From 76c759a3942a7b020b6d636b0a253735a05c8a74 Mon Sep 17 00:00:00 2001 From: Ben Mosley Date: Wed, 22 Apr 2026 20:37:17 -0500 Subject: [PATCH] Added requirements.txt --- .gitignore | 5 +- port/bin/Activate.ps1 | 3 +- port/bin/activate | 41 +- port/bin/activate.csh | 7 +- port/bin/activate.fish | 8 +- port/bin/dotenv | 2 +- port/bin/flask | 2 +- port/bin/gunicorn | 8 - port/bin/normalizer | 8 - port/bin/pip | 2 +- port/bin/pip3 | 2 +- port/bin/pip3.11 | 8 - port/bin/python | 2 +- port/bin/python3 | 2 +- port/bin/python3.11 | 1 - port/bin/slugify | 2 +- .../site/python3.11/greenlet/greenlet.h | 164 - .../Flask_Login-0.6.3.dist-info/INSTALLER | 1 - .../Flask_Login-0.6.3.dist-info/LICENSE | 22 - .../Flask_Login-0.6.3.dist-info/METADATA | 183 - .../Flask_Login-0.6.3.dist-info/RECORD | 23 - .../Flask_Login-0.6.3.dist-info/REQUESTED | 0 .../Flask_Login-0.6.3.dist-info/WHEEL | 5 - .../Flask_Login-0.6.3.dist-info/top_level.txt | 1 - .../MarkupSafe-3.0.2.dist-info/INSTALLER | 1 - .../MarkupSafe-3.0.2.dist-info/LICENSE.txt | 28 - .../MarkupSafe-3.0.2.dist-info/METADATA | 92 - .../MarkupSafe-3.0.2.dist-info/RECORD | 14 - .../MarkupSafe-3.0.2.dist-info/WHEEL | 6 - .../MarkupSafe-3.0.2.dist-info/top_level.txt | 1 - .../typing_extensions.cpython-311.pyc | Bin 189554 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 222 - .../__pycache__/__init__.cpython-311.pyc | Bin 11154 -> 0 bytes .../__pycache__/override.cpython-311.pyc | Bin 311 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../blinker-1.9.0.dist-info/INSTALLER | 1 - .../blinker-1.9.0.dist-info/LICENSE.txt | 20 - .../blinker-1.9.0.dist-info/METADATA | 60 - .../blinker-1.9.0.dist-info/RECORD | 12 - .../blinker-1.9.0.dist-info/WHEEL | 4 - .../site-packages/blinker/__init__.py | 17 - .../__pycache__/__init__.cpython-311.pyc | Bin 602 -> 0 bytes .../__pycache__/_utilities.cpython-311.pyc | Bin 3087 -> 0 bytes .../blinker/__pycache__/base.cpython-311.pyc | Bin 23619 -> 0 bytes .../site-packages/blinker/_utilities.py | 64 - .../python3.11/site-packages/blinker/base.py | 512 - .../python3.11/site-packages/blinker/py.typed | 0 .../certifi-2025.10.5.dist-info/INSTALLER | 1 - .../certifi-2025.10.5.dist-info/METADATA | 78 - .../certifi-2025.10.5.dist-info/RECORD | 14 - .../certifi-2025.10.5.dist-info/WHEEL | 5 - .../licenses/LICENSE | 20 - .../certifi-2025.10.5.dist-info/top_level.txt | 1 - .../site-packages/certifi/__init__.py | 4 - .../site-packages/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 323 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 712 -> 0 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 2382 -> 0 bytes .../site-packages/certifi/cacert.pem | 4800 --------- .../python3.11/site-packages/certifi/core.py | 83 - .../python3.11/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 - .../METADATA | 764 -- .../charset_normalizer-3.4.4.dist-info/RECORD | 35 - .../charset_normalizer-3.4.4.dist-info/WHEEL | 7 - .../entry_points.txt | 2 - .../licenses/LICENSE | 21 - .../top_level.txt | 1 - .../charset_normalizer/__init__.py | 48 - .../charset_normalizer/__main__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 1904 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 395 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 20786 -> 0 bytes .../__pycache__/cd.cpython-311.pyc | Bin 15869 -> 0 bytes .../__pycache__/constant.cpython-311.pyc | Bin 45720 -> 0 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 3346 -> 0 bytes .../__pycache__/md.cpython-311.pyc | Bin 27540 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 18559 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 15652 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 401 -> 0 bytes .../site-packages/charset_normalizer/api.py | 669 -- .../site-packages/charset_normalizer/cd.py | 395 - .../charset_normalizer/cli/__init__.py | 8 - .../charset_normalizer/cli/__main__.py | 381 - .../cli/__pycache__/__init__.cpython-311.pyc | Bin 367 -> 0 bytes .../cli/__pycache__/__main__.cpython-311.pyc | Bin 15985 -> 0 bytes .../charset_normalizer/constant.py | 2015 ---- .../charset_normalizer/legacy.py | 80 - .../md.cpython-311-x86_64-linux-gnu.so | Bin 15912 -> 0 bytes .../site-packages/charset_normalizer/md.py | 635 -- .../md__mypyc.cpython-311-x86_64-linux-gnu.so | Bin 282232 -> 0 bytes .../charset_normalizer/models.py | 360 - .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 - .../charset_normalizer/version.py | 8 - .../click-8.1.8.dist-info/INSTALLER | 1 - .../click-8.1.8.dist-info/LICENSE.txt | 28 - .../click-8.1.8.dist-info/METADATA | 74 - .../click-8.1.8.dist-info/RECORD | 38 - .../site-packages/click-8.1.8.dist-info/WHEEL | 4 - .../site-packages/click/__init__.py | 75 - .../__pycache__/__init__.cpython-311.pyc | Bin 3721 -> 0 bytes .../click/__pycache__/_compat.cpython-311.pyc | Bin 28663 -> 0 bytes .../__pycache__/_termui_impl.cpython-311.pyc | Bin 33264 -> 0 bytes .../__pycache__/_textwrap.cpython-311.pyc | Bin 2633 -> 0 bytes .../__pycache__/_winconsole.cpython-311.pyc | Bin 13323 -> 0 bytes .../click/__pycache__/core.cpython-311.pyc | Bin 142552 -> 0 bytes .../__pycache__/decorators.cpython-311.pyc | Bin 26325 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16341 -> 0 bytes .../__pycache__/formatting.cpython-311.pyc | Bin 15678 -> 0 bytes .../click/__pycache__/globals.cpython-311.pyc | Bin 3343 -> 0 bytes .../click/__pycache__/parser.cpython-311.pyc | Bin 23122 -> 0 bytes .../shell_completion.cpython-311.pyc | Bin 24118 -> 0 bytes .../click/__pycache__/termui.cpython-311.pyc | Bin 34467 -> 0 bytes .../click/__pycache__/testing.cpython-311.pyc | Bin 25958 -> 0 bytes .../click/__pycache__/types.cpython-311.pyc | Bin 53701 -> 0 bytes .../click/__pycache__/utils.cpython-311.pyc | Bin 28029 -> 0 bytes .../python3.11/site-packages/click/_compat.py | 623 -- .../site-packages/click/_termui_impl.py | 788 -- .../site-packages/click/_textwrap.py | 49 - .../site-packages/click/_winconsole.py | 279 - .../python3.11/site-packages/click/core.py | 3047 ------ .../site-packages/click/decorators.py | 562 -- .../site-packages/click/exceptions.py | 296 - .../site-packages/click/formatting.py | 301 - .../python3.11/site-packages/click/globals.py | 67 - .../python3.11/site-packages/click/parser.py | 531 - .../python3.11/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 603 -- .../python3.11/site-packages/click/termui.py | 784 -- .../python3.11/site-packages/click/testing.py | 483 - .../python3.11/site-packages/click/types.py | 1093 -- .../python3.11/site-packages/click/utils.py | 624 -- .../site-packages/distutils-precedence.pth | 1 - .../site-packages/dotenv/__init__.py | 49 - .../site-packages/dotenv/__main__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 2023 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 387 -> 0 bytes .../dotenv/__pycache__/cli.cpython-311.pyc | Bin 10791 -> 0 bytes .../__pycache__/ipython.cpython-311.pyc | Bin 2303 -> 0 bytes .../dotenv/__pycache__/main.cpython-311.pyc | Bin 18544 -> 0 bytes .../dotenv/__pycache__/parser.cpython-311.pyc | Bin 11360 -> 0 bytes .../__pycache__/variables.cpython-311.pyc | Bin 5521 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 199 -> 0 bytes .../python3.11/site-packages/dotenv/cli.py | 190 - .../site-packages/dotenv/ipython.py | 39 - .../python3.11/site-packages/dotenv/main.py | 398 - .../python3.11/site-packages/dotenv/parser.py | 175 - .../python3.11/site-packages/dotenv/py.typed | 1 - .../site-packages/dotenv/variables.py | 86 - .../site-packages/dotenv/version.py | 1 - .../flask-3.1.0.dist-info/INSTALLER | 1 - .../flask-3.1.0.dist-info/LICENSE.txt | 28 - .../flask-3.1.0.dist-info/METADATA | 81 - .../flask-3.1.0.dist-info/RECORD | 58 - .../flask-3.1.0.dist-info/REQUESTED | 0 .../site-packages/flask-3.1.0.dist-info/WHEEL | 4 - .../flask-3.1.0.dist-info/entry_points.txt | 3 - .../site-packages/flask/__init__.py | 60 - .../site-packages/flask/__main__.py | 3 - .../__pycache__/__init__.cpython-311.pyc | Bin 3165 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 254 -> 0 bytes .../flask/__pycache__/app.cpython-311.pyc | Bin 65068 -> 0 bytes .../__pycache__/blueprints.cpython-311.pyc | Bin 5351 -> 0 bytes .../flask/__pycache__/cli.cpython-311.pyc | Bin 47895 -> 0 bytes .../flask/__pycache__/config.cpython-311.pyc | Bin 17212 -> 0 bytes .../flask/__pycache__/ctx.cpython-311.pyc | Bin 20895 -> 0 bytes .../__pycache__/debughelpers.cpython-311.pyc | Bin 10206 -> 0 bytes .../flask/__pycache__/globals.cpython-311.pyc | Bin 2217 -> 0 bytes .../flask/__pycache__/helpers.cpython-311.pyc | Bin 26533 -> 0 bytes .../flask/__pycache__/logging.cpython-311.pyc | Bin 3447 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 18635 -> 0 bytes .../flask/__pycache__/signals.cpython-311.pyc | Bin 1358 -> 0 bytes .../__pycache__/templating.cpython-311.pyc | Bin 10645 -> 0 bytes .../flask/__pycache__/testing.cpython-311.pyc | Bin 14600 -> 0 bytes .../flask/__pycache__/typing.cpython-311.pyc | Bin 3676 -> 0 bytes .../flask/__pycache__/views.cpython-311.pyc | Bin 7454 -> 0 bytes .../__pycache__/wrappers.cpython-311.pyc | Bin 10845 -> 0 bytes .../lib/python3.11/site-packages/flask/app.py | 1536 --- .../site-packages/flask/blueprints.py | 128 - .../lib/python3.11/site-packages/flask/cli.py | 1133 --- .../python3.11/site-packages/flask/config.py | 367 - .../lib/python3.11/site-packages/flask/ctx.py | 449 - .../site-packages/flask/debughelpers.py | 178 - .../python3.11/site-packages/flask/globals.py | 51 - .../python3.11/site-packages/flask/helpers.py | 634 -- .../site-packages/flask/json/__init__.py | 170 - .../json/__pycache__/__init__.cpython-311.pyc | Bin 6869 -> 0 bytes .../json/__pycache__/provider.cpython-311.pyc | Bin 9984 -> 0 bytes .../json/__pycache__/tag.cpython-311.pyc | Bin 16577 -> 0 bytes .../site-packages/flask/json/provider.py | 215 - .../site-packages/flask/json/tag.py | 327 - .../python3.11/site-packages/flask/logging.py | 79 - .../python3.11/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 - .../sansio/__pycache__/app.cpython-311.pyc | Bin 35436 -> 0 bytes .../__pycache__/blueprints.cpython-311.pyc | Bin 32545 -> 0 bytes .../__pycache__/scaffold.cpython-311.pyc | Bin 31424 -> 0 bytes .../site-packages/flask/sansio/app.py | 964 -- .../site-packages/flask/sansio/blueprints.py | 632 -- .../site-packages/flask/sansio/scaffold.py | 792 -- .../site-packages/flask/sessions.py | 398 - .../python3.11/site-packages/flask/signals.py | 17 - .../site-packages/flask/templating.py | 219 - .../python3.11/site-packages/flask/testing.py | 297 - .../python3.11/site-packages/flask/typing.py | 90 - .../python3.11/site-packages/flask/views.py | 191 - .../site-packages/flask/wrappers.py | 257 - .../site-packages/flask_login/__about__.py | 10 - .../site-packages/flask_login/__init__.py | 94 - .../__pycache__/__about__.cpython-311.pyc | Bin 668 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 3091 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 909 -> 0 bytes .../__pycache__/login_manager.cpython-311.pyc | Bin 22982 -> 0 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 3241 -> 0 bytes .../__pycache__/signals.cpython-311.pyc | Bin 1834 -> 0 bytes .../__pycache__/test_client.cpython-311.pyc | Bin 1470 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 18838 -> 0 bytes .../site-packages/flask_login/config.py | 55 - .../flask_login/login_manager.py | 543 - .../site-packages/flask_login/mixins.py | 65 - .../site-packages/flask_login/signals.py | 61 - .../site-packages/flask_login/test_client.py | 19 - .../site-packages/flask_login/utils.py | 415 - .../flask_mail-0.10.0.dist-info/INSTALLER | 1 - .../flask_mail-0.10.0.dist-info/LICENSE.txt | 28 - .../flask_mail-0.10.0.dist-info/METADATA | 68 - .../flask_mail-0.10.0.dist-info/RECORD | 9 - .../flask_mail-0.10.0.dist-info/REQUESTED | 0 .../flask_mail-0.10.0.dist-info/WHEEL | 4 - .../site-packages/flask_mail/__init__.py | 660 -- .../__pycache__/__init__.cpython-311.pyc | Bin 32623 -> 0 bytes .../site-packages/flask_mail/py.typed | 0 .../INSTALLER | 1 - .../LICENSE.rst | 28 - .../flask_sqlalchemy-3.1.1.dist-info/METADATA | 109 - .../flask_sqlalchemy-3.1.1.dist-info/RECORD | 27 - .../REQUESTED | 0 .../flask_sqlalchemy-3.1.1.dist-info/WHEEL | 4 - .../flask_sqlalchemy/__init__.py | 26 - .../__pycache__/__init__.cpython-311.pyc | Bin 1164 -> 0 bytes .../__pycache__/cli.cpython-311.pyc | Bin 1132 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 41752 -> 0 bytes .../__pycache__/model.cpython-311.pyc | Bin 14615 -> 0 bytes .../__pycache__/pagination.cpython-311.pyc | Bin 14947 -> 0 bytes .../__pycache__/query.cpython-311.pyc | Bin 4836 -> 0 bytes .../record_queries.cpython-311.pyc | Bin 5223 -> 0 bytes .../__pycache__/session.cpython-311.pyc | Bin 4842 -> 0 bytes .../__pycache__/table.cpython-311.pyc | Bin 1872 -> 0 bytes .../track_modifications.cpython-311.pyc | Bin 4003 -> 0 bytes .../site-packages/flask_sqlalchemy/cli.py | 16 - .../flask_sqlalchemy/extension.py | 1008 -- .../site-packages/flask_sqlalchemy/model.py | 330 - .../flask_sqlalchemy/pagination.py | 364 - .../site-packages/flask_sqlalchemy/py.typed | 0 .../site-packages/flask_sqlalchemy/query.py | 105 - .../flask_sqlalchemy/record_queries.py | 117 - .../site-packages/flask_sqlalchemy/session.py | 111 - .../site-packages/flask_sqlalchemy/table.py | 39 - .../flask_sqlalchemy/track_modifications.py | 88 - .../greenlet-3.1.1.dist-info/AUTHORS | 51 - .../greenlet-3.1.1.dist-info/INSTALLER | 1 - .../greenlet-3.1.1.dist-info/LICENSE | 30 - .../greenlet-3.1.1.dist-info/LICENSE.PSF | 47 - .../greenlet-3.1.1.dist-info/METADATA | 103 - .../greenlet-3.1.1.dist-info/RECORD | 122 - .../greenlet-3.1.1.dist-info/WHEEL | 6 - .../greenlet-3.1.1.dist-info/top_level.txt | 1 - .../site-packages/greenlet/CObjects.cpp | 157 - .../site-packages/greenlet/PyGreenlet.cpp | 738 -- .../site-packages/greenlet/PyGreenlet.hpp | 35 - .../greenlet/PyGreenletUnswitchable.cpp | 147 - .../site-packages/greenlet/PyModule.cpp | 292 - .../greenlet/TBrokenGreenlet.cpp | 45 - .../greenlet/TExceptionState.cpp | 62 - .../site-packages/greenlet/TGreenlet.cpp | 718 -- .../site-packages/greenlet/TGreenlet.hpp | 813 -- .../greenlet/TGreenletGlobals.cpp | 94 - .../site-packages/greenlet/TMainGreenlet.cpp | 153 - .../site-packages/greenlet/TPythonState.cpp | 393 - .../site-packages/greenlet/TStackState.cpp | 265 - .../site-packages/greenlet/TThreadState.hpp | 497 - .../greenlet/TThreadStateCreator.hpp | 102 - .../greenlet/TThreadStateDestroy.cpp | 258 - .../site-packages/greenlet/TUserGreenlet.cpp | 662 -- .../site-packages/greenlet/__init__.py | 71 - .../__pycache__/__init__.cpython-311.pyc | Bin 1336 -> 0 bytes .../_greenlet.cpython-311-x86_64-linux-gnu.so | Bin 1388888 -> 0 bytes .../site-packages/greenlet/greenlet.cpp | 320 - .../site-packages/greenlet/greenlet.h | 164 - .../greenlet/greenlet_allocator.hpp | 63 - .../greenlet/greenlet_compiler_compat.hpp | 98 - .../greenlet/greenlet_cpython_add_pending.hpp | 172 - .../greenlet/greenlet_cpython_compat.hpp | 142 - .../greenlet/greenlet_exceptions.hpp | 171 - .../greenlet/greenlet_internal.hpp | 107 - .../site-packages/greenlet/greenlet_refs.hpp | 1118 --- .../greenlet/greenlet_slp_switch.hpp | 99 - .../greenlet/greenlet_thread_support.hpp | 31 - .../greenlet/platform/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 191 -> 0 bytes .../platform/setup_switch_x64_masm.cmd | 2 - .../greenlet/platform/switch_aarch64_gcc.h | 124 - .../greenlet/platform/switch_alpha_unix.h | 30 - .../greenlet/platform/switch_amd64_unix.h | 87 - .../greenlet/platform/switch_arm32_gcc.h | 79 - .../greenlet/platform/switch_arm32_ios.h | 67 - .../greenlet/platform/switch_arm64_masm.asm | 53 - .../greenlet/platform/switch_arm64_masm.obj | Bin 746 -> 0 bytes .../greenlet/platform/switch_arm64_msvc.h | 17 - .../greenlet/platform/switch_csky_gcc.h | 48 - .../platform/switch_loongarch64_linux.h | 31 - .../greenlet/platform/switch_m68k_gcc.h | 38 - .../greenlet/platform/switch_mips_unix.h | 64 - .../greenlet/platform/switch_ppc64_aix.h | 103 - .../greenlet/platform/switch_ppc64_linux.h | 105 - .../greenlet/platform/switch_ppc_aix.h | 87 - .../greenlet/platform/switch_ppc_linux.h | 84 - .../greenlet/platform/switch_ppc_macosx.h | 82 - .../greenlet/platform/switch_ppc_unix.h | 82 - .../greenlet/platform/switch_riscv_unix.h | 36 - .../greenlet/platform/switch_s390_unix.h | 87 - .../greenlet/platform/switch_sh_gcc.h | 36 - .../greenlet/platform/switch_sparc_sun_gcc.h | 92 - .../greenlet/platform/switch_x32_unix.h | 63 - .../greenlet/platform/switch_x64_masm.asm | 111 - .../greenlet/platform/switch_x64_masm.obj | Bin 1078 -> 0 bytes .../greenlet/platform/switch_x64_msvc.h | 60 - .../greenlet/platform/switch_x86_msvc.h | 326 - .../greenlet/platform/switch_x86_unix.h | 105 - .../greenlet/slp_platformselect.h | 75 - .../site-packages/greenlet/tests/__init__.py | 240 - .../__pycache__/__init__.cpython-311.pyc | Bin 10157 -> 0 bytes ...fail_clearing_run_switches.cpython-311.pyc | Bin 2395 -> 0 bytes .../fail_cpp_exception.cpython-311.pyc | Bin 1711 -> 0 bytes ...nitialstub_already_started.cpython-311.pyc | Bin 3871 -> 0 bytes .../fail_slp_switch.cpython-311.pyc | Bin 1422 -> 0 bytes ...ail_switch_three_greenlets.cpython-311.pyc | Bin 1888 -> 0 bytes ...il_switch_three_greenlets2.cpython-311.pyc | Bin 2896 -> 0 bytes .../fail_switch_two_greenlets.cpython-311.pyc | Bin 1891 -> 0 bytes .../__pycache__/leakcheck.cpython-311.pyc | Bin 12767 -> 0 bytes .../test_contextvars.cpython-311.pyc | Bin 18601 -> 0 bytes .../__pycache__/test_cpp.cpython-311.pyc | Bin 4557 -> 0 bytes .../test_extension_interface.cpython-311.pyc | Bin 8566 -> 0 bytes .../tests/__pycache__/test_gc.cpython-311.pyc | Bin 5508 -> 0 bytes .../test_generator.cpython-311.pyc | Bin 3530 -> 0 bytes .../test_generator_nested.cpython-311.pyc | Bin 9384 -> 0 bytes .../__pycache__/test_greenlet.cpython-311.pyc | Bin 86955 -> 0 bytes .../test_greenlet_trash.cpython-311.pyc | Bin 7423 -> 0 bytes .../__pycache__/test_leaks.cpython-311.pyc | Bin 21755 -> 0 bytes .../test_stack_saved.cpython-311.pyc | Bin 1504 -> 0 bytes .../__pycache__/test_throw.cpython-311.pyc | Bin 8924 -> 0 bytes .../__pycache__/test_tracing.cpython-311.pyc | Bin 15830 -> 0 bytes .../__pycache__/test_version.cpython-311.pyc | Bin 2917 -> 0 bytes .../__pycache__/test_weakref.cpython-311.pyc | Bin 3070 -> 0 bytes .../greenlet/tests/_test_extension.c | 231 - ..._extension.cpython-311-x86_64-linux-gnu.so | Bin 36624 -> 0 bytes .../greenlet/tests/_test_extension_cpp.cpp | 226 - ...ension_cpp.cpython-311-x86_64-linux-gnu.so | Bin 57288 -> 0 bytes .../tests/fail_clearing_run_switches.py | 47 - .../greenlet/tests/fail_cpp_exception.py | 33 - .../tests/fail_initialstub_already_started.py | 78 - .../greenlet/tests/fail_slp_switch.py | 29 - .../tests/fail_switch_three_greenlets.py | 44 - .../tests/fail_switch_three_greenlets2.py | 55 - .../tests/fail_switch_two_greenlets.py | 41 - .../site-packages/greenlet/tests/leakcheck.py | 319 - .../greenlet/tests/test_contextvars.py | 310 - .../site-packages/greenlet/tests/test_cpp.py | 73 - .../tests/test_extension_interface.py | 115 - .../site-packages/greenlet/tests/test_gc.py | 86 - .../greenlet/tests/test_generator.py | 59 - .../greenlet/tests/test_generator_nested.py | 168 - .../greenlet/tests/test_greenlet.py | 1324 --- .../greenlet/tests/test_greenlet_trash.py | 187 - .../greenlet/tests/test_leaks.py | 443 - .../greenlet/tests/test_stack_saved.py | 19 - .../greenlet/tests/test_throw.py | 128 - .../greenlet/tests/test_tracing.py | 291 - .../greenlet/tests/test_version.py | 41 - .../greenlet/tests/test_weakref.py | 35 - .../gunicorn-23.0.0.dist-info/INSTALLER | 1 - .../gunicorn-23.0.0.dist-info/LICENSE | 23 - .../gunicorn-23.0.0.dist-info/METADATA | 130 - .../gunicorn-23.0.0.dist-info/RECORD | 77 - .../gunicorn-23.0.0.dist-info/REQUESTED | 0 .../gunicorn-23.0.0.dist-info/WHEEL | 5 - .../entry_points.txt | 5 - .../gunicorn-23.0.0.dist-info/top_level.txt | 1 - .../site-packages/gunicorn/__init__.py | 8 - .../site-packages/gunicorn/__main__.py | 10 - .../__pycache__/__init__.cpython-311.pyc | Bin 572 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 364 -> 0 bytes .../__pycache__/arbiter.cpython-311.pyc | Bin 34568 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 97158 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 3371 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 1398 -> 0 bytes .../__pycache__/glogging.cpython-311.pyc | Bin 23926 -> 0 bytes .../__pycache__/pidfile.cpython-311.pyc | Bin 4805 -> 0 bytes .../__pycache__/reloader.cpython-311.pyc | Bin 7144 -> 0 bytes .../gunicorn/__pycache__/sock.cpython-311.pyc | Bin 13025 -> 0 bytes .../__pycache__/systemd.cpython-311.pyc | Bin 3739 -> 0 bytes .../gunicorn/__pycache__/util.cpython-311.pyc | Bin 26824 -> 0 bytes .../site-packages/gunicorn/app/__init__.py | 3 - .../app/__pycache__/__init__.cpython-311.pyc | Bin 186 -> 0 bytes .../app/__pycache__/base.cpython-311.pyc | Bin 12586 -> 0 bytes .../app/__pycache__/pasterapp.cpython-311.pyc | Bin 3548 -> 0 bytes .../app/__pycache__/wsgiapp.cpython-311.pyc | Bin 3704 -> 0 bytes .../site-packages/gunicorn/app/base.py | 235 - .../site-packages/gunicorn/app/pasterapp.py | 74 - .../site-packages/gunicorn/app/wsgiapp.py | 70 - .../site-packages/gunicorn/arbiter.py | 671 -- .../site-packages/gunicorn/config.py | 2442 ----- .../site-packages/gunicorn/debug.py | 68 - .../site-packages/gunicorn/errors.py | 28 - .../site-packages/gunicorn/glogging.py | 473 - .../site-packages/gunicorn/http/__init__.py | 8 - .../http/__pycache__/__init__.cpython-311.pyc | Bin 397 -> 0 bytes .../http/__pycache__/body.cpython-311.pyc | Bin 14306 -> 0 bytes .../http/__pycache__/errors.cpython-311.pyc | Bin 9334 -> 0 bytes .../http/__pycache__/message.cpython-311.pyc | Bin 20197 -> 0 bytes .../http/__pycache__/parser.cpython-311.pyc | Bin 2285 -> 0 bytes .../http/__pycache__/unreader.cpython-311.pyc | Bin 4435 -> 0 bytes .../http/__pycache__/wsgi.cpython-311.pyc | Bin 17200 -> 0 bytes .../site-packages/gunicorn/http/body.py | 268 - .../site-packages/gunicorn/http/errors.py | 145 - .../site-packages/gunicorn/http/message.py | 463 - .../site-packages/gunicorn/http/parser.py | 51 - .../site-packages/gunicorn/http/unreader.py | 78 - .../site-packages/gunicorn/http/wsgi.py | 401 - .../gunicorn/instrument/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 193 -> 0 bytes .../__pycache__/statsd.cpython-311.pyc | Bin 8057 -> 0 bytes .../gunicorn/instrument/statsd.py | 134 - .../site-packages/gunicorn/pidfile.py | 85 - .../site-packages/gunicorn/reloader.py | 131 - .../python3.11/site-packages/gunicorn/sock.py | 231 - .../site-packages/gunicorn/systemd.py | 75 - .../python3.11/site-packages/gunicorn/util.py | 653 -- .../gunicorn/workers/__init__.py | 14 - .../__pycache__/__init__.cpython-311.pyc | Bin 571 -> 0 bytes .../workers/__pycache__/base.cpython-311.pyc | Bin 14747 -> 0 bytes .../__pycache__/base_async.cpython-311.pyc | Bin 9283 -> 0 bytes .../__pycache__/geventlet.cpython-311.pyc | Bin 9401 -> 0 bytes .../__pycache__/ggevent.cpython-311.pyc | Bin 10385 -> 0 bytes .../__pycache__/gthread.cpython-311.pyc | Bin 20224 -> 0 bytes .../__pycache__/gtornado.cpython-311.pyc | Bin 8705 -> 0 bytes .../workers/__pycache__/sync.cpython-311.pyc | Bin 11546 -> 0 bytes .../__pycache__/workertmp.cpython-311.pyc | Bin 3072 -> 0 bytes .../site-packages/gunicorn/workers/base.py | 287 - .../gunicorn/workers/base_async.py | 147 - .../gunicorn/workers/geventlet.py | 186 - .../site-packages/gunicorn/workers/ggevent.py | 193 - .../site-packages/gunicorn/workers/gthread.py | 372 - .../gunicorn/workers/gtornado.py | 166 - .../site-packages/gunicorn/workers/sync.py | 209 - .../gunicorn/workers/workertmp.py | 53 - .../idna-3.11.dist-info/INSTALLER | 1 - .../idna-3.11.dist-info/METADATA | 209 - .../site-packages/idna-3.11.dist-info/RECORD | 22 - .../site-packages/idna-3.11.dist-info/WHEEL | 4 - .../idna-3.11.dist-info/licenses/LICENSE.md | 31 - .../python3.11/site-packages/idna/__init__.py | 45 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1085 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5767 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1007 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19286 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 103001 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2965 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 201 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 166254 -> 0 bytes .../python3.11/site-packages/idna/codec.py | 122 - .../python3.11/site-packages/idna/compat.py | 15 - .../lib/python3.11/site-packages/idna/core.py | 437 - .../python3.11/site-packages/idna/idnadata.py | 4309 -------- .../site-packages/idna/intranges.py | 57 - .../site-packages/idna/package_data.py | 1 - .../python3.11/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8841 ----------------- .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 - .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 - .../itsdangerous-2.2.0.dist-info/METADATA | 60 - .../itsdangerous-2.2.0.dist-info/RECORD | 22 - .../itsdangerous-2.2.0.dist-info/WHEEL | 4 - .../site-packages/itsdangerous/__init__.py | 38 - .../__pycache__/__init__.cpython-311.pyc | Bin 1987 -> 0 bytes .../__pycache__/_json.cpython-311.pyc | Bin 1364 -> 0 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2943 -> 0 bytes .../__pycache__/exc.cpython-311.pyc | Bin 4814 -> 0 bytes .../__pycache__/serializer.cpython-311.pyc | Bin 15720 -> 0 bytes .../__pycache__/signer.cpython-311.pyc | Bin 12473 -> 0 bytes .../__pycache__/timed.cpython-311.pyc | Bin 9740 -> 0 bytes .../__pycache__/url_safe.cpython-311.pyc | Bin 4125 -> 0 bytes .../site-packages/itsdangerous/_json.py | 18 - .../site-packages/itsdangerous/encoding.py | 54 - .../site-packages/itsdangerous/exc.py | 106 - .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 - .../site-packages/itsdangerous/signer.py | 266 - .../site-packages/itsdangerous/timed.py | 228 - .../site-packages/itsdangerous/url_safe.py | 83 - .../jinja2-3.1.6.dist-info/INSTALLER | 1 - .../jinja2-3.1.6.dist-info/METADATA | 84 - .../jinja2-3.1.6.dist-info/RECORD | 57 - .../jinja2-3.1.6.dist-info/WHEEL | 4 - .../jinja2-3.1.6.dist-info/entry_points.txt | 3 - .../licenses/LICENSE.txt | 28 - .../site-packages/jinja2/__init__.py | 38 - .../__pycache__/__init__.cpython-311.pyc | Bin 2113 -> 0 bytes .../__pycache__/_identifier.cpython-311.pyc | Bin 2129 -> 0 bytes .../__pycache__/async_utils.cpython-311.pyc | Bin 5589 -> 0 bytes .../__pycache__/bccache.cpython-311.pyc | Bin 20911 -> 0 bytes .../__pycache__/compiler.cpython-311.pyc | Bin 112433 -> 0 bytes .../__pycache__/constants.cpython-311.pyc | Bin 1548 -> 0 bytes .../jinja2/__pycache__/debug.cpython-311.pyc | Bin 6708 -> 0 bytes .../__pycache__/defaults.cpython-311.pyc | Bin 1714 -> 0 bytes .../__pycache__/environment.cpython-311.pyc | Bin 80571 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8599 -> 0 bytes .../jinja2/__pycache__/ext.cpython-311.pyc | Bin 43375 -> 0 bytes .../__pycache__/filters.cpython-311.pyc | Bin 77633 -> 0 bytes .../__pycache__/idtracking.cpython-311.pyc | Bin 19503 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-311.pyc | Bin 35656 -> 0 bytes .../__pycache__/loaders.cpython-311.pyc | Bin 34389 -> 0 bytes .../jinja2/__pycache__/meta.cpython-311.pyc | Bin 5693 -> 0 bytes .../__pycache__/nativetypes.cpython-311.pyc | Bin 7955 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-311.pyc | Bin 64474 -> 0 bytes .../__pycache__/optimizer.cpython-311.pyc | Bin 2844 -> 0 bytes .../jinja2/__pycache__/parser.cpython-311.pyc | Bin 60020 -> 0 bytes .../__pycache__/runtime.cpython-311.pyc | Bin 51107 -> 0 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 19215 -> 0 bytes .../jinja2/__pycache__/tests.cpython-311.pyc | Bin 9264 -> 0 bytes .../jinja2/__pycache__/utils.cpython-311.pyc | Bin 37551 -> 0 bytes .../__pycache__/visitor.cpython-311.pyc | Bin 5692 -> 0 bytes .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/async_utils.py | 99 - .../site-packages/jinja2/bccache.py | 408 - .../site-packages/jinja2/compiler.py | 1998 ---- .../site-packages/jinja2/constants.py | 20 - .../python3.11/site-packages/jinja2/debug.py | 191 - .../site-packages/jinja2/defaults.py | 48 - .../site-packages/jinja2/environment.py | 1672 ---- .../site-packages/jinja2/exceptions.py | 166 - .../python3.11/site-packages/jinja2/ext.py | 870 -- .../site-packages/jinja2/filters.py | 1873 ---- .../site-packages/jinja2/idtracking.py | 318 - .../python3.11/site-packages/jinja2/lexer.py | 868 -- .../site-packages/jinja2/loaders.py | 693 -- .../python3.11/site-packages/jinja2/meta.py | 112 - .../site-packages/jinja2/nativetypes.py | 130 - .../python3.11/site-packages/jinja2/nodes.py | 1206 --- .../site-packages/jinja2/optimizer.py | 48 - .../python3.11/site-packages/jinja2/parser.py | 1049 -- .../python3.11/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 -- .../site-packages/jinja2/sandbox.py | 436 - .../python3.11/site-packages/jinja2/tests.py | 256 - .../python3.11/site-packages/jinja2/utils.py | 766 -- .../site-packages/jinja2/visitor.py | 92 - .../site-packages/markupsafe/__init__.py | 395 - .../__pycache__/__init__.cpython-311.pyc | Bin 25730 -> 0 bytes .../__pycache__/_native.cpython-311.pyc | Bin 681 -> 0 bytes .../site-packages/markupsafe/_native.py | 8 - .../site-packages/markupsafe/_speedups.c | 204 - .../_speedups.cpython-311-x86_64-linux-gnu.so | Bin 43456 -> 0 bytes .../site-packages/markupsafe/_speedups.pyi | 1 - .../site-packages/markupsafe/py.typed | 0 .../packaging-24.2.dist-info/INSTALLER | 1 - .../packaging-24.2.dist-info/LICENSE | 3 - .../packaging-24.2.dist-info/LICENSE.APACHE | 177 - .../packaging-24.2.dist-info/LICENSE.BSD | 23 - .../packaging-24.2.dist-info/METADATA | 102 - .../packaging-24.2.dist-info/RECORD | 40 - .../packaging-24.2.dist-info/WHEEL | 4 - .../site-packages/packaging/__init__.py | 15 - .../__pycache__/__init__.cpython-311.pyc | Bin 543 -> 0 bytes .../__pycache__/_elffile.cpython-311.pyc | Bin 5501 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 10934 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 5294 -> 0 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 16266 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3667 -> 0 bytes .../__pycache__/_tokenizer.cpython-311.pyc | Bin 8531 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 13086 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 31073 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 4708 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 41495 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 25867 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 7569 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21956 -> 0 bytes .../site-packages/packaging/_elffile.py | 110 - .../site-packages/packaging/_manylinux.py | 263 - .../site-packages/packaging/_musllinux.py | 85 - .../site-packages/packaging/_parser.py | 354 - .../site-packages/packaging/_structures.py | 61 - .../site-packages/packaging/_tokenizer.py | 194 - .../packaging/licenses/__init__.py | 145 - .../__pycache__/__init__.cpython-311.pyc | Bin 5027 -> 0 bytes .../__pycache__/_spdx.cpython-311.pyc | Bin 50251 -> 0 bytes .../site-packages/packaging/licenses/_spdx.py | 759 -- .../site-packages/packaging/markers.py | 331 - .../site-packages/packaging/metadata.py | 863 -- .../site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 91 - .../site-packages/packaging/specifiers.py | 1020 -- .../site-packages/packaging/tags.py | 617 -- .../site-packages/packaging/utils.py | 163 - .../site-packages/packaging/version.py | 582 -- .../pip-23.0.1.dist-info/INSTALLER | 1 - .../pip-23.0.1.dist-info/LICENSE.txt | 20 - .../pip-23.0.1.dist-info/METADATA | 88 - .../site-packages/pip-23.0.1.dist-info/RECORD | 996 -- .../pip-23.0.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.0.1.dist-info/WHEEL | 5 - .../pip-23.0.1.dist-info/entry_points.txt | 4 - .../pip-23.0.1.dist-info/top_level.txt | 1 - .../python3.11/site-packages/pip/__init__.py | 13 - .../python3.11/site-packages/pip/__main__.py | 31 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-311.pyc | Bin 766 -> 0 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 1075 -> 0 bytes .../__pip-runner__.cpython-311.pyc | Bin 2503 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 19 - .../__pycache__/__init__.cpython-311.pyc | Bin 949 -> 0 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 16069 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 14694 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 19225 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 38354 -> 0 bytes .../__pycache__/main.cpython-311.pyc | Bin 749 -> 0 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 5517 -> 0 bytes .../self_outdated_check.cpython-311.pyc | Bin 11319 -> 0 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 15989 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 311 - .../site-packages/pip/_internal/cache.py | 293 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-311.pyc | Bin 284 -> 0 bytes .../autocompletion.cpython-311.pyc | Bin 10074 -> 0 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 11072 -> 0 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 32971 -> 0 bytes .../command_context.cpython-311.pyc | Bin 2106 -> 0 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 2361 -> 0 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 5520 -> 0 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 17021 -> 0 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 3168 -> 0 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 20133 -> 0 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 8833 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 372 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 171 - .../pip/_internal/cli/base_command.py | 216 - .../pip/_internal/cli/cmdoptions.py | 1055 -- .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 70 - .../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 | 502 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-311.pyc | Bin 4452 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 10551 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 2302 -> 0 bytes .../__pycache__/completion.cpython-311.pyc | Bin 5464 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 14893 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 12001 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 7808 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 4153 -> 0 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 3354 -> 0 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 1966 -> 0 bytes .../__pycache__/index.cpython-311.pyc | Bin 7789 -> 0 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 4442 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 35371 -> 0 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 17503 -> 0 bytes .../__pycache__/search.cpython-311.pyc | Bin 8948 -> 0 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 11291 -> 0 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 5142 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 9948 -> 0 bytes .../pip/_internal/commands/cache.py | 223 - .../pip/_internal/commands/check.py | 53 - .../pip/_internal/commands/completion.py | 126 - .../pip/_internal/commands/configuration.py | 282 - .../pip/_internal/commands/debug.py | 199 - .../pip/_internal/commands/download.py | 149 - .../pip/_internal/commands/freeze.py | 97 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 139 - .../pip/_internal/commands/inspect.py | 92 - .../pip/_internal/commands/install.py | 873 -- .../pip/_internal/commands/list.py | 367 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 189 - .../pip/_internal/commands/uninstall.py | 113 - .../pip/_internal/commands/wheel.py | 203 - .../pip/_internal/configuration.py | 374 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-311.pyc | Bin 1034 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 2406 -> 0 bytes .../__pycache__/installed.cpython-311.pyc | Bin 1543 -> 0 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 8945 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 2137 -> 0 bytes .../pip/_internal/distributions/base.py | 39 - .../pip/_internal/distributions/installed.py | 23 - .../pip/_internal/distributions/sdist.py | 150 - .../pip/_internal/distributions/wheel.py | 34 - .../site-packages/pip/_internal/exceptions.py | 747 -- .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 238 -> 0 bytes .../__pycache__/collector.cpython-311.pyc | Bin 24544 -> 0 bytes .../package_finder.cpython-311.pyc | Bin 44216 -> 0 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 11020 -> 0 bytes .../pip/_internal/index/collector.py | 505 - .../pip/_internal/index/package_finder.py | 1029 -- .../pip/_internal/index/sources.py | 224 - .../pip/_internal/locations/__init__.py | 467 - .../__pycache__/__init__.cpython-311.pyc | Bin 18176 -> 0 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 7585 -> 0 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 8880 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 4001 -> 0 bytes .../pip/_internal/locations/_distutils.py | 173 - .../pip/_internal/locations/_sysconfig.py | 213 - .../pip/_internal/locations/base.py | 81 - .../site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 127 - .../__pycache__/__init__.cpython-311.pyc | Bin 6409 -> 0 bytes .../__pycache__/_json.cpython-311.pyc | Bin 3563 -> 0 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 38008 -> 0 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 16856 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 688 -- .../_internal/metadata/importlib/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 355 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 3562 -> 0 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 14578 -> 0 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 12416 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 55 - .../_internal/metadata/importlib/_dists.py | 224 - .../pip/_internal/metadata/importlib/_envs.py | 188 - .../pip/_internal/metadata/pkg_resources.py | 270 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 272 -> 0 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 2091 -> 0 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 12254 -> 0 bytes .../format_control.cpython-311.pyc | Bin 4655 -> 0 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 1897 -> 0 bytes .../installation_report.cpython-311.pyc | Bin 2611 -> 0 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 26443 -> 0 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 1263 -> 0 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 5826 -> 0 bytes .../selection_prefs.cpython-311.pyc | Bin 1994 -> 0 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 4756 -> 0 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 6419 -> 0 bytes .../pip/_internal/models/candidate.py | 34 - .../pip/_internal/models/direct_url.py | 228 - .../pip/_internal/models/format_control.py | 80 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 53 - .../pip/_internal/models/link.py | 524 - .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 133 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 110 - .../pip/_internal/models/wheel.py | 92 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 260 -> 0 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 19064 -> 0 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 5183 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 9575 -> 0 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 13021 -> 0 bytes .../__pycache__/session.cpython-311.pyc | Bin 21288 -> 0 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 2409 -> 0 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 3188 -> 0 bytes .../pip/_internal/network/auth.py | 446 - .../pip/_internal/network/cache.py | 69 - .../pip/_internal/network/download.py | 186 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 518 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 60 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 198 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 6631 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 11594 -> 0 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 26378 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 204 -> 0 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 8127 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 2275 -> 0 bytes .../metadata_editable.cpython-311.pyc | Bin 2311 -> 0 bytes .../metadata_legacy.cpython-311.pyc | Bin 3711 -> 0 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 1941 -> 0 bytes .../wheel_editable.cpython-311.pyc | Bin 2385 -> 0 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 4492 -> 0 bytes .../operations/build/build_tracker.py | 124 - .../_internal/operations/build/metadata.py | 39 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 149 - .../pip/_internal/operations/freeze.py | 254 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 272 -> 0 bytes .../editable_legacy.cpython-311.pyc | Bin 2268 -> 0 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 6108 -> 0 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 39994 -> 0 bytes .../operations/install/editable_legacy.py | 47 - .../_internal/operations/install/legacy.py | 120 - .../pip/_internal/operations/install/wheel.py | 738 -- .../pip/_internal/operations/prepare.py | 667 -- .../site-packages/pip/_internal/pyproject.py | 174 - .../pip/_internal/req/__init__.py | 94 - .../req/__pycache__/__init__.cpython-311.pyc | Bin 4444 -> 0 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 20703 -> 0 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 22432 -> 0 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 40344 -> 0 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 6000 -> 0 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 36998 -> 0 bytes .../pip/_internal/req/constructors.py | 501 - .../pip/_internal/req/req_file.py | 544 - .../pip/_internal/req/req_install.py | 946 -- .../pip/_internal/req/req_set.py | 82 - .../pip/_internal/req/req_uninstall.py | 640 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 198 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 1369 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 205 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 23791 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 600 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 209 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 9622 -> 0 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 28832 -> 0 bytes .../__pycache__/factory.cpython-311.pyc | Bin 31976 -> 0 bytes .../found_candidates.cpython-311.pyc | Bin 6757 -> 0 bytes .../__pycache__/provider.cpython-311.pyc | Bin 11051 -> 0 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 4654 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 11119 -> 0 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 12306 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 556 -- .../resolution/resolvelib/factory.py | 731 -- .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 248 - .../resolution/resolvelib/reporter.py | 68 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 296 - .../pip/_internal/self_outdated_check.py | 242 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 193 -> 0 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 2014 -> 0 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 2552 -> 0 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 2260 -> 0 bytes .../compatibility_tags.cpython-311.pyc | Bin 6752 -> 0 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 710 -> 0 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 7083 -> 0 bytes .../direct_url_helpers.cpython-311.pyc | Bin 3716 -> 0 bytes .../distutils_args.cpython-311.pyc | Bin 1460 -> 0 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 3231 -> 0 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 2316 -> 0 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 4238 -> 0 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 8223 -> 0 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 1309 -> 0 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 2552 -> 0 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 8330 -> 0 bytes .../inject_securetransport.cpython-311.pyc | Bin 1327 -> 0 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 15452 -> 0 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 37694 -> 0 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 2933 -> 0 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 2800 -> 0 bytes .../setuptools_build.cpython-311.pyc | Bin 6097 -> 0 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 9887 -> 0 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 11414 -> 0 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 12889 -> 0 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 2686 -> 0 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 4933 -> 0 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 7103 -> 0 bytes .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 188 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/distutils_args.py | 43 - .../pip/_internal/utils/egg_link.py | 72 - .../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 | 144 - .../_internal/utils/inject_securetransport.py | 35 - .../pip/_internal/utils/logging.py | 348 - .../site-packages/pip/_internal/utils/misc.py | 763 -- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 195 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 246 - .../pip/_internal/utils/unpacking.py | 257 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 136 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 628 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 5853 -> 0 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 21517 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 8699 -> 0 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 14596 -> 0 bytes .../versioncontrol.cpython-311.pyc | Bin 31865 -> 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 | 382 - .../site-packages/pip/_vendor/__init__.py | 120 - .../__pycache__/__init__.cpython-311.pyc | Bin 5606 -> 0 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 46408 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 97438 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 - .../__pycache__/__init__.cpython-311.pyc | Bin 835 -> 0 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 2690 -> 0 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 5497 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 3771 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1128 -> 0 bytes .../__pycache__/controller.cpython-311.pyc | Bin 16443 -> 0 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 4230 -> 0 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 6675 -> 0 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 8390 -> 0 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 956 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 - .../pip/_vendor/cachecontrol/adapter.py | 137 - .../pip/_vendor/cachecontrol/cache.py | 65 - .../_vendor/cachecontrol/caches/__init__.py | 9 - .../__pycache__/__init__.cpython-311.pyc | Bin 410 -> 0 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 8393 -> 0 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 2490 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 188 - .../cachecontrol/caches/redis_cache.py | 39 - .../pip/_vendor/cachecontrol/compat.py | 32 - .../pip/_vendor/cachecontrol/controller.py | 439 - .../pip/_vendor/cachecontrol/filewrapper.py | 111 - .../pip/_vendor/cachecontrol/heuristics.py | 139 - .../pip/_vendor/cachecontrol/serialize.py | 190 - .../pip/_vendor/cachecontrol/wrapper.py | 33 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 335 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 736 -> 0 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 3978 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4527 --------- .../site-packages/pip/_vendor/certifi/core.py | 119 - .../pip/_vendor/chardet/__init__.py | 115 - .../__pycache__/__init__.cpython-311.pyc | Bin 5067 -> 0 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 27197 -> 0 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 1672 -> 0 bytes .../chardistribution.cpython-311.pyc | Bin 11264 -> 0 bytes .../charsetgroupprober.cpython-311.pyc | Bin 4294 -> 0 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 5540 -> 0 bytes .../codingstatemachine.cpython-311.pyc | Bin 3991 -> 0 bytes .../codingstatemachinedict.cpython-311.pyc | Bin 947 -> 0 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 1681 -> 0 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 3382 -> 0 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 4898 -> 0 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 12637 -> 0 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 4724 -> 0 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 12080 -> 0 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 1673 -> 0 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 27202 -> 0 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 1673 -> 0 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 19124 -> 0 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 1688 -> 0 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 5677 -> 0 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 22153 -> 0 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 84657 -> 0 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 1679 -> 0 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 40161 -> 0 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 85831 -> 0 bytes .../langgreekmodel.cpython-311.pyc | Bin 79253 -> 0 bytes .../langhebrewmodel.cpython-311.pyc | Bin 80015 -> 0 bytes .../langhungarianmodel.cpython-311.pyc | Bin 85785 -> 0 bytes .../langrussianmodel.cpython-311.pyc | Bin 108732 -> 0 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 80193 -> 0 bytes .../langturkishmodel.cpython-311.pyc | Bin 80032 -> 0 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 7328 -> 0 bytes .../macromanprober.cpython-311.pyc | Bin 7495 -> 0 bytes .../mbcharsetprober.cpython-311.pyc | Bin 4116 -> 0 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 1986 -> 0 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 31726 -> 0 bytes .../__pycache__/resultdict.cpython-311.pyc | Bin 765 -> 0 bytes .../sbcharsetprober.cpython-311.pyc | Bin 6391 -> 0 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 2936 -> 0 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 4829 -> 0 bytes .../universaldetector.cpython-311.pyc | Bin 12457 -> 0 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 10577 -> 0 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 3464 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 500 -> 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-311.pyc | Bin 197 -> 0 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 4336 -> 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-311.pyc | Bin 202 -> 0 bytes .../__pycache__/languages.cpython-311.pyc | Bin 10802 -> 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-311.pyc | Bin 569 -> 0 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 4567 -> 0 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 16213 -> 0 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 3930 -> 0 bytes .../__pycache__/win32.cpython-311.pyc | Bin 7918 -> 0 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 9144 -> 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-311.pyc | Bin 200 -> 0 bytes .../__pycache__/ansi_test.cpython-311.pyc | Bin 5845 -> 0 bytes .../ansitowin32_test.cpython-311.pyc | Bin 21512 -> 0 bytes .../initialise_test.cpython-311.pyc | Bin 14139 -> 0 bytes .../__pycache__/isatty_test.cpython-311.pyc | Bin 6704 -> 0 bytes .../tests/__pycache__/utils.cpython-311.pyc | Bin 2879 -> 0 bytes .../__pycache__/winterm_test.cpython-311.pyc | Bin 7232 -> 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 | 23 - .../__pycache__/__init__.cpython-311.pyc | Bin 1438 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 52304 -> 0 bytes .../__pycache__/database.cpython-311.pyc | Bin 72092 -> 0 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 26681 -> 0 bytes .../__pycache__/locators.cpython-311.pyc | Bin 65857 -> 0 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 17024 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 8160 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 47108 -> 0 bytes .../__pycache__/resources.cpython-311.pyc | Bin 18987 -> 0 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 21263 -> 0 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 97442 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 34569 -> 0 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 60373 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1116 --- .../pip/_vendor/distlib/database.py | 1350 --- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1300 --- .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 152 - .../pip/_vendor/distlib/metadata.py | 1076 -- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 437 - .../site-packages/pip/_vendor/distlib/util.py | 1932 ---- .../pip/_vendor/distlib/version.py | 739 -- .../pip/_vendor/distlib/wheel.py | 1082 -- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 1191 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 325 -> 0 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 57724 -> 0 bytes .../pip/_vendor/distro/distro.py | 1399 --- .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1092 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 5383 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 1009 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 19444 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 38968 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2977 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 212 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 163192 -> 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-311.pyc | Bin 2071 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 2372 -> 0 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 9158 -> 0 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 47185 -> 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-311.pyc | Bin 636 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 557 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13223 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 7991 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3679 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16519 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7634 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34357 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21342 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6677 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21869 -> 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 | 3296 ------ .../__pycache__/__init__.cpython-311.pyc | Bin 158225 -> 0 bytes .../__pycache__/py31compat.cpython-311.pyc | Bin 978 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/platformdirs/__init__.py | 342 - .../pip/_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-311.pyc | Bin 12924 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2121 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 6351 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 7178 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 4588 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11020 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 307 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 9956 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 120 - .../pip/_vendor/platformdirs/api.py | 156 - .../pip/_vendor/platformdirs/macos.py | 64 - .../pip/_vendor/platformdirs/unix.py | 181 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 184 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-311.pyc | Bin 3839 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 775 -> 0 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 30286 -> 0 bytes .../__pycache__/console.cpython-311.pyc | Bin 3038 -> 0 bytes .../__pycache__/filter.cpython-311.pyc | Bin 3499 -> 0 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 3865 -> 0 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 40393 -> 0 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 1718 -> 0 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 3731 -> 0 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 5025 -> 0 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 4880 -> 0 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 8311 -> 0 bytes .../__pycache__/style.cpython-311.pyc | Bin 7419 -> 0 bytes .../__pycache__/token.cpython-311.pyc | Bin 7459 -> 0 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 33793 -> 0 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 14586 -> 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-311.pyc | Bin 40099 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 94 - .../_vendor/pygments/formatters/__init__.py | 143 - .../__pycache__/__init__.cpython-311.pyc | Bin 6865 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 4147 -> 0 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 4473 -> 0 bytes .../__pycache__/groff.cpython-311.pyc | Bin 7806 -> 0 bytes .../__pycache__/html.cpython-311.pyc | Bin 42591 -> 0 bytes .../__pycache__/img.cpython-311.pyc | Bin 28563 -> 0 bytes .../__pycache__/irc.cpython-311.pyc | Bin 7666 -> 0 bytes .../__pycache__/latex.cpython-311.pyc | Bin 21799 -> 0 bytes .../__pycache__/other.cpython-311.pyc | Bin 7627 -> 0 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 3171 -> 0 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 6838 -> 0 bytes .../__pycache__/svg.cpython-311.pyc | Bin 9658 -> 0 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 6037 -> 0 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 16403 -> 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 | 179 - .../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 | 882 -- .../pip/_vendor/pygments/lexers/__init__.py | 335 - .../__pycache__/__init__.cpython-311.pyc | Bin 15142 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 62773 -> 0 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 43974 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 541 - .../pip/_vendor/pygments/lexers/python.py | 1204 --- .../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 | 155 - .../pip/_vendor/pygments/style.py | 197 - .../pip/_vendor/pygments/styles/__init__.py | 97 - .../__pycache__/__init__.cpython-311.pyc | Bin 4452 -> 0 bytes .../pip/_vendor/pygments/token.py | 213 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 308 - .../pip/_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8342 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8456 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14778 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277664 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12920 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53621 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36304 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19500 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15358 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14257 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 207 - .../pip/_vendor/pyparsing/common.py | 424 - .../pip/_vendor/pyparsing/core.py | 5814 ----------- .../pip/_vendor/pyparsing/diagram/__init__.py | 642 -- .../__pycache__/__init__.cpython-311.pyc | Bin 28023 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 - .../pip/_vendor/pyparsing/helpers.py | 1088 -- .../pip/_vendor/pyparsing/results.py | 760 -- .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 352 - .../pip/_vendor/pyparsing/util.py | 235 - .../pip/_vendor/pyproject_hooks/__init__.py | 23 - .../__pycache__/__init__.cpython-311.pyc | Bin 700 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 398 -> 0 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 16664 -> 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-311.pyc | Bin 1160 -> 0 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 16482 -> 0 bytes .../_in_process/_in_process.py | 353 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-311.pyc | Bin 6444 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 581 -> 0 bytes .../_internal_utils.cpython-311.pyc | Bin 2078 -> 0 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 24881 -> 0 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 7426 -> 0 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 14625 -> 0 bytes .../__pycache__/certs.cpython-311.pyc | Bin 977 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 1803 -> 0 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 27105 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8520 -> 0 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4515 -> 0 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1245 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 38776 -> 0 bytes .../__pycache__/packages.cpython-311.pyc | Bin 825 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 29614 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6232 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 6217 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 40131 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 48 - .../pip/_vendor/requests/adapters.py | 584 -- .../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 | 831 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1086 -- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-311.pyc | Bin 748 -> 0 bytes .../__pycache__/providers.cpython-311.pyc | Bin 7067 -> 0 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 2797 -> 0 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 25243 -> 0 bytes .../__pycache__/structs.cpython-311.pyc | Bin 11325 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 203 -> 0 bytes .../collections_abc.cpython-311.pyc | Bin 478 -> 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 | 482 - .../pip/_vendor/resolvelib/structs.py | 165 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 274 - .../rich/__pycache__/__init__.cpython-311.pyc | Bin 7491 -> 0 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 11569 -> 0 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 7830 -> 0 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 208517 -> 0 bytes .../_emoji_replace.cpython-311.pyc | Bin 1929 -> 0 bytes .../_export_format.cpython-311.pyc | Bin 2334 -> 0 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 630 -> 0 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 14182 -> 0 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 4764 -> 0 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 2110 -> 0 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 4675 -> 0 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 5246 -> 0 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 791 -> 0 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 7929 -> 0 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 13679 -> 0 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 1125 -> 0 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 978 -> 0 bytes .../_win32_console.cpython-311.pyc | Bin 30166 -> 0 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 2825 -> 0 bytes .../_windows_renderer.cpython-311.pyc | Bin 4016 -> 0 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 2781 -> 0 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 1922 -> 0 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 13471 -> 0 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 10447 -> 0 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 4544 -> 0 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 12986 -> 0 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 6436 -> 0 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 27567 -> 0 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 1870 -> 0 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 10641 -> 0 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 123157 -> 0 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 2462 -> 0 bytes .../__pycache__/containers.cpython-311.pyc | Bin 10803 -> 0 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 11894 -> 0 bytes .../default_styles.cpython-311.pyc | Bin 12494 -> 0 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 1817 -> 0 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 4795 -> 0 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 2326 -> 0 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 3774 -> 0 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 3298 -> 0 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 10985 -> 0 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 6678 -> 0 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 6401 -> 0 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 23308 -> 0 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 21129 -> 0 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 5142 -> 0 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 14513 -> 0 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 10435 -> 0 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 7268 -> 0 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 7484 -> 0 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 2242 -> 0 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 5975 -> 0 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 12731 -> 0 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 44824 -> 0 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 82703 -> 0 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 11009 -> 0 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 16375 -> 0 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 2093 -> 0 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 656 -> 0 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 7655 -> 0 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 7694 -> 0 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 4348 -> 0 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 2771 -> 0 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 31538 -> 0 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 6887 -> 0 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 6755 -> 0 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 34328 -> 0 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 2436 -> 0 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 42530 -> 0 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 48797 -> 0 bytes .../terminal_theme.cpython-311.pyc | Bin 3702 -> 0 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 65213 -> 0 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 7140 -> 0 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 352 -> 0 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 31666 -> 0 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 12523 -> 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 | 78 - .../pip/_vendor/rich/_extension.py | 10 - .../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 | 83 - .../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 | 237 - .../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 | 618 -- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2612 ----- .../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 | 188 - .../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 | 54 - .../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 | 373 - .../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 | 1029 -- .../pip/_vendor/rich/progress.py | 1707 ---- .../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 | 134 - .../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 | 136 - .../site-packages/pip/_vendor/rich/status.py | 132 - .../site-packages/pip/_vendor/rich/style.py | 773 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 945 -- .../site-packages/pip/_vendor/rich/table.py | 1002 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1311 --- .../site-packages/pip/_vendor/rich/theme.py | 112 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 677 -- .../site-packages/pip/_vendor/rich/tree.py | 251 - .../site-packages/pip/_vendor/six.py | 998 -- .../pip/_vendor/tenacity/__init__.py | 519 - .../__pycache__/__init__.cpython-311.pyc | Bin 27790 -> 0 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 4797 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 2062 -> 0 bytes .../__pycache__/after.cpython-311.pyc | Bin 1689 -> 0 bytes .../__pycache__/before.cpython-311.pyc | Bin 1523 -> 0 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 2100 -> 0 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 1562 -> 0 bytes .../__pycache__/retry.cpython-311.pyc | Bin 15036 -> 0 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 5890 -> 0 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 2908 -> 0 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 13362 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 - .../pip/_vendor/tenacity/_utils.py | 68 - .../pip/_vendor/tenacity/after.py | 46 - .../pip/_vendor/tenacity/before.py | 41 - .../pip/_vendor/tenacity/before_sleep.py | 58 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 240 - .../pip/_vendor/tenacity/stop.py | 96 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 232 - .../pip/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-311.pyc | Bin 407 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30846 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4486 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 399 -> 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/typing_extensions.py | 2209 ---- .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-311.pyc | Bin 3705 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 18293 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 215 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 21889 -> 0 bytes .../connectionpool.cpython-311.pyc | Bin 37632 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 16119 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 11412 -> 0 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 4493 -> 0 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 21816 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 6656 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 36539 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 567 -- .../pip/_vendor/urllib3/connectionpool.py | 1110 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 201 -> 0 bytes .../_appengine_environ.cpython-311.pyc | Bin 1940 -> 0 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 12147 -> 0 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 6224 -> 0 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 25733 -> 0 bytes .../securetransport.cpython-311.pyc | Bin 36840 -> 0 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8085 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 218 -> 0 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 16965 -> 0 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 15602 -> 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-311.pyc | Bin 202 -> 0 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 46444 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 212 -> 0 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 1959 -> 0 bytes .../urllib3/packages/backports/makefile.py | 51 - .../pip/_vendor/urllib3/packages/six.py | 1076 -- .../pip/_vendor/urllib3/poolmanager.py | 537 - .../pip/_vendor/urllib3/request.py | 170 - .../pip/_vendor/urllib3/response.py | 879 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-311.pyc | Bin 1404 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5131 -> 0 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1713 -> 0 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 1496 -> 0 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 4616 -> 0 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3485 -> 0 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 22753 -> 0 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 16816 -> 0 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 5795 -> 0 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 11624 -> 0 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 11032 -> 0 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 17556 -> 0 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 4998 -> 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 | 620 -- .../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 | 268 - .../pip/_vendor/urllib3/util/url.py | 435 - .../pip/_vendor/urllib3/util/wait.py | 152 - .../site-packages/pip/_vendor/vendor.txt | 23 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-311.pyc | Bin 12878 -> 0 bytes .../__pycache__/labels.cpython-311.pyc | Bin 7278 -> 0 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 3206 -> 0 bytes .../__pycache__/tests.cpython-311.pyc | Bin 11184 -> 0 bytes .../x_user_defined.cpython-311.pyc | Bin 3558 -> 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.11/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3282 ------ .../__pycache__/__init__.cpython-311.pyc | Bin 156109 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 195 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 97412 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 15988 -> 0 bytes .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 829 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10746 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 4273 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5558 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1391 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6489 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 7490 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8364 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6386 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 104 - .../_vendor/importlib_resources/_compat.py | 98 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 121 - .../_vendor/importlib_resources/abc.py | 137 - .../_vendor/importlib_resources/readers.py | 122 - .../_vendor/importlib_resources/simple.py | 116 - .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 202 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 10977 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20288 -> 0 bytes .../pkg_resources/_vendor/jaraco/context.py | 253 - .../pkg_resources/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26605 -> 0 bytes .../_vendor/more_itertools/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 374 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 169496 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 33516 -> 0 bytes .../_vendor/more_itertools/more.py | 4346 -------- .../_vendor/more_itertools/recipes.py | 841 -- .../_vendor/packaging/__about__.py | 26 - .../_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-311.pyc | Bin 646 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 567 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13233 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 8001 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3689 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16538 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7653 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34367 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21352 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6687 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21879 -> 0 bytes .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 61 - .../_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 802 -- .../pkg_resources/_vendor/packaging/tags.py | 487 - .../pkg_resources/_vendor/packaging/utils.py | 136 - .../_vendor/packaging/version.py | 504 - .../_vendor/platformdirs/__init__.py | 342 - .../_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-311.pyc | Bin 12827 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2119 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 6361 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 7188 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 4598 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 11030 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 317 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 9966 -> 0 bytes .../_vendor/platformdirs/android.py | 120 - .../pkg_resources/_vendor/platformdirs/api.py | 156 - .../_vendor/platformdirs/macos.py | 64 - .../_vendor/platformdirs/unix.py | 181 - .../_vendor/platformdirs/version.py | 4 - .../_vendor/platformdirs/windows.py | 184 - .../_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8340 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8466 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14788 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277640 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12930 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53631 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36314 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19510 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15368 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14267 -> 0 bytes .../_vendor/pyparsing/actions.py | 207 - .../pkg_resources/_vendor/pyparsing/common.py | 424 - .../pkg_resources/_vendor/pyparsing/core.py | 5814 ----------- .../_vendor/pyparsing/diagram/__init__.py | 642 -- .../__pycache__/__init__.cpython-311.pyc | Bin 28003 -> 0 bytes .../_vendor/pyparsing/exceptions.py | 267 - .../_vendor/pyparsing/helpers.py | 1088 -- .../_vendor/pyparsing/results.py | 760 -- .../_vendor/pyparsing/testing.py | 331 - .../_vendor/pyparsing/unicode.py | 352 - .../pkg_resources/_vendor/pyparsing/util.py | 235 - .../_vendor/typing_extensions.py | 2209 ---- .../pkg_resources/_vendor/zipp.py | 329 - .../pkg_resources/extern/__init__.py | 81 - .../__pycache__/__init__.cpython-311.pyc | Bin 4318 -> 0 bytes .../python_dotenv-1.1.0.dist-info/INSTALLER | 1 - .../python_dotenv-1.1.0.dist-info/METADATA | 720 -- .../python_dotenv-1.1.0.dist-info/RECORD | 26 - .../python_dotenv-1.1.0.dist-info/REQUESTED | 0 .../python_dotenv-1.1.0.dist-info/WHEEL | 5 - .../entry_points.txt | 2 - .../licenses/LICENSE | 27 - .../top_level.txt | 1 - .../python_slugify-8.0.4.dist-info/INSTALLER | 1 - .../python_slugify-8.0.4.dist-info/LICENSE | 21 - .../python_slugify-8.0.4.dist-info/METADATA | 246 - .../python_slugify-8.0.4.dist-info/RECORD | 20 - .../python_slugify-8.0.4.dist-info/REQUESTED | 0 .../python_slugify-8.0.4.dist-info/WHEEL | 6 - .../entry_points.txt | 2 - .../top_level.txt | 1 - .../requests-2.32.5.dist-info/INSTALLER | 1 - .../requests-2.32.5.dist-info/METADATA | 133 - .../requests-2.32.5.dist-info/RECORD | 43 - .../requests-2.32.5.dist-info/REQUESTED | 0 .../requests-2.32.5.dist-info/WHEEL | 5 - .../licenses/LICENSE | 175 - .../requests-2.32.5.dist-info/top_level.txt | 1 - .../site-packages/requests/__init__.py | 184 - .../__pycache__/__init__.cpython-311.pyc | Bin 6366 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 569 -> 0 bytes .../_internal_utils.cpython-311.pyc | Bin 2133 -> 0 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 30018 -> 0 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 7486 -> 0 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 14613 -> 0 bytes .../__pycache__/certs.cpython-311.pyc | Bin 703 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 2790 -> 0 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 27123 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 9054 -> 0 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4520 -> 0 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1233 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 38815 -> 0 bytes .../__pycache__/packages.cpython-311.pyc | Bin 1156 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 29809 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6292 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 6205 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 40261 -> 0 bytes .../site-packages/requests/__version__.py | 14 - .../site-packages/requests/_internal_utils.py | 50 - .../site-packages/requests/adapters.py | 696 -- .../python3.11/site-packages/requests/api.py | 157 - .../python3.11/site-packages/requests/auth.py | 314 - .../site-packages/requests/certs.py | 17 - .../site-packages/requests/compat.py | 106 - .../site-packages/requests/cookies.py | 561 -- .../site-packages/requests/exceptions.py | 151 - .../python3.11/site-packages/requests/help.py | 134 - .../site-packages/requests/hooks.py | 33 - .../site-packages/requests/models.py | 1039 -- .../site-packages/requests/packages.py | 23 - .../site-packages/requests/sessions.py | 831 -- .../site-packages/requests/status_codes.py | 128 - .../site-packages/requests/structures.py | 99 - .../site-packages/requests/utils.py | 1086 -- .../setuptools-66.1.1.dist-info/INSTALLER | 1 - .../setuptools-66.1.1.dist-info/LICENSE | 19 - .../setuptools-66.1.1.dist-info/METADATA | 137 - .../setuptools-66.1.1.dist-info/RECORD | 484 - .../setuptools-66.1.1.dist-info/REQUESTED | 0 .../setuptools-66.1.1.dist-info/WHEEL | 5 - .../entry_points.txt | 57 - .../setuptools-66.1.1.dist-info/top_level.txt | 4 - .../site-packages/setuptools/__init__.py | 268 - .../__pycache__/__init__.cpython-311.pyc | Bin 13923 -> 0 bytes .../_deprecation_warning.cpython-311.pyc | Bin 639 -> 0 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 5196 -> 0 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 3652 -> 0 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 1952 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1151 -> 0 bytes .../__pycache__/_path.cpython-311.pyc | Bin 1472 -> 0 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 1133 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10161 -> 0 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 28144 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 1287 -> 0 bytes .../__pycache__/depends.cpython-311.pyc | Bin 7972 -> 0 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 31125 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 63792 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 2948 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 6804 -> 0 bytes .../__pycache__/glob.cpython-311.pyc | Bin 6561 -> 0 bytes .../__pycache__/installer.cpython-311.pyc | Bin 5611 -> 0 bytes .../__pycache__/launch.cpython-311.pyc | Bin 1527 -> 0 bytes .../__pycache__/logging.cpython-311.pyc | Bin 2094 -> 0 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 7004 -> 0 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 64177 -> 0 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 5659 -> 0 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 61932 -> 0 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 714 -> 0 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 27330 -> 0 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 1816 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 434 -> 0 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 15490 -> 0 bytes .../windows_support.cpython-311.pyc | Bin 1431 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 14 - .../__pycache__/__init__.cpython-311.pyc | Bin 558 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 8528 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 860 -> 0 bytes .../__pycache__/_log.cpython-311.pyc | Bin 277 -> 0 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 569 -> 0 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 25071 -> 0 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 10619 -> 0 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 13445 -> 0 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 46314 -> 0 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 18838 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 6039 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 9929 -> 0 bytes .../cygwinccompiler.cpython-311.pyc | Bin 13623 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 321 -> 0 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 3983 -> 0 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 10364 -> 0 bytes .../__pycache__/dist.cpython-311.pyc | Bin 55487 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 6794 -> 0 bytes .../__pycache__/extension.cpython-311.pyc | Bin 10175 -> 0 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 17234 -> 0 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 10668 -> 0 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 17608 -> 0 bytes .../__pycache__/log.cpython-311.pyc | Bin 2692 -> 0 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 33557 -> 0 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 26969 -> 0 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 621 -> 0 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 989 -> 0 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 4433 -> 0 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 22070 -> 0 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 11270 -> 0 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 16493 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 20844 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 11346 -> 0 bytes .../versionpredicate.cpython-311.pyc | Bin 7623 -> 0 bytes .../setuptools/_distutils/_collections.py | 194 - .../setuptools/_distutils/_functools.py | 20 - .../setuptools/_distutils/_log.py | 4 - .../setuptools/_distutils/_macos_compat.py | 12 - .../setuptools/_distutils/_msvccompiler.py | 572 -- .../setuptools/_distutils/archive_util.py | 280 - .../setuptools/_distutils/bcppcompiler.py | 408 - .../setuptools/_distutils/ccompiler.py | 1220 --- .../setuptools/_distutils/cmd.py | 435 - .../setuptools/_distutils/command/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 541 -> 0 bytes .../_framework_compat.cpython-311.pyc | Bin 2782 -> 0 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 6000 -> 0 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 5720 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 23254 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 6055 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 7763 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 30273 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 17599 -> 0 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 7853 -> 0 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 7509 -> 0 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 3185 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 16222 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 29374 -> 0 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 3762 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 5217 -> 0 bytes .../install_headers.cpython-311.pyc | Bin 2350 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 8671 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 3157 -> 0 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 1538 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 15556 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 23768 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 10422 -> 0 bytes .../_distutils/command/_framework_compat.py | 55 - .../setuptools/_distutils/command/bdist.py | 157 - .../_distutils/command/bdist_dumb.py | 144 - .../_distutils/command/bdist_rpm.py | 615 -- .../setuptools/_distutils/command/build.py | 153 - .../_distutils/command/build_clib.py | 208 - .../_distutils/command/build_ext.py | 789 -- .../setuptools/_distutils/command/build_py.py | 407 - .../_distutils/command/build_scripts.py | 173 - .../setuptools/_distutils/command/check.py | 151 - .../setuptools/_distutils/command/clean.py | 76 - .../setuptools/_distutils/command/config.py | 377 - .../setuptools/_distutils/command/install.py | 814 -- .../_distutils/command/install_data.py | 84 - .../_distutils/command/install_egg_info.py | 92 - .../_distutils/command/install_headers.py | 45 - .../_distutils/command/install_lib.py | 238 - .../_distutils/command/install_scripts.py | 61 - .../_distutils/command/py37compat.py | 31 - .../setuptools/_distutils/command/register.py | 321 - .../setuptools/_distutils/command/sdist.py | 531 - .../setuptools/_distutils/command/upload.py | 207 - .../setuptools/_distutils/config.py | 139 - .../setuptools/_distutils/core.py | 291 - .../setuptools/_distutils/cygwinccompiler.py | 358 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 96 - .../setuptools/_distutils/dir_util.py | 243 - .../setuptools/_distutils/dist.py | 1287 --- .../setuptools/_distutils/errors.py | 127 - .../setuptools/_distutils/extension.py | 248 - .../setuptools/_distutils/fancy_getopt.py | 470 - .../setuptools/_distutils/file_util.py | 249 - .../setuptools/_distutils/filelist.py | 371 - .../setuptools/_distutils/log.py | 57 - .../setuptools/_distutils/msvc9compiler.py | 832 -- .../setuptools/_distutils/msvccompiler.py | 695 -- .../setuptools/_distutils/py38compat.py | 8 - .../setuptools/_distutils/py39compat.py | 22 - .../setuptools/_distutils/spawn.py | 109 - .../setuptools/_distutils/sysconfig.py | 552 - .../setuptools/_distutils/text_file.py | 287 - .../setuptools/_distutils/unixccompiler.py | 401 - .../setuptools/_distutils/util.py | 513 - .../setuptools/_distutils/version.py | 358 - .../setuptools/_distutils/versionpredicate.py | 175 - .../site-packages/setuptools/_entry_points.py | 94 - .../site-packages/setuptools/_imp.py | 82 - .../site-packages/setuptools/_importlib.py | 47 - .../site-packages/setuptools/_itertools.py | 23 - .../site-packages/setuptools/_path.py | 29 - .../site-packages/setuptools/_reqs.py | 19 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 192 -> 0 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 21778 -> 0 bytes .../typing_extensions.cpython-311.pyc | Bin 107609 -> 0 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 15985 -> 0 bytes .../_vendor/importlib_metadata/__init__.py | 1047 -- .../__pycache__/__init__.cpython-311.pyc | Bin 58231 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 3844 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 2191 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 2713 -> 0 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 3631 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 2594 -> 0 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 2998 -> 0 bytes .../__pycache__/_text.cpython-311.pyc | Bin 4389 -> 0 bytes .../_vendor/importlib_metadata/_adapters.py | 68 - .../importlib_metadata/_collections.py | 30 - .../_vendor/importlib_metadata/_compat.py | 71 - .../_vendor/importlib_metadata/_functools.py | 104 - .../_vendor/importlib_metadata/_itertools.py | 73 - .../_vendor/importlib_metadata/_meta.py | 48 - .../_vendor/importlib_metadata/_text.py | 99 - .../_vendor/importlib_resources/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 826 -> 0 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 10743 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 4270 -> 0 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 5555 -> 0 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 1388 -> 0 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 6486 -> 0 bytes .../__pycache__/abc.cpython-311.pyc | Bin 7487 -> 0 bytes .../__pycache__/readers.cpython-311.pyc | Bin 8361 -> 0 bytes .../__pycache__/simple.cpython-311.pyc | Bin 6383 -> 0 bytes .../_vendor/importlib_resources/_adapters.py | 170 - .../_vendor/importlib_resources/_common.py | 104 - .../_vendor/importlib_resources/_compat.py | 98 - .../_vendor/importlib_resources/_itertools.py | 35 - .../_vendor/importlib_resources/_legacy.py | 121 - .../_vendor/importlib_resources/abc.py | 137 - .../_vendor/importlib_resources/readers.py | 122 - .../_vendor/importlib_resources/simple.py | 116 - .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 199 -> 0 bytes .../__pycache__/context.cpython-311.pyc | Bin 10974 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 20279 -> 0 bytes .../setuptools/_vendor/jaraco/context.py | 253 - .../setuptools/_vendor/jaraco/functools.py | 525 - .../_vendor/jaraco/text/__init__.py | 599 -- .../text/__pycache__/__init__.cpython-311.pyc | Bin 26593 -> 0 bytes .../_vendor/more_itertools/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 292 -> 0 bytes .../__pycache__/more.cpython-311.pyc | Bin 149179 -> 0 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 23761 -> 0 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 ------- .../_vendor/more_itertools/recipes.py | 620 -- .../setuptools/_vendor/ordered_set.py | 488 - .../setuptools/_vendor/packaging/__about__.py | 26 - .../setuptools/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-311.pyc | Bin 643 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 564 -> 0 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 13230 -> 0 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 7998 -> 0 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 3686 -> 0 bytes .../__pycache__/markers.cpython-311.pyc | Bin 16532 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 7647 -> 0 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 34364 -> 0 bytes .../__pycache__/tags.cpython-311.pyc | Bin 21349 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 6684 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 21876 -> 0 bytes .../_vendor/packaging/_manylinux.py | 301 - .../_vendor/packaging/_musllinux.py | 136 - .../_vendor/packaging/_structures.py | 61 - .../setuptools/_vendor/packaging/markers.py | 304 - .../_vendor/packaging/requirements.py | 146 - .../_vendor/packaging/specifiers.py | 802 -- .../setuptools/_vendor/packaging/tags.py | 487 - .../setuptools/_vendor/packaging/utils.py | 136 - .../setuptools/_vendor/packaging/version.py | 504 - .../setuptools/_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-311.pyc | Bin 8337 -> 0 bytes .../__pycache__/actions.cpython-311.pyc | Bin 8463 -> 0 bytes .../__pycache__/common.cpython-311.pyc | Bin 14785 -> 0 bytes .../__pycache__/core.cpython-311.pyc | Bin 277637 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 12927 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 53628 -> 0 bytes .../__pycache__/results.cpython-311.pyc | Bin 36311 -> 0 bytes .../__pycache__/testing.cpython-311.pyc | Bin 19507 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 15365 -> 0 bytes .../__pycache__/util.cpython-311.pyc | Bin 14264 -> 0 bytes .../setuptools/_vendor/pyparsing/actions.py | 207 - .../setuptools/_vendor/pyparsing/common.py | 424 - .../setuptools/_vendor/pyparsing/core.py | 5814 ----------- .../_vendor/pyparsing/diagram/__init__.py | 642 -- .../__pycache__/__init__.cpython-311.pyc | Bin 28000 -> 0 bytes .../_vendor/pyparsing/exceptions.py | 267 - .../setuptools/_vendor/pyparsing/helpers.py | 1088 -- .../setuptools/_vendor/pyparsing/results.py | 760 -- .../setuptools/_vendor/pyparsing/testing.py | 331 - .../setuptools/_vendor/pyparsing/unicode.py | 352 - .../setuptools/_vendor/pyparsing/util.py | 235 - .../setuptools/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-311.pyc | Bin 414 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 30853 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4493 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 406 -> 0 bytes .../setuptools/_vendor/tomli/_parser.py | 691 -- .../setuptools/_vendor/tomli/_re.py | 107 - .../setuptools/_vendor/tomli/_types.py | 10 - .../setuptools/_vendor/typing_extensions.py | 2296 ----- .../site-packages/setuptools/_vendor/zipp.py | 329 - .../site-packages/setuptools/archive_util.py | 213 - .../site-packages/setuptools/build_meta.py | 512 - .../site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 137216 -> 0 bytes .../site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 633 -> 0 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 3900 -> 0 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 25582 -> 0 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 2188 -> 0 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 6988 -> 0 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 4163 -> 0 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 22008 -> 0 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 23174 -> 0 bytes .../__pycache__/develop.cpython-311.pyc | Bin 10916 -> 0 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 7978 -> 0 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 121498 -> 0 bytes .../editable_wheel.cpython-311.pyc | Bin 51411 -> 0 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 40836 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 6813 -> 0 bytes .../install_egg_info.cpython-311.pyc | Bin 5339 -> 0 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 8410 -> 0 bytes .../install_scripts.cpython-311.pyc | Bin 4277 -> 0 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 8034 -> 0 bytes .../__pycache__/register.cpython-311.pyc | Bin 1124 -> 0 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 4184 -> 0 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 1364 -> 0 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 13436 -> 0 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 7676 -> 0 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 14617 -> 0 bytes .../__pycache__/upload.cpython-311.pyc | Bin 1088 -> 0 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 11939 -> 0 bytes .../site-packages/setuptools/command/alias.py | 78 - .../setuptools/command/bdist_egg.py | 457 - .../setuptools/command/bdist_rpm.py | 40 - .../site-packages/setuptools/command/build.py | 146 - .../setuptools/command/build_clib.py | 101 - .../setuptools/command/build_ext.py | 383 - .../setuptools/command/build_py.py | 368 - .../setuptools/command/develop.py | 193 - .../setuptools/command/dist_info.py | 142 - .../setuptools/command/easy_install.py | 2366 ----- .../setuptools/command/editable_wheel.py | 844 -- .../setuptools/command/egg_info.py | 775 -- .../setuptools/command/install.py | 139 - .../setuptools/command/install_egg_info.py | 83 - .../setuptools/command/install_lib.py | 148 - .../setuptools/command/install_scripts.py | 70 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 134 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 64 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 210 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 251 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 212 - .../setuptools/config/__init__.py | 35 - .../__pycache__/__init__.cpython-311.pyc | Bin 2028 -> 0 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 22837 -> 0 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 28242 -> 0 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 27873 -> 0 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 33282 -> 0 bytes .../setuptools/config/_apply_pyprojecttoml.py | 384 - .../config/_validate_pyproject/__init__.py | 34 - .../__pycache__/__init__.cpython-311.pyc | Bin 2316 -> 0 bytes .../error_reporting.cpython-311.pyc | Bin 20207 -> 0 bytes .../extra_validations.cpython-311.pyc | Bin 1865 -> 0 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 3240 -> 0 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 192638 -> 0 bytes .../__pycache__/formats.cpython-311.pyc | Bin 14355 -> 0 bytes .../_validate_pyproject/error_reporting.py | 318 - .../_validate_pyproject/extra_validations.py | 36 - .../fastjsonschema_exceptions.py | 51 - .../fastjsonschema_validations.py | 1035 -- .../config/_validate_pyproject/formats.py | 259 - .../site-packages/setuptools/config/expand.py | 462 - .../setuptools/config/pyprojecttoml.py | 498 - .../setuptools/config/setupcfg.py | 769 -- .../site-packages/setuptools/dep_util.py | 25 - .../site-packages/setuptools/depends.py | 176 - .../site-packages/setuptools/discovery.py | 601 -- .../site-packages/setuptools/dist.py | 1218 --- .../site-packages/setuptools/errors.py | 58 - .../site-packages/setuptools/extension.py | 148 - .../setuptools/extern/__init__.py | 76 - .../__pycache__/__init__.cpython-311.pyc | Bin 4392 -> 0 bytes .../site-packages/setuptools/glob.py | 167 - .../site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 137728 -> 0 bytes .../site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/installer.py | 104 - .../site-packages/setuptools/launch.py | 36 - .../site-packages/setuptools/logging.py | 37 - .../site-packages/setuptools/monkey.py | 165 - .../site-packages/setuptools/msvc.py | 1703 ---- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1177 --- .../site-packages/setuptools/py34compat.py | 13 - .../site-packages/setuptools/sandbox.py | 530 - .../setuptools/script (dev).tmpl | 6 - .../site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/unicode_utils.py | 42 - .../site-packages/setuptools/version.py | 6 - .../site-packages/setuptools/wheel.py | 222 - .../setuptools/windows_support.py | 29 - .../site-packages/slugify/__init__.py | 10 - .../site-packages/slugify/__main__.py | 98 - .../__pycache__/__init__.cpython-311.pyc | Bin 646 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 5821 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 557 -> 0 bytes .../__pycache__/slugify.cpython-311.pyc | Bin 8439 -> 0 bytes .../__pycache__/special.cpython-311.pyc | Bin 1370 -> 0 bytes .../site-packages/slugify/__version__.py | 8 - .../python3.11/site-packages/slugify/py.typed | 0 .../site-packages/slugify/slugify.py | 197 - .../site-packages/slugify/special.py | 47 - .../sqlalchemy-2.0.40.dist-info/INSTALLER | 1 - .../sqlalchemy-2.0.40.dist-info/METADATA | 244 - .../sqlalchemy-2.0.40.dist-info/RECORD | 529 - .../sqlalchemy-2.0.40.dist-info/WHEEL | 6 - .../licenses/LICENSE | 19 - .../sqlalchemy-2.0.40.dist-info/top_level.txt | 1 - .../site-packages/sqlalchemy/__init__.py | 294 - .../__pycache__/__init__.cpython-311.pyc | Bin 13946 -> 0 bytes .../__pycache__/events.cpython-311.pyc | Bin 661 -> 0 bytes .../__pycache__/exc.cpython-311.pyc | Bin 34763 -> 0 bytes .../__pycache__/inspection.cpython-311.pyc | Bin 7425 -> 0 bytes .../__pycache__/log.cpython-311.pyc | Bin 12296 -> 0 bytes .../__pycache__/schema.cpython-311.pyc | Bin 3167 -> 0 bytes .../__pycache__/types.cpython-311.pyc | Bin 3230 -> 0 bytes .../sqlalchemy/connectors/__init__.py | 18 - .../__pycache__/__init__.cpython-311.pyc | Bin 672 -> 0 bytes .../__pycache__/aioodbc.cpython-311.pyc | Bin 8017 -> 0 bytes .../__pycache__/asyncio.cpython-311.pyc | Bin 13430 -> 0 bytes .../__pycache__/pyodbc.cpython-311.pyc | Bin 11187 -> 0 bytes .../sqlalchemy/connectors/aioodbc.py | 174 - .../sqlalchemy/connectors/asyncio.py | 213 - .../sqlalchemy/connectors/pyodbc.py | 247 - .../sqlalchemy/cyextension/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 196 -> 0 bytes ...ollections.cpython-311-x86_64-linux-gnu.so | Bin 2019624 -> 0 bytes .../sqlalchemy/cyextension/collections.pyx | 409 - ...utabledict.cpython-311-x86_64-linux-gnu.so | Bin 703728 -> 0 bytes .../sqlalchemy/cyextension/immutabledict.pxd | 8 - .../sqlalchemy/cyextension/immutabledict.pyx | 133 - ...processors.cpython-311-x86_64-linux-gnu.so | Bin 509560 -> 0 bytes .../sqlalchemy/cyextension/processors.pyx | 68 - ...esultproxy.cpython-311-x86_64-linux-gnu.so | Bin 586688 -> 0 bytes .../sqlalchemy/cyextension/resultproxy.pyx | 102 - .../util.cpython-311-x86_64-linux-gnu.so | Bin 870128 -> 0 bytes .../sqlalchemy/cyextension/util.pyx | 91 - .../sqlalchemy/dialects/__init__.py | 61 - .../__pycache__/__init__.cpython-311.pyc | Bin 2087 -> 0 bytes .../__pycache__/_typing.cpython-311.pyc | Bin 1274 -> 0 bytes .../sqlalchemy/dialects/_typing.py | 30 - .../sqlalchemy/dialects/mssql/__init__.py | 88 - .../__pycache__/__init__.cpython-311.pyc | Bin 2216 -> 0 bytes .../mssql/__pycache__/aioodbc.cpython-311.pyc | Bin 2580 -> 0 bytes .../mssql/__pycache__/base.cpython-311.pyc | Bin 158432 -> 0 bytes .../information_schema.cpython-311.pyc | Bin 9849 -> 0 bytes .../mssql/__pycache__/json.cpython-311.pyc | Bin 5758 -> 0 bytes .../__pycache__/provision.cpython-311.pyc | Bin 8784 -> 0 bytes .../mssql/__pycache__/pymssql.cpython-311.pyc | Bin 6713 -> 0 bytes .../mssql/__pycache__/pyodbc.cpython-311.pyc | Bin 33253 -> 0 bytes .../sqlalchemy/dialects/mssql/aioodbc.py | 63 - .../sqlalchemy/dialects/mssql/base.py | 4058 -------- .../dialects/mssql/information_schema.py | 254 - .../sqlalchemy/dialects/mssql/json.py | 129 - .../sqlalchemy/dialects/mssql/provision.py | 162 - .../sqlalchemy/dialects/mssql/pymssql.py | 126 - .../sqlalchemy/dialects/mssql/pyodbc.py | 760 -- .../sqlalchemy/dialects/mysql/__init__.py | 104 - .../__pycache__/__init__.cpython-311.pyc | Bin 2695 -> 0 bytes .../__pycache__/aiomysql.cpython-311.pyc | Bin 18619 -> 0 bytes .../mysql/__pycache__/asyncmy.cpython-311.pyc | Bin 19277 -> 0 bytes .../mysql/__pycache__/base.cpython-311.pyc | Bin 149595 -> 0 bytes .../mysql/__pycache__/cymysql.cpython-311.pyc | Bin 3338 -> 0 bytes .../mysql/__pycache__/dml.cpython-311.pyc | Bin 9253 -> 0 bytes .../__pycache__/enumerated.cpython-311.pyc | Bin 11247 -> 0 bytes .../__pycache__/expression.cpython-311.pyc | Bin 5406 -> 0 bytes .../mysql/__pycache__/json.cpython-311.pyc | Bin 3972 -> 0 bytes .../mysql/__pycache__/mariadb.cpython-311.pyc | Bin 2681 -> 0 bytes .../mariadbconnector.cpython-311.pyc | Bin 12946 -> 0 bytes .../mysqlconnector.cpython-311.pyc | Bin 12342 -> 0 bytes .../mysql/__pycache__/mysqldb.cpython-311.pyc | Bin 12727 -> 0 bytes .../__pycache__/provision.cpython-311.pyc | Bin 5149 -> 0 bytes .../mysql/__pycache__/pymysql.cpython-311.pyc | Bin 5638 -> 0 bytes .../mysql/__pycache__/pyodbc.cpython-311.pyc | Bin 5850 -> 0 bytes .../__pycache__/reflection.cpython-311.pyc | Bin 27151 -> 0 bytes .../reserved_words.cpython-311.pyc | Bin 4436 -> 0 bytes .../mysql/__pycache__/types.cpython-311.pyc | Bin 33623 -> 0 bytes .../sqlalchemy/dialects/mysql/aiomysql.py | 335 - .../sqlalchemy/dialects/mysql/asyncmy.py | 339 - .../sqlalchemy/dialects/mysql/base.py | 3582 ------- .../sqlalchemy/dialects/mysql/cymysql.py | 84 - .../sqlalchemy/dialects/mysql/dml.py | 225 - .../sqlalchemy/dialects/mysql/enumerated.py | 243 - .../sqlalchemy/dialects/mysql/expression.py | 143 - .../sqlalchemy/dialects/mysql/json.py | 81 - .../sqlalchemy/dialects/mysql/mariadb.py | 67 - .../dialects/mysql/mariadbconnector.py | 277 - .../dialects/mysql/mysqlconnector.py | 245 - .../sqlalchemy/dialects/mysql/mysqldb.py | 305 - .../sqlalchemy/dialects/mysql/provision.py | 114 - .../sqlalchemy/dialects/mysql/pymysql.py | 136 - .../sqlalchemy/dialects/mysql/pyodbc.py | 139 - .../sqlalchemy/dialects/mysql/reflection.py | 677 -- .../dialects/mysql/reserved_words.py | 571 -- .../sqlalchemy/dialects/mysql/types.py | 773 -- .../sqlalchemy/dialects/oracle/__init__.py | 67 - .../__pycache__/__init__.cpython-311.pyc | Bin 1721 -> 0 bytes .../oracle/__pycache__/base.cpython-311.pyc | Bin 147784 -> 0 bytes .../__pycache__/cx_oracle.cpython-311.pyc | Bin 63930 -> 0 bytes .../__pycache__/dictionary.cpython-311.pyc | Bin 32382 -> 0 bytes .../__pycache__/oracledb.cpython-311.pyc | Bin 42732 -> 0 bytes .../__pycache__/provision.cpython-311.pyc | Bin 12678 -> 0 bytes .../oracle/__pycache__/types.cpython-311.pyc | Bin 14679 -> 0 bytes .../sqlalchemy/dialects/oracle/base.py | 3484 ------- .../sqlalchemy/dialects/oracle/cx_oracle.py | 1552 --- .../sqlalchemy/dialects/oracle/dictionary.py | 507 - .../sqlalchemy/dialects/oracle/oracledb.py | 947 -- .../sqlalchemy/dialects/oracle/provision.py | 220 - .../sqlalchemy/dialects/oracle/types.py | 316 - .../dialects/postgresql/__init__.py | 167 - .../__pycache__/__init__.cpython-311.pyc | Bin 4630 -> 0 bytes .../_psycopg_common.cpython-311.pyc | Bin 8745 -> 0 bytes .../__pycache__/array.cpython-311.pyc | Bin 20632 -> 0 bytes .../__pycache__/asyncpg.cpython-311.pyc | Bin 62983 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 210462 -> 0 bytes .../__pycache__/dml.cpython-311.pyc | Bin 13796 -> 0 bytes .../__pycache__/ext.cpython-311.pyc | Bin 20806 -> 0 bytes .../__pycache__/hstore.cpython-311.pyc | Bin 16587 -> 0 bytes .../__pycache__/json.cpython-311.pyc | Bin 16255 -> 0 bytes .../__pycache__/named_types.cpython-311.pyc | Bin 25059 -> 0 bytes .../__pycache__/operators.cpython-311.pyc | Bin 2178 -> 0 bytes .../__pycache__/pg8000.cpython-311.pyc | Bin 32841 -> 0 bytes .../__pycache__/pg_catalog.cpython-311.pyc | Bin 13648 -> 0 bytes .../__pycache__/provision.cpython-311.pyc | Bin 9190 -> 0 bytes .../__pycache__/psycopg.cpython-311.pyc | Bin 40644 -> 0 bytes .../__pycache__/psycopg2.cpython-311.pyc | Bin 37206 -> 0 bytes .../__pycache__/psycopg2cffi.cpython-311.pyc | Bin 2297 -> 0 bytes .../__pycache__/ranges.cpython-311.pyc | Bin 37637 -> 0 bytes .../__pycache__/types.cpython-311.pyc | Bin 12922 -> 0 bytes .../dialects/postgresql/_psycopg_common.py | 187 - .../sqlalchemy/dialects/postgresql/array.py | 509 - .../sqlalchemy/dialects/postgresql/asyncpg.py | 1287 --- .../sqlalchemy/dialects/postgresql/base.py | 5082 ---------- .../sqlalchemy/dialects/postgresql/dml.py | 339 - .../sqlalchemy/dialects/postgresql/ext.py | 501 - .../sqlalchemy/dialects/postgresql/hstore.py | 406 - .../sqlalchemy/dialects/postgresql/json.py | 367 - .../dialects/postgresql/named_types.py | 505 - .../dialects/postgresql/operators.py | 129 - .../sqlalchemy/dialects/postgresql/pg8000.py | 666 -- .../dialects/postgresql/pg_catalog.py | 300 - .../dialects/postgresql/provision.py | 175 - .../sqlalchemy/dialects/postgresql/psycopg.py | 783 -- .../dialects/postgresql/psycopg2.py | 892 -- .../dialects/postgresql/psycopg2cffi.py | 61 - .../sqlalchemy/dialects/postgresql/ranges.py | 1031 -- .../sqlalchemy/dialects/postgresql/types.py | 313 - .../sqlalchemy/dialects/sqlite/__init__.py | 57 - .../__pycache__/__init__.cpython-311.pyc | Bin 1371 -> 0 bytes .../__pycache__/aiosqlite.cpython-311.pyc | Bin 20685 -> 0 bytes .../sqlite/__pycache__/base.cpython-311.pyc | Bin 106626 -> 0 bytes .../sqlite/__pycache__/dml.cpython-311.pyc | Bin 11223 -> 0 bytes .../sqlite/__pycache__/json.cpython-311.pyc | Bin 4309 -> 0 bytes .../__pycache__/provision.cpython-311.pyc | Bin 7980 -> 0 bytes .../__pycache__/pysqlcipher.cpython-311.pyc | Bin 6609 -> 0 bytes .../__pycache__/pysqlite.cpython-311.pyc | Bin 33839 -> 0 bytes .../sqlalchemy/dialects/sqlite/aiosqlite.py | 421 - .../sqlalchemy/dialects/sqlite/base.py | 2877 ------ .../sqlalchemy/dialects/sqlite/dml.py | 263 - .../sqlalchemy/dialects/sqlite/json.py | 92 - .../sqlalchemy/dialects/sqlite/provision.py | 198 - .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 157 - .../sqlalchemy/dialects/sqlite/pysqlite.py | 771 -- .../dialects/type_migration_guidelines.txt | 145 - .../sqlalchemy/engine/__init__.py | 62 - .../__pycache__/__init__.cpython-311.pyc | Bin 2951 -> 0 bytes .../_py_processors.cpython-311.pyc | Bin 5161 -> 0 bytes .../__pycache__/_py_row.cpython-311.pyc | Bin 6762 -> 0 bytes .../__pycache__/_py_util.cpython-311.pyc | Bin 2554 -> 0 bytes .../engine/__pycache__/base.cpython-311.pyc | Bin 132697 -> 0 bytes .../characteristics.cpython-311.pyc | Bin 7019 -> 0 bytes .../engine/__pycache__/create.cpython-311.pyc | Bin 35467 -> 0 bytes .../engine/__pycache__/cursor.cpython-311.pyc | Bin 87877 -> 0 bytes .../__pycache__/default.cpython-311.pyc | Bin 94771 -> 0 bytes .../engine/__pycache__/events.cpython-311.pyc | Bin 40583 -> 0 bytes .../__pycache__/interfaces.cpython-311.pyc | Bin 104079 -> 0 bytes .../engine/__pycache__/mock.cpython-311.pyc | Bin 6272 -> 0 bytes .../__pycache__/processors.cpython-311.pyc | Bin 1654 -> 0 bytes .../__pycache__/reflection.cpython-311.pyc | Bin 86107 -> 0 bytes .../engine/__pycache__/result.cpython-311.pyc | Bin 101216 -> 0 bytes .../engine/__pycache__/row.cpython-311.pyc | Bin 19523 -> 0 bytes .../__pycache__/strategies.cpython-311.pyc | Bin 643 -> 0 bytes .../engine/__pycache__/url.cpython-311.pyc | Bin 36960 -> 0 bytes .../engine/__pycache__/util.cpython-311.pyc | Bin 7631 -> 0 bytes .../sqlalchemy/engine/_py_processors.py | 136 - .../sqlalchemy/engine/_py_row.py | 128 - .../sqlalchemy/engine/_py_util.py | 74 - .../site-packages/sqlalchemy/engine/base.py | 3371 ------- .../sqlalchemy/engine/characteristics.py | 155 - .../site-packages/sqlalchemy/engine/create.py | 878 -- .../site-packages/sqlalchemy/engine/cursor.py | 2181 ---- .../sqlalchemy/engine/default.py | 2382 ----- .../site-packages/sqlalchemy/engine/events.py | 965 -- .../sqlalchemy/engine/interfaces.py | 3413 ------- .../site-packages/sqlalchemy/engine/mock.py | 133 - .../sqlalchemy/engine/processors.py | 61 - .../sqlalchemy/engine/reflection.py | 2099 ---- .../site-packages/sqlalchemy/engine/result.py | 2380 ----- .../site-packages/sqlalchemy/engine/row.py | 400 - .../sqlalchemy/engine/strategies.py | 19 - .../site-packages/sqlalchemy/engine/url.py | 924 -- .../site-packages/sqlalchemy/engine/util.py | 167 - .../sqlalchemy/event/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 1089 -> 0 bytes .../event/__pycache__/api.cpython-311.pyc | Bin 9363 -> 0 bytes .../event/__pycache__/attr.cpython-311.pyc | Bin 33943 -> 0 bytes .../event/__pycache__/base.cpython-311.pyc | Bin 22357 -> 0 bytes .../event/__pycache__/legacy.cpython-311.pyc | Bin 10079 -> 0 bytes .../__pycache__/registry.cpython-311.pyc | Bin 13440 -> 0 bytes .../site-packages/sqlalchemy/event/api.py | 222 - .../site-packages/sqlalchemy/event/attr.py | 655 -- .../site-packages/sqlalchemy/event/base.py | 472 - .../site-packages/sqlalchemy/event/legacy.py | 246 - .../sqlalchemy/event/registry.py | 390 - .../site-packages/sqlalchemy/events.py | 17 - .../site-packages/sqlalchemy/exc.py | 832 -- .../site-packages/sqlalchemy/ext/__init__.py | 11 - .../ext/__pycache__/__init__.cpython-311.pyc | Bin 363 -> 0 bytes .../associationproxy.cpython-311.pyc | Bin 94424 -> 0 bytes .../ext/__pycache__/automap.cpython-311.pyc | Bin 58994 -> 0 bytes .../ext/__pycache__/baked.cpython-311.pyc | Bin 25026 -> 0 bytes .../ext/__pycache__/compiler.cpython-311.pyc | Bin 21852 -> 0 bytes .../horizontal_shard.cpython-311.pyc | Bin 18947 -> 0 bytes .../ext/__pycache__/hybrid.cpython-311.pyc | Bin 62337 -> 0 bytes .../ext/__pycache__/indexable.cpython-311.pyc | Bin 12677 -> 0 bytes .../instrumentation.cpython-311.pyc | Bin 21559 -> 0 bytes .../ext/__pycache__/mutable.cpython-311.pyc | Bin 51195 -> 0 bytes .../__pycache__/orderinglist.cpython-311.pyc | Bin 18798 -> 0 bytes .../__pycache__/serializer.cpython-311.pyc | Bin 8632 -> 0 bytes .../sqlalchemy/ext/associationproxy.py | 2013 ---- .../sqlalchemy/ext/asyncio/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 1240 -> 0 bytes .../asyncio/__pycache__/base.cpython-311.pyc | Bin 12318 -> 0 bytes .../__pycache__/engine.cpython-311.pyc | Bin 59644 -> 0 bytes .../asyncio/__pycache__/exc.cpython-311.pyc | Bin 1181 -> 0 bytes .../__pycache__/result.cpython-311.pyc | Bin 39404 -> 0 bytes .../__pycache__/scoping.cpython-311.pyc | Bin 57011 -> 0 bytes .../__pycache__/session.cpython-311.pyc | Bin 73590 -> 0 bytes .../sqlalchemy/ext/asyncio/base.py | 281 - .../sqlalchemy/ext/asyncio/engine.py | 1469 --- .../sqlalchemy/ext/asyncio/exc.py | 21 - .../sqlalchemy/ext/asyncio/result.py | 962 -- .../sqlalchemy/ext/asyncio/scoping.py | 1614 --- .../sqlalchemy/ext/asyncio/session.py | 1962 ---- .../site-packages/sqlalchemy/ext/automap.py | 1701 ---- .../site-packages/sqlalchemy/ext/baked.py | 570 -- .../site-packages/sqlalchemy/ext/compiler.py | 600 -- .../sqlalchemy/ext/declarative/__init__.py | 65 - .../__pycache__/__init__.cpython-311.pyc | Bin 2244 -> 0 bytes .../__pycache__/extensions.cpython-311.pyc | Bin 22418 -> 0 bytes .../sqlalchemy/ext/declarative/extensions.py | 564 -- .../sqlalchemy/ext/horizontal_shard.py | 478 - .../site-packages/sqlalchemy/ext/hybrid.py | 1533 --- .../site-packages/sqlalchemy/ext/indexable.py | 345 - .../sqlalchemy/ext/instrumentation.py | 450 - .../site-packages/sqlalchemy/ext/mutable.py | 1095 -- .../sqlalchemy/ext/mypy/__init__.py | 6 - .../mypy/__pycache__/__init__.cpython-311.pyc | Bin 193 -> 0 bytes .../mypy/__pycache__/apply.cpython-311.pyc | Bin 11118 -> 0 bytes .../__pycache__/decl_class.cpython-311.pyc | Bin 15897 -> 0 bytes .../mypy/__pycache__/infer.cpython-311.pyc | Bin 16009 -> 0 bytes .../mypy/__pycache__/names.cpython-311.pyc | Bin 11686 -> 0 bytes .../mypy/__pycache__/plugin.cpython-311.pyc | Bin 13040 -> 0 bytes .../ext/mypy/__pycache__/util.cpython-311.pyc | Bin 15944 -> 0 bytes .../sqlalchemy/ext/mypy/apply.py | 324 - .../sqlalchemy/ext/mypy/decl_class.py | 515 - .../sqlalchemy/ext/mypy/infer.py | 590 -- .../sqlalchemy/ext/mypy/names.py | 335 - .../sqlalchemy/ext/mypy/plugin.py | 303 - .../site-packages/sqlalchemy/ext/mypy/util.py | 357 - .../sqlalchemy/ext/orderinglist.py | 427 - .../sqlalchemy/ext/serializer.py | 185 - .../sqlalchemy/future/__init__.py | 16 - .../__pycache__/__init__.cpython-311.pyc | Bin 522 -> 0 bytes .../future/__pycache__/engine.cpython-311.pyc | Bin 440 -> 0 bytes .../site-packages/sqlalchemy/future/engine.py | 15 - .../site-packages/sqlalchemy/inspection.py | 174 - .../site-packages/sqlalchemy/log.py | 288 - .../site-packages/sqlalchemy/orm/__init__.py | 170 - .../orm/__pycache__/__init__.cpython-311.pyc | Bin 8547 -> 0 bytes .../_orm_constructors.cpython-311.pyc | Bin 103878 -> 0 bytes .../orm/__pycache__/_typing.cpython-311.pyc | Bin 7824 -> 0 bytes .../__pycache__/attributes.cpython-311.pyc | Bin 104494 -> 0 bytes .../orm/__pycache__/base.cpython-311.pyc | Bin 32853 -> 0 bytes .../bulk_persistence.cpython-311.pyc | Bin 71942 -> 0 bytes .../__pycache__/clsregistry.cpython-311.pyc | Bin 26877 -> 0 bytes .../__pycache__/collections.cpython-311.pyc | Bin 68390 -> 0 bytes .../orm/__pycache__/context.cpython-311.pyc | Bin 106631 -> 0 bytes .../orm/__pycache__/decl_api.cpython-311.pyc | Bin 71929 -> 0 bytes .../orm/__pycache__/decl_base.cpython-311.pyc | Bin 77242 -> 0 bytes .../__pycache__/dependency.cpython-311.pyc | Bin 44499 -> 0 bytes .../descriptor_props.cpython-311.pyc | Bin 53443 -> 0 bytes .../orm/__pycache__/dynamic.cpython-311.pyc | Bin 14145 -> 0 bytes .../orm/__pycache__/evaluator.cpython-311.pyc | Bin 18179 -> 0 bytes .../orm/__pycache__/events.cpython-311.pyc | Bin 140400 -> 0 bytes .../orm/__pycache__/exc.cpython-311.pyc | Bin 11506 -> 0 bytes .../orm/__pycache__/identity.cpython-311.pyc | Bin 13925 -> 0 bytes .../instrumentation.cpython-311.pyc | Bin 33752 -> 0 bytes .../__pycache__/interfaces.cpython-311.pyc | Bin 56848 -> 0 bytes .../orm/__pycache__/loading.cpython-311.pyc | Bin 52357 -> 0 bytes .../mapped_collection.cpython-311.pyc | Bin 23714 -> 0 bytes .../orm/__pycache__/mapper.cpython-311.pyc | Bin 176048 -> 0 bytes .../__pycache__/path_registry.cpython-311.pyc | Bin 34763 -> 0 bytes .../__pycache__/persistence.cpython-311.pyc | Bin 50750 -> 0 bytes .../__pycache__/properties.cpython-311.pyc | Bin 34491 -> 0 bytes .../orm/__pycache__/query.cpython-311.pyc | Bin 133242 -> 0 bytes .../__pycache__/relationships.cpython-311.pyc | Bin 135699 -> 0 bytes .../orm/__pycache__/scoping.cpython-311.pyc | Bin 84275 -> 0 bytes .../orm/__pycache__/session.cpython-311.pyc | Bin 208302 -> 0 bytes .../orm/__pycache__/state.cpython-311.pyc | Bin 47735 -> 0 bytes .../__pycache__/state_changes.cpython-311.pyc | Bin 7452 -> 0 bytes .../__pycache__/strategies.cpython-311.pyc | Bin 111495 -> 0 bytes .../strategy_options.cpython-311.pyc | Bin 90423 -> 0 bytes .../orm/__pycache__/sync.cpython-311.pyc | Bin 6967 -> 0 bytes .../__pycache__/unitofwork.cpython-311.pyc | Bin 37069 -> 0 bytes .../orm/__pycache__/util.cpython-311.pyc | Bin 92302 -> 0 bytes .../orm/__pycache__/writeonly.cpython-311.pyc | Bin 29712 -> 0 bytes .../sqlalchemy/orm/_orm_constructors.py | 2590 ----- .../site-packages/sqlalchemy/orm/_typing.py | 179 - .../sqlalchemy/orm/attributes.py | 2835 ------ .../site-packages/sqlalchemy/orm/base.py | 973 -- .../sqlalchemy/orm/bulk_persistence.py | 2123 ---- .../sqlalchemy/orm/clsregistry.py | 571 -- .../sqlalchemy/orm/collections.py | 1627 --- .../site-packages/sqlalchemy/orm/context.py | 3336 ------- .../site-packages/sqlalchemy/orm/decl_api.py | 1917 ---- .../site-packages/sqlalchemy/orm/decl_base.py | 2188 ---- .../sqlalchemy/orm/dependency.py | 1304 --- .../sqlalchemy/orm/descriptor_props.py | 1077 -- .../site-packages/sqlalchemy/orm/dynamic.py | 300 - .../site-packages/sqlalchemy/orm/evaluator.py | 379 - .../site-packages/sqlalchemy/orm/events.py | 3271 ------ .../site-packages/sqlalchemy/orm/exc.py | 237 - .../site-packages/sqlalchemy/orm/identity.py | 302 - .../sqlalchemy/orm/instrumentation.py | 754 -- .../sqlalchemy/orm/interfaces.py | 1490 --- .../site-packages/sqlalchemy/orm/loading.py | 1682 ---- .../sqlalchemy/orm/mapped_collection.py | 557 -- .../site-packages/sqlalchemy/orm/mapper.py | 4431 --------- .../sqlalchemy/orm/path_registry.py | 811 -- .../sqlalchemy/orm/persistence.py | 1782 ---- .../sqlalchemy/orm/properties.py | 886 -- .../site-packages/sqlalchemy/orm/query.py | 3454 ------- .../sqlalchemy/orm/relationships.py | 3514 ------- .../site-packages/sqlalchemy/orm/scoping.py | 2163 ---- .../site-packages/sqlalchemy/orm/session.py | 5302 ---------- .../site-packages/sqlalchemy/orm/state.py | 1143 --- .../sqlalchemy/orm/state_changes.py | 198 - .../sqlalchemy/orm/strategies.py | 3473 ------- .../sqlalchemy/orm/strategy_options.py | 2550 ----- .../site-packages/sqlalchemy/orm/sync.py | 164 - .../sqlalchemy/orm/unitofwork.py | 796 -- .../site-packages/sqlalchemy/orm/util.py | 2403 ----- .../site-packages/sqlalchemy/orm/writeonly.py | 678 -- .../site-packages/sqlalchemy/pool/__init__.py | 44 - .../pool/__pycache__/__init__.cpython-311.pyc | Bin 1868 -> 0 bytes .../pool/__pycache__/base.cpython-311.pyc | Bin 59356 -> 0 bytes .../pool/__pycache__/events.cpython-311.pyc | Bin 14475 -> 0 bytes .../pool/__pycache__/impl.cpython-311.pyc | Bin 27540 -> 0 bytes .../site-packages/sqlalchemy/pool/base.py | 1516 --- .../site-packages/sqlalchemy/pool/events.py | 372 - .../site-packages/sqlalchemy/pool/impl.py | 581 -- .../site-packages/sqlalchemy/py.typed | 0 .../site-packages/sqlalchemy/schema.py | 70 - .../site-packages/sqlalchemy/sql/__init__.py | 145 - .../sql/__pycache__/__init__.cpython-311.pyc | Bin 6466 -> 0 bytes .../_dml_constructors.cpython-311.pyc | Bin 4193 -> 0 bytes .../_elements_constructors.cpython-311.pyc | Bin 66900 -> 0 bytes .../__pycache__/_orm_types.cpython-311.pyc | Bin 668 -> 0 bytes .../sql/__pycache__/_py_util.cpython-311.pyc | Bin 3341 -> 0 bytes .../_selectable_constructors.cpython-311.pyc | Bin 23453 -> 0 bytes .../sql/__pycache__/_typing.cpython-311.pyc | Bin 16850 -> 0 bytes .../__pycache__/annotation.cpython-311.pyc | Bin 23137 -> 0 bytes .../sql/__pycache__/base.cpython-311.pyc | Bin 107550 -> 0 bytes .../sql/__pycache__/cache_key.cpython-311.pyc | Bin 39222 -> 0 bytes .../sql/__pycache__/coercions.cpython-311.pyc | Bin 54189 -> 0 bytes .../sql/__pycache__/compiler.cpython-311.pyc | Bin 292215 -> 0 bytes .../sql/__pycache__/crud.cpython-311.pyc | Bin 47782 -> 0 bytes .../sql/__pycache__/ddl.cpython-311.pyc | Bin 65565 -> 0 bytes .../default_comparator.cpython-311.pyc | Bin 18076 -> 0 bytes .../sql/__pycache__/dml.cpython-311.pyc | Bin 78242 -> 0 bytes .../sql/__pycache__/elements.cpython-311.pyc | Bin 222500 -> 0 bytes .../sql/__pycache__/events.cpython-311.pyc | Bin 19362 -> 0 bytes .../__pycache__/expression.cpython-311.pyc | Bin 7220 -> 0 bytes .../sql/__pycache__/functions.cpython-311.pyc | Bin 81685 -> 0 bytes .../sql/__pycache__/lambdas.cpython-311.pyc | Bin 59508 -> 0 bytes .../sql/__pycache__/naming.cpython-311.pyc | Bin 9193 -> 0 bytes .../sql/__pycache__/operators.cpython-311.pyc | Bin 94072 -> 0 bytes .../sql/__pycache__/roles.cpython-311.pyc | Bin 14928 -> 0 bytes .../sql/__pycache__/schema.cpython-311.pyc | Bin 257257 -> 0 bytes .../__pycache__/selectable.cpython-311.pyc | Bin 277427 -> 0 bytes .../sql/__pycache__/sqltypes.cpython-311.pyc | Bin 164926 -> 0 bytes .../__pycache__/traversals.cpython-311.pyc | Bin 49264 -> 0 bytes .../sql/__pycache__/type_api.cpython-311.pyc | Bin 90958 -> 0 bytes .../sql/__pycache__/util.cpython-311.pyc | Bin 59985 -> 0 bytes .../sql/__pycache__/visitors.cpython-311.pyc | Bin 38845 -> 0 bytes .../sqlalchemy/sql/_dml_constructors.py | 132 - .../sqlalchemy/sql/_elements_constructors.py | 1872 ---- .../sqlalchemy/sql/_orm_types.py | 20 - .../site-packages/sqlalchemy/sql/_py_util.py | 75 - .../sql/_selectable_constructors.py | 715 -- .../site-packages/sqlalchemy/sql/_typing.py | 463 - .../sqlalchemy/sql/annotation.py | 585 -- .../site-packages/sqlalchemy/sql/base.py | 2185 ---- .../site-packages/sqlalchemy/sql/cache_key.py | 1057 -- .../site-packages/sqlalchemy/sql/coercions.py | 1403 --- .../site-packages/sqlalchemy/sql/compiler.py | 7946 --------------- .../site-packages/sqlalchemy/sql/crud.py | 1678 ---- .../site-packages/sqlalchemy/sql/ddl.py | 1441 --- .../sqlalchemy/sql/default_comparator.py | 552 - .../site-packages/sqlalchemy/sql/dml.py | 1837 ---- .../site-packages/sqlalchemy/sql/elements.py | 5544 ----------- .../site-packages/sqlalchemy/sql/events.py | 458 - .../sqlalchemy/sql/expression.py | 162 - .../site-packages/sqlalchemy/sql/functions.py | 2099 ---- .../site-packages/sqlalchemy/sql/lambdas.py | 1443 --- .../site-packages/sqlalchemy/sql/naming.py | 212 - .../site-packages/sqlalchemy/sql/operators.py | 2623 ----- .../site-packages/sqlalchemy/sql/roles.py | 323 - .../site-packages/sqlalchemy/sql/schema.py | 6219 ------------ .../sqlalchemy/sql/selectable.py | 7183 ------------- .../site-packages/sqlalchemy/sql/sqltypes.py | 3908 -------- .../sqlalchemy/sql/traversals.py | 1024 -- .../site-packages/sqlalchemy/sql/type_api.py | 2362 ----- .../site-packages/sqlalchemy/sql/util.py | 1487 --- .../site-packages/sqlalchemy/sql/visitors.py | 1167 --- .../sqlalchemy/testing/__init__.py | 96 - .../__pycache__/__init__.cpython-311.pyc | Bin 4516 -> 0 bytes .../__pycache__/assertions.cpython-311.pyc | Bin 49545 -> 0 bytes .../__pycache__/assertsql.cpython-311.pyc | Bin 22352 -> 0 bytes .../__pycache__/asyncio.cpython-311.pyc | Bin 4489 -> 0 bytes .../__pycache__/config.cpython-311.pyc | Bin 19617 -> 0 bytes .../__pycache__/engines.cpython-311.pyc | Bin 23178 -> 0 bytes .../__pycache__/entities.cpython-311.pyc | Bin 6015 -> 0 bytes .../__pycache__/exclusions.cpython-311.pyc | Bin 24296 -> 0 bytes .../__pycache__/pickleable.cpython-311.pyc | Bin 7594 -> 0 bytes .../__pycache__/profiling.cpython-311.pyc | Bin 14266 -> 0 bytes .../__pycache__/provision.cpython-311.pyc | Bin 23356 -> 0 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 89951 -> 0 bytes .../__pycache__/schema.cpython-311.pyc | Bin 9934 -> 0 bytes .../testing/__pycache__/util.cpython-311.pyc | Bin 25643 -> 0 bytes .../__pycache__/warnings.cpython-311.pyc | Bin 2262 -> 0 bytes .../sqlalchemy/testing/assertions.py | 989 -- .../sqlalchemy/testing/assertsql.py | 516 - .../sqlalchemy/testing/asyncio.py | 135 - .../sqlalchemy/testing/config.py | 423 - .../sqlalchemy/testing/engines.py | 474 - .../sqlalchemy/testing/entities.py | 117 - .../sqlalchemy/testing/exclusions.py | 435 - .../sqlalchemy/testing/fixtures/__init__.py | 28 - .../__pycache__/__init__.cpython-311.pyc | Bin 1181 -> 0 bytes .../fixtures/__pycache__/base.cpython-311.pyc | Bin 15729 -> 0 bytes .../fixtures/__pycache__/mypy.cpython-311.pyc | Bin 14615 -> 0 bytes .../fixtures/__pycache__/orm.cpython-311.pyc | Bin 12939 -> 0 bytes .../fixtures/__pycache__/sql.cpython-311.pyc | Bin 25193 -> 0 bytes .../sqlalchemy/testing/fixtures/base.py | 366 - .../sqlalchemy/testing/fixtures/mypy.py | 312 - .../sqlalchemy/testing/fixtures/orm.py | 227 - .../sqlalchemy/testing/fixtures/sql.py | 503 - .../sqlalchemy/testing/pickleable.py | 155 - .../sqlalchemy/testing/plugin/__init__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 199 -> 0 bytes .../__pycache__/bootstrap.cpython-311.pyc | Bin 2220 -> 0 bytes .../__pycache__/plugin_base.cpython-311.pyc | Bin 31499 -> 0 bytes .../__pycache__/pytestplugin.cpython-311.pyc | Bin 37238 -> 0 bytes .../sqlalchemy/testing/plugin/bootstrap.py | 51 - .../sqlalchemy/testing/plugin/plugin_base.py | 779 -- .../sqlalchemy/testing/plugin/pytestplugin.py | 868 -- .../sqlalchemy/testing/profiling.py | 324 - .../sqlalchemy/testing/provision.py | 502 - .../sqlalchemy/testing/requirements.py | 1847 ---- .../sqlalchemy/testing/schema.py | 224 - .../sqlalchemy/testing/suite/__init__.py | 19 - .../__pycache__/__init__.cpython-311.pyc | Bin 653 -> 0 bytes .../__pycache__/test_cte.cpython-311.pyc | Bin 10651 -> 0 bytes .../__pycache__/test_ddl.cpython-311.pyc | Bin 21757 -> 0 bytes .../test_deprecations.cpython-311.pyc | Bin 10005 -> 0 bytes .../__pycache__/test_dialect.cpython-311.pyc | Bin 39585 -> 0 bytes .../__pycache__/test_insert.cpython-311.pyc | Bin 28262 -> 0 bytes .../test_reflection.cpython-311.pyc | Bin 159676 -> 0 bytes .../__pycache__/test_results.cpython-311.pyc | Bin 28805 -> 0 bytes .../__pycache__/test_rowcount.cpython-311.pyc | Bin 11057 -> 0 bytes .../__pycache__/test_select.cpython-311.pyc | Bin 123751 -> 0 bytes .../__pycache__/test_sequence.cpython-311.pyc | Bin 16944 -> 0 bytes .../__pycache__/test_types.cpython-311.pyc | Bin 110989 -> 0 bytes .../test_unicode_ddl.cpython-311.pyc | Bin 9163 -> 0 bytes .../test_update_delete.cpython-311.pyc | Bin 7753 -> 0 bytes .../sqlalchemy/testing/suite/test_cte.py | 211 - .../sqlalchemy/testing/suite/test_ddl.py | 389 - .../testing/suite/test_deprecations.py | 153 - .../sqlalchemy/testing/suite/test_dialect.py | 740 -- .../sqlalchemy/testing/suite/test_insert.py | 630 -- .../testing/suite/test_reflection.py | 3273 ------ .../sqlalchemy/testing/suite/test_results.py | 504 - .../sqlalchemy/testing/suite/test_rowcount.py | 258 - .../sqlalchemy/testing/suite/test_select.py | 2008 ---- .../sqlalchemy/testing/suite/test_sequence.py | 317 - .../sqlalchemy/testing/suite/test_types.py | 2145 ---- .../testing/suite/test_unicode_ddl.py | 189 - .../testing/suite/test_update_delete.py | 139 - .../site-packages/sqlalchemy/testing/util.py | 538 - .../sqlalchemy/testing/warnings.py | 52 - .../site-packages/sqlalchemy/types.py | 76 - .../site-packages/sqlalchemy/util/__init__.py | 160 - .../util/__pycache__/__init__.cpython-311.pyc | Bin 7858 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 36748 -> 0 bytes .../_concurrency_py3k.cpython-311.pyc | Bin 12214 -> 0 bytes .../util/__pycache__/_has_cy.cpython-311.pyc | Bin 1263 -> 0 bytes .../_py_collections.cpython-311.pyc | Bin 35527 -> 0 bytes .../util/__pycache__/compat.cpython-311.pyc | Bin 13710 -> 0 bytes .../__pycache__/concurrency.cpython-311.pyc | Bin 4654 -> 0 bytes .../__pycache__/deprecations.cpython-311.pyc | Bin 14990 -> 0 bytes .../__pycache__/langhelpers.cpython-311.pyc | Bin 95624 -> 0 bytes .../__pycache__/preloaded.cpython-311.pyc | Bin 6681 -> 0 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 16628 -> 0 bytes .../__pycache__/tool_support.cpython-311.pyc | Bin 9665 -> 0 bytes .../__pycache__/topological.cpython-311.pyc | Bin 4750 -> 0 bytes .../util/__pycache__/typing.cpython-311.pyc | Bin 30082 -> 0 bytes .../sqlalchemy/util/_collections.py | 717 -- .../sqlalchemy/util/_concurrency_py3k.py | 288 - .../site-packages/sqlalchemy/util/_has_cy.py | 40 - .../sqlalchemy/util/_py_collections.py | 541 - .../site-packages/sqlalchemy/util/compat.py | 301 - .../sqlalchemy/util/concurrency.py | 108 - .../sqlalchemy/util/deprecations.py | 401 - .../sqlalchemy/util/langhelpers.py | 2222 ----- .../sqlalchemy/util/preloaded.py | 150 - .../site-packages/sqlalchemy/util/queue.py | 322 - .../sqlalchemy/util/tool_support.py | 201 - .../sqlalchemy/util/topological.py | 120 - .../site-packages/sqlalchemy/util/typing.py | 732 -- .../DESCRIPTION.rst | 46 - .../text_unidecode-1.3.dist-info/INSTALLER | 1 - .../text_unidecode-1.3.dist-info/LICENSE.txt | 134 - .../text_unidecode-1.3.dist-info/METADATA | 73 - .../text_unidecode-1.3.dist-info/RECORD | 11 - .../text_unidecode-1.3.dist-info/WHEEL | 6 - .../metadata.json | 1 - .../top_level.txt | 1 - .../site-packages/text_unidecode/__init__.py | 21 - .../__pycache__/__init__.cpython-311.pyc | Bin 1139 -> 0 bytes .../site-packages/text_unidecode/data.bin | Bin 311077 -> 0 bytes .../INSTALLER | 1 - .../METADATA | 68 - .../typing_extensions-4.13.2.dist-info/RECORD | 7 - .../typing_extensions-4.13.2.dist-info/WHEEL | 4 - .../licenses/LICENSE | 279 - .../site-packages/typing_extensions.py | 4584 --------- .../urllib3-2.5.0.dist-info/INSTALLER | 1 - .../urllib3-2.5.0.dist-info/METADATA | 154 - .../urllib3-2.5.0.dist-info/RECORD | 79 - .../urllib3-2.5.0.dist-info/WHEEL | 4 - .../licenses/LICENSE.txt | 21 - .../site-packages/urllib3/__init__.py | 211 - .../__pycache__/__init__.cpython-311.pyc | Bin 7664 -> 0 bytes .../_base_connection.cpython-311.pyc | Bin 7098 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 25960 -> 0 bytes .../_request_methods.cpython-311.pyc | Bin 10711 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 713 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 40491 -> 0 bytes .../connectionpool.cpython-311.pyc | Bin 41263 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 20085 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 12708 -> 0 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 3867 -> 0 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 25875 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 56633 -> 0 bytes .../site-packages/urllib3/_base_connection.py | 165 - .../site-packages/urllib3/_collections.py | 479 - .../site-packages/urllib3/_request_methods.py | 278 - .../site-packages/urllib3/_version.py | 21 - .../site-packages/urllib3/connection.py | 1093 -- .../site-packages/urllib3/connectionpool.py | 1178 --- .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 189 -> 0 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 29493 -> 0 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8726 -> 0 bytes .../urllib3/contrib/emscripten/__init__.py | 16 - .../__pycache__/__init__.cpython-311.pyc | Bin 991 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 10608 -> 0 bytes .../__pycache__/fetch.cpython-311.pyc | Bin 31281 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 1647 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 12969 -> 0 bytes .../urllib3/contrib/emscripten/connection.py | 255 - .../emscripten/emscripten_fetch_worker.js | 110 - .../urllib3/contrib/emscripten/fetch.py | 728 -- .../urllib3/contrib/emscripten/request.py | 22 - .../urllib3/contrib/emscripten/response.py | 277 - .../urllib3/contrib/pyopenssl.py | 564 -- .../site-packages/urllib3/contrib/socks.py | 228 - .../site-packages/urllib3/exceptions.py | 335 - .../site-packages/urllib3/fields.py | 341 - .../site-packages/urllib3/filepost.py | 89 - .../site-packages/urllib3/http2/__init__.py | 53 - .../__pycache__/__init__.cpython-311.pyc | Bin 2014 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 19035 -> 0 bytes .../http2/__pycache__/probe.cpython-311.pyc | Bin 4334 -> 0 bytes .../site-packages/urllib3/http2/connection.py | 356 - .../site-packages/urllib3/http2/probe.py | 87 - .../site-packages/urllib3/poolmanager.py | 653 -- .../python3.11/site-packages/urllib3/py.typed | 2 - .../site-packages/urllib3/response.py | 1307 --- .../site-packages/urllib3/util/__init__.py | 42 - .../util/__pycache__/__init__.cpython-311.pyc | Bin 1222 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5045 -> 0 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1280 -> 0 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 9212 -> 0 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3354 -> 0 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 21160 -> 0 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 18079 -> 0 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 6249 -> 0 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 14313 -> 0 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 12067 -> 0 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 17766 -> 0 bytes .../util/__pycache__/util.cpython-311.pyc | Bin 2170 -> 0 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 3741 -> 0 bytes .../site-packages/urllib3/util/connection.py | 137 - .../site-packages/urllib3/util/proxy.py | 43 - .../site-packages/urllib3/util/request.py | 266 - .../site-packages/urllib3/util/response.py | 101 - .../site-packages/urllib3/util/retry.py | 533 - .../site-packages/urllib3/util/ssl_.py | 524 - .../urllib3/util/ssl_match_hostname.py | 159 - .../urllib3/util/ssltransport.py | 271 - .../site-packages/urllib3/util/timeout.py | 275 - .../site-packages/urllib3/util/url.py | 469 - .../site-packages/urllib3/util/util.py | 42 - .../site-packages/urllib3/util/wait.py | 124 - .../werkzeug-3.1.3.dist-info/INSTALLER | 1 - .../werkzeug-3.1.3.dist-info/LICENSE.txt | 28 - .../werkzeug-3.1.3.dist-info/METADATA | 99 - .../werkzeug-3.1.3.dist-info/RECORD | 116 - .../werkzeug-3.1.3.dist-info/WHEEL | 4 - .../site-packages/werkzeug/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 392 -> 0 bytes .../__pycache__/_internal.cpython-311.pyc | Bin 10683 -> 0 bytes .../__pycache__/_reloader.cpython-311.pyc | Bin 23128 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 36958 -> 0 bytes .../__pycache__/formparser.cpython-311.pyc | Bin 17992 -> 0 bytes .../werkzeug/__pycache__/http.cpython-311.pyc | Bin 54748 -> 0 bytes .../__pycache__/local.cpython-311.pyc | Bin 31328 -> 0 bytes .../__pycache__/security.cpython-311.pyc | Bin 7762 -> 0 bytes .../__pycache__/serving.cpython-311.pyc | Bin 50437 -> 0 bytes .../werkzeug/__pycache__/test.cpython-311.pyc | Bin 64244 -> 0 bytes .../__pycache__/testapp.cpython-311.pyc | Bin 9536 -> 0 bytes .../werkzeug/__pycache__/urls.cpython-311.pyc | Bin 9025 -> 0 bytes .../__pycache__/user_agent.cpython-311.pyc | Bin 2316 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 30215 -> 0 bytes .../werkzeug/__pycache__/wsgi.cpython-311.pyc | Bin 26876 -> 0 bytes .../site-packages/werkzeug/_internal.py | 211 - .../site-packages/werkzeug/_reloader.py | 471 - .../werkzeug/datastructures/__init__.py | 64 - .../__pycache__/__init__.cpython-311.pyc | Bin 3049 -> 0 bytes .../__pycache__/accept.cpython-311.pyc | Bin 18294 -> 0 bytes .../__pycache__/auth.cpython-311.pyc | Bin 15604 -> 0 bytes .../__pycache__/cache_control.cpython-311.pyc | Bin 13404 -> 0 bytes .../__pycache__/csp.cpython-311.pyc | Bin 7205 -> 0 bytes .../__pycache__/etag.cpython-311.pyc | Bin 6095 -> 0 bytes .../__pycache__/file_storage.cpython-311.pyc | Bin 9708 -> 0 bytes .../__pycache__/headers.cpython-311.pyc | Bin 33776 -> 0 bytes .../__pycache__/mixins.cpython-311.pyc | Bin 19194 -> 0 bytes .../__pycache__/range.cpython-311.pyc | Bin 10847 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 66480 -> 0 bytes .../werkzeug/datastructures/accept.py | 350 - .../werkzeug/datastructures/auth.py | 317 - .../werkzeug/datastructures/cache_control.py | 273 - .../werkzeug/datastructures/csp.py | 100 - .../werkzeug/datastructures/etag.py | 106 - .../werkzeug/datastructures/file_storage.py | 209 - .../werkzeug/datastructures/headers.py | 662 -- .../werkzeug/datastructures/mixins.py | 317 - .../werkzeug/datastructures/range.py | 214 - .../werkzeug/datastructures/structures.py | 1239 --- .../site-packages/werkzeug/debug/__init__.py | 565 -- .../__pycache__/__init__.cpython-311.pyc | Bin 26066 -> 0 bytes .../debug/__pycache__/console.cpython-311.pyc | Bin 13452 -> 0 bytes .../debug/__pycache__/repr.cpython-311.pyc | Bin 16130 -> 0 bytes .../debug/__pycache__/tbtools.cpython-311.pyc | Bin 18194 -> 0 bytes .../site-packages/werkzeug/debug/console.py | 219 - .../site-packages/werkzeug/debug/repr.py | 282 - .../werkzeug/debug/shared/ICON_LICENSE.md | 6 - .../werkzeug/debug/shared/console.png | Bin 507 -> 0 bytes .../werkzeug/debug/shared/debugger.js | 344 - .../werkzeug/debug/shared/less.png | Bin 191 -> 0 bytes .../werkzeug/debug/shared/more.png | Bin 200 -> 0 bytes .../werkzeug/debug/shared/style.css | 150 - .../site-packages/werkzeug/debug/tbtools.py | 450 - .../site-packages/werkzeug/exceptions.py | 894 -- .../site-packages/werkzeug/formparser.py | 430 - .../python3.11/site-packages/werkzeug/http.py | 1405 --- .../site-packages/werkzeug/local.py | 653 -- .../werkzeug/middleware/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 193 -> 0 bytes .../__pycache__/dispatcher.cpython-311.pyc | Bin 3477 -> 0 bytes .../__pycache__/http_proxy.cpython-311.pyc | Bin 10962 -> 0 bytes .../__pycache__/lint.cpython-311.pyc | Bin 20923 -> 0 bytes .../__pycache__/profiler.cpython-311.pyc | Bin 7599 -> 0 bytes .../__pycache__/proxy_fix.cpython-311.pyc | Bin 7666 -> 0 bytes .../__pycache__/shared_data.cpython-311.pyc | Bin 13902 -> 0 bytes .../werkzeug/middleware/dispatcher.py | 81 - .../werkzeug/middleware/http_proxy.py | 236 - .../site-packages/werkzeug/middleware/lint.py | 439 - .../werkzeug/middleware/profiler.py | 155 - .../werkzeug/middleware/proxy_fix.py | 183 - .../werkzeug/middleware/shared_data.py | 283 - .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 134 - .../__pycache__/__init__.cpython-311.pyc | Bin 5058 -> 0 bytes .../__pycache__/converters.cpython-311.pyc | Bin 12437 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 8941 -> 0 bytes .../routing/__pycache__/map.cpython-311.pyc | Bin 41737 -> 0 bytes .../__pycache__/matcher.cpython-311.pyc | Bin 9087 -> 0 bytes .../routing/__pycache__/rules.cpython-311.pyc | Bin 42167 -> 0 bytes .../werkzeug/routing/converters.py | 261 - .../werkzeug/routing/exceptions.py | 152 - .../site-packages/werkzeug/routing/map.py | 951 -- .../site-packages/werkzeug/routing/matcher.py | 202 - .../site-packages/werkzeug/routing/rules.py | 928 -- .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 189 -> 0 bytes .../sansio/__pycache__/http.cpython-311.pyc | Bin 6105 -> 0 bytes .../__pycache__/multipart.cpython-311.pyc | Bin 15352 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 23438 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 34125 -> 0 bytes .../sansio/__pycache__/utils.cpython-311.pyc | Bin 6859 -> 0 bytes .../site-packages/werkzeug/sansio/http.py | 170 - .../werkzeug/sansio/multipart.py | 323 - .../site-packages/werkzeug/sansio/request.py | 534 - .../site-packages/werkzeug/sansio/response.py | 763 -- .../site-packages/werkzeug/sansio/utils.py | 167 - .../site-packages/werkzeug/security.py | 166 - .../site-packages/werkzeug/serving.py | 1125 --- .../python3.11/site-packages/werkzeug/test.py | 1464 --- .../site-packages/werkzeug/testapp.py | 194 - .../python3.11/site-packages/werkzeug/urls.py | 203 - .../site-packages/werkzeug/user_agent.py | 47 - .../site-packages/werkzeug/utils.py | 691 -- .../werkzeug/wrappers/__init__.py | 3 - .../__pycache__/__init__.cpython-311.pyc | Bin 354 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 27577 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 37001 -> 0 bytes .../werkzeug/wrappers/request.py | 650 -- .../werkzeug/wrappers/response.py | 831 -- .../python3.11/site-packages/werkzeug/wsgi.py | 595 -- port/lib64 | 1 - port/pyvenv.cfg | 8 +- requirements.txt | 7 + 2892 files changed, 53 insertions(+), 655200 deletions(-) delete mode 100755 port/bin/gunicorn delete mode 100755 port/bin/normalizer delete mode 100755 port/bin/pip3.11 delete mode 120000 port/bin/python3.11 delete mode 100644 port/include/site/python3.11/greenlet/greenlet.h delete mode 100644 port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/LICENSE delete mode 100644 port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/_distutils_hack/__init__.py delete mode 100644 port/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/_distutils_hack/override.py delete mode 100644 port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/blinker/__init__.py delete mode 100644 port/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/blinker/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/blinker/_utilities.py delete mode 100644 port/lib/python3.11/site-packages/blinker/base.py delete mode 100644 port/lib/python3.11/site-packages/blinker/py.typed delete mode 100644 port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/licenses/LICENSE delete mode 100644 port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/certifi/__init__.py delete mode 100644 port/lib/python3.11/site-packages/certifi/__main__.py delete mode 100644 port/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/certifi/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/certifi/cacert.pem delete mode 100644 port/lib/python3.11/site-packages/certifi/core.py delete mode 100644 port/lib/python3.11/site-packages/certifi/py.typed delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__init__.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__main__.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/cd.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/constant.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/md.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/models.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/api.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/cd.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/constant.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/legacy.py delete mode 100755 port/lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/md.py delete mode 100755 port/lib/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/models.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/py.typed delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/utils.py delete mode 100644 port/lib/python3.11/site-packages/charset_normalizer/version.py delete mode 100644 port/lib/python3.11/site-packages/click-8.1.8.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/click-8.1.8.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/click-8.1.8.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/click/__init__.py delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/formatting.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/click/_compat.py delete mode 100644 port/lib/python3.11/site-packages/click/_termui_impl.py delete mode 100644 port/lib/python3.11/site-packages/click/_textwrap.py delete mode 100644 port/lib/python3.11/site-packages/click/_winconsole.py delete mode 100644 port/lib/python3.11/site-packages/click/core.py delete mode 100644 port/lib/python3.11/site-packages/click/decorators.py delete mode 100644 port/lib/python3.11/site-packages/click/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/click/formatting.py delete mode 100644 port/lib/python3.11/site-packages/click/globals.py delete mode 100644 port/lib/python3.11/site-packages/click/parser.py delete mode 100644 port/lib/python3.11/site-packages/click/py.typed delete mode 100644 port/lib/python3.11/site-packages/click/shell_completion.py delete mode 100644 port/lib/python3.11/site-packages/click/termui.py delete mode 100644 port/lib/python3.11/site-packages/click/testing.py delete mode 100644 port/lib/python3.11/site-packages/click/types.py delete mode 100644 port/lib/python3.11/site-packages/click/utils.py delete mode 100644 port/lib/python3.11/site-packages/distutils-precedence.pth delete mode 100644 port/lib/python3.11/site-packages/dotenv/__init__.py delete mode 100644 port/lib/python3.11/site-packages/dotenv/__main__.py delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/cli.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/ipython.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/main.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/variables.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/dotenv/cli.py delete mode 100644 port/lib/python3.11/site-packages/dotenv/ipython.py delete mode 100644 port/lib/python3.11/site-packages/dotenv/main.py delete mode 100644 port/lib/python3.11/site-packages/dotenv/parser.py delete mode 100644 port/lib/python3.11/site-packages/dotenv/py.typed delete mode 100644 port/lib/python3.11/site-packages/dotenv/variables.py delete mode 100644 port/lib/python3.11/site-packages/dotenv/version.py delete mode 100644 port/lib/python3.11/site-packages/flask-3.1.0.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/flask-3.1.0.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/flask-3.1.0.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/flask-3.1.0.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/flask-3.1.0.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/flask-3.1.0.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/flask-3.1.0.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/flask/__init__.py delete mode 100644 port/lib/python3.11/site-packages/flask/__main__.py delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/app.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/blueprints.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/cli.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/config.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/ctx.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/debughelpers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/globals.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/helpers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/logging.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/sessions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/signals.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/templating.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/testing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/typing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/views.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/__pycache__/wrappers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/app.py delete mode 100644 port/lib/python3.11/site-packages/flask/blueprints.py delete mode 100644 port/lib/python3.11/site-packages/flask/cli.py delete mode 100644 port/lib/python3.11/site-packages/flask/config.py delete mode 100644 port/lib/python3.11/site-packages/flask/ctx.py delete mode 100644 port/lib/python3.11/site-packages/flask/debughelpers.py delete mode 100644 port/lib/python3.11/site-packages/flask/globals.py delete mode 100644 port/lib/python3.11/site-packages/flask/helpers.py delete mode 100644 port/lib/python3.11/site-packages/flask/json/__init__.py delete mode 100644 port/lib/python3.11/site-packages/flask/json/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/json/__pycache__/provider.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/json/__pycache__/tag.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/json/provider.py delete mode 100644 port/lib/python3.11/site-packages/flask/json/tag.py delete mode 100644 port/lib/python3.11/site-packages/flask/logging.py delete mode 100644 port/lib/python3.11/site-packages/flask/py.typed delete mode 100644 port/lib/python3.11/site-packages/flask/sansio/README.md delete mode 100644 port/lib/python3.11/site-packages/flask/sansio/__pycache__/app.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/sansio/__pycache__/blueprints.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/sansio/__pycache__/scaffold.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask/sansio/app.py delete mode 100644 port/lib/python3.11/site-packages/flask/sansio/blueprints.py delete mode 100644 port/lib/python3.11/site-packages/flask/sansio/scaffold.py delete mode 100644 port/lib/python3.11/site-packages/flask/sessions.py delete mode 100644 port/lib/python3.11/site-packages/flask/signals.py delete mode 100644 port/lib/python3.11/site-packages/flask/templating.py delete mode 100644 port/lib/python3.11/site-packages/flask/testing.py delete mode 100644 port/lib/python3.11/site-packages/flask/typing.py delete mode 100644 port/lib/python3.11/site-packages/flask/views.py delete mode 100644 port/lib/python3.11/site-packages/flask/wrappers.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/__about__.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/__init__.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/__about__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/config.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/login_manager.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/mixins.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/signals.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/test_client.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_login/config.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/login_manager.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/mixins.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/signals.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/test_client.py delete mode 100644 port/lib/python3.11/site-packages/flask_login/utils.py delete mode 100644 port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/flask_mail/__init__.py delete mode 100644 port/lib/python3.11/site-packages/flask_mail/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_mail/py.typed delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__init__.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/cli.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/model.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/pagination.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/query.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/record_queries.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/session.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/table.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/cli.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/extension.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/model.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/pagination.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/py.typed delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/query.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/record_queries.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/session.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/table.py delete mode 100644 port/lib/python3.11/site-packages/flask_sqlalchemy/track_modifications.py delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/AUTHORS delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE.PSF delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/greenlet/CObjects.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/PyGreenlet.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/PyGreenlet.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/PyGreenletUnswitchable.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/PyModule.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TBrokenGreenlet.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TExceptionState.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TGreenlet.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TGreenlet.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TGreenletGlobals.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TMainGreenlet.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TPythonState.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TStackState.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TThreadState.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TThreadStateCreator.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TThreadStateDestroy.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/TUserGreenlet.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/__init__.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/__pycache__/__init__.cpython-311.pyc delete mode 100755 port/lib/python3.11/site-packages/greenlet/_greenlet.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet.cpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_allocator.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_compiler_compat.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_cpython_add_pending.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_cpython_compat.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_exceptions.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_internal.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_refs.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_slp_switch.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/greenlet_thread_support.hpp delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/__init__.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/setup_switch_x64_masm.cmd delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_aarch64_gcc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_alpha_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_amd64_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_gcc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_ios.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_masm.asm delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_masm.obj delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_msvc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_csky_gcc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_loongarch64_linux.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_m68k_gcc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_mips_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_aix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_linux.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_aix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_linux.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_macosx.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_riscv_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_s390_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_sh_gcc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_sparc_sun_gcc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_x32_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_x64_masm.asm delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_x64_masm.obj delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_x64_msvc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_x86_msvc.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/platform/switch_x86_unix.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/slp_platformselect.h delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__init__.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/leakcheck.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_extension_interface.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_gc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_generator.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_greenlet_trash.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_leaks.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_stack_saved.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_throw.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_tracing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/_test_extension.c delete mode 100755 port/lib/python3.11/site-packages/greenlet/tests/_test_extension.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/_test_extension_cpp.cpp delete mode 100755 port/lib/python3.11/site-packages/greenlet/tests/_test_extension_cpp.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/fail_clearing_run_switches.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/fail_cpp_exception.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/fail_initialstub_already_started.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/fail_slp_switch.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets2.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/fail_switch_two_greenlets.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/leakcheck.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_contextvars.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_cpp.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_extension_interface.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_gc.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_generator.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_generator_nested.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_greenlet.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_greenlet_trash.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_leaks.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_stack_saved.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_throw.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_tracing.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_version.py delete mode 100644 port/lib/python3.11/site-packages/greenlet/tests/test_weakref.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/LICENSE delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__init__.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__main__.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/arbiter.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/config.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/debug.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/errors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/glogging.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/pidfile.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/reloader.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/sock.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/systemd.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/__init__.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/__pycache__/wsgiapp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/base.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/pasterapp.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/arbiter.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/config.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/debug.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/errors.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/glogging.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__init__.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__pycache__/body.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__pycache__/errors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__pycache__/message.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__pycache__/parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__pycache__/unreader.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/__pycache__/wsgi.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/body.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/errors.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/message.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/parser.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/unreader.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/http/wsgi.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/instrument/__init__.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/instrument/__pycache__/statsd.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/instrument/statsd.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/pidfile.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/reloader.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/sock.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/systemd.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/util.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__init__.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/base_async.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/geventlet.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/ggevent.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gthread.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/sync.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/workertmp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/base.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/base_async.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/geventlet.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/ggevent.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/gthread.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/gtornado.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/sync.py delete mode 100644 port/lib/python3.11/site-packages/gunicorn/workers/workertmp.py delete mode 100644 port/lib/python3.11/site-packages/idna-3.11.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/idna-3.11.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/idna-3.11.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/idna-3.11.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/idna-3.11.dist-info/licenses/LICENSE.md delete mode 100644 port/lib/python3.11/site-packages/idna/__init__.py delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/package_data.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/idna/codec.py delete mode 100644 port/lib/python3.11/site-packages/idna/compat.py delete mode 100644 port/lib/python3.11/site-packages/idna/core.py delete mode 100644 port/lib/python3.11/site-packages/idna/idnadata.py delete mode 100644 port/lib/python3.11/site-packages/idna/intranges.py delete mode 100644 port/lib/python3.11/site-packages/idna/package_data.py delete mode 100644 port/lib/python3.11/site-packages/idna/py.typed delete mode 100644 port/lib/python3.11/site-packages/idna/uts46data.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__init__.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/_json.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/encoding.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/exc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/serializer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/signer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/timed.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/__pycache__/url_safe.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/_json.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/encoding.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/exc.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/py.typed delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/serializer.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/signer.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/timed.py delete mode 100644 port/lib/python3.11/site-packages/itsdangerous/url_safe.py delete mode 100644 port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/jinja2/__init__.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/_identifier.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/async_utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/defaults.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/environment.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/filters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/loaders.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/meta.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/nativetypes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/optimizer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/runtime.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/tests.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/jinja2/_identifier.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/async_utils.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/bccache.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/compiler.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/constants.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/debug.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/defaults.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/environment.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/ext.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/filters.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/idtracking.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/lexer.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/loaders.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/meta.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/nativetypes.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/nodes.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/optimizer.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/parser.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/py.typed delete mode 100644 port/lib/python3.11/site-packages/jinja2/runtime.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/sandbox.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/tests.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/utils.py delete mode 100644 port/lib/python3.11/site-packages/jinja2/visitor.py delete mode 100644 port/lib/python3.11/site-packages/markupsafe/__init__.py delete mode 100644 port/lib/python3.11/site-packages/markupsafe/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/markupsafe/__pycache__/_native.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/markupsafe/_native.py delete mode 100644 port/lib/python3.11/site-packages/markupsafe/_speedups.c delete mode 100755 port/lib/python3.11/site-packages/markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/markupsafe/_speedups.pyi delete mode 100644 port/lib/python3.11/site-packages/markupsafe/py.typed delete mode 100644 port/lib/python3.11/site-packages/packaging-24.2.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/packaging-24.2.dist-info/LICENSE delete mode 100644 port/lib/python3.11/site-packages/packaging-24.2.dist-info/LICENSE.APACHE delete mode 100644 port/lib/python3.11/site-packages/packaging-24.2.dist-info/LICENSE.BSD delete mode 100644 port/lib/python3.11/site-packages/packaging-24.2.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/packaging-24.2.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/packaging-24.2.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/packaging/__init__.py delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/_elffile.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/_parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/_tokenizer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/metadata.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/_elffile.py delete mode 100644 port/lib/python3.11/site-packages/packaging/_manylinux.py delete mode 100644 port/lib/python3.11/site-packages/packaging/_musllinux.py delete mode 100644 port/lib/python3.11/site-packages/packaging/_parser.py delete mode 100644 port/lib/python3.11/site-packages/packaging/_structures.py delete mode 100644 port/lib/python3.11/site-packages/packaging/_tokenizer.py delete mode 100644 port/lib/python3.11/site-packages/packaging/licenses/__init__.py delete mode 100644 port/lib/python3.11/site-packages/packaging/licenses/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/licenses/__pycache__/_spdx.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/packaging/licenses/_spdx.py delete mode 100644 port/lib/python3.11/site-packages/packaging/markers.py delete mode 100644 port/lib/python3.11/site-packages/packaging/metadata.py delete mode 100644 port/lib/python3.11/site-packages/packaging/py.typed delete mode 100644 port/lib/python3.11/site-packages/packaging/requirements.py delete mode 100644 port/lib/python3.11/site-packages/packaging/specifiers.py delete mode 100644 port/lib/python3.11/site-packages/packaging/tags.py delete mode 100644 port/lib/python3.11/site-packages/packaging/utils.py delete mode 100644 port/lib/python3.11/site-packages/packaging/version.py delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/pip-23.0.1.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/pip/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/__main__.py delete mode 100644 port/lib/python3.11/site-packages/pip/__pip-runner__.py delete mode 100644 port/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/build_env.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cache.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/base_command.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/command_context.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/main.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/parser.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/req_command.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/spinners.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/cache.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/check.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/completion.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/configuration.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/debug.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/download.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/freeze.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/hash.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/help.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/index.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/inspect.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/install.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/list.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/search.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/show.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/commands/wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/configuration.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/base.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/installed.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/collector.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/package_finder.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/index/sources.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/locations/base.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/main.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/_json.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/base.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/candidate.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/direct_url.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/format_control.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/index.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/installation_report.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/link.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/scheme.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/search_scope.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/target_python.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/models/wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/auth.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/cache.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/download.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/session.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/utils.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/check.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/freeze.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/operations/prepare.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/pyproject.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/constructors.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/req_file.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/req_install.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/req_set.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/base.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/_log.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/datetime.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/encoding.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/glibc.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/hashes.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/logging.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/misc.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/models.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/packaging.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/urls.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/utils/wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/git.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 port/lib/python3.11/site-packages/pip/_internal/wheel_builder.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/certifi/core.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachinedict.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/macromanprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/resultdict.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/chardet/version.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansi_test.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/initialise_test.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/isatty_test.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/utils.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/tests/winterm_test.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/database.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/index.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/util.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/version.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/distro/distro.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/codec.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/core.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/packaging/version.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/console.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/style.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/token.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pygments/util.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/api.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/auth.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/certs.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/compat.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/help.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/models.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/packages.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/structures.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/requests/utils.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/abc.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/align.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/bar.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/box.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/cells.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/color.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/columns.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/console.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/containers.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/control.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/errors.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/json.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/layout.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/live.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/logging.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/markup.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/measure.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/padding.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/pager.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/palette.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/panel.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/progress.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/region.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/repr.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/rule.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/scope.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/screen.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/segment.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/status.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/style.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/styled.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/table.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/text.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/theme.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/themes.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/rich/tree.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/six.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/vendor.txt delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 port/lib/python3.11/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 port/lib/python3.11/site-packages/pip/py.typed delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__main__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/android.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/api.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/macos.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/unix.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/version.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/windows.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/actions.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/common.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/core.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/helpers.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/results.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/testing.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/unicode.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/util.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/typing_extensions.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/extern/__init__.py delete mode 100644 port/lib/python3.11/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/licenses/LICENSE delete mode 100644 port/lib/python3.11/site-packages/python_dotenv-1.1.0.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/LICENSE delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/python_slugify-8.0.4.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/requests-2.32.5.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/requests-2.32.5.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/requests-2.32.5.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/requests-2.32.5.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/requests-2.32.5.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/requests-2.32.5.dist-info/licenses/LICENSE delete mode 100644 port/lib/python3.11/site-packages/requests-2.32.5.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/requests/__init__.py delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/__version__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/_internal_utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/adapters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/auth.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/certs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/cookies.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/help.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/hooks.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/models.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/packages.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/sessions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/status_codes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/structures.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/requests/__version__.py delete mode 100644 port/lib/python3.11/site-packages/requests/_internal_utils.py delete mode 100644 port/lib/python3.11/site-packages/requests/adapters.py delete mode 100644 port/lib/python3.11/site-packages/requests/api.py delete mode 100644 port/lib/python3.11/site-packages/requests/auth.py delete mode 100644 port/lib/python3.11/site-packages/requests/certs.py delete mode 100644 port/lib/python3.11/site-packages/requests/compat.py delete mode 100644 port/lib/python3.11/site-packages/requests/cookies.py delete mode 100644 port/lib/python3.11/site-packages/requests/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/requests/help.py delete mode 100644 port/lib/python3.11/site-packages/requests/hooks.py delete mode 100644 port/lib/python3.11/site-packages/requests/models.py delete mode 100644 port/lib/python3.11/site-packages/requests/packages.py delete mode 100644 port/lib/python3.11/site-packages/requests/sessions.py delete mode 100644 port/lib/python3.11/site-packages/requests/status_codes.py delete mode 100644 port/lib/python3.11/site-packages/requests/structures.py delete mode 100644 port/lib/python3.11/site-packages/requests/utils.py delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/LICENSE delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/REQUESTED delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/entry_points.txt delete mode 100644 port/lib/python3.11/site-packages/setuptools-66.1.1.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/setuptools/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/_path.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/depends.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/dist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/errors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/extension.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/glob.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/installer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/launch.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/logging.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_deprecation_warning.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_log.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/_collections.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/_functools.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/_log.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/cmd.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/build.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/check.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/config.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/install.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/register.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/config.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/core.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/debug.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/dist.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/errors.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/extension.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/file_util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/filelist.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/log.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/py39compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/spawn.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/text_file.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/version.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_entry_points.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_imp.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_importlib.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_itertools.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_path.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_reqs.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/actions.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/common.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/core.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/helpers.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/results.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/testing.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/unicode.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/_vendor/zipp.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/archive_util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/build_meta.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/cli-32.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/cli-64.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/cli-arm64.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/cli.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/alias.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/bdist_egg.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/build.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/build_clib.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/build_ext.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/build_py.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/develop.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/dist_info.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/easy_install.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/editable_wheel.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/egg_info.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/install.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/install_egg_info.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/install_lib.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/install_scripts.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/py36compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/register.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/rotate.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/saveopts.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/sdist.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/setopt.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/test.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/upload.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/command/upload_docs.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/expand.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/config/setupcfg.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/dep_util.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/depends.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/discovery.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/dist.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/errors.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/extension.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/extern/__init__.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/setuptools/glob.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/gui-32.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/gui-64.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/gui-arm64.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/gui.exe delete mode 100644 port/lib/python3.11/site-packages/setuptools/installer.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/launch.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/logging.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/monkey.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/msvc.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/namespaces.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/package_index.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/py34compat.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/sandbox.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/script (dev).tmpl delete mode 100644 port/lib/python3.11/site-packages/setuptools/script.tmpl delete mode 100644 port/lib/python3.11/site-packages/setuptools/unicode_utils.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/version.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/wheel.py delete mode 100644 port/lib/python3.11/site-packages/setuptools/windows_support.py delete mode 100644 port/lib/python3.11/site-packages/slugify/__init__.py delete mode 100644 port/lib/python3.11/site-packages/slugify/__main__.py delete mode 100644 port/lib/python3.11/site-packages/slugify/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/slugify/__pycache__/__main__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/slugify/__pycache__/__version__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/slugify/__pycache__/slugify.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/slugify/__pycache__/special.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/slugify/__version__.py delete mode 100644 port/lib/python3.11/site-packages/slugify/py.typed delete mode 100644 port/lib/python3.11/site-packages/slugify/slugify.py delete mode 100644 port/lib/python3.11/site-packages/slugify/special.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy-2.0.40.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy-2.0.40.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy-2.0.40.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy-2.0.40.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy-2.0.40.dist-info/licenses/LICENSE delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy-2.0.40.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__pycache__/events.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__pycache__/exc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__pycache__/inspection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__pycache__/log.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__pycache__/schema.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/__pycache__/types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/__pycache__/aioodbc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/__pycache__/asyncio.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/__pycache__/pyodbc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/aioodbc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/asyncio.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/connectors/pyodbc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/__pycache__/__init__.cpython-311.pyc delete mode 100755 port/lib/python3.11/site-packages/sqlalchemy/cyextension/collections.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/collections.pyx delete mode 100755 port/lib/python3.11/site-packages/sqlalchemy/cyextension/immutabledict.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/immutabledict.pxd delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/immutabledict.pyx delete mode 100755 port/lib/python3.11/site-packages/sqlalchemy/cyextension/processors.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/processors.pyx delete mode 100755 port/lib/python3.11/site-packages/sqlalchemy/cyextension/resultproxy.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/resultproxy.pyx delete mode 100755 port/lib/python3.11/site-packages/sqlalchemy/cyextension/util.cpython-311-x86_64-linux-gnu.so delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/cyextension/util.pyx delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/__pycache__/_typing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/_typing.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/aioodbc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/json.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/provision.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/aioodbc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/information_schema.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/json.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/provision.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/pymssql.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mssql/pyodbc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/aiomysql.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/asyncmy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/dml.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/expression.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/json.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadb.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/mariadbconnector.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/provision.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/reserved_words.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/__pycache__/types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/aiomysql.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/asyncmy.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/cymysql.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/dml.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/enumerated.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/expression.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/json.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mariadb.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/provision.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/pymysql.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/pyodbc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/reflection.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/reserved_words.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/types.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__pycache__/dictionary.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__pycache__/oracledb.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__pycache__/provision.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/__pycache__/types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/dictionary.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/oracledb.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/provision.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/oracle/types.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/_psycopg_common.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/array.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/asyncpg.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/json.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/named_types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/operators.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/pg_catalog.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/provision.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/__pycache__/types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/array.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/dml.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/ext.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/hstore.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/json.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/named_types.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/operators.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/pg8000.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/provision.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/psycopg.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/ranges.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/types.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/aiosqlite.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/dml.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/json.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/provision.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/dml.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/json.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/provision.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/dialects/type_migration_guidelines.txt delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/_py_processors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/_py_row.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/_py_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/characteristics.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/create.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/cursor.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/default.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/events.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/interfaces.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/mock.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/processors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/reflection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/result.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/row.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/strategies.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/url.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/_py_processors.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/_py_row.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/_py_util.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/characteristics.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/create.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/default.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/events.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/interfaces.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/mock.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/processors.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/result.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/row.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/strategies.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/url.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/engine/util.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/__pycache__/api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/__pycache__/attr.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/__pycache__/legacy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/__pycache__/registry.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/api.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/attr.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/legacy.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/event/registry.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/events.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/exc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/associationproxy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/automap.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/baked.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/compiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/horizontal_shard.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/indexable.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/instrumentation.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/mutable.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/orderinglist.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/serializer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/associationproxy.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__pycache__/engine.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__pycache__/exc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__pycache__/result.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__pycache__/scoping.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/__pycache__/session.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/engine.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/exc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/result.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/scoping.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/asyncio/session.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/automap.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/baked.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/compiler.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/declarative/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/declarative/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/declarative/__pycache__/extensions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/declarative/extensions.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/horizontal_shard.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/hybrid.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/indexable.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/instrumentation.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mutable.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__pycache__/apply.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__pycache__/decl_class.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__pycache__/infer.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__pycache__/names.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/apply.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/decl_class.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/infer.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/names.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/plugin.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/mypy/util.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/orderinglist.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/ext/serializer.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/future/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/future/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/future/__pycache__/engine.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/future/engine.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/inspection.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/log.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/_orm_constructors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/_typing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/attributes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/bulk_persistence.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/clsregistry.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/collections.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/context.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/decl_api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/decl_base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/dependency.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/descriptor_props.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/dynamic.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/evaluator.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/events.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/exc.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/identity.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/instrumentation.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/interfaces.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/loading.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/mapped_collection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/mapper.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/path_registry.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/persistence.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/properties.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/query.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/relationships.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/scoping.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/session.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/state.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/state_changes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/strategies.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/strategy_options.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/sync.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/unitofwork.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/__pycache__/writeonly.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/_orm_constructors.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/_typing.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/attributes.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/bulk_persistence.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/clsregistry.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/collections.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/context.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/decl_api.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/decl_base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/dependency.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/descriptor_props.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/dynamic.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/evaluator.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/events.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/exc.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/identity.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/instrumentation.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/interfaces.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/loading.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/mapped_collection.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/mapper.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/path_registry.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/persistence.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/properties.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/query.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/relationships.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/scoping.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/session.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/state.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/state_changes.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/strategies.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/strategy_options.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/sync.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/unitofwork.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/util.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/orm/writeonly.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/__pycache__/events.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/__pycache__/impl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/events.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/pool/impl.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/py.typed delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/schema.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/_dml_constructors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/_elements_constructors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/_orm_types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/_py_util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/_selectable_constructors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/_typing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/annotation.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/cache_key.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/coercions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/compiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/crud.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/ddl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/default_comparator.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/dml.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/elements.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/events.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/expression.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/functions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/lambdas.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/naming.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/operators.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/roles.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/schema.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/selectable.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/sqltypes.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/traversals.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/type_api.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/__pycache__/visitors.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/_dml_constructors.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/_elements_constructors.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/_orm_types.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/_py_util.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/_selectable_constructors.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/_typing.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/annotation.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/cache_key.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/coercions.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/crud.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/ddl.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/default_comparator.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/dml.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/elements.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/events.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/expression.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/functions.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/lambdas.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/naming.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/operators.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/roles.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/schema.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/selectable.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/sqltypes.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/traversals.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/util.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/sql/visitors.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/assertions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/assertsql.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/asyncio.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/config.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/engines.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/entities.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/exclusions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/pickleable.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/profiling.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/provision.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/requirements.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/schema.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/__pycache__/warnings.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/assertions.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/assertsql.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/asyncio.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/config.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/engines.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/entities.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/exclusions.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/__pycache__/base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/__pycache__/mypy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/__pycache__/orm.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/__pycache__/sql.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/mypy.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/orm.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/fixtures/sql.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/pickleable.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/bootstrap.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/plugin_base.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/plugin/pytestplugin.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/profiling.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/provision.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/requirements.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/schema.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_cte.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_deprecations.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_insert.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_results.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_rowcount.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_select.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_types.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_unicode_ddl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_cte.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_ddl.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_deprecations.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_dialect.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_insert.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_reflection.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_results.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_rowcount.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_select.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_sequence.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_types.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/suite/test_update_delete.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/util.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/testing/warnings.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/types.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__init__.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/_collections.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/_concurrency_py3k.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/_has_cy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/_py_collections.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/compat.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/concurrency.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/deprecations.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/langhelpers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/preloaded.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/queue.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/tool_support.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/topological.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/__pycache__/typing.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/_collections.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/_has_cy.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/_py_collections.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/compat.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/concurrency.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/deprecations.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/preloaded.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/queue.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/tool_support.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/topological.py delete mode 100644 port/lib/python3.11/site-packages/sqlalchemy/util/typing.py delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/DESCRIPTION.rst delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/metadata.json delete mode 100644 port/lib/python3.11/site-packages/text_unidecode-1.3.dist-info/top_level.txt delete mode 100644 port/lib/python3.11/site-packages/text_unidecode/__init__.py delete mode 100644 port/lib/python3.11/site-packages/text_unidecode/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/text_unidecode/data.bin delete mode 100644 port/lib/python3.11/site-packages/typing_extensions-4.13.2.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/typing_extensions-4.13.2.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/typing_extensions-4.13.2.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/typing_extensions-4.13.2.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/typing_extensions-4.13.2.dist-info/licenses/LICENSE delete mode 100644 port/lib/python3.11/site-packages/typing_extensions.py delete mode 100644 port/lib/python3.11/site-packages/urllib3-2.5.0.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/urllib3-2.5.0.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/urllib3-2.5.0.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/urllib3-2.5.0.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/urllib3-2.5.0.dist-info/licenses/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/urllib3/__init__.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/_base_connection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/_collections.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/_request_methods.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/_version.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/connection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/connectionpool.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/fields.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/filepost.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/poolmanager.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/__pycache__/response.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/_base_connection.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/_collections.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/_request_methods.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/_version.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/connection.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/connectionpool.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/__init__.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/__pycache__/socks.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/__init__.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/connection.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/fetch.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/request.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/emscripten/response.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/pyopenssl.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/contrib/socks.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/fields.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/filepost.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/http2/__init__.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/http2/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/http2/__pycache__/connection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/http2/__pycache__/probe.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/http2/connection.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/http2/probe.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/poolmanager.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/py.typed delete mode 100644 port/lib/python3.11/site-packages/urllib3/response.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__init__.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/connection.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/proxy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/request.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/response.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/retry.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/ssl_.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/ssltransport.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/timeout.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/url.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/util.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/__pycache__/wait.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/connection.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/proxy.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/request.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/response.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/retry.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/ssl_.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/ssl_match_hostname.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/ssltransport.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/timeout.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/url.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/util.py delete mode 100644 port/lib/python3.11/site-packages/urllib3/util/wait.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug-3.1.3.dist-info/INSTALLER delete mode 100644 port/lib/python3.11/site-packages/werkzeug-3.1.3.dist-info/LICENSE.txt delete mode 100644 port/lib/python3.11/site-packages/werkzeug-3.1.3.dist-info/METADATA delete mode 100644 port/lib/python3.11/site-packages/werkzeug-3.1.3.dist-info/RECORD delete mode 100644 port/lib/python3.11/site-packages/werkzeug-3.1.3.dist-info/WHEEL delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__init__.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/_internal.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/_reloader.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/formparser.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/http.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/local.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/security.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/serving.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/test.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/testapp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/urls.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/user_agent.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/__pycache__/wsgi.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/_internal.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/_reloader.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__init__.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/accept.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/auth.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/cache_control.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/csp.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/etag.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/headers.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/mixins.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/range.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/__pycache__/structures.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/accept.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/auth.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/cache_control.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/csp.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/etag.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/file_storage.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/headers.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/mixins.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/range.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/datastructures/structures.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/__init__.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/__pycache__/console.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/__pycache__/repr.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/console.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/repr.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/shared/console.png delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/shared/less.png delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/shared/more.png delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/shared/style.css delete mode 100644 port/lib/python3.11/site-packages/werkzeug/debug/tbtools.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/formparser.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/http.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/local.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__init__.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/lint.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/lint.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/profiler.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/middleware/shared_data.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/py.typed delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/__init__.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/__pycache__/converters.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/__pycache__/exceptions.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/__pycache__/map.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/__pycache__/matcher.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/__pycache__/rules.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/converters.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/exceptions.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/map.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/matcher.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/routing/rules.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/__init__.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/http.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/request.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/response.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/__pycache__/utils.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/http.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/multipart.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/request.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/response.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/sansio/utils.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/security.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/serving.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/test.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/testapp.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/urls.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/user_agent.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/utils.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/wrappers/__init__.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/request.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/wrappers/__pycache__/response.cpython-311.pyc delete mode 100644 port/lib/python3.11/site-packages/werkzeug/wrappers/request.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/wrappers/response.py delete mode 100644 port/lib/python3.11/site-packages/werkzeug/wsgi.py delete mode 120000 port/lib64 create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 54fc4bf..c580d7d 100644 --- a/.gitignore +++ b/.gitignore @@ -136,6 +136,7 @@ venv/ ENV/ env.bak/ venv.bak/ +port/ # Spyder project settings .spyderproject @@ -174,7 +175,3 @@ cython_debug/ # PyPI configuration file .pypirc -<<<<<<< HEAD -======= - ->>>>>>> 1f178fb (Initial Commit) diff --git a/port/bin/Activate.ps1 b/port/bin/Activate.ps1 index b49d77b..16ba529 100644 --- a/port/bin/Activate.ps1 +++ b/port/bin/Activate.ps1 @@ -219,6 +219,8 @@ deactivate -nondestructive # that there is an activated venv. $env:VIRTUAL_ENV = $VenvDir +$env:VIRTUAL_ENV_PROMPT = $Prompt + if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { Write-Verbose "Setting prompt to '$Prompt'" @@ -233,7 +235,6 @@ if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " _OLD_VIRTUAL_PROMPT } - $env:VIRTUAL_ENV_PROMPT = $Prompt } # Clear PYTHONHOME diff --git a/port/bin/activate b/port/bin/activate index c13fff4..d6834f4 100644 --- a/port/bin/activate +++ b/port/bin/activate @@ -1,5 +1,5 @@ # This file must be used with "source bin/activate" *from bash* -# you cannot run it directly +# You cannot run it directly deactivate () { # reset old environment variables @@ -14,12 +14,10 @@ deactivate () { unset _OLD_VIRTUAL_PYTHONHOME fi - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null - fi + # Call hash to forget past locations. Without forgetting + # past locations the $PATH changes we made may not be respected. + # See "man bash" for more details. hash is usually a builtin of your shell + hash -r 2> /dev/null if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then PS1="${_OLD_VIRTUAL_PS1:-}" @@ -38,13 +36,27 @@ deactivate () { # unset irrelevant variables deactivate nondestructive -VIRTUAL_ENV=/var/www/Portfolio/port -export VIRTUAL_ENV +# on Windows, a path can contain colons and backslashes and has to be converted: +case "$(uname)" in + CYGWIN*|MSYS*|MINGW*) + # transform D:\path\to\venv to /d/path/to/venv on MSYS and MINGW + # and to /cygdrive/d/path/to/venv on Cygwin + VIRTUAL_ENV=$(cygpath /Users/Kim/Desktop/Portfolio/port) + export VIRTUAL_ENV + ;; + *) + # use the path as-is + export VIRTUAL_ENV=/Users/Kim/Desktop/Portfolio/port + ;; +esac _OLD_VIRTUAL_PATH="$PATH" PATH="$VIRTUAL_ENV/"bin":$PATH" export PATH +VIRTUAL_ENV_PROMPT=port +export VIRTUAL_ENV_PROMPT + # 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 @@ -55,15 +67,10 @@ fi if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then _OLD_VIRTUAL_PS1="${PS1:-}" - PS1='(port) '"${PS1:-}" + PS1="("port") ${PS1:-}" export PS1 - VIRTUAL_ENV_PROMPT='(port) ' - export VIRTUAL_ENV_PROMPT fi -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting +# Call hash to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null -fi +hash -r 2> /dev/null diff --git a/port/bin/activate.csh b/port/bin/activate.csh index 1bde13d..99a7646 100644 --- a/port/bin/activate.csh +++ b/port/bin/activate.csh @@ -1,5 +1,6 @@ # 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 @@ -8,17 +9,17 @@ alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PA # Unset irrelevant variables. deactivate nondestructive -setenv VIRTUAL_ENV /var/www/Portfolio/port +setenv VIRTUAL_ENV /Users/Kim/Desktop/Portfolio/port set _OLD_VIRTUAL_PATH="$PATH" setenv PATH "$VIRTUAL_ENV/"bin":$PATH" +setenv VIRTUAL_ENV_PROMPT port set _OLD_VIRTUAL_PROMPT="$prompt" if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = '(port) '"$prompt" - setenv VIRTUAL_ENV_PROMPT '(port) ' + set prompt = "("port") $prompt:q" endif alias pydoc python -m pydoc diff --git a/port/bin/activate.fish b/port/bin/activate.fish index d4da3b0..ceda9d8 100644 --- a/port/bin/activate.fish +++ b/port/bin/activate.fish @@ -1,5 +1,5 @@ # This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/); you cannot run it directly. +# (https://fishshell.com/). You cannot run it directly. function deactivate -d "Exit virtual environment and return to normal shell environment" # reset old environment variables @@ -33,10 +33,11 @@ end # Unset irrelevant variables. deactivate nondestructive -set -gx VIRTUAL_ENV /var/www/Portfolio/port +set -gx VIRTUAL_ENV /Users/Kim/Desktop/Portfolio/port set -gx _OLD_VIRTUAL_PATH $PATH set -gx PATH "$VIRTUAL_ENV/"bin $PATH +set -gx VIRTUAL_ENV_PROMPT port # Unset PYTHONHOME if set. if set -q PYTHONHOME @@ -56,7 +57,7 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" 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) '(port) ' (set_color normal) + printf "%s(%s)%s " (set_color 4B8BBE) port (set_color normal) # Restore the return status of the previous command. echo "exit $old_status" | . @@ -65,5 +66,4 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" end set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT '(port) ' end diff --git a/port/bin/dotenv b/port/bin/dotenv index 647907b..6ad3c95 100755 --- a/port/bin/dotenv +++ b/port/bin/dotenv @@ -1,4 +1,4 @@ -#!/var/www/Portfolio/port/bin/python3 +#!/Users/Kim/Desktop/Portfolio/port/bin/python3.13 # -*- coding: utf-8 -*- import re import sys diff --git a/port/bin/flask b/port/bin/flask index b123a2b..d2820eb 100755 --- a/port/bin/flask +++ b/port/bin/flask @@ -1,4 +1,4 @@ -#!/var/www/Portfolio/port/bin/python3 +#!/Users/Kim/Desktop/Portfolio/port/bin/python3.13 # -*- coding: utf-8 -*- import re import sys diff --git a/port/bin/gunicorn b/port/bin/gunicorn deleted file mode 100755 index c5953f6..0000000 --- a/port/bin/gunicorn +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/Portfolio/port/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from gunicorn.app.wsgiapp import run -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(run()) diff --git a/port/bin/normalizer b/port/bin/normalizer deleted file mode 100755 index 7b81fca..0000000 --- a/port/bin/normalizer +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/Portfolio/port/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from charset_normalizer.cli import cli_detect -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(cli_detect()) diff --git a/port/bin/pip b/port/bin/pip index 4b5d408..aeb3920 100755 --- a/port/bin/pip +++ b/port/bin/pip @@ -1,4 +1,4 @@ -#!/var/www/Portfolio/port/bin/python3 +#!/Users/Kim/Desktop/Portfolio/port/bin/python3.13 # -*- coding: utf-8 -*- import re import sys diff --git a/port/bin/pip3 b/port/bin/pip3 index 4b5d408..aeb3920 100755 --- a/port/bin/pip3 +++ b/port/bin/pip3 @@ -1,4 +1,4 @@ -#!/var/www/Portfolio/port/bin/python3 +#!/Users/Kim/Desktop/Portfolio/port/bin/python3.13 # -*- coding: utf-8 -*- import re import sys diff --git a/port/bin/pip3.11 b/port/bin/pip3.11 deleted file mode 100755 index 4b5d408..0000000 --- a/port/bin/pip3.11 +++ /dev/null @@ -1,8 +0,0 @@ -#!/var/www/Portfolio/port/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/port/bin/python b/port/bin/python index b8a0adb..b4d7bb3 120000 --- a/port/bin/python +++ b/port/bin/python @@ -1 +1 @@ -python3 \ No newline at end of file +python3.13 \ No newline at end of file diff --git a/port/bin/python3 b/port/bin/python3 index ae65fda..b4d7bb3 120000 --- a/port/bin/python3 +++ b/port/bin/python3 @@ -1 +1 @@ -/usr/bin/python3 \ No newline at end of file +python3.13 \ No newline at end of file diff --git a/port/bin/python3.11 b/port/bin/python3.11 deleted file mode 120000 index b8a0adb..0000000 --- a/port/bin/python3.11 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/port/bin/slugify b/port/bin/slugify index 280b0f4..3f5d261 100755 --- a/port/bin/slugify +++ b/port/bin/slugify @@ -1,4 +1,4 @@ -#!/var/www/Portfolio/port/bin/python3 +#!/Users/Kim/Desktop/Portfolio/port/bin/python3.13 # -*- coding: utf-8 -*- import re import sys diff --git a/port/include/site/python3.11/greenlet/greenlet.h b/port/include/site/python3.11/greenlet/greenlet.h deleted file mode 100644 index d02a16e..0000000 --- a/port/include/site/python3.11/greenlet/greenlet.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ - -/* Greenlet object interface */ - -#ifndef Py_GREENLETOBJECT_H -#define Py_GREENLETOBJECT_H - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* This is deprecated and undocumented. It does not change. */ -#define GREENLET_VERSION "1.0.0" - -#ifndef GREENLET_MODULE -#define implementation_ptr_t void* -#endif - -typedef struct _greenlet { - PyObject_HEAD - PyObject* weakreflist; - PyObject* dict; - implementation_ptr_t pimpl; -} PyGreenlet; - -#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) - - -/* C API functions */ - -/* Total number of symbols that are exported */ -#define PyGreenlet_API_pointers 12 - -#define PyGreenlet_Type_NUM 0 -#define PyExc_GreenletError_NUM 1 -#define PyExc_GreenletExit_NUM 2 - -#define PyGreenlet_New_NUM 3 -#define PyGreenlet_GetCurrent_NUM 4 -#define PyGreenlet_Throw_NUM 5 -#define PyGreenlet_Switch_NUM 6 -#define PyGreenlet_SetParent_NUM 7 - -#define PyGreenlet_MAIN_NUM 8 -#define PyGreenlet_STARTED_NUM 9 -#define PyGreenlet_ACTIVE_NUM 10 -#define PyGreenlet_GET_PARENT_NUM 11 - -#ifndef GREENLET_MODULE -/* This section is used by modules that uses the greenlet C API */ -static void** _PyGreenlet_API = NULL; - -# define PyGreenlet_Type \ - (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) - -# define PyExc_GreenletError \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) - -# define PyExc_GreenletExit \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) - -/* - * PyGreenlet_New(PyObject *args) - * - * greenlet.greenlet(run, parent=None) - */ -# define PyGreenlet_New \ - (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ - _PyGreenlet_API[PyGreenlet_New_NUM]) - -/* - * PyGreenlet_GetCurrent(void) - * - * greenlet.getcurrent() - */ -# define PyGreenlet_GetCurrent \ - (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) - -/* - * PyGreenlet_Throw( - * PyGreenlet *greenlet, - * PyObject *typ, - * PyObject *val, - * PyObject *tb) - * - * g.throw(...) - */ -# define PyGreenlet_Throw \ - (*(PyObject * (*)(PyGreenlet * self, \ - PyObject * typ, \ - PyObject * val, \ - PyObject * tb)) \ - _PyGreenlet_API[PyGreenlet_Throw_NUM]) - -/* - * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) - * - * g.switch(*args, **kwargs) - */ -# define PyGreenlet_Switch \ - (*(PyObject * \ - (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ - _PyGreenlet_API[PyGreenlet_Switch_NUM]) - -/* - * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) - * - * g.parent = new_parent - */ -# define PyGreenlet_SetParent \ - (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ - _PyGreenlet_API[PyGreenlet_SetParent_NUM]) - -/* - * PyGreenlet_GetParent(PyObject* greenlet) - * - * return greenlet.parent; - * - * This could return NULL even if there is no exception active. - * If it does not return NULL, you are responsible for decrementing the - * reference count. - */ -# define PyGreenlet_GetParent \ - (*(PyGreenlet* (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) - -/* - * deprecated, undocumented alias. - */ -# define PyGreenlet_GET_PARENT PyGreenlet_GetParent - -# define PyGreenlet_MAIN \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_MAIN_NUM]) - -# define PyGreenlet_STARTED \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_STARTED_NUM]) - -# define PyGreenlet_ACTIVE \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) - - - - -/* Macro that imports greenlet and initializes C API */ -/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we - keep the older definition to be sure older code that might have a copy of - the header still works. */ -# define PyGreenlet_Import() \ - { \ - _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ - } - -#endif /* GREENLET_MODULE */ - -#ifdef __cplusplus -} -#endif -#endif /* !Py_GREENLETOBJECT_H */ diff --git a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER b/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/LICENSE b/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/LICENSE deleted file mode 100644 index 0446381..0000000 --- a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2011 Matthew Frazier - -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/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/METADATA b/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/METADATA deleted file mode 100644 index 445a0b2..0000000 --- a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/METADATA +++ /dev/null @@ -1,183 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-Login -Version: 0.6.3 -Summary: User authentication and session management for Flask. -Home-page: https://github.com/maxcountryman/flask-login -Author: Matthew Frazier -Author-email: leafstormrush@gmail.com -Maintainer: Max Countryman -License: MIT -Project-URL: Documentation, https://flask-login.readthedocs.io/ -Project-URL: Changes, https://github.com/maxcountryman/flask-login/blob/main/CHANGES.md -Project-URL: Source Code, https://github.com/maxcountryman/flask-login -Project-URL: Issue Tracker, https://github.com/maxcountryman/flask-login/issues -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Web Environment -Classifier: Framework :: Flask -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: Flask >=1.0.4 -Requires-Dist: Werkzeug >=1.0.1 - -# Flask-Login - -![Tests](https://github.com/maxcountryman/flask-login/workflows/Tests/badge.svg) -[![coverage](https://coveralls.io/repos/maxcountryman/flask-login/badge.svg?branch=main&service=github)](https://coveralls.io/github/maxcountryman/flask-login?branch=main) -[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE) - -Flask-Login provides user session management for Flask. It handles the common -tasks of logging in, logging out, and remembering your users' sessions over -extended periods of time. - -Flask-Login is not bound to any particular database system or permissions -model. The only requirement is that your user objects implement a few methods, -and that you provide a callback to the extension capable of loading users from -their ID. - -## Installation - -Install the extension with pip: - -```sh -$ pip install flask-login -``` - -## Usage - -Once installed, the Flask-Login is easy to use. Let's walk through setting up -a basic application. Also please note that this is a very basic guide: we will -be taking shortcuts here that you should never take in a real application. - -To begin we'll set up a Flask app: - -```python -import flask - -app = flask.Flask(__name__) -app.secret_key = 'super secret string' # Change this! -``` - -Flask-Login works via a login manager. To kick things off, we'll set up the -login manager by instantiating it and telling it about our Flask app: - -```python -import flask_login - -login_manager = flask_login.LoginManager() - -login_manager.init_app(app) -``` - -To keep things simple we're going to use a dictionary to represent a database -of users. In a real application, this would be an actual persistence layer. -However it's important to point out this is a feature of Flask-Login: it -doesn't care how your data is stored so long as you tell it how to retrieve it! - -```python -# Our mock database. -users = {'foo@bar.tld': {'password': 'secret'}} -``` - -We also need to tell Flask-Login how to load a user from a Flask request and -from its session. To do this we need to define our user object, a -`user_loader` callback, and a `request_loader` callback. - -```python -class User(flask_login.UserMixin): - pass - - -@login_manager.user_loader -def user_loader(email): - if email not in users: - return - - user = User() - user.id = email - return user - - -@login_manager.request_loader -def request_loader(request): - email = request.form.get('email') - if email not in users: - return - - user = User() - user.id = email - return user -``` - -Now we're ready to define our views. We can start with a login view, which will -populate the session with authentication bits. After that we can define a view -that requires authentication. - -```python -@app.route('/login', methods=['GET', 'POST']) -def login(): - if flask.request.method == 'GET': - return ''' -
- - - -
- ''' - - email = flask.request.form['email'] - if email in users and flask.request.form['password'] == users[email]['password']: - user = User() - user.id = email - flask_login.login_user(user) - return flask.redirect(flask.url_for('protected')) - - return 'Bad login' - - -@app.route('/protected') -@flask_login.login_required -def protected(): - return 'Logged in as: ' + flask_login.current_user.id -``` - -Finally we can define a view to clear the session and log users out: - -```python -@app.route('/logout') -def logout(): - flask_login.logout_user() - return 'Logged out' -``` - -We now have a basic working application that makes use of session-based -authentication. To round things off, we should provide a callback for login -failures: - -```python -@login_manager.unauthorized_handler -def unauthorized_handler(): - return 'Unauthorized', 401 -``` - -Documentation for Flask-Login is available on [ReadTheDocs](https://flask-login.readthedocs.io/en/latest/). -For complete understanding of available configuration, please refer to the [source code](https://github.com/maxcountryman/flask-login). - - -## Contributing - -We welcome contributions! If you would like to hack on Flask-Login, please -follow these steps: - -1. Fork this repository -2. Make your changes -3. Install the dev requirements with `pip install -r requirements/dev.txt` -4. Submit a pull request after running `tox` (ensure it does not error!) - -Please give us adequate time to review your submission. Thanks! diff --git a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/RECORD b/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/RECORD deleted file mode 100644 index 37b8816..0000000 --- a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/RECORD +++ /dev/null @@ -1,23 +0,0 @@ -Flask_Login-0.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_Login-0.6.3.dist-info/LICENSE,sha256=ep37nF2iBO0TcPO2LBPimSoS2h2nB_R-FWiX7rQ0Tls,1059 -Flask_Login-0.6.3.dist-info/METADATA,sha256=AUSHR5Po6-Cwmz1KBrAZbTzR-iVVFvtb2NQKYl7UuAU,5799 -Flask_Login-0.6.3.dist-info/RECORD,, -Flask_Login-0.6.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_Login-0.6.3.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -Flask_Login-0.6.3.dist-info/top_level.txt,sha256=OuXmIpiFnXLvW-iBbW2km7ZIy5EZvwSBnYaOC3Kt7j8,12 -flask_login/__about__.py,sha256=Kkp5e9mV9G7vK_FqZof-g9RFmyyBzq1gge5aKXgvilE,389 -flask_login/__init__.py,sha256=wYQiQCikT_Ndp3PhOD-1gRTGCrUPIE-FrjQUrT9aVAg,2681 -flask_login/__pycache__/__about__.cpython-311.pyc,, -flask_login/__pycache__/__init__.cpython-311.pyc,, -flask_login/__pycache__/config.cpython-311.pyc,, -flask_login/__pycache__/login_manager.cpython-311.pyc,, -flask_login/__pycache__/mixins.cpython-311.pyc,, -flask_login/__pycache__/signals.cpython-311.pyc,, -flask_login/__pycache__/test_client.cpython-311.pyc,, -flask_login/__pycache__/utils.cpython-311.pyc,, -flask_login/config.py,sha256=YAocv18La7YGQyNY5aT7rU1GQIZnX6pvchwqx3kA9p8,1813 -flask_login/login_manager.py,sha256=h20F_iv3mqc6rIJ4-V6_XookzOUl8Rcpasua-dCByQY,20073 -flask_login/mixins.py,sha256=gPd7otMRljxw0eUhUMbHsnEBc_jK2cYdxg5KFLuJcoI,1528 -flask_login/signals.py,sha256=xCMoFHKU1RTVt1NY-Gfl0OiVKpiyNt6YJw_PsgkjY3w,2464 -flask_login/test_client.py,sha256=6mrjiBRLGJpgvvFlLypXPTBLiMp0BAN-Ft-uogqC81g,517 -flask_login/utils.py,sha256=Y1wxjCVxpYohBaQJ0ADLypQ-VvBNycwG-gVXFF7k99I,14021 diff --git a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/REQUESTED b/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/WHEEL b/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/WHEEL deleted file mode 100644 index ba48cbc..0000000 --- a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.3) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt b/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt deleted file mode 100644 index 31514bd..0000000 --- a/port/lib/python3.11/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -flask_login diff --git a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER b/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt b/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt deleted file mode 100644 index 9d227a0..0000000 --- a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA b/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA deleted file mode 100644 index 82261f2..0000000 --- a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/METADATA +++ /dev/null @@ -1,92 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 3.0.2 -Summary: Safely add untrusted strings to HTML/XML markup. -Maintainer-email: Pallets -License: Copyright 2010 Pallets - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://markupsafe.palletsprojects.com/ -Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ -Project-URL: Source, https://github.com/pallets/markupsafe/ -Project-URL: Chat, https://discord.gg/pallets -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Classifier: Typing :: Typed -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-File: LICENSE.txt - -# MarkupSafe - -MarkupSafe implements a text object that escapes characters so it is -safe to use in HTML and XML. Characters that have special meanings are -replaced so that they display as the actual characters. This mitigates -injection attacks, meaning untrusted user input can safely be displayed -on a page. - - -## Examples - -```pycon ->>> from markupsafe import Markup, escape - ->>> # escape replaces special characters and wraps in Markup ->>> escape("") -Markup('<script>alert(document.cookie);</script>') - ->>> # wrap in Markup to mark text "safe" and prevent escaping ->>> Markup("Hello") -Markup('hello') - ->>> escape(Markup("Hello")) -Markup('hello') - ->>> # Markup is a str subclass ->>> # methods and operators escape their arguments ->>> template = Markup("Hello {name}") ->>> template.format(name='"World"') -Markup('Hello "World"') -``` - -## Donate - -The Pallets organization develops and supports MarkupSafe and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -[please donate today][]. - -[please donate today]: https://palletsprojects.com/donate diff --git a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD b/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD deleted file mode 100644 index b474513..0000000 --- a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -MarkupSafe-3.0.2.dist-info/METADATA,sha256=aAwbZhSmXdfFuMM-rEHpeiHRkBOGESyVLJIuwzHP-nw,3975 -MarkupSafe-3.0.2.dist-info/RECORD,, -MarkupSafe-3.0.2.dist-info/WHEEL,sha256=OhaudQk1f3YCu0uQO5v6u-i01XPoX70c0R3T_XY-jOo,151 -MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=sr-U6_27DfaSrj5jnHYxWN-pvhM27sjlDplMDPZKm7k,13214 -markupsafe/__pycache__/__init__.cpython-311.pyc,, -markupsafe/__pycache__/_native.cpython-311.pyc,, -markupsafe/_native.py,sha256=hSLs8Jmz5aqayuengJJ3kdT5PwNpBWpKrmQSdipndC8,210 -markupsafe/_speedups.c,sha256=O7XulmTo-epI6n2FtMVOrJXl8EAaIwD2iNYmBI5SEoQ,4149 -markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so,sha256=6IDH6Z1ajjClhfGerTB8WLb81uXUpLD8e-e1WzCirVY,43456 -markupsafe/_speedups.pyi,sha256=ENd1bYe7gbBUf2ywyYWOGUpnXOHNJ-cgTNqetlW8h5k,41 -markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL b/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL deleted file mode 100644 index 35db8b0..0000000 --- a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.2.0) -Root-Is-Purelib: false -Tag: cp311-cp311-manylinux_2_17_x86_64 -Tag: cp311-cp311-manylinux2014_x86_64 - diff --git a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt b/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/port/lib/python3.11/site-packages/MarkupSafe-3.0.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/port/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc b/port/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc deleted file mode 100644 index b7220f7b6f50b72fbbfc305699dc060d7a9ca797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189554 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

pTLCP+<6O>G0E=H& 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 diff --git a/port/lib/python3.11/site-packages/_distutils_hack/__init__.py b/port/lib/python3.11/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f987a53..0000000 --- a/port/lib/python3.11/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,222 +0,0 @@ -# don't import any costly modules -import sys -import os - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - import warnings - - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils." - ) - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - import warnings - - warnings.warn("Setuptools is replacing distutils.") - mods = [ - name - for name in sys.modules - if name == "distutils" or name.startswith("distutils.") - ] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') - return which == 'local' - - -def ensure_local_distutils(): - import importlib - - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - with shim(): - importlib.import_module('distutils') - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - assert 'setuptools._distutils.log' not in sys.modules - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class _TrivialRe: - def __init__(self, *patterns): - self._patterns = patterns - - def match(self, string): - return all(pat in string for pat in self._patterns) - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - # optimization: only consider top level modules and those - # found in the CPython test suite. - if path is not None and not fullname.startswith('test.'): - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - if self.is_cpython(): - return - - import importlib - import importlib.abc - import importlib.util - - try: - mod = importlib.import_module('setuptools._distutils') - except Exception: - # There are a couple of cases where setuptools._distutils - # may not be present: - # - An older Setuptools without a local distutils is - # taking precedence. Ref #2957. - # - Path manipulation during sitecustomize removes - # setuptools from the path but only after the hook - # has been loaded. Ref #2980. - # In either case, fall back to stdlib behavior. - return - - class DistutilsLoader(importlib.abc.Loader): - def create_module(self, spec): - mod.__name__ = 'distutils' - return mod - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader( - 'distutils', DistutilsLoader(), origin=mod.__file__ - ) - - @staticmethod - def is_cpython(): - """ - Suppress supplying distutils for CPython (build and tests). - Ref #2965 and #3007. - """ - return os.path.isfile('pybuilddir.txt') - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @classmethod - def pip_imported_during_build(cls): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - - return any( - cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) - ) - - @staticmethod - def frame_file_is_setup(frame): - """ - Return True if the indicated frame suggests a setup.py file. - """ - # some frames may not have __file__ (#2940) - return frame.f_globals.get('__file__', '').endswith('setup.py') - - def spec_for_sensitive_tests(self): - """ - Ensure stdlib distutils when running select tests under CPython. - - python/cpython#91169 - """ - clear_distutils() - self.spec_for_distutils = lambda: None - - sensitive_tests = ( - [ - 'test.test_distutils', - 'test.test_peg_generator', - 'test.test_importlib', - ] - if sys.version_info < (3, 10) - else [ - 'test.test_distutils', - ] - ) - - -for name in DistutilsMetaFinder.sensitive_tests: - setattr( - DistutilsMetaFinder, - f'spec_for_{name}', - DistutilsMetaFinder.spec_for_sensitive_tests, - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - DISTUTILS_FINDER in sys.meta_path or insert_shim() - - -class shim: - def __enter__(self): - insert_shim() - - def __exit__(self, exc, value, tb): - remove_shim() - - -def insert_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/port/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ebe73de79ba326bb61c389fe2333a3efc98d9691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11154 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 b*((gP*BLY~F=$?7(7wW;eF27w*no-w`ovF; diff --git a/port/lib/python3.11/site-packages/_distutils_hack/override.py b/port/lib/python3.11/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/port/lib/python3.11/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/INSTALLER b/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/LICENSE.txt b/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/LICENSE.txt deleted file mode 100644 index 79c9825..0000000 --- a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2010 Jason Kirtland - -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/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/METADATA b/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/METADATA deleted file mode 100644 index 6d343f5..0000000 --- a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.3 -Name: blinker -Version: 1.9.0 -Summary: Fast, simple object-to-object and broadcast signaling -Author: Jason Kirtland -Maintainer-email: Pallets Ecosystem -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://blinker.readthedocs.io -Project-URL: Source, https://github.com/pallets-eco/blinker/ - -# Blinker - -Blinker provides a fast dispatching system that allows any number of -interested parties to subscribe to events, or "signals". - - -## Pallets Community Ecosystem - -> [!IMPORTANT]\ -> This project is part of the Pallets Community Ecosystem. Pallets is the open -> source organization that maintains Flask; Pallets-Eco enables community -> maintenance of related projects. If you are interested in helping maintain -> this project, please reach out on [the Pallets Discord server][discord]. -> -> [discord]: https://discord.gg/pallets - - -## Example - -Signal receivers can subscribe to specific senders or receive signals -sent by any sender. - -```pycon ->>> from blinker import signal ->>> started = signal('round-started') ->>> def each(round): -... print(f"Round {round}") -... ->>> started.connect(each) - ->>> def round_two(round): -... print("This is round two.") -... ->>> started.connect(round_two, sender=2) - ->>> for round in range(1, 4): -... started.send(round) -... -Round 1! -Round 2! -This is round two. -Round 3! -``` - diff --git a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/RECORD b/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/RECORD deleted file mode 100644 index 52d1667..0000000 --- a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -blinker-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -blinker-1.9.0.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 -blinker-1.9.0.dist-info/METADATA,sha256=uIRiM8wjjbHkCtbCyTvctU37IAZk0kEe5kxAld1dvzA,1633 -blinker-1.9.0.dist-info/RECORD,, -blinker-1.9.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 -blinker/__init__.py,sha256=I2EdZqpy4LyjX17Hn1yzJGWCjeLaVaPzsMgHkLfj_cQ,317 -blinker/__pycache__/__init__.cpython-311.pyc,, -blinker/__pycache__/_utilities.cpython-311.pyc,, -blinker/__pycache__/base.cpython-311.pyc,, -blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 -blinker/base.py,sha256=QpDuvXXcwJF49lUBcH5BiST46Rz9wSG7VW_p7N_027M,19132 -blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/WHEEL b/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/WHEEL deleted file mode 100644 index e3c6fee..0000000 --- a/port/lib/python3.11/site-packages/blinker-1.9.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.10.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/port/lib/python3.11/site-packages/blinker/__init__.py b/port/lib/python3.11/site-packages/blinker/__init__.py deleted file mode 100644 index 1772fa4..0000000 --- a/port/lib/python3.11/site-packages/blinker/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from .base import ANY -from .base import default_namespace -from .base import NamedSignal -from .base import Namespace -from .base import Signal -from .base import signal - -__all__ = [ - "ANY", - "default_namespace", - "NamedSignal", - "Namespace", - "Signal", - "signal", -] diff --git a/port/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/blinker/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8bef096860d8407f017114cef31652905dbaaa92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmaKoze~eF6vy8+X_B@S=^zN=qEiQZ6xS-aITfLkS&oZ$t)bVXTvAJM@xRd7Mf`6v zhE9T0w?emq;JcIxLGbR&_df64@Auwp)&bj7?|XDf0KQDHZ zD#B8giRD`b+sL+W7hFZI`qhFRWXE?3c9C7*E!ac$e2>5gMD30EHBlcxyRkACw#l-= zqbN>!8pctw!dID`b=|+ip(W&y&s54HK9R|k-%GQ;kAWD3qlhaEYbM;!IlpNq*)4E% z6_3=8G1r)9tY*yAqTjAB>x>O&=}b$;w1v5)9q>f{zi;U>#+73112(t?wm0;VYdW9L z>20jjVXVTKPLZez13F!#4{>zS>2_%nrt%zrGUg+h&_IRJSZc~x7=$2q8I~W@UZCVOCZSXIWV}oMdI?aGaHu!%GD02|kvqyPW_ diff --git a/port/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc b/port/lib/python3.11/site-packages/blinker/__pycache__/_utilities.cpython-311.pyc deleted file mode 100644 index 47dbe5cb88a92f58abe5a5fe723eee2a54847dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3087 zcma(T?`s=Jc1F9>%91TPR+1)7oNSzMv07KEoBsIF5E^oj_GnFM(mRkb>(%ba*?7IH z&W_^RRY3=as;%M7kt6<6=!Z5(X#W@q^g%2X3MC)tLQ&SlN?W4>8S^GRi$PYL;Y-)tiNB;!m9yR6B|lJ9pcGK zQqoct4Zez--k7LNNS+FKrjnr~L6~+sd$_oryiW=F2HvPuCKKd3u~R$5*6t^O1MiSC zWgoF8chpMGp0Nw|^iHypw-Yx=@#v2zP^4kj^gLgf!tuRe3C0R%HTY!y#?1A1n7HNJ zA-!o0my;hQ8qh~?1M&$Rj*$wrNhR?<9I~P~q@vmhmb8`2z_+K`q(*IRXR?yAbM^$N zqS<*n1K+egEmfOnlMiVn14dY-E%C)b#cq|^wm|r zdYf5dzPP$t(%)lsW(sEOmg%~I&Y5U%4+L38hZdL{On2m37As{W?aGxadbHF0#hUM5 zEb2}WCrGiIyb-POl)PlaO!?iO6{Tyg83cbd`LgX;VmT0eVYuGPN~lFA2tw5ZT|x!8 zVJgzn8hHwAg@%QfKKcxhf6;rSNt@(0;8D9n_|*8gNlzZK$PFTfZb8z0c)uC(z8v3U zL~W9I41JtvCgQ83`RWso7TwN8t}6|-I03Za8h~G0q@T_2UAp^vCwm5Zzi|BS z>-(ZtxX_ur@Gw{SbZvL-AO2_lzSYgm^>TAjqxw^y$-p_@8XC^)_D*vu17&4Kz<^EuEtvzT)ShA;}4XEUe=!q=-zZv;@N z%m8GtQpozT&bCm_@o+&VN|IPihZ@AG(;zC8g99h$GZ#HS%K+a67UlmX~Hj!gkDDeG$y!O1OAI3!Evx43GJM zg$e>{$wP)Iu~m1xwUCNX+k`(sJO>_E9z4`;Zq*t5>~Ogurd}CO@}v()lrym29i%Tu zS@jBk1BQ6_gARa!LMiQ&xlX))Pfm5>y-#v2`Si(5=dkz5Go5(vlQW%o|6ZMHUEO)B pZT)>|XQ@R8sZ$hU`f2bJ(tdu-xSXeuT;t$^O3w_)ZvlDY{{oh-w4ML} diff --git a/port/lib/python3.11/site-packages/blinker/__pycache__/base.cpython-311.pyc b/port/lib/python3.11/site-packages/blinker/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 60d7c9c62d690a05ec779310cd9a01bbd0a97a80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23619 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 O!ZB!-ND>e*H2OcvB)M+@ diff --git a/port/lib/python3.11/site-packages/blinker/_utilities.py b/port/lib/python3.11/site-packages/blinker/_utilities.py deleted file mode 100644 index 000c902..0000000 --- a/port/lib/python3.11/site-packages/blinker/_utilities.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import inspect -import typing as t -from weakref import ref -from weakref import WeakMethod - -T = t.TypeVar("T") - - -class Symbol: - """A constant symbol, nicer than ``object()``. Repeated calls return the - same instance. - - >>> Symbol('foo') is Symbol('foo') - True - >>> Symbol('foo') - foo - """ - - symbols: t.ClassVar[dict[str, Symbol]] = {} - - def __new__(cls, name: str) -> Symbol: - if name in cls.symbols: - return cls.symbols[name] - - obj = super().__new__(cls) - cls.symbols[name] = obj - return obj - - def __init__(self, name: str) -> None: - self.name = name - - def __repr__(self) -> str: - return self.name - - def __getnewargs__(self) -> tuple[t.Any, ...]: - return (self.name,) - - -def make_id(obj: object) -> c.Hashable: - """Get a stable identifier for a receiver or sender, to be used as a dict - key or in a set. - """ - if inspect.ismethod(obj): - # The id of a bound method is not stable, but the id of the unbound - # function and instance are. - return id(obj.__func__), id(obj.__self__) - - if isinstance(obj, (str, int)): - # Instances with the same value always compare equal and have the same - # hash, even if the id may change. - return obj - - # Assume other types are not hashable but will always be the same instance. - return id(obj) - - -def make_ref(obj: T, callback: c.Callable[[ref[T]], None] | None = None) -> ref[T]: - if inspect.ismethod(obj): - return WeakMethod(obj, callback) # type: ignore[arg-type, return-value] - - return ref(obj, callback) diff --git a/port/lib/python3.11/site-packages/blinker/base.py b/port/lib/python3.11/site-packages/blinker/base.py deleted file mode 100644 index d051b94..0000000 --- a/port/lib/python3.11/site-packages/blinker/base.py +++ /dev/null @@ -1,512 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import sys -import typing as t -import weakref -from collections import defaultdict -from contextlib import contextmanager -from functools import cached_property -from inspect import iscoroutinefunction - -from ._utilities import make_id -from ._utilities import make_ref -from ._utilities import Symbol - -F = t.TypeVar("F", bound=c.Callable[..., t.Any]) - -ANY = Symbol("ANY") -"""Symbol for "any sender".""" - -ANY_ID = 0 - - -class Signal: - """A notification emitter. - - :param doc: The docstring for the signal. - """ - - ANY = ANY - """An alias for the :data:`~blinker.ANY` sender symbol.""" - - set_class: type[set[t.Any]] = set - """The set class to use for tracking connected receivers and senders. - Python's ``set`` is unordered. If receivers must be dispatched in the order - they were connected, an ordered set implementation can be used. - - .. versionadded:: 1.7 - """ - - @cached_property - def receiver_connected(self) -> Signal: - """Emitted at the end of each :meth:`connect` call. - - The signal sender is the signal instance, and the :meth:`connect` - arguments are passed through: ``receiver``, ``sender``, and ``weak``. - - .. versionadded:: 1.2 - """ - return Signal(doc="Emitted after a receiver connects.") - - @cached_property - def receiver_disconnected(self) -> Signal: - """Emitted at the end of each :meth:`disconnect` call. - - The sender is the signal instance, and the :meth:`disconnect` arguments - are passed through: ``receiver`` and ``sender``. - - This signal is emitted **only** when :meth:`disconnect` is called - explicitly. This signal cannot be emitted by an automatic disconnect - when a weakly referenced receiver or sender goes out of scope, as the - instance is no longer be available to be used as the sender for this - signal. - - An alternative approach is available by subscribing to - :attr:`receiver_connected` and setting up a custom weakref cleanup - callback on weak receivers and senders. - - .. versionadded:: 1.2 - """ - return Signal(doc="Emitted after a receiver disconnects.") - - def __init__(self, doc: str | None = None) -> None: - if doc: - self.__doc__ = doc - - self.receivers: dict[ - t.Any, weakref.ref[c.Callable[..., t.Any]] | c.Callable[..., t.Any] - ] = {} - """The map of connected receivers. Useful to quickly check if any - receivers are connected to the signal: ``if s.receivers:``. The - structure and data is not part of the public API, but checking its - boolean value is. - """ - - self.is_muted: bool = False - self._by_receiver: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) - self._by_sender: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) - self._weak_senders: dict[t.Any, weakref.ref[t.Any]] = {} - - def connect(self, receiver: F, sender: t.Any = ANY, weak: bool = True) -> F: - """Connect ``receiver`` to be called when the signal is sent by - ``sender``. - - :param receiver: The callable to call when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument - along with any extra keyword arguments. - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. A receiver may be connected - to multiple senders by calling :meth:`connect` multiple times. - :param weak: Track the receiver with a :mod:`weakref`. The receiver will - be automatically disconnected when it is garbage collected. When - connecting a receiver defined within a function, set to ``False``, - otherwise it will be disconnected when the function scope ends. - """ - receiver_id = make_id(receiver) - sender_id = ANY_ID if sender is ANY else make_id(sender) - - if weak: - self.receivers[receiver_id] = make_ref( - receiver, self._make_cleanup_receiver(receiver_id) - ) - else: - self.receivers[receiver_id] = receiver - - self._by_sender[sender_id].add(receiver_id) - self._by_receiver[receiver_id].add(sender_id) - - if sender is not ANY and sender_id not in self._weak_senders: - # store a cleanup for weakref-able senders - try: - self._weak_senders[sender_id] = make_ref( - sender, self._make_cleanup_sender(sender_id) - ) - except TypeError: - pass - - if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: - try: - self.receiver_connected.send( - self, receiver=receiver, sender=sender, weak=weak - ) - except TypeError: - # TODO no explanation or test for this - self.disconnect(receiver, sender) - raise - - return receiver - - def connect_via(self, sender: t.Any, weak: bool = False) -> c.Callable[[F], F]: - """Connect the decorated function to be called when the signal is sent - by ``sender``. - - The decorated function will be called when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument along - with any extra keyword arguments. - - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. A receiver may be connected - to multiple senders by calling :meth:`connect` multiple times. - :param weak: Track the receiver with a :mod:`weakref`. The receiver will - be automatically disconnected when it is garbage collected. When - connecting a receiver defined within a function, set to ``False``, - otherwise it will be disconnected when the function scope ends.= - - .. versionadded:: 1.1 - """ - - def decorator(fn: F) -> F: - self.connect(fn, sender, weak) - return fn - - return decorator - - @contextmanager - def connected_to( - self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY - ) -> c.Generator[None, None, None]: - """A context manager that temporarily connects ``receiver`` to the - signal while a ``with`` block executes. When the block exits, the - receiver is disconnected. Useful for tests. - - :param receiver: The callable to call when :meth:`send` is called with - the given ``sender``, passing ``sender`` as a positional argument - along with any extra keyword arguments. - :param sender: Any object or :data:`ANY`. ``receiver`` will only be - called when :meth:`send` is called with this sender. If ``ANY``, the - receiver will be called for any sender. - - .. versionadded:: 1.1 - """ - self.connect(receiver, sender=sender, weak=False) - - try: - yield None - finally: - self.disconnect(receiver) - - @contextmanager - def muted(self) -> c.Generator[None, None, None]: - """A context manager that temporarily disables the signal. No receivers - will be called if the signal is sent, until the ``with`` block exits. - Useful for tests. - """ - self.is_muted = True - - try: - yield None - finally: - self.is_muted = False - - def send( - self, - sender: t.Any | None = None, - /, - *, - _async_wrapper: c.Callable[ - [c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]], c.Callable[..., t.Any] - ] - | None = None, - **kwargs: t.Any, - ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: - """Call all receivers that are connected to the given ``sender`` - or :data:`ANY`. Each receiver is called with ``sender`` as a positional - argument along with any extra keyword arguments. Return a list of - ``(receiver, return value)`` tuples. - - The order receivers are called is undefined, but can be influenced by - setting :attr:`set_class`. - - If a receiver raises an exception, that exception will propagate up. - This makes debugging straightforward, with an assumption that correctly - implemented receivers will not raise. - - :param sender: Call receivers connected to this sender, in addition to - those connected to :data:`ANY`. - :param _async_wrapper: Will be called on any receivers that are async - coroutines to turn them into sync callables. For example, could run - the receiver with an event loop. - :param kwargs: Extra keyword arguments to pass to each receiver. - - .. versionchanged:: 1.7 - Added the ``_async_wrapper`` argument. - """ - if self.is_muted: - return [] - - results = [] - - for receiver in self.receivers_for(sender): - if iscoroutinefunction(receiver): - if _async_wrapper is None: - raise RuntimeError("Cannot send to a coroutine function.") - - result = _async_wrapper(receiver)(sender, **kwargs) - else: - result = receiver(sender, **kwargs) - - results.append((receiver, result)) - - return results - - async def send_async( - self, - sender: t.Any | None = None, - /, - *, - _sync_wrapper: c.Callable[ - [c.Callable[..., t.Any]], c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]] - ] - | None = None, - **kwargs: t.Any, - ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: - """Await all receivers that are connected to the given ``sender`` - or :data:`ANY`. Each receiver is called with ``sender`` as a positional - argument along with any extra keyword arguments. Return a list of - ``(receiver, return value)`` tuples. - - The order receivers are called is undefined, but can be influenced by - setting :attr:`set_class`. - - If a receiver raises an exception, that exception will propagate up. - This makes debugging straightforward, with an assumption that correctly - implemented receivers will not raise. - - :param sender: Call receivers connected to this sender, in addition to - those connected to :data:`ANY`. - :param _sync_wrapper: Will be called on any receivers that are sync - callables to turn them into async coroutines. For example, - could call the receiver in a thread. - :param kwargs: Extra keyword arguments to pass to each receiver. - - .. versionadded:: 1.7 - """ - if self.is_muted: - return [] - - results = [] - - for receiver in self.receivers_for(sender): - if not iscoroutinefunction(receiver): - if _sync_wrapper is None: - raise RuntimeError("Cannot send to a non-coroutine function.") - - result = await _sync_wrapper(receiver)(sender, **kwargs) - else: - result = await receiver(sender, **kwargs) - - results.append((receiver, result)) - - return results - - def has_receivers_for(self, sender: t.Any) -> bool: - """Check if there is at least one receiver that will be called with the - given ``sender``. A receiver connected to :data:`ANY` will always be - called, regardless of sender. Does not check if weakly referenced - receivers are still live. See :meth:`receivers_for` for a stronger - search. - - :param sender: Check for receivers connected to this sender, in addition - to those connected to :data:`ANY`. - """ - if not self.receivers: - return False - - if self._by_sender[ANY_ID]: - return True - - if sender is ANY: - return False - - return make_id(sender) in self._by_sender - - def receivers_for( - self, sender: t.Any - ) -> c.Generator[c.Callable[..., t.Any], None, None]: - """Yield each receiver to be called for ``sender``, in addition to those - to be called for :data:`ANY`. Weakly referenced receivers that are not - live will be disconnected and skipped. - - :param sender: Yield receivers connected to this sender, in addition - to those connected to :data:`ANY`. - """ - # TODO: test receivers_for(ANY) - if not self.receivers: - return - - sender_id = make_id(sender) - - if sender_id in self._by_sender: - ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] - else: - ids = self._by_sender[ANY_ID].copy() - - for receiver_id in ids: - receiver = self.receivers.get(receiver_id) - - if receiver is None: - continue - - if isinstance(receiver, weakref.ref): - strong = receiver() - - if strong is None: - self._disconnect(receiver_id, ANY_ID) - continue - - yield strong - else: - yield receiver - - def disconnect(self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY) -> None: - """Disconnect ``receiver`` from being called when the signal is sent by - ``sender``. - - :param receiver: A connected receiver callable. - :param sender: Disconnect from only this sender. By default, disconnect - from all senders. - """ - sender_id: c.Hashable - - if sender is ANY: - sender_id = ANY_ID - else: - sender_id = make_id(sender) - - receiver_id = make_id(receiver) - self._disconnect(receiver_id, sender_id) - - if ( - "receiver_disconnected" in self.__dict__ - and self.receiver_disconnected.receivers - ): - self.receiver_disconnected.send(self, receiver=receiver, sender=sender) - - def _disconnect(self, receiver_id: c.Hashable, sender_id: c.Hashable) -> None: - if sender_id == ANY_ID: - if self._by_receiver.pop(receiver_id, None) is not None: - for bucket in self._by_sender.values(): - bucket.discard(receiver_id) - - self.receivers.pop(receiver_id, None) - else: - self._by_sender[sender_id].discard(receiver_id) - self._by_receiver[receiver_id].discard(sender_id) - - def _make_cleanup_receiver( - self, receiver_id: c.Hashable - ) -> c.Callable[[weakref.ref[c.Callable[..., t.Any]]], None]: - """Create a callback function to disconnect a weakly referenced - receiver when it is garbage collected. - """ - - def cleanup(ref: weakref.ref[c.Callable[..., t.Any]]) -> None: - # If the interpreter is shutting down, disconnecting can result in a - # weird ignored exception. Don't call it in that case. - if not sys.is_finalizing(): - self._disconnect(receiver_id, ANY_ID) - - return cleanup - - def _make_cleanup_sender( - self, sender_id: c.Hashable - ) -> c.Callable[[weakref.ref[t.Any]], None]: - """Create a callback function to disconnect all receivers for a weakly - referenced sender when it is garbage collected. - """ - assert sender_id != ANY_ID - - def cleanup(ref: weakref.ref[t.Any]) -> None: - self._weak_senders.pop(sender_id, None) - - for receiver_id in self._by_sender.pop(sender_id, ()): - self._by_receiver[receiver_id].discard(sender_id) - - return cleanup - - def _cleanup_bookkeeping(self) -> None: - """Prune unused sender/receiver bookkeeping. Not threadsafe. - - Connecting & disconnecting leaves behind a small amount of bookkeeping - data. Typical workloads using Blinker, for example in most web apps, - Flask, CLI scripts, etc., are not adversely affected by this - bookkeeping. - - With a long-running process performing dynamic signal routing with high - volume, e.g. connecting to function closures, senders are all unique - object instances. Doing all of this over and over may cause memory usage - to grow due to extraneous bookkeeping. (An empty ``set`` for each stale - sender/receiver pair.) - - This method will prune that bookkeeping away, with the caveat that such - pruning is not threadsafe. The risk is that cleanup of a fully - disconnected receiver/sender pair occurs while another thread is - connecting that same pair. If you are in the highly dynamic, unique - receiver/sender situation that has lead you to this method, that failure - mode is perhaps not a big deal for you. - """ - for mapping in (self._by_sender, self._by_receiver): - for ident, bucket in list(mapping.items()): - if not bucket: - mapping.pop(ident, None) - - def _clear_state(self) -> None: - """Disconnect all receivers and senders. Useful for tests.""" - self._weak_senders.clear() - self.receivers.clear() - self._by_sender.clear() - self._by_receiver.clear() - - -class NamedSignal(Signal): - """A named generic notification emitter. The name is not used by the signal - itself, but matches the key in the :class:`Namespace` that it belongs to. - - :param name: The name of the signal within the namespace. - :param doc: The docstring for the signal. - """ - - def __init__(self, name: str, doc: str | None = None) -> None: - super().__init__(doc) - - #: The name of this signal. - self.name: str = name - - def __repr__(self) -> str: - base = super().__repr__() - return f"{base[:-1]}; {self.name!r}>" # noqa: E702 - - -class Namespace(dict[str, NamedSignal]): - """A dict mapping names to signals.""" - - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` for the given ``name``, creating it - if required. Repeated calls with the same name return the same signal. - - :param name: The name of the signal. - :param doc: The docstring of the signal. - """ - if name not in self: - self[name] = NamedSignal(name, doc) - - return self[name] - - -class _PNamespaceSignal(t.Protocol): - def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ... - - -default_namespace: Namespace = Namespace() -"""A default :class:`Namespace` for creating named signals. :func:`signal` -creates a :class:`NamedSignal` in this namespace. -""" - -signal: _PNamespaceSignal = default_namespace.signal -"""Return a :class:`NamedSignal` in :data:`default_namespace` with the given -``name``, creating it if required. Repeated calls with the same name return the -same signal. -""" diff --git a/port/lib/python3.11/site-packages/blinker/py.typed b/port/lib/python3.11/site-packages/blinker/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/INSTALLER b/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/METADATA b/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/METADATA deleted file mode 100644 index ca094b1..0000000 --- a/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/METADATA +++ /dev/null @@ -1,78 +0,0 @@ -Metadata-Version: 2.4 -Name: certifi -Version: 2025.10.5 -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 -Classifier: Programming Language :: Python :: 3.14 -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/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/RECORD b/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/RECORD deleted file mode 100644 index 17b7012..0000000 --- a/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -certifi-2025.10.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2025.10.5.dist-info/METADATA,sha256=RzyR4sT6xRN1pNNy24IHVOlZuDJh1BNfaMa04zEadtk,2474 -certifi-2025.10.5.dist-info/RECORD,, -certifi-2025.10.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 -certifi-2025.10.5.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2025.10.5.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=jWkaYHMk4oIPSSBEK5bLMbO_qrkyNm_cRFx-D16-3Ks,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/__pycache__/__init__.cpython-311.pyc,, -certifi/__pycache__/__main__.cpython-311.pyc,, -certifi/__pycache__/core.cpython-311.pyc,, -certifi/cacert.pem,sha256=IIn8WiWDZAH67pn3IkYLAbOTmZdGoPuBeUNmbW7MBFg,291366 -certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/WHEEL b/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/WHEEL deleted file mode 100644 index e7fa31b..0000000 --- a/port/lib/python3.11/site-packages/certifi-2025.10.5.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/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/licenses/LICENSE b/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/licenses/LICENSE deleted file mode 100644 index 62b076c..0000000 --- a/port/lib/python3.11/site-packages/certifi-2025.10.5.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/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/top_level.txt b/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/top_level.txt deleted file mode 100644 index 963eac5..0000000 --- a/port/lib/python3.11/site-packages/certifi-2025.10.5.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -certifi diff --git a/port/lib/python3.11/site-packages/certifi/__init__.py b/port/lib/python3.11/site-packages/certifi/__init__.py deleted file mode 100644 index c4b6c0b..0000000 --- a/port/lib/python3.11/site-packages/certifi/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import contents, where - -__all__ = ["contents", "where"] -__version__ = "2025.10.05" diff --git a/port/lib/python3.11/site-packages/certifi/__main__.py b/port/lib/python3.11/site-packages/certifi/__main__.py deleted file mode 100644 index 8945b5d..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 22c13c1c28a9ab31f202ede1376572f38aa8b721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmZ3^%ge<81e+%?XT|~P#~=<2FhLogm4J-t3@HpLj5!Rsj8TlaOi@gX3@J=0%;`)~ z%qc8UEGewP44P~&8G#BlnQn0;=jWBA=9LuRVlB@|ElMq728tK40EsFtBLgE-JwpRM z15-au)>|ye`N-0@*yH09b8_P2Z*j-Rm!%dJXXfX{$FF4g4Ajc-%R|2`u}HtXyj(vZ zzo;ZFKPNL^zW~V6&&f>EFQ_cZ$j>v@Gc?pM&MZmQEl5nxPE1cN)=y3?D#=XC)Q^wP z%*!l^kJl@x{Ka9Do1apelWJGQ4Kx_!>S6;R@qw9_qvRtNw9 diff --git a/port/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc b/port/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index e1052f892c3373de594cd0eb790d7ad1c59c25bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmah`&ubGw6n?Y6cQGo4KcUNir)N3lCsb+r+_DK#ol^yX4@@Q1mDb?_q}=Fdwe_lsaCUq+xHVWxZv@JNGemW z!No5Q-hmH33ZW;W6rxD#Ns-)>5lDbxN2!{|9DJ=3=&4x!sNJNufG_)suYS|UGUs!@ zG6bBjSK00O*IWY|J5p6A4X(lDF8#?GBR-q^l_9SGl~5~~^8cAF{ikT`wj^eFNlbA} zGo}u=F~NIM+uO6+?VD>WqY1$dB?H_-OmjUNByr1PhD-XXOES!K4-*<}1w?!+5zoc$ zJ|q1>#K&$524PysBLGJk^v0G5rGKhr#7b`>jjt;c#egCWLM! zVUXA8Jxm1`-xi$ms4C<#)KY9NC(dYdM)ThuX zpfiEaOs}2k%~QQO)fWnVAy?+Ie)!}ZWK^FiX8vNdI$AwiJ6@YAjY4Tmsy#1j%cJF^ RmE)Cz?qN4C7rD#r;Y3Jylta@7{6)K&ms*Z_KFfx_B&`-XELK|C#l`NUsPEk){o$TPUl_Xnw(kNR*DHauC znB`>ARNIDGNU925DO1r)NfRdxVkK3xO!P9bGNChiuN7yYy^u=ZIzq3^K|8+*>Iov9 zap-GI*Nbmz0H}rz!RMIzxdPWk>nP2vq**5{=WgY`UfYm!8{ashEbEU9BFoRvIh}cN zJNr<<+1=gU?0plHf>|`oYz3@r(fB@F*&|zK`9|jY^{izO{nLt~K2SDwE9+sDRZXk| zP>$p-+P<-@l1G@5fi^1%s)|l|>4c9p`Pjk80jX^?_-i(Qt=@UC2$Rz689n}4*tMO2 zV#x)gs5=7HmI|Z3_z+#dP%lK)GVwt`h`9V|`)SM}z<2CJSnHbSuMEuUoz?rM@Pr=E z6GD&eNo}BGb@zwxa_kTEt%Zo>e?r^-T4d;QwAX{_A;UU)#;rI3FA^7_OS+{)PNWm_ z`?ogkV8};=uYhvIZPO@M6taaWG7e`E>;!=lz)LL4&VWK_ARQ6wn}!8rZX9ud`qKmA zAoUV{8u58MKL2?6G&1zd>eJOmWZI5Q*CW&aO7XfF zcQ@~$01X~(=Veep0Y9t=62BL=w`5IUplh8X1?ydk#{I$ft_H9REBHN_f@z=}L9tZB zNHdP8msL|U%A0A<#Tt*$&q1s!nhdCteiX${HNXj&n1NLe`C0~4*KE=+%c(U&Q!-I+q` z@F75O?8Bh2gvQ+yLRa#n)@66b5PApKyYgn+&lN&R=}9ll{anX`FfA?OVdxxjQzx>| zVoXVhN2wa4Dn=EpJ$;C~gmu+t@X=ZV)y3Kvihof1{HWL%U$Dm){s)HoMd~BisGp%4 z>oN;Mb6K<35st&uG=pgv`wve^;xc6o42xcrG9`9!wYL0xzAoh&QqGogbus5L0@JXs zqz9dVENi9;$<0}NRvRG-juUyPV+;PXWTRX#onfOyt3DL{4Aw1k2dlbuSvTBj;bPwg zo2I^d7@VY5imEpp`a=Ao{fBuIPr($Lqt*oI7RNA5ixn8Yg{X=kCR`2C-wPD2y1y3B zFrTzguM!a-u({#=-6l6#=O$nBGxaw;FNa2}_g)N-RhL`*m@u(_qlKXBS2K*T&g`qO o2lVgIAtWp^b^goOpYFY4?Y*FDp 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/port/lib/python3.11/site-packages/certifi/py.typed b/port/lib/python3.11/site-packages/certifi/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER b/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA b/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA deleted file mode 100644 index 8d32edc..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/METADATA +++ /dev/null @@ -1,764 +0,0 @@ -Metadata-Version: 2.4 -Name: charset-normalizer -Version: 3.4.4 -Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. -Author-email: "Ahmed R. TAHRI" -Maintainer-email: "Ahmed R. TAHRI" -License: MIT -Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md -Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ -Project-URL: Code, https://github.com/jawah/charset_normalizer -Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues -Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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 :: 3.14 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Text Processing :: Linguistic -Classifier: Topic :: Utilities -Classifier: Typing :: Typed -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: unicode-backport -Dynamic: license-file - -

Charset Detection, for Everyone 👋

- -

- The Real First Universal Charset Detector
- - - - - Download Count Total - - - - -

-

- Featured Packages
- - Static Badge - - - Static Badge - -

-

- In other language (unofficial port - by the community)
- - Static Badge - -

- -> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, -> I'm trying to resolve the issue by taking a new approach. -> All IANA character set names for which the Python core library provides codecs are supported. - -

- >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< -

- -This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. - -| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | -|--------------------------------------------------|:---------------------------------------------:|:--------------------------------------------------------------------------------------------------:|:-----------------------------------------------:| -| `Fast` | ❌ | ✅ | ✅ | -| `Universal**` | ❌ | ✅ | ❌ | -| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | -| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | -| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ | -| `Native Python` | ✅ | ✅ | ❌ | -| `Detect spoken language` | ❌ | ✅ | N/A | -| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | -| `Whl Size (min)` | 193.6 kB | 42 kB | ~200 kB | -| `Supported Encoding` | 33 | 🎉 [99](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 | - -

-Reading Normalized TextCat Reading Text -

- -*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
- -## ⚡ Performance - -This package offer better performance than its counterpart Chardet. Here are some numbers. - -| Package | Accuracy | Mean per file (ms) | File per sec (est) | -|-----------------------------------------------|:--------:|:------------------:|:------------------:| -| [chardet](https://github.com/chardet/chardet) | 86 % | 63 ms | 16 file/sec | -| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | - -| Package | 99th percentile | 95th percentile | 50th percentile | -|-----------------------------------------------|:---------------:|:---------------:|:---------------:| -| [chardet](https://github.com/chardet/chardet) | 265 ms | 71 ms | 7 ms | -| charset-normalizer | 100 ms | 50 ms | 5 ms | - -_updated as of december 2024 using CPython 3.12_ - -Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. - -> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. -> And yes, these results might change at any time. The dataset can be updated to include more files. -> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. -> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability -> (e.g. Supported Encoding) Challenge-them if you want. - -## ✨ Installation - -Using pip: - -```sh -pip install charset-normalizer -U -``` - -## 🚀 Basic Usage - -### CLI -This package comes with a CLI. - -``` -usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] - file [file ...] - -The Real First Universal Charset Detector. Discover originating encoding used -on text file. Normalize text to unicode. - -positional arguments: - files File(s) to be analysed - -optional arguments: - -h, --help show this help message and exit - -v, --verbose Display complementary information about file if any. - Stdout will contain logs about the detection process. - -a, --with-alternative - Output complementary possibilities if any. Top-level - JSON WILL be a list. - -n, --normalize Permit to normalize input file. If not set, program - does not write anything. - -m, --minimal Only output the charset detected to STDOUT. Disabling - JSON output. - -r, --replace Replace file when trying to normalize it instead of - creating a new one. - -f, --force Replace file without asking if you are sure, use this - flag with caution. - -t THRESHOLD, --threshold THRESHOLD - Define a custom maximum amount of chaos allowed in - decoded content. 0. <= chaos <= 1. - --version Show version information and exit. -``` - -```bash -normalizer ./data/sample.1.fr.srt -``` - -or - -```bash -python -m charset_normalizer ./data/sample.1.fr.srt -``` - -🎉 Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. - -```json -{ - "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", - "encoding": "cp1252", - "encoding_aliases": [ - "1252", - "windows_1252" - ], - "alternative_encodings": [ - "cp1254", - "cp1256", - "cp1258", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - "mbcs" - ], - "language": "French", - "alphabets": [ - "Basic Latin", - "Latin-1 Supplement" - ], - "has_sig_or_bom": false, - "chaos": 0.149, - "coherence": 97.152, - "unicode_path": null, - "is_preferred": true -} -``` - -### Python -*Just print out normalized text* -```python -from charset_normalizer import from_path - -results = from_path('./my_subtitle.srt') - -print(str(results.best())) -``` - -*Upgrade your code without effort* -```python -from charset_normalizer import detect -``` - -The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. - -See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) - -## 😇 Why - -When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a -reliable alternative using a completely different method. Also! I never back down on a good challenge! - -I **don't care** about the **originating charset** encoding, because **two different tables** can -produce **two identical rendered string.** -What I want is to get readable text, the best I can. - -In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 - -Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. - -## 🍰 How - - - Discard all charset encoding table that could not fit the binary content. - - Measure noise, or the mess once opened (by chunks) with a corresponding charset encoding. - - Extract matches with the lowest mess detected. - - Additionally, we measure coherence / probe for a language. - -**Wait a minute**, what is noise/mess and coherence according to **YOU ?** - -*Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then -**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). - I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to - improve or rewrite it. - -*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought -that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. - -## ⚡ Known limitations - - - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) - - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. - -## ⚠️ About Python EOLs - -**If you are running:** - -- Python >=2.7,<3.5: Unsupported -- Python 3.5: charset-normalizer < 2.1 -- Python 3.6: charset-normalizer < 3.1 -- Python 3.7: charset-normalizer < 4.0 - -Upgrade your Python interpreter as soon as possible. - -## 👤 Contributing - -Contributions, issues and feature requests are very much welcome.
-Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. - -## 📝 License - -Copyright © [Ahmed TAHRI @Ousret](https://github.com/Ousret).
-This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. - -Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) - -## 💼 For Enterprise - -Professional support for charset-normalizer is available as part of the [Tidelift -Subscription][1]. Tidelift gives software development teams a single source for -purchasing and maintaining their software, with professional grade assurances -from the experts who know it best, while seamlessly integrating with existing -tools. - -[1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme - -[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) - -# Changelog -All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - -## [3.4.4](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.4) (2025-10-13) - -### Changed -- Bound `setuptools` to a specific constraint `setuptools>=68,<=81`. -- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2 - -### Removed -- `setuptools-scm` as a build dependency. - -### Misc -- Enforced hashes in `dev-requirements.txt` and created `ci-requirements.txt` for security purposes. -- Additional pre-built wheels for riscv64, s390x, and armv7l architectures. -- Restore ` multiple.intoto.jsonl` in GitHub releases in addition to individual attestation file per wheel. - -## [3.4.3](https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3) (2025-08-09) - -### Changed -- mypy(c) is no longer a required dependency at build time if `CHARSET_NORMALIZER_USE_MYPYC` isn't set to `1`. (#595) (#583) -- automatically lower confidence on small bytes samples that are not Unicode in `detect` output legacy function. (#391) - -### Added -- Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase. -- Support for Python 3.14 - -### Fixed -- sdist archive contained useless directories. -- automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (#633) - -### Misc -- SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. - Each published wheel comes with its SBOM. We choose CycloneDX as the format. -- Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel. - -## [3.4.2](https://github.com/Ousret/charset_normalizer/compare/3.4.1...3.4.2) (2025-05-02) - -### Fixed -- Addressed the DeprecationWarning in our CLI regarding `argparse.FileType` by backporting the target class into the package. (#591) -- Improved the overall reliability of the detector with CJK Ideographs. (#605) (#587) - -### Changed -- Optional mypyc compilation upgraded to version 1.15 for Python >= 3.8 - -## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) - -### Changed -- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. -- Enforce annotation delayed loading for a simpler and consistent types in the project. -- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 - -### Added -- pre-commit configuration. -- noxfile. - -### Removed -- `build-requirements.txt` as per using `pyproject.toml` native build configuration. -- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). -- `setup.cfg` in favor of `pyproject.toml` metadata configuration. -- Unused `utils.range_scan` function. - -### Fixed -- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) -- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ - -## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) - -### Added -- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. -- Support for Python 3.13 (#512) - -### Fixed -- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. -- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) -- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) - -## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) - -### Fixed -- Unintentional memory usage regression when using large payload that match several encoding (#376) -- Regression on some detection case showcased in the documentation (#371) - -### Added -- Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife) - -## [3.3.1](https://github.com/Ousret/charset_normalizer/compare/3.3.0...3.3.1) (2023-10-22) - -### Changed -- Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8 -- Improved the general detection reliability based on reports from the community - -## [3.3.0](https://github.com/Ousret/charset_normalizer/compare/3.2.0...3.3.0) (2023-09-30) - -### Added -- Allow to execute the CLI (e.g. normalizer) through `python -m charset_normalizer.cli` or `python -m charset_normalizer` -- Support for 9 forgotten encoding that are supported by Python but unlisted in `encoding.aliases` as they have no alias (#323) - -### Removed -- (internal) Redundant utils.is_ascii function and unused function is_private_use_only -- (internal) charset_normalizer.assets is moved inside charset_normalizer.constant - -### Changed -- (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection -- Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8 - -### Fixed -- Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in \_\_lt\_\_ (#350) - -## [3.2.0](https://github.com/Ousret/charset_normalizer/compare/3.1.0...3.2.0) (2023-06-07) - -### Changed -- Typehint for function `from_path` no longer enforce `PathLike` as its first argument -- Minor improvement over the global detection reliability - -### Added -- Introduce function `is_binary` that relies on main capabilities, and optimized to detect binaries -- Propagate `enable_fallback` argument throughout `from_bytes`, `from_path`, and `from_fp` that allow a deeper control over the detection (default True) -- Explicit support for Python 3.12 - -### Fixed -- Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289) - -## [3.1.0](https://github.com/Ousret/charset_normalizer/compare/3.0.1...3.1.0) (2023-03-06) - -### Added -- Argument `should_rename_legacy` for legacy function `detect` and disregard any new arguments without errors (PR #262) - -### Removed -- Support for Python 3.6 (PR #260) - -### Changed -- Optional speedup provided by mypy/c 1.0.1 - -## [3.0.1](https://github.com/Ousret/charset_normalizer/compare/3.0.0...3.0.1) (2022-11-18) - -### Fixed -- Multi-bytes cutter/chunk generator did not always cut correctly (PR #233) - -### Changed -- Speedup provided by mypy/c 0.990 on Python >= 3.7 - -## [3.0.0](https://github.com/Ousret/charset_normalizer/compare/2.1.1...3.0.0) (2022-10-20) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it -- Sphinx warnings when generating the documentation - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [3.0.0rc1](https://github.com/Ousret/charset_normalizer/compare/3.0.0b2...3.0.0rc1) (2022-10-18) - -### Added -- Extend the capability of explain=True when cp_isolation contains at most two entries (min one), will log in details of the Mess-detector results -- Support for alternative language frequency set in charset_normalizer.assets.FREQUENCIES -- Add parameter `language_threshold` in `from_bytes`, `from_path` and `from_fp` to adjust the minimum expected coherence ratio - -### Changed -- Build with static metadata using 'build' frontend -- Make the language detection stricter - -### Fixed -- CLI with opt --normalize fail when using full path for files -- TooManyAccentuatedPlugin induce false positive on the mess detection when too few alpha character have been fed to it - -### Removed -- Coherence detector no longer return 'Simple English' instead return 'English' -- Coherence detector no longer return 'Classical Chinese' instead return 'Chinese' - -## [3.0.0b2](https://github.com/Ousret/charset_normalizer/compare/3.0.0b1...3.0.0b2) (2022-08-21) - -### Added -- `normalizer --version` now specify if current version provide extra speedup (meaning mypyc compilation whl) - -### Removed -- Breaking: Method `first()` and `best()` from CharsetMatch -- UTF-7 will no longer appear as "detected" without a recognized SIG/mark (is unreliable/conflict with ASCII) - -### Fixed -- Sphinx warnings when generating the documentation - -## [3.0.0b1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...3.0.0b1) (2022-08-15) - -### Changed -- Optional: Module `md.py` can be compiled using Mypyc to provide an extra speedup up to 4x faster than v2.1 - -### Removed -- Breaking: Class aliases CharsetDetector, CharsetDoctor, CharsetNormalizerMatch and CharsetNormalizerMatches -- Breaking: Top-level function `normalize` -- Breaking: Properties `chaos_secondary_pass`, `coherence_non_latin` and `w_counter` from CharsetMatch -- Support for the backport `unicodedata2` - -## [2.1.1](https://github.com/Ousret/charset_normalizer/compare/2.1.0...2.1.1) (2022-08-19) - -### Deprecated -- Function `normalize` scheduled for removal in 3.0 - -### Changed -- Removed useless call to decode in fn is_unprintable (#206) - -### Fixed -- Third-party library (i18n xgettext) crashing not recognizing utf_8 (PEP 263) with underscore from [@aleksandernovikov](https://github.com/aleksandernovikov) (#204) - -## [2.1.0](https://github.com/Ousret/charset_normalizer/compare/2.0.12...2.1.0) (2022-06-19) - -### Added -- Output the Unicode table version when running the CLI with `--version` (PR #194) - -### Changed -- Re-use decoded buffer for single byte character sets from [@nijel](https://github.com/nijel) (PR #175) -- Fixing some performance bottlenecks from [@deedy5](https://github.com/deedy5) (PR #183) - -### Fixed -- Workaround potential bug in cpython with Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space (PR #175) -- CLI default threshold aligned with the API threshold from [@oleksandr-kuzmenko](https://github.com/oleksandr-kuzmenko) (PR #181) - -### Removed -- Support for Python 3.5 (PR #192) - -### Deprecated -- Use of backport unicodedata from `unicodedata2` as Python is quickly catching up, scheduled for removal in 3.0 (PR #194) - -## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) - -### Fixed -- ASCII miss-detection on rare cases (PR #170) - -## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) - -### Added -- Explicit support for Python 3.11 (PR #164) - -### Changed -- The logging behavior have been completely reviewed, now using only TRACE and DEBUG levels (PR #163 #165) - -## [2.0.10](https://github.com/Ousret/charset_normalizer/compare/2.0.9...2.0.10) (2022-01-04) - -### Fixed -- Fallback match entries might lead to UnicodeDecodeError for large bytes sequence (PR #154) - -### Changed -- Skipping the language-detection (CD) on ASCII (PR #155) - -## [2.0.9](https://github.com/Ousret/charset_normalizer/compare/2.0.8...2.0.9) (2021-12-03) - -### Changed -- Moderating the logging impact (since 2.0.8) for specific environments (PR #147) - -### Fixed -- Wrong logging level applied when setting kwarg `explain` to True (PR #146) - -## [2.0.8](https://github.com/Ousret/charset_normalizer/compare/2.0.7...2.0.8) (2021-11-24) -### Changed -- Improvement over Vietnamese detection (PR #126) -- MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) -- Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) -- call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) -- Code style as refactored by Sourcery-AI (PR #131) -- Minor adjustment on the MD around european words (PR #133) -- Remove and replace SRTs from assets / tests (PR #139) -- Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Setting kwarg `explain` to True will add provisionally (bounded to function lifespan) a specific stream handler (PR #135) - -### Fixed -- Fix large (misleading) sequence giving UnicodeDecodeError (PR #137) -- Avoid using too insignificant chunk (PR #137) - -### Added -- Add and expose function `set_logging_handler` to configure a specific StreamHandler from [@nmaynes](https://github.com/nmaynes) (PR #135) -- Add `CHANGELOG.md` entries, format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) (PR #141) - -## [2.0.7](https://github.com/Ousret/charset_normalizer/compare/2.0.6...2.0.7) (2021-10-11) -### Added -- Add support for Kazakh (Cyrillic) language detection (PR #109) - -### Changed -- Further, improve inferring the language from a given single-byte code page (PR #112) -- Vainly trying to leverage PEP263 when PEP3120 is not supported (PR #116) -- Refactoring for potential performance improvements in loops from [@adbar](https://github.com/adbar) (PR #113) -- Various detection improvement (MD+CD) (PR #117) - -### Removed -- Remove redundant logging entry about detected language(s) (PR #115) - -### Fixed -- Fix a minor inconsistency between Python 3.5 and other versions regarding language detection (PR #117 #102) - -## [2.0.6](https://github.com/Ousret/charset_normalizer/compare/2.0.5...2.0.6) (2021-09-18) -### Fixed -- Unforeseen regression with the loss of the backward-compatibility with some older minor of Python 3.5.x (PR #100) -- Fix CLI crash when using --minimal output in certain cases (PR #103) - -### Changed -- Minor improvement to the detection efficiency (less than 1%) (PR #106 #101) - -## [2.0.5](https://github.com/Ousret/charset_normalizer/compare/2.0.4...2.0.5) (2021-09-14) -### Changed -- The project now comply with: flake8, mypy, isort and black to ensure a better overall quality (PR #81) -- The BC-support with v1.x was improved, the old staticmethods are restored (PR #82) -- The Unicode detection is slightly improved (PR #93) -- Add syntax sugar \_\_bool\_\_ for results CharsetMatches list-container (PR #91) - -### Removed -- The project no longer raise warning on tiny content given for detection, will be simply logged as warning instead (PR #92) - -### Fixed -- In some rare case, the chunks extractor could cut in the middle of a multi-byte character and could mislead the mess detection (PR #95) -- Some rare 'space' characters could trip up the UnprintablePlugin/Mess detection (PR #96) -- The MANIFEST.in was not exhaustive (PR #78) - -## [2.0.4](https://github.com/Ousret/charset_normalizer/compare/2.0.3...2.0.4) (2021-07-30) -### Fixed -- The CLI no longer raise an unexpected exception when no encoding has been found (PR #70) -- Fix accessing the 'alphabets' property when the payload contains surrogate characters (PR #68) -- The logger could mislead (explain=True) on detected languages and the impact of one MBCS match (PR #72) -- Submatch factoring could be wrong in rare edge cases (PR #72) -- Multiple files given to the CLI were ignored when publishing results to STDOUT. (After the first path) (PR #72) -- Fix line endings from CRLF to LF for certain project files (PR #67) - -### Changed -- Adjust the MD to lower the sensitivity, thus improving the global detection reliability (PR #69 #76) -- Allow fallback on specified encoding if any (PR #71) - -## [2.0.3](https://github.com/Ousret/charset_normalizer/compare/2.0.2...2.0.3) (2021-07-16) -### Changed -- Part of the detection mechanism has been improved to be less sensitive, resulting in more accurate detection results. Especially ASCII. (PR #63) -- According to the community wishes, the detection will fall back on ASCII or UTF-8 in a last-resort case. (PR #64) - -## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) -### Fixed -- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) - -### Changed -- Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) - -## [2.0.1](https://github.com/Ousret/charset_normalizer/compare/2.0.0...2.0.1) (2021-07-13) -### Fixed -- Make it work where there isn't a filesystem available, dropping assets frequencies.json. Report from [@sethmlarson](https://github.com/sethmlarson). (PR #55) -- Using explain=False permanently disable the verbose output in the current runtime (PR #47) -- One log entry (language target preemptive) was not show in logs when using explain=True (PR #47) -- Fix undesired exception (ValueError) on getitem of instance CharsetMatches (PR #52) - -### Changed -- Public function normalize default args values were not aligned with from_bytes (PR #53) - -### Added -- You may now use charset aliases in cp_isolation and cp_exclusion arguments (PR #47) - -## [2.0.0](https://github.com/Ousret/charset_normalizer/compare/1.4.1...2.0.0) (2021-07-02) -### Changed -- 4x to 5 times faster than the previous 1.4.0 release. At least 2x faster than Chardet. -- Accent has been made on UTF-8 detection, should perform rather instantaneous. -- The backward compatibility with Chardet has been greatly improved. The legacy detect function returns an identical charset name whenever possible. -- The detection mechanism has been slightly improved, now Turkish content is detected correctly (most of the time) -- The program has been rewritten to ease the readability and maintainability. (+Using static typing)+ -- utf_7 detection has been reinstated. - -### Removed -- This package no longer require anything when used with Python 3.5 (Dropped cached_property) -- Removed support for these languages: Catalan, Esperanto, Kazakh, Baque, Volapük, Azeri, Galician, Nynorsk, Macedonian, and Serbocroatian. -- The exception hook on UnicodeDecodeError has been removed. - -### Deprecated -- Methods coherence_non_latin, w_counter, chaos_secondary_pass of the class CharsetMatch are now deprecated and scheduled for removal in v3.0 - -### Fixed -- The CLI output used the relative path of the file(s). Should be absolute. - -## [1.4.1](https://github.com/Ousret/charset_normalizer/compare/1.4.0...1.4.1) (2021-05-28) -### Fixed -- Logger configuration/usage no longer conflict with others (PR #44) - -## [1.4.0](https://github.com/Ousret/charset_normalizer/compare/1.3.9...1.4.0) (2021-05-21) -### Removed -- Using standard logging instead of using the package loguru. -- Dropping nose test framework in favor of the maintained pytest. -- Choose to not use dragonmapper package to help with gibberish Chinese/CJK text. -- Require cached_property only for Python 3.5 due to constraint. Dropping for every other interpreter version. -- Stop support for UTF-7 that does not contain a SIG. -- Dropping PrettyTable, replaced with pure JSON output in CLI. - -### Fixed -- BOM marker in a CharsetNormalizerMatch instance could be False in rare cases even if obviously present. Due to the sub-match factoring process. -- Not searching properly for the BOM when trying utf32/16 parent codec. - -### Changed -- Improving the package final size by compressing frequencies.json. -- Huge improvement over the larges payload. - -### Added -- CLI now produces JSON consumable output. -- Return ASCII if given sequences fit. Given reasonable confidence. - -## [1.3.9](https://github.com/Ousret/charset_normalizer/compare/1.3.8...1.3.9) (2021-05-13) - -### Fixed -- In some very rare cases, you may end up getting encode/decode errors due to a bad bytes payload (PR #40) - -## [1.3.8](https://github.com/Ousret/charset_normalizer/compare/1.3.7...1.3.8) (2021-05-12) - -### Fixed -- Empty given payload for detection may cause an exception if trying to access the `alphabets` property. (PR #39) - -## [1.3.7](https://github.com/Ousret/charset_normalizer/compare/1.3.6...1.3.7) (2021-05-12) - -### Fixed -- The legacy detect function should return UTF-8-SIG if sig is present in the payload. (PR #38) - -## [1.3.6](https://github.com/Ousret/charset_normalizer/compare/1.3.5...1.3.6) (2021-02-09) - -### Changed -- Amend the previous release to allow prettytable 2.0 (PR #35) - -## [1.3.5](https://github.com/Ousret/charset_normalizer/compare/1.3.4...1.3.5) (2021-02-08) - -### Fixed -- Fix error while using the package with a python pre-release interpreter (PR #33) - -### Changed -- Dependencies refactoring, constraints revised. - -### Added -- Add python 3.9 and 3.10 to the supported interpreters - -MIT License - -Copyright (c) 2025 TAHRI Ahmed R. - -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/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD b/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD deleted file mode 100644 index 520761e..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/RECORD +++ /dev/null @@ -1,35 +0,0 @@ -../../../bin/normalizer,sha256=nALMN-6a_4_iWqxeosL4B827IP-EmTDY4AOdUJAbf-s,252 -charset_normalizer-3.4.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -charset_normalizer-3.4.4.dist-info/METADATA,sha256=jVuUFBti8dav19YLvWissTihVdF2ozUY4KKMw7jdkBQ,37303 -charset_normalizer-3.4.4.dist-info/RECORD,, -charset_normalizer-3.4.4.dist-info/WHEEL,sha256=BvA_i88wcFUl5ehXLgmhwyDL4XPGrCKn6CTUA9axFDE,190 -charset_normalizer-3.4.4.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 -charset_normalizer-3.4.4.dist-info/licenses/LICENSE,sha256=bQ1Bv-FwrGx9wkjJpj4lTQ-0WmDVCoJX0K-SxuJJuIc,1071 -charset_normalizer-3.4.4.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 -charset_normalizer/__init__.py,sha256=OKRxRv2Zhnqk00tqkN0c1BtJjm165fWXLydE52IKuHc,1590 -charset_normalizer/__main__.py,sha256=yzYxMR-IhKRHYwcSlavEv8oGdwxsR89mr2X09qXGdps,109 -charset_normalizer/__pycache__/__init__.cpython-311.pyc,, -charset_normalizer/__pycache__/__main__.cpython-311.pyc,, -charset_normalizer/__pycache__/api.cpython-311.pyc,, -charset_normalizer/__pycache__/cd.cpython-311.pyc,, -charset_normalizer/__pycache__/constant.cpython-311.pyc,, -charset_normalizer/__pycache__/legacy.cpython-311.pyc,, -charset_normalizer/__pycache__/md.cpython-311.pyc,, -charset_normalizer/__pycache__/models.cpython-311.pyc,, -charset_normalizer/__pycache__/utils.cpython-311.pyc,, -charset_normalizer/__pycache__/version.cpython-311.pyc,, -charset_normalizer/api.py,sha256=V07i8aVeCD8T2fSia3C-fn0i9t8qQguEBhsqszg32Ns,22668 -charset_normalizer/cd.py,sha256=WKTo1HDb-H9HfCDc3Bfwq5jzS25Ziy9SE2a74SgTq88,12522 -charset_normalizer/cli/__init__.py,sha256=D8I86lFk2-py45JvqxniTirSj_sFyE6sjaY_0-G1shc,136 -charset_normalizer/cli/__main__.py,sha256=dMaXG6IJXRvqq8z2tig7Qb83-BpWTln55ooiku5_uvg,12646 -charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc,, -charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc,, -charset_normalizer/constant.py,sha256=7UVY4ldYhmQMHUdgQ_sgZmzcQ0xxYxpBunqSZ-XJZ8U,42713 -charset_normalizer/legacy.py,sha256=sYBzSpzsRrg_wF4LP536pG64BItw7Tqtc3SMQAHvFLM,2731 -charset_normalizer/md.cpython-311-x86_64-linux-gnu.so,sha256=vmQPHNPc6Z0rbXxiiMeoCQxfjjh5z8umtRgKpBckk7E,15912 -charset_normalizer/md.py,sha256=-_oN3h3_X99nkFfqamD3yu45DC_wfk5odH0Tr_CQiXs,20145 -charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so,sha256=83X9F2ayDPRojhPPi7Dpm2LS0plQBG4B12R1GSri2lw,282232 -charset_normalizer/models.py,sha256=lKXhOnIPtiakbK3i__J9wpOfzx3JDTKj7Dn3Rg0VaRI,12394 -charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/utils.py,sha256=sTejPgrdlNsKNucZfJCxJ95lMTLA0ShHLLE3n5wpT9Q,12170 -charset_normalizer/version.py,sha256=nKE4qBNk5WA4LIJ_yIH_aSDfvtsyizkWMg-PUG-UZVk,115 diff --git a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL b/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL deleted file mode 100644 index 35bcd5d..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/WHEEL +++ /dev/null @@ -1,7 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp311-cp311-manylinux_2_17_x86_64 -Tag: cp311-cp311-manylinux2014_x86_64 -Tag: cp311-cp311-manylinux_2_28_x86_64 - diff --git a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt b/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt deleted file mode 100644 index 65619e7..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -normalizer = charset_normalizer.cli:cli_detect diff --git a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE b/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE deleted file mode 100644 index 9725772..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 TAHRI Ahmed R. - -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/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt b/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt deleted file mode 100644 index 66958f0..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer-3.4.4.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -charset_normalizer diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__init__.py b/port/lib/python3.11/site-packages/charset_normalizer/__init__.py deleted file mode 100644 index 0d3a379..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -Charset-Normalizer -~~~~~~~~~~~~~~ -The Real First Universal Charset Detector. -A library that helps you read text from an unknown charset encoding. -Motivated by chardet, This package is trying to resolve the issue by taking a new approach. -All IANA character set names for which the Python core library provides codecs are supported. - -Basic usage: - >>> from charset_normalizer import from_bytes - >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) - >>> best_guess = results.best() - >>> str(best_guess) - 'Bсеки човек има право на образование. Oбразованието!' - -Others methods and usages are available - see the full documentation -at . -:copyright: (c) 2021 by Ahmed TAHRI -:license: MIT, see LICENSE for more details. -""" - -from __future__ import annotations - -import logging - -from .api import from_bytes, from_fp, from_path, is_binary -from .legacy import detect -from .models import CharsetMatch, CharsetMatches -from .utils import set_logging_handler -from .version import VERSION, __version__ - -__all__ = ( - "from_fp", - "from_path", - "from_bytes", - "is_binary", - "detect", - "CharsetMatch", - "CharsetMatches", - "__version__", - "VERSION", - "set_logging_handler", -) - -# Attach a NullHandler to the top level logger by default -# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library - -logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__main__.py b/port/lib/python3.11/site-packages/charset_normalizer/__main__.py deleted file mode 100644 index e0e76f7..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -from __future__ import annotations - -from .cli import cli_detect - -if __name__ == "__main__": - cli_detect() diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6f39976df79a752729c2294ee97ad69a93bd545f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1904 zcmcIk&2Jk;6d!-Yj@L;_5+oc;s5%us$RVWNu?ZJcF1CE` z66SnKx%Sniq3zlfZ&SkXhQo!#pL$M@asl#46@Nk{HKosM+8Sm~n-f03(k2qylm!A0 z{19_WEG+345_h=oV&dV@+w=Usht1SJrk?3rj@PYe_k8K}h@=*750Y(*${Tpsb_5QH zxktJb11tFePGjlA-NI)*3MSQt2&vMOWKV4q?9o0ZLBM@t+5nI-++1s|CHE3jQjWoS z>=Bm=-0?Z?+m2}`SKS{-+Xs9;r)OTlH9g0Iqkxr~0u$I1VG#Hn;MO$lHW7}ALjf2Y z8pe2abv1Q(N&M+TC6pcG zqe`_pM$@K38r_fz1!x4VrWO~@jtI#Y&W|O_|2JGs+k$j+fn5q&vLF+lmBu|y3h5Dt zkv5}v5fYr%Mkj>iTfP~()RROyzNbNr-m;|(M5A8sI?@i?HPd(NTcO}o)?ZHAYE5gH zelXxp*Om>uU{>++&E+LkaBH>;6}!8(x!u$n%rU7aXanDC?%qfM+-=@jZ|$rnHRh_4 zf}#e9qNY7lZCcI5W#V~$ic7Sfscx_4V@^7Y#6G?Aw-5z z)i^wjh!+)^P-Ie(k|OH$6q#0J3P?Qna_p*a#6`n^_!~y78Ad0RA*Y7H;SoY{ zaResLk-$lxVh$3!alwWDW8&O?JP}HWW@@}R!k*$$$dqNm7+5ZKsk{r0 zQyy!?vNluS<8lj%V@ybde1rKP%X zBwZZ6OyY{7sT+plInpp{!QjQ@Er1>}y2{@M8!F4-)sfb^w80cW{^hcC2(8m-&(iF-O64(Yw~q3g7AGzCSq zdZ6hj^qjqDG@CS2L7t~P>GMaK(WJ+HCIhq18?Mz@db%5+k&f2oOXI{q%PU`lKZ diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/api.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/api.cpython-311.pyc deleted file mode 100644 index bcc11d195783667398501390570549280f7b73ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20786 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 diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/cd.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/cd.cpython-311.pyc deleted file mode 100644 index 52307f50f77532535c47db493dd54205d965851b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15869 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 G`u_k`VPwbv diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/md.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/md.cpython-311.pyc deleted file mode 100644 index 09527e474dbf529fcfe30d6fd60109aeb131fbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27540 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 V;}co?0Up+Y7LZG4@n&@J{{k&Tdv^c; diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/models.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/models.cpython-311.pyc deleted file mode 100644 index 05b90577f6e14b53c98fc2c761a32882e479354c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18559 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 Nnx%iUPA)^T{|gJkM(zLr diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/utils.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 5f0c7b3be518d0d8b6a250675c97a337741d2344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15652 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 diff --git a/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/version.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/__pycache__/version.cpython-311.pyc deleted file mode 100644 index 69d8fe61743e9d9197e3940148025bcf4e3cbfb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 401 zcmYjMzfS@&6mIW0AiZE*m{^ET3|>QEG&(4Q3mQlqZfQk0CyjCR zA5mkXxyi)Ijf9QKHbBDHzW2WOBj0PE3Izl-UT1bFb^JBS2KI`;#i=HDfC3*-NUaF= zE#HEG+P=-~hs~HmGDLyQp!SaLLL;CS=HC^k)VtFm;1C<|HRt z*}}s>;L&J=FSt-$9)%nyn&BwC!pT_mcwFgw diff --git a/port/lib/python3.11/site-packages/charset_normalizer/api.py b/port/lib/python3.11/site-packages/charset_normalizer/api.py deleted file mode 100644 index ebd9639..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/api.py +++ /dev/null @@ -1,669 +0,0 @@ -from __future__ import annotations - -import logging -from os import PathLike -from typing import BinaryIO - -from .cd import ( - coherence_ratio, - encoding_languages, - mb_encoding_languages, - merge_coherence_ratios, -) -from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE -from .md import mess_ratio -from .models import CharsetMatch, CharsetMatches -from .utils import ( - any_specified_encoding, - cut_sequence_chunks, - iana_name, - identify_sig_or_bom, - is_cp_similar, - is_multi_byte_encoding, - should_strip_sig_or_bom, -) - -logger = logging.getLogger("charset_normalizer") -explain_handler = logging.StreamHandler() -explain_handler.setFormatter( - logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") -) - - -def from_bytes( - sequences: bytes | bytearray, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.2, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Given a raw bytes sequence, return the best possibles charset usable to render str objects. - If there is no results, it is a strong indicator that the source is binary/not text. - By default, the process will extract 5 blocks of 512o each to assess the mess and coherence of a given sequence. - And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. - - The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page - but never take it for granted. Can improve the performance. - - You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that - purpose. - - This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. - By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' - toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. - Custom logging format and handler can be set manually. - """ - - if not isinstance(sequences, (bytearray, bytes)): - raise TypeError( - "Expected object of type bytes or bytearray, got: {}".format( - type(sequences) - ) - ) - - if explain: - previous_logger_level: int = logger.level - logger.addHandler(explain_handler) - logger.setLevel(TRACE) - - length: int = len(sequences) - - if length == 0: - logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level or logging.WARNING) - return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) - - if cp_isolation is not None: - logger.log( - TRACE, - "cp_isolation is set. use this flag for debugging purpose. " - "limited list of encoding allowed : %s.", - ", ".join(cp_isolation), - ) - cp_isolation = [iana_name(cp, False) for cp in cp_isolation] - else: - cp_isolation = [] - - if cp_exclusion is not None: - logger.log( - TRACE, - "cp_exclusion is set. use this flag for debugging purpose. " - "limited list of encoding excluded : %s.", - ", ".join(cp_exclusion), - ) - cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] - else: - cp_exclusion = [] - - if length <= (chunk_size * steps): - logger.log( - TRACE, - "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", - steps, - chunk_size, - length, - ) - steps = 1 - chunk_size = length - - if steps > 1 and length / steps < chunk_size: - chunk_size = int(length / steps) - - is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE - is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE - - if is_too_small_sequence: - logger.log( - TRACE, - "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( - length - ), - ) - elif is_too_large_sequence: - logger.log( - TRACE, - "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( - length - ), - ) - - prioritized_encodings: list[str] = [] - - specified_encoding: str | None = ( - any_specified_encoding(sequences) if preemptive_behaviour else None - ) - - if specified_encoding is not None: - prioritized_encodings.append(specified_encoding) - logger.log( - TRACE, - "Detected declarative mark in sequence. Priority +1 given for %s.", - specified_encoding, - ) - - tested: set[str] = set() - tested_but_hard_failure: list[str] = [] - tested_but_soft_failure: list[str] = [] - - fallback_ascii: CharsetMatch | None = None - fallback_u8: CharsetMatch | None = None - fallback_specified: CharsetMatch | None = None - - results: CharsetMatches = CharsetMatches() - - early_stop_results: CharsetMatches = CharsetMatches() - - sig_encoding, sig_payload = identify_sig_or_bom(sequences) - - if sig_encoding is not None: - prioritized_encodings.append(sig_encoding) - logger.log( - TRACE, - "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", - len(sig_payload), - sig_encoding, - ) - - prioritized_encodings.append("ascii") - - if "utf_8" not in prioritized_encodings: - prioritized_encodings.append("utf_8") - - for encoding_iana in prioritized_encodings + IANA_SUPPORTED: - if cp_isolation and encoding_iana not in cp_isolation: - continue - - if cp_exclusion and encoding_iana in cp_exclusion: - continue - - if encoding_iana in tested: - continue - - tested.add(encoding_iana) - - decoded_payload: str | None = None - bom_or_sig_available: bool = sig_encoding == encoding_iana - strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( - encoding_iana - ) - - if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", - encoding_iana, - ) - continue - if encoding_iana in {"utf_7"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s won't be tested as-is because detection is unreliable without BOM/SIG.", - encoding_iana, - ) - continue - - try: - is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) - except (ModuleNotFoundError, ImportError): - logger.log( - TRACE, - "Encoding %s does not provide an IncrementalDecoder", - encoding_iana, - ) - continue - - try: - if is_too_large_sequence and is_multi_byte_decoder is False: - str( - ( - sequences[: int(50e4)] - if strip_sig_or_bom is False - else sequences[len(sig_payload) : int(50e4)] - ), - encoding=encoding_iana, - ) - else: - decoded_payload = str( - ( - sequences - if strip_sig_or_bom is False - else sequences[len(sig_payload) :] - ), - encoding=encoding_iana, - ) - except (UnicodeDecodeError, LookupError) as e: - if not isinstance(e, LookupError): - logger.log( - TRACE, - "Code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - similar_soft_failure_test: bool = False - - for encoding_soft_failed in tested_but_soft_failure: - if is_cp_similar(encoding_iana, encoding_soft_failed): - similar_soft_failure_test = True - break - - if similar_soft_failure_test: - logger.log( - TRACE, - "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", - encoding_iana, - encoding_soft_failed, - ) - continue - - r_ = range( - 0 if not bom_or_sig_available else len(sig_payload), - length, - int(length / steps), - ) - - multi_byte_bonus: bool = ( - is_multi_byte_decoder - and decoded_payload is not None - and len(decoded_payload) < length - ) - - if multi_byte_bonus: - logger.log( - TRACE, - "Code page %s is a multi byte encoding table and it appear that at least one character " - "was encoded using n-bytes.", - encoding_iana, - ) - - max_chunk_gave_up: int = int(len(r_) / 4) - - max_chunk_gave_up = max(max_chunk_gave_up, 2) - early_stop_count: int = 0 - lazy_str_hard_failure = False - - md_chunks: list[str] = [] - md_ratios = [] - - try: - for chunk in cut_sequence_chunks( - sequences, - encoding_iana, - r_, - chunk_size, - bom_or_sig_available, - strip_sig_or_bom, - sig_payload, - is_multi_byte_decoder, - decoded_payload, - ): - md_chunks.append(chunk) - - md_ratios.append( - mess_ratio( - chunk, - threshold, - explain is True and 1 <= len(cp_isolation) <= 2, - ) - ) - - if md_ratios[-1] >= threshold: - early_stop_count += 1 - - if (early_stop_count >= max_chunk_gave_up) or ( - bom_or_sig_available and strip_sig_or_bom is False - ): - break - except ( - UnicodeDecodeError - ) as e: # Lazy str loading may have missed something there - logger.log( - TRACE, - "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - early_stop_count = max_chunk_gave_up - lazy_str_hard_failure = True - - # We might want to check the sequence again with the whole content - # Only if initial MD tests passes - if ( - not lazy_str_hard_failure - and is_too_large_sequence - and not is_multi_byte_decoder - ): - try: - sequences[int(50e3) :].decode(encoding_iana, errors="strict") - except UnicodeDecodeError as e: - logger.log( - TRACE, - "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 - if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: - tested_but_soft_failure.append(encoding_iana) - logger.log( - TRACE, - "%s was excluded because of initial chaos probing. Gave up %i time(s). " - "Computed mean chaos is %f %%.", - encoding_iana, - early_stop_count, - round(mean_mess_ratio * 100, ndigits=3), - ) - # Preparing those fallbacks in case we got nothing. - if ( - enable_fallback - and encoding_iana - in ["ascii", "utf_8", specified_encoding, "utf_16", "utf_32"] - and not lazy_str_hard_failure - ): - fallback_entry = CharsetMatch( - sequences, - encoding_iana, - threshold, - bom_or_sig_available, - [], - decoded_payload, - preemptive_declaration=specified_encoding, - ) - if encoding_iana == specified_encoding: - fallback_specified = fallback_entry - elif encoding_iana == "ascii": - fallback_ascii = fallback_entry - else: - fallback_u8 = fallback_entry - continue - - logger.log( - TRACE, - "%s passed initial chaos probing. Mean measured chaos is %f %%", - encoding_iana, - round(mean_mess_ratio * 100, ndigits=3), - ) - - if not is_multi_byte_decoder: - target_languages: list[str] = encoding_languages(encoding_iana) - else: - target_languages = mb_encoding_languages(encoding_iana) - - if target_languages: - logger.log( - TRACE, - "{} should target any language(s) of {}".format( - encoding_iana, str(target_languages) - ), - ) - - cd_ratios = [] - - # We shall skip the CD when its about ASCII - # Most of the time its not relevant to run "language-detection" on it. - if encoding_iana != "ascii": - for chunk in md_chunks: - chunk_languages = coherence_ratio( - chunk, - language_threshold, - ",".join(target_languages) if target_languages else None, - ) - - cd_ratios.append(chunk_languages) - - cd_ratios_merged = merge_coherence_ratios(cd_ratios) - - if cd_ratios_merged: - logger.log( - TRACE, - "We detected language {} using {}".format( - cd_ratios_merged, encoding_iana - ), - ) - - current_match = CharsetMatch( - sequences, - encoding_iana, - mean_mess_ratio, - bom_or_sig_available, - cd_ratios_merged, - ( - decoded_payload - if ( - is_too_large_sequence is False - or encoding_iana in [specified_encoding, "ascii", "utf_8"] - ) - else None - ), - preemptive_declaration=specified_encoding, - ) - - results.append(current_match) - - if ( - encoding_iana in [specified_encoding, "ascii", "utf_8"] - and mean_mess_ratio < 0.1 - ): - # If md says nothing to worry about, then... stop immediately! - if mean_mess_ratio == 0.0: - logger.debug( - "Encoding detection: %s is most likely the one.", - current_match.encoding, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([current_match]) - - early_stop_results.append(current_match) - - if ( - len(early_stop_results) - and (specified_encoding is None or specified_encoding in tested) - and "ascii" in tested - and "utf_8" in tested - ): - probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] - logger.debug( - "Encoding detection: %s is most likely the one.", - probable_result.encoding, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return CharsetMatches([probable_result]) - - if encoding_iana == sig_encoding: - logger.debug( - "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " - "the beginning of the sequence.", - encoding_iana, - ) - if explain: # Defensive: ensure exit path clean handler - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) - - if len(results) == 0: - if fallback_u8 or fallback_ascii or fallback_specified: - logger.log( - TRACE, - "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", - ) - - if fallback_specified: - logger.debug( - "Encoding detection: %s will be used as a fallback match", - fallback_specified.encoding, - ) - results.append(fallback_specified) - elif ( - (fallback_u8 and fallback_ascii is None) - or ( - fallback_u8 - and fallback_ascii - and fallback_u8.fingerprint != fallback_ascii.fingerprint - ) - or (fallback_u8 is not None) - ): - logger.debug("Encoding detection: utf_8 will be used as a fallback match") - results.append(fallback_u8) - elif fallback_ascii: - logger.debug("Encoding detection: ascii will be used as a fallback match") - results.append(fallback_ascii) - - if results: - logger.debug( - "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", - results.best().encoding, # type: ignore - len(results) - 1, - ) - else: - logger.debug("Encoding detection: Unable to determine any suitable charset.") - - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return results - - -def from_fp( - fp: BinaryIO, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but using a file pointer that is already ready. - Will not close the file pointer. - """ - return from_bytes( - fp.read(), - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def from_path( - path: str | bytes | PathLike, # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = True, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. - Can raise IOError. - """ - with open(path, "rb") as fp: - return from_fp( - fp, - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - language_threshold, - enable_fallback, - ) - - -def is_binary( - fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: list[str] | None = None, - cp_exclusion: list[str] | None = None, - preemptive_behaviour: bool = True, - explain: bool = False, - language_threshold: float = 0.1, - enable_fallback: bool = False, -) -> bool: - """ - Detect if the given input (file, bytes, or path) points to a binary file. aka. not a string. - Based on the same main heuristic algorithms and default kwargs at the sole exception that fallbacks match - are disabled to be stricter around ASCII-compatible but unlikely to be a string. - """ - if isinstance(fp_or_path_or_payload, (str, PathLike)): - guesses = from_path( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - elif isinstance( - fp_or_path_or_payload, - ( - bytes, - bytearray, - ), - ): - guesses = from_bytes( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - else: - guesses = from_fp( - fp_or_path_or_payload, - steps=steps, - chunk_size=chunk_size, - threshold=threshold, - cp_isolation=cp_isolation, - cp_exclusion=cp_exclusion, - preemptive_behaviour=preemptive_behaviour, - explain=explain, - language_threshold=language_threshold, - enable_fallback=enable_fallback, - ) - - return not guesses diff --git a/port/lib/python3.11/site-packages/charset_normalizer/cd.py b/port/lib/python3.11/site-packages/charset_normalizer/cd.py deleted file mode 100644 index 71a3ed5..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/cd.py +++ /dev/null @@ -1,395 +0,0 @@ -from __future__ import annotations - -import importlib -from codecs import IncrementalDecoder -from collections import Counter -from functools import lru_cache -from typing import Counter as TypeCounter - -from .constant import ( - FREQUENCIES, - KO_NAMES, - LANGUAGE_SUPPORTED_COUNT, - TOO_SMALL_SEQUENCE, - ZH_NAMES, -) -from .md import is_suspiciously_successive_range -from .models import CoherenceMatches -from .utils import ( - is_accentuated, - is_latin, - is_multi_byte_encoding, - is_unicode_range_secondary, - unicode_range, -) - - -def encoding_unicode_range(iana_name: str) -> list[str]: - """ - Return associated unicode ranges in a single byte code page. - """ - if is_multi_byte_encoding(iana_name): - raise OSError("Function not supported on multi-byte code page") - - decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder - - p: IncrementalDecoder = decoder(errors="ignore") - seen_ranges: dict[str, int] = {} - character_count: int = 0 - - for i in range(0x40, 0xFF): - chunk: str = p.decode(bytes([i])) - - if chunk: - character_range: str | None = unicode_range(chunk) - - if character_range is None: - continue - - if is_unicode_range_secondary(character_range) is False: - if character_range not in seen_ranges: - seen_ranges[character_range] = 0 - seen_ranges[character_range] += 1 - character_count += 1 - - return sorted( - [ - character_range - for character_range in seen_ranges - if seen_ranges[character_range] / character_count >= 0.15 - ] - ) - - -def unicode_range_languages(primary_range: str) -> list[str]: - """ - Return inferred languages used with a unicode range. - """ - languages: list[str] = [] - - for language, characters in FREQUENCIES.items(): - for character in characters: - if unicode_range(character) == primary_range: - languages.append(language) - break - - return languages - - -@lru_cache() -def encoding_languages(iana_name: str) -> list[str]: - """ - Single-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - unicode_ranges: list[str] = encoding_unicode_range(iana_name) - primary_range: str | None = None - - for specified_range in unicode_ranges: - if "Latin" not in specified_range: - primary_range = specified_range - break - - if primary_range is None: - return ["Latin Based"] - - return unicode_range_languages(primary_range) - - -@lru_cache() -def mb_encoding_languages(iana_name: str) -> list[str]: - """ - Multi-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - if ( - iana_name.startswith("shift_") - or iana_name.startswith("iso2022_jp") - or iana_name.startswith("euc_j") - or iana_name == "cp932" - ): - return ["Japanese"] - if iana_name.startswith("gb") or iana_name in ZH_NAMES: - return ["Chinese"] - if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: - return ["Korean"] - - return [] - - -@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) -def get_target_features(language: str) -> tuple[bool, bool]: - """ - Determine main aspects from a supported language if it contains accents and if is pure Latin. - """ - target_have_accents: bool = False - target_pure_latin: bool = True - - for character in FREQUENCIES[language]: - if not target_have_accents and is_accentuated(character): - target_have_accents = True - if target_pure_latin and is_latin(character) is False: - target_pure_latin = False - - return target_have_accents, target_pure_latin - - -def alphabet_languages( - characters: list[str], ignore_non_latin: bool = False -) -> list[str]: - """ - Return associated languages associated to given characters. - """ - languages: list[tuple[str, float]] = [] - - source_have_accents = any(is_accentuated(character) for character in characters) - - for language, language_characters in FREQUENCIES.items(): - target_have_accents, target_pure_latin = get_target_features(language) - - if ignore_non_latin and target_pure_latin is False: - continue - - if target_have_accents is False and source_have_accents: - continue - - character_count: int = len(language_characters) - - character_match_count: int = len( - [c for c in language_characters if c in characters] - ) - - ratio: float = character_match_count / character_count - - if ratio >= 0.2: - languages.append((language, ratio)) - - languages = sorted(languages, key=lambda x: x[1], reverse=True) - - return [compatible_language[0] for compatible_language in languages] - - -def characters_popularity_compare( - language: str, ordered_characters: list[str] -) -> float: - """ - Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. - The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). - Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) - """ - if language not in FREQUENCIES: - raise ValueError(f"{language} not available") - - character_approved_count: int = 0 - FREQUENCIES_language_set = set(FREQUENCIES[language]) - - ordered_characters_count: int = len(ordered_characters) - target_language_characters_count: int = len(FREQUENCIES[language]) - - large_alphabet: bool = target_language_characters_count > 26 - - for character, character_rank in zip( - ordered_characters, range(0, ordered_characters_count) - ): - if character not in FREQUENCIES_language_set: - continue - - character_rank_in_language: int = FREQUENCIES[language].index(character) - expected_projection_ratio: float = ( - target_language_characters_count / ordered_characters_count - ) - character_rank_projection: int = int(character_rank * expected_projection_ratio) - - if ( - large_alphabet is False - and abs(character_rank_projection - character_rank_in_language) > 4 - ): - continue - - if ( - large_alphabet is True - and abs(character_rank_projection - character_rank_in_language) - < target_language_characters_count / 3 - ): - character_approved_count += 1 - continue - - characters_before_source: list[str] = FREQUENCIES[language][ - 0:character_rank_in_language - ] - characters_after_source: list[str] = FREQUENCIES[language][ - character_rank_in_language: - ] - characters_before: list[str] = ordered_characters[0:character_rank] - characters_after: list[str] = ordered_characters[character_rank:] - - before_match_count: int = len( - set(characters_before) & set(characters_before_source) - ) - - after_match_count: int = len( - set(characters_after) & set(characters_after_source) - ) - - if len(characters_before_source) == 0 and before_match_count <= 4: - character_approved_count += 1 - continue - - if len(characters_after_source) == 0 and after_match_count <= 4: - character_approved_count += 1 - continue - - if ( - before_match_count / len(characters_before_source) >= 0.4 - or after_match_count / len(characters_after_source) >= 0.4 - ): - character_approved_count += 1 - continue - - return character_approved_count / len(ordered_characters) - - -def alpha_unicode_split(decoded_sequence: str) -> list[str]: - """ - Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. - Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; - One containing the latin letters and the other hebrew. - """ - layers: dict[str, str] = {} - - for character in decoded_sequence: - if character.isalpha() is False: - continue - - character_range: str | None = unicode_range(character) - - if character_range is None: - continue - - layer_target_range: str | None = None - - for discovered_range in layers: - if ( - is_suspiciously_successive_range(discovered_range, character_range) - is False - ): - layer_target_range = discovered_range - break - - if layer_target_range is None: - layer_target_range = character_range - - if layer_target_range not in layers: - layers[layer_target_range] = character.lower() - continue - - layers[layer_target_range] += character.lower() - - return list(layers.values()) - - -def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: - """ - This function merge results previously given by the function coherence_ratio. - The return type is the same as coherence_ratio. - """ - per_language_ratios: dict[str, list[float]] = {} - for result in results: - for sub_result in result: - language, ratio = sub_result - if language not in per_language_ratios: - per_language_ratios[language] = [ratio] - continue - per_language_ratios[language].append(ratio) - - merge = [ - ( - language, - round( - sum(per_language_ratios[language]) / len(per_language_ratios[language]), - 4, - ), - ) - for language in per_language_ratios - ] - - return sorted(merge, key=lambda x: x[1], reverse=True) - - -def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: - """ - We shall NOT return "English—" in CoherenceMatches because it is an alternative - of "English". This function only keeps the best match and remove the em-dash in it. - """ - index_results: dict[str, list[float]] = dict() - - for result in results: - language, ratio = result - no_em_name: str = language.replace("—", "") - - if no_em_name not in index_results: - index_results[no_em_name] = [] - - index_results[no_em_name].append(ratio) - - if any(len(index_results[e]) > 1 for e in index_results): - filtered_results: CoherenceMatches = [] - - for language in index_results: - filtered_results.append((language, max(index_results[language]))) - - return filtered_results - - return results - - -@lru_cache(maxsize=2048) -def coherence_ratio( - decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None -) -> CoherenceMatches: - """ - Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. - A layer = Character extraction by alphabets/ranges. - """ - - results: list[tuple[str, float]] = [] - ignore_non_latin: bool = False - - sufficient_match_count: int = 0 - - lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] - if "Latin Based" in lg_inclusion_list: - ignore_non_latin = True - lg_inclusion_list.remove("Latin Based") - - for layer in alpha_unicode_split(decoded_sequence): - sequence_frequencies: TypeCounter[str] = Counter(layer) - most_common = sequence_frequencies.most_common() - - character_count: int = sum(o for c, o in most_common) - - if character_count <= TOO_SMALL_SEQUENCE: - continue - - popular_character_ordered: list[str] = [c for c, o in most_common] - - for language in lg_inclusion_list or alphabet_languages( - popular_character_ordered, ignore_non_latin - ): - ratio: float = characters_popularity_compare( - language, popular_character_ordered - ) - - if ratio < threshold: - continue - elif ratio >= 0.8: - sufficient_match_count += 1 - - results.append((language, round(ratio, 4))) - - if sufficient_match_count >= 3: - break - - return sorted( - filter_alt_coherence_matches(results), key=lambda x: x[1], reverse=True - ) diff --git a/port/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py b/port/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py deleted file mode 100644 index 543a5a4..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import annotations - -from .__main__ import cli_detect, query_yes_no - -__all__ = ( - "cli_detect", - "query_yes_no", -) diff --git a/port/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py b/port/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py deleted file mode 100644 index cb64156..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py +++ /dev/null @@ -1,381 +0,0 @@ -from __future__ import annotations - -import argparse -import sys -import typing -from json import dumps -from os.path import abspath, basename, dirname, join, realpath -from platform import python_version -from unicodedata import unidata_version - -import charset_normalizer.md as md_module -from charset_normalizer import from_fp -from charset_normalizer.models import CliDetectionResult -from charset_normalizer.version import __version__ - - -def query_yes_no(question: str, default: str = "yes") -> bool: - """Ask a yes/no question via input() and return their answer. - - "question" is a string that is presented to the user. - "default" is the presumed answer if the user just hits . - It must be "yes" (the default), "no" or None (meaning - an answer is required of the user). - - The "answer" return value is True for "yes" or False for "no". - - Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input - """ - valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} - if default is None: - prompt = " [y/n] " - elif default == "yes": - prompt = " [Y/n] " - elif default == "no": - prompt = " [y/N] " - else: - raise ValueError("invalid default answer: '%s'" % default) - - while True: - sys.stdout.write(question + prompt) - choice = input().lower() - if default is not None and choice == "": - return valid[default] - elif choice in valid: - return valid[choice] - else: - sys.stdout.write("Please respond with 'yes' or 'no' (or 'y' or 'n').\n") - - -class FileType: - """Factory for creating file object types - - Instances of FileType are typically passed as type= arguments to the - ArgumentParser add_argument() method. - - Keyword Arguments: - - mode -- A string indicating how the file is to be opened. Accepts the - same values as the builtin open() function. - - bufsize -- The file's desired buffer size. Accepts the same values as - the builtin open() function. - - encoding -- The file's encoding. Accepts the same values as the - builtin open() function. - - errors -- A string indicating how encoding and decoding errors are to - be handled. Accepts the same value as the builtin open() function. - - Backported from CPython 3.12 - """ - - def __init__( - self, - mode: str = "r", - bufsize: int = -1, - encoding: str | None = None, - errors: str | None = None, - ): - self._mode = mode - self._bufsize = bufsize - self._encoding = encoding - self._errors = errors - - def __call__(self, string: str) -> typing.IO: # type: ignore[type-arg] - # the special argument "-" means sys.std{in,out} - if string == "-": - if "r" in self._mode: - return sys.stdin.buffer if "b" in self._mode else sys.stdin - elif any(c in self._mode for c in "wax"): - return sys.stdout.buffer if "b" in self._mode else sys.stdout - else: - msg = f'argument "-" with mode {self._mode}' - raise ValueError(msg) - - # all other arguments are used as file names - try: - return open(string, self._mode, self._bufsize, self._encoding, self._errors) - except OSError as e: - message = f"can't open '{string}': {e}" - raise argparse.ArgumentTypeError(message) - - def __repr__(self) -> str: - args = self._mode, self._bufsize - kwargs = [("encoding", self._encoding), ("errors", self._errors)] - args_str = ", ".join( - [repr(arg) for arg in args if arg != -1] - + [f"{kw}={arg!r}" for kw, arg in kwargs if arg is not None] - ) - return f"{type(self).__name__}({args_str})" - - -def cli_detect(argv: list[str] | None = None) -> int: - """ - CLI assistant using ARGV and ArgumentParser - :param argv: - :return: 0 if everything is fine, anything else equal trouble - """ - parser = argparse.ArgumentParser( - description="The Real First Universal Charset Detector. " - "Discover originating encoding used on text file. " - "Normalize text to unicode." - ) - - parser.add_argument( - "files", type=FileType("rb"), nargs="+", help="File(s) to be analysed" - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - dest="verbose", - help="Display complementary information about file if any. " - "Stdout will contain logs about the detection process.", - ) - parser.add_argument( - "-a", - "--with-alternative", - action="store_true", - default=False, - dest="alternatives", - help="Output complementary possibilities if any. Top-level JSON WILL be a list.", - ) - parser.add_argument( - "-n", - "--normalize", - action="store_true", - default=False, - dest="normalize", - help="Permit to normalize input file. If not set, program does not write anything.", - ) - parser.add_argument( - "-m", - "--minimal", - action="store_true", - default=False, - dest="minimal", - help="Only output the charset detected to STDOUT. Disabling JSON output.", - ) - parser.add_argument( - "-r", - "--replace", - action="store_true", - default=False, - dest="replace", - help="Replace file when trying to normalize it instead of creating a new one.", - ) - parser.add_argument( - "-f", - "--force", - action="store_true", - default=False, - dest="force", - help="Replace file without asking if you are sure, use this flag with caution.", - ) - parser.add_argument( - "-i", - "--no-preemptive", - action="store_true", - default=False, - dest="no_preemptive", - help="Disable looking at a charset declaration to hint the detector.", - ) - parser.add_argument( - "-t", - "--threshold", - action="store", - default=0.2, - type=float, - dest="threshold", - help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", - ) - parser.add_argument( - "--version", - action="version", - version="Charset-Normalizer {} - Python {} - Unicode {} - SpeedUp {}".format( - __version__, - python_version(), - unidata_version, - "OFF" if md_module.__file__.lower().endswith(".py") else "ON", - ), - help="Show version information and exit.", - ) - - args = parser.parse_args(argv) - - if args.replace is True and args.normalize is False: - if args.files: - for my_file in args.files: - my_file.close() - print("Use --replace in addition of --normalize only.", file=sys.stderr) - return 1 - - if args.force is True and args.replace is False: - if args.files: - for my_file in args.files: - my_file.close() - print("Use --force in addition of --replace only.", file=sys.stderr) - return 1 - - if args.threshold < 0.0 or args.threshold > 1.0: - if args.files: - for my_file in args.files: - my_file.close() - print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) - return 1 - - x_ = [] - - for my_file in args.files: - matches = from_fp( - my_file, - threshold=args.threshold, - explain=args.verbose, - preemptive_behaviour=args.no_preemptive is False, - ) - - best_guess = matches.best() - - if best_guess is None: - print( - 'Unable to identify originating encoding for "{}". {}'.format( - my_file.name, - ( - "Maybe try increasing maximum amount of chaos." - if args.threshold < 1.0 - else "" - ), - ), - file=sys.stderr, - ) - x_.append( - CliDetectionResult( - abspath(my_file.name), - None, - [], - [], - "Unknown", - [], - False, - 1.0, - 0.0, - None, - True, - ) - ) - else: - x_.append( - CliDetectionResult( - abspath(my_file.name), - best_guess.encoding, - best_guess.encoding_aliases, - [ - cp - for cp in best_guess.could_be_from_charset - if cp != best_guess.encoding - ], - best_guess.language, - best_guess.alphabets, - best_guess.bom, - best_guess.percent_chaos, - best_guess.percent_coherence, - None, - True, - ) - ) - - if len(matches) > 1 and args.alternatives: - for el in matches: - if el != best_guess: - x_.append( - CliDetectionResult( - abspath(my_file.name), - el.encoding, - el.encoding_aliases, - [ - cp - for cp in el.could_be_from_charset - if cp != el.encoding - ], - el.language, - el.alphabets, - el.bom, - el.percent_chaos, - el.percent_coherence, - None, - False, - ) - ) - - if args.normalize is True: - if best_guess.encoding.startswith("utf") is True: - print( - '"{}" file does not need to be normalized, as it already came from unicode.'.format( - my_file.name - ), - file=sys.stderr, - ) - if my_file.closed is False: - my_file.close() - continue - - dir_path = dirname(realpath(my_file.name)) - file_name = basename(realpath(my_file.name)) - - o_: list[str] = file_name.split(".") - - if args.replace is False: - o_.insert(-1, best_guess.encoding) - if my_file.closed is False: - my_file.close() - elif ( - args.force is False - and query_yes_no( - 'Are you sure to normalize "{}" by replacing it ?'.format( - my_file.name - ), - "no", - ) - is False - ): - if my_file.closed is False: - my_file.close() - continue - - try: - x_[0].unicode_path = join(dir_path, ".".join(o_)) - - with open(x_[0].unicode_path, "wb") as fp: - fp.write(best_guess.output()) - except OSError as e: - print(str(e), file=sys.stderr) - if my_file.closed is False: - my_file.close() - return 2 - - if my_file.closed is False: - my_file.close() - - if args.minimal is False: - print( - dumps( - [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, - ensure_ascii=True, - indent=4, - ) - ) - else: - for my_file in args.files: - print( - ", ".join( - [ - el.encoding or "undefined" - for el in x_ - if el.path == abspath(my_file.name) - ] - ) - ) - - return 0 - - -if __name__ == "__main__": - cli_detect() diff --git a/port/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 90ea984f8e0a195d80fdd2d701cffff2b7ddf25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmZvWy-LJD5XX13xes#QOIQdg%yQU?_y{6c2x*4B?4Gx{*^QfxN31L@?R*5W_C>Cg zRD#uY2iINY1hEjD8D{>!VTPI4=`Vg2gi*P diff --git a/port/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc b/port/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 872e54071dfc4012140bb3c3b60741ee8192f56a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15985 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 QZm=IL2unSR*?#o@0ZhCJ<^TWy diff --git a/port/lib/python3.11/site-packages/charset_normalizer/constant.py b/port/lib/python3.11/site-packages/charset_normalizer/constant.py deleted file mode 100644 index cc71a01..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/constant.py +++ /dev/null @@ -1,2015 +0,0 @@ -from __future__ import annotations - -from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE -from encodings.aliases import aliases -from re import IGNORECASE -from re import compile as re_compile - -# Contain for each eligible encoding a list of/item bytes SIG/BOM -ENCODING_MARKS: dict[str, bytes | list[bytes]] = { - "utf_8": BOM_UTF8, - "utf_7": [ - b"\x2b\x2f\x76\x38", - b"\x2b\x2f\x76\x39", - b"\x2b\x2f\x76\x2b", - b"\x2b\x2f\x76\x2f", - b"\x2b\x2f\x76\x38\x2d", - ], - "gb18030": b"\x84\x31\x95\x33", - "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], - "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], -} - -TOO_SMALL_SEQUENCE: int = 32 -TOO_BIG_SEQUENCE: int = int(10e6) - -UTF8_MAXIMAL_ALLOCATION: int = 1_112_064 - -# Up-to-date Unicode ucd/15.0.0 -UNICODE_RANGES_COMBINED: dict[str, range] = { - "Control character": range(32), - "Basic Latin": range(32, 128), - "Latin-1 Supplement": range(128, 256), - "Latin Extended-A": range(256, 384), - "Latin Extended-B": range(384, 592), - "IPA Extensions": range(592, 688), - "Spacing Modifier Letters": range(688, 768), - "Combining Diacritical Marks": range(768, 880), - "Greek and Coptic": range(880, 1024), - "Cyrillic": range(1024, 1280), - "Cyrillic Supplement": range(1280, 1328), - "Armenian": range(1328, 1424), - "Hebrew": range(1424, 1536), - "Arabic": range(1536, 1792), - "Syriac": range(1792, 1872), - "Arabic Supplement": range(1872, 1920), - "Thaana": range(1920, 1984), - "NKo": range(1984, 2048), - "Samaritan": range(2048, 2112), - "Mandaic": range(2112, 2144), - "Syriac Supplement": range(2144, 2160), - "Arabic Extended-B": range(2160, 2208), - "Arabic Extended-A": range(2208, 2304), - "Devanagari": range(2304, 2432), - "Bengali": range(2432, 2560), - "Gurmukhi": range(2560, 2688), - "Gujarati": range(2688, 2816), - "Oriya": range(2816, 2944), - "Tamil": range(2944, 3072), - "Telugu": range(3072, 3200), - "Kannada": range(3200, 3328), - "Malayalam": range(3328, 3456), - "Sinhala": range(3456, 3584), - "Thai": range(3584, 3712), - "Lao": range(3712, 3840), - "Tibetan": range(3840, 4096), - "Myanmar": range(4096, 4256), - "Georgian": range(4256, 4352), - "Hangul Jamo": range(4352, 4608), - "Ethiopic": range(4608, 4992), - "Ethiopic Supplement": range(4992, 5024), - "Cherokee": range(5024, 5120), - "Unified Canadian Aboriginal Syllabics": range(5120, 5760), - "Ogham": range(5760, 5792), - "Runic": range(5792, 5888), - "Tagalog": range(5888, 5920), - "Hanunoo": range(5920, 5952), - "Buhid": range(5952, 5984), - "Tagbanwa": range(5984, 6016), - "Khmer": range(6016, 6144), - "Mongolian": range(6144, 6320), - "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6400), - "Limbu": range(6400, 6480), - "Tai Le": range(6480, 6528), - "New Tai Lue": range(6528, 6624), - "Khmer Symbols": range(6624, 6656), - "Buginese": range(6656, 6688), - "Tai Tham": range(6688, 6832), - "Combining Diacritical Marks Extended": range(6832, 6912), - "Balinese": range(6912, 7040), - "Sundanese": range(7040, 7104), - "Batak": range(7104, 7168), - "Lepcha": range(7168, 7248), - "Ol Chiki": range(7248, 7296), - "Cyrillic Extended-C": range(7296, 7312), - "Georgian Extended": range(7312, 7360), - "Sundanese Supplement": range(7360, 7376), - "Vedic Extensions": range(7376, 7424), - "Phonetic Extensions": range(7424, 7552), - "Phonetic Extensions Supplement": range(7552, 7616), - "Combining Diacritical Marks Supplement": range(7616, 7680), - "Latin Extended Additional": range(7680, 7936), - "Greek Extended": range(7936, 8192), - "General Punctuation": range(8192, 8304), - "Superscripts and Subscripts": range(8304, 8352), - "Currency Symbols": range(8352, 8400), - "Combining Diacritical Marks for Symbols": range(8400, 8448), - "Letterlike Symbols": range(8448, 8528), - "Number Forms": range(8528, 8592), - "Arrows": range(8592, 8704), - "Mathematical Operators": range(8704, 8960), - "Miscellaneous Technical": range(8960, 9216), - "Control Pictures": range(9216, 9280), - "Optical Character Recognition": range(9280, 9312), - "Enclosed Alphanumerics": range(9312, 9472), - "Box Drawing": range(9472, 9600), - "Block Elements": range(9600, 9632), - "Geometric Shapes": range(9632, 9728), - "Miscellaneous Symbols": range(9728, 9984), - "Dingbats": range(9984, 10176), - "Miscellaneous Mathematical Symbols-A": range(10176, 10224), - "Supplemental Arrows-A": range(10224, 10240), - "Braille Patterns": range(10240, 10496), - "Supplemental Arrows-B": range(10496, 10624), - "Miscellaneous Mathematical Symbols-B": range(10624, 10752), - "Supplemental Mathematical Operators": range(10752, 11008), - "Miscellaneous Symbols and Arrows": range(11008, 11264), - "Glagolitic": range(11264, 11360), - "Latin Extended-C": range(11360, 11392), - "Coptic": range(11392, 11520), - "Georgian Supplement": range(11520, 11568), - "Tifinagh": range(11568, 11648), - "Ethiopic Extended": range(11648, 11744), - "Cyrillic Extended-A": range(11744, 11776), - "Supplemental Punctuation": range(11776, 11904), - "CJK Radicals Supplement": range(11904, 12032), - "Kangxi Radicals": range(12032, 12256), - "Ideographic Description Characters": range(12272, 12288), - "CJK Symbols and Punctuation": range(12288, 12352), - "Hiragana": range(12352, 12448), - "Katakana": range(12448, 12544), - "Bopomofo": range(12544, 12592), - "Hangul Compatibility Jamo": range(12592, 12688), - "Kanbun": range(12688, 12704), - "Bopomofo Extended": range(12704, 12736), - "CJK Strokes": range(12736, 12784), - "Katakana Phonetic Extensions": range(12784, 12800), - "Enclosed CJK Letters and Months": range(12800, 13056), - "CJK Compatibility": range(13056, 13312), - "CJK Unified Ideographs Extension A": range(13312, 19904), - "Yijing Hexagram Symbols": range(19904, 19968), - "CJK Unified Ideographs": range(19968, 40960), - "Yi Syllables": range(40960, 42128), - "Yi Radicals": range(42128, 42192), - "Lisu": range(42192, 42240), - "Vai": range(42240, 42560), - "Cyrillic Extended-B": range(42560, 42656), - "Bamum": range(42656, 42752), - "Modifier Tone Letters": range(42752, 42784), - "Latin Extended-D": range(42784, 43008), - "Syloti Nagri": range(43008, 43056), - "Common Indic Number Forms": range(43056, 43072), - "Phags-pa": range(43072, 43136), - "Saurashtra": range(43136, 43232), - "Devanagari Extended": range(43232, 43264), - "Kayah Li": range(43264, 43312), - "Rejang": range(43312, 43360), - "Hangul Jamo Extended-A": range(43360, 43392), - "Javanese": range(43392, 43488), - "Myanmar Extended-B": range(43488, 43520), - "Cham": range(43520, 43616), - "Myanmar Extended-A": range(43616, 43648), - "Tai Viet": range(43648, 43744), - "Meetei Mayek Extensions": range(43744, 43776), - "Ethiopic Extended-A": range(43776, 43824), - "Latin Extended-E": range(43824, 43888), - "Cherokee Supplement": range(43888, 43968), - "Meetei Mayek": range(43968, 44032), - "Hangul Syllables": range(44032, 55216), - "Hangul Jamo Extended-B": range(55216, 55296), - "High Surrogates": range(55296, 56192), - "High Private Use Surrogates": range(56192, 56320), - "Low Surrogates": range(56320, 57344), - "Private Use Area": range(57344, 63744), - "CJK Compatibility Ideographs": range(63744, 64256), - "Alphabetic Presentation Forms": range(64256, 64336), - "Arabic Presentation Forms-A": range(64336, 65024), - "Variation Selectors": range(65024, 65040), - "Vertical Forms": range(65040, 65056), - "Combining Half Marks": range(65056, 65072), - "CJK Compatibility Forms": range(65072, 65104), - "Small Form Variants": range(65104, 65136), - "Arabic Presentation Forms-B": range(65136, 65280), - "Halfwidth and Fullwidth Forms": range(65280, 65520), - "Specials": range(65520, 65536), - "Linear B Syllabary": range(65536, 65664), - "Linear B Ideograms": range(65664, 65792), - "Aegean Numbers": range(65792, 65856), - "Ancient Greek Numbers": range(65856, 65936), - "Ancient Symbols": range(65936, 66000), - "Phaistos Disc": range(66000, 66048), - "Lycian": range(66176, 66208), - "Carian": range(66208, 66272), - "Coptic Epact Numbers": range(66272, 66304), - "Old Italic": range(66304, 66352), - "Gothic": range(66352, 66384), - "Old Permic": range(66384, 66432), - "Ugaritic": range(66432, 66464), - "Old Persian": range(66464, 66528), - "Deseret": range(66560, 66640), - "Shavian": range(66640, 66688), - "Osmanya": range(66688, 66736), - "Osage": range(66736, 66816), - "Elbasan": range(66816, 66864), - "Caucasian Albanian": range(66864, 66928), - "Vithkuqi": range(66928, 67008), - "Linear A": range(67072, 67456), - "Latin Extended-F": range(67456, 67520), - "Cypriot Syllabary": range(67584, 67648), - "Imperial Aramaic": range(67648, 67680), - "Palmyrene": range(67680, 67712), - "Nabataean": range(67712, 67760), - "Hatran": range(67808, 67840), - "Phoenician": range(67840, 67872), - "Lydian": range(67872, 67904), - "Meroitic Hieroglyphs": range(67968, 68000), - "Meroitic Cursive": range(68000, 68096), - "Kharoshthi": range(68096, 68192), - "Old South Arabian": range(68192, 68224), - "Old North Arabian": range(68224, 68256), - "Manichaean": range(68288, 68352), - "Avestan": range(68352, 68416), - "Inscriptional Parthian": range(68416, 68448), - "Inscriptional Pahlavi": range(68448, 68480), - "Psalter Pahlavi": range(68480, 68528), - "Old Turkic": range(68608, 68688), - "Old Hungarian": range(68736, 68864), - "Hanifi Rohingya": range(68864, 68928), - "Rumi Numeral Symbols": range(69216, 69248), - "Yezidi": range(69248, 69312), - "Arabic Extended-C": range(69312, 69376), - "Old Sogdian": range(69376, 69424), - "Sogdian": range(69424, 69488), - "Old Uyghur": range(69488, 69552), - "Chorasmian": range(69552, 69600), - "Elymaic": range(69600, 69632), - "Brahmi": range(69632, 69760), - "Kaithi": range(69760, 69840), - "Sora Sompeng": range(69840, 69888), - "Chakma": range(69888, 69968), - "Mahajani": range(69968, 70016), - "Sharada": range(70016, 70112), - "Sinhala Archaic Numbers": range(70112, 70144), - "Khojki": range(70144, 70224), - "Multani": range(70272, 70320), - "Khudawadi": range(70320, 70400), - "Grantha": range(70400, 70528), - "Newa": range(70656, 70784), - "Tirhuta": range(70784, 70880), - "Siddham": range(71040, 71168), - "Modi": range(71168, 71264), - "Mongolian Supplement": range(71264, 71296), - "Takri": range(71296, 71376), - "Ahom": range(71424, 71504), - "Dogra": range(71680, 71760), - "Warang Citi": range(71840, 71936), - "Dives Akuru": range(71936, 72032), - "Nandinagari": range(72096, 72192), - "Zanabazar Square": range(72192, 72272), - "Soyombo": range(72272, 72368), - "Unified Canadian Aboriginal Syllabics Extended-A": range(72368, 72384), - "Pau Cin Hau": range(72384, 72448), - "Devanagari Extended-A": range(72448, 72544), - "Bhaiksuki": range(72704, 72816), - "Marchen": range(72816, 72896), - "Masaram Gondi": range(72960, 73056), - "Gunjala Gondi": range(73056, 73136), - "Makasar": range(73440, 73472), - "Kawi": range(73472, 73568), - "Lisu Supplement": range(73648, 73664), - "Tamil Supplement": range(73664, 73728), - "Cuneiform": range(73728, 74752), - "Cuneiform Numbers and Punctuation": range(74752, 74880), - "Early Dynastic Cuneiform": range(74880, 75088), - "Cypro-Minoan": range(77712, 77824), - "Egyptian Hieroglyphs": range(77824, 78896), - "Egyptian Hieroglyph Format Controls": range(78896, 78944), - "Anatolian Hieroglyphs": range(82944, 83584), - "Bamum Supplement": range(92160, 92736), - "Mro": range(92736, 92784), - "Tangsa": range(92784, 92880), - "Bassa Vah": range(92880, 92928), - "Pahawh Hmong": range(92928, 93072), - "Medefaidrin": range(93760, 93856), - "Miao": range(93952, 94112), - "Ideographic Symbols and Punctuation": range(94176, 94208), - "Tangut": range(94208, 100352), - "Tangut Components": range(100352, 101120), - "Khitan Small Script": range(101120, 101632), - "Tangut Supplement": range(101632, 101760), - "Kana Extended-B": range(110576, 110592), - "Kana Supplement": range(110592, 110848), - "Kana Extended-A": range(110848, 110896), - "Small Kana Extension": range(110896, 110960), - "Nushu": range(110960, 111360), - "Duployan": range(113664, 113824), - "Shorthand Format Controls": range(113824, 113840), - "Znamenny Musical Notation": range(118528, 118736), - "Byzantine Musical Symbols": range(118784, 119040), - "Musical Symbols": range(119040, 119296), - "Ancient Greek Musical Notation": range(119296, 119376), - "Kaktovik Numerals": range(119488, 119520), - "Mayan Numerals": range(119520, 119552), - "Tai Xuan Jing Symbols": range(119552, 119648), - "Counting Rod Numerals": range(119648, 119680), - "Mathematical Alphanumeric Symbols": range(119808, 120832), - "Sutton SignWriting": range(120832, 121520), - "Latin Extended-G": range(122624, 122880), - "Glagolitic Supplement": range(122880, 122928), - "Cyrillic Extended-D": range(122928, 123024), - "Nyiakeng Puachue Hmong": range(123136, 123216), - "Toto": range(123536, 123584), - "Wancho": range(123584, 123648), - "Nag Mundari": range(124112, 124160), - "Ethiopic Extended-B": range(124896, 124928), - "Mende Kikakui": range(124928, 125152), - "Adlam": range(125184, 125280), - "Indic Siyaq Numbers": range(126064, 126144), - "Ottoman Siyaq Numbers": range(126208, 126288), - "Arabic Mathematical Alphabetic Symbols": range(126464, 126720), - "Mahjong Tiles": range(126976, 127024), - "Domino Tiles": range(127024, 127136), - "Playing Cards": range(127136, 127232), - "Enclosed Alphanumeric Supplement": range(127232, 127488), - "Enclosed Ideographic Supplement": range(127488, 127744), - "Miscellaneous Symbols and Pictographs": range(127744, 128512), - "Emoticons range(Emoji)": range(128512, 128592), - "Ornamental Dingbats": range(128592, 128640), - "Transport and Map Symbols": range(128640, 128768), - "Alchemical Symbols": range(128768, 128896), - "Geometric Shapes Extended": range(128896, 129024), - "Supplemental Arrows-C": range(129024, 129280), - "Supplemental Symbols and Pictographs": range(129280, 129536), - "Chess Symbols": range(129536, 129648), - "Symbols and Pictographs Extended-A": range(129648, 129792), - "Symbols for Legacy Computing": range(129792, 130048), - "CJK Unified Ideographs Extension B": range(131072, 173792), - "CJK Unified Ideographs Extension C": range(173824, 177984), - "CJK Unified Ideographs Extension D": range(177984, 178208), - "CJK Unified Ideographs Extension E": range(178208, 183984), - "CJK Unified Ideographs Extension F": range(183984, 191472), - "CJK Compatibility Ideographs Supplement": range(194560, 195104), - "CJK Unified Ideographs Extension G": range(196608, 201552), - "CJK Unified Ideographs Extension H": range(201552, 205744), - "Tags": range(917504, 917632), - "Variation Selectors Supplement": range(917760, 918000), - "Supplementary Private Use Area-A": range(983040, 1048576), - "Supplementary Private Use Area-B": range(1048576, 1114112), -} - - -UNICODE_SECONDARY_RANGE_KEYWORD: list[str] = [ - "Supplement", - "Extended", - "Extensions", - "Modifier", - "Marks", - "Punctuation", - "Symbols", - "Forms", - "Operators", - "Miscellaneous", - "Drawing", - "Block", - "Shapes", - "Supplemental", - "Tags", -] - -RE_POSSIBLE_ENCODING_INDICATION = re_compile( - r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", - IGNORECASE, -) - -IANA_NO_ALIASES = [ - "cp720", - "cp737", - "cp856", - "cp874", - "cp875", - "cp1006", - "koi8_r", - "koi8_t", - "koi8_u", -] - -IANA_SUPPORTED: list[str] = sorted( - filter( - lambda x: x.endswith("_codec") is False - and x not in {"rot_13", "tactis", "mbcs"}, - list(set(aliases.values())) + IANA_NO_ALIASES, - ) -) - -IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) - -# pre-computed code page that are similar using the function cp_similarity. -IANA_SUPPORTED_SIMILAR: dict[str, list[str]] = { - "cp037": ["cp1026", "cp1140", "cp273", "cp500"], - "cp1026": ["cp037", "cp1140", "cp273", "cp500"], - "cp1125": ["cp866"], - "cp1140": ["cp037", "cp1026", "cp273", "cp500"], - "cp1250": ["iso8859_2"], - "cp1251": ["kz1048", "ptcp154"], - "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1253": ["iso8859_7"], - "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1257": ["iso8859_13"], - "cp273": ["cp037", "cp1026", "cp1140", "cp500"], - "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], - "cp500": ["cp037", "cp1026", "cp1140", "cp273"], - "cp850": ["cp437", "cp857", "cp858", "cp865"], - "cp857": ["cp850", "cp858", "cp865"], - "cp858": ["cp437", "cp850", "cp857", "cp865"], - "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], - "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], - "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], - "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], - "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], - "cp866": ["cp1125"], - "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], - "iso8859_11": ["tis_620"], - "iso8859_13": ["cp1257"], - "iso8859_14": [ - "iso8859_10", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_15": [ - "cp1252", - "cp1254", - "iso8859_10", - "iso8859_14", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_16": [ - "iso8859_14", - "iso8859_15", - "iso8859_2", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], - "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], - "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], - "iso8859_7": ["cp1253"], - "iso8859_9": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "latin_1", - ], - "kz1048": ["cp1251", "ptcp154"], - "latin_1": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "iso8859_9", - ], - "mac_iceland": ["mac_roman", "mac_turkish"], - "mac_roman": ["mac_iceland", "mac_turkish"], - "mac_turkish": ["mac_iceland", "mac_roman"], - "ptcp154": ["cp1251", "kz1048"], - "tis_620": ["iso8859_11"], -} - - -CHARDET_CORRESPONDENCE: dict[str, str] = { - "iso2022_kr": "ISO-2022-KR", - "iso2022_jp": "ISO-2022-JP", - "euc_kr": "EUC-KR", - "tis_620": "TIS-620", - "utf_32": "UTF-32", - "euc_jp": "EUC-JP", - "koi8_r": "KOI8-R", - "iso8859_1": "ISO-8859-1", - "iso8859_2": "ISO-8859-2", - "iso8859_5": "ISO-8859-5", - "iso8859_6": "ISO-8859-6", - "iso8859_7": "ISO-8859-7", - "iso8859_8": "ISO-8859-8", - "utf_16": "UTF-16", - "cp855": "IBM855", - "mac_cyrillic": "MacCyrillic", - "gb2312": "GB2312", - "gb18030": "GB18030", - "cp932": "CP932", - "cp866": "IBM866", - "utf_8": "utf-8", - "utf_8_sig": "UTF-8-SIG", - "shift_jis": "SHIFT_JIS", - "big5": "Big5", - "cp1250": "windows-1250", - "cp1251": "windows-1251", - "cp1252": "Windows-1252", - "cp1253": "windows-1253", - "cp1255": "windows-1255", - "cp1256": "windows-1256", - "cp1254": "Windows-1254", - "cp949": "CP949", -} - - -COMMON_SAFE_ASCII_CHARACTERS: set[str] = { - "<", - ">", - "=", - ":", - "/", - "&", - ";", - "{", - "}", - "[", - "]", - ",", - "|", - '"', - "-", - "(", - ")", -} - -# Sample character sets — replace with full lists if needed -COMMON_CHINESE_CHARACTERS = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" - -COMMON_JAPANESE_CHARACTERS = "日一国年大十二本中長出三時行見月分後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨" - -COMMON_KOREAN_CHARACTERS = "一二三四五六七八九十百千萬上下左右中人女子大小山川日月火水木金土父母天地國名年時文校學生" - -# Combine all into a set -COMMON_CJK_CHARACTERS = set( - "".join( - [ - COMMON_CHINESE_CHARACTERS, - COMMON_JAPANESE_CHARACTERS, - COMMON_KOREAN_CHARACTERS, - ] - ) -) - -KO_NAMES: set[str] = {"johab", "cp949", "euc_kr"} -ZH_NAMES: set[str] = {"big5", "cp950", "big5hkscs", "hz"} - -# Logging LEVEL below DEBUG -TRACE: int = 5 - - -# Language label that contain the em dash "—" -# character are to be considered alternative seq to origin -FREQUENCIES: dict[str, list[str]] = { - "English": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "u", - "m", - "f", - "p", - "g", - "w", - "y", - "b", - "v", - "k", - "x", - "j", - "z", - "q", - ], - "English—": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "m", - "u", - "f", - "p", - "g", - "w", - "b", - "y", - "v", - "k", - "j", - "x", - "z", - "q", - ], - "German": [ - "e", - "n", - "i", - "r", - "s", - "t", - "a", - "d", - "h", - "u", - "l", - "g", - "o", - "c", - "m", - "b", - "f", - "k", - "w", - "z", - "p", - "v", - "ü", - "ä", - "ö", - "j", - ], - "French": [ - "e", - "a", - "s", - "n", - "i", - "t", - "r", - "l", - "u", - "o", - "d", - "c", - "p", - "m", - "é", - "v", - "g", - "f", - "b", - "h", - "q", - "à", - "x", - "è", - "y", - "j", - ], - "Dutch": [ - "e", - "n", - "a", - "i", - "r", - "t", - "o", - "d", - "s", - "l", - "g", - "h", - "v", - "m", - "u", - "k", - "c", - "p", - "b", - "w", - "j", - "z", - "f", - "y", - "x", - "ë", - ], - "Italian": [ - "e", - "i", - "a", - "o", - "n", - "l", - "t", - "r", - "s", - "c", - "d", - "u", - "p", - "m", - "g", - "v", - "f", - "b", - "z", - "h", - "q", - "è", - "à", - "k", - "y", - "ò", - ], - "Polish": [ - "a", - "i", - "o", - "e", - "n", - "r", - "z", - "w", - "s", - "c", - "t", - "k", - "y", - "d", - "p", - "m", - "u", - "l", - "j", - "ł", - "g", - "b", - "h", - "ą", - "ę", - "ó", - ], - "Spanish": [ - "e", - "a", - "o", - "n", - "s", - "r", - "i", - "l", - "d", - "t", - "c", - "u", - "m", - "p", - "b", - "g", - "v", - "f", - "y", - "ó", - "h", - "q", - "í", - "j", - "z", - "á", - ], - "Russian": [ - "о", - "а", - "е", - "и", - "н", - "с", - "т", - "р", - "в", - "л", - "к", - "м", - "д", - "п", - "у", - "г", - "я", - "ы", - "з", - "б", - "й", - "ь", - "ч", - "х", - "ж", - "ц", - ], - # Jap-Kanji - "Japanese": [ - "人", - "一", - "大", - "亅", - "丁", - "丨", - "竹", - "笑", - "口", - "日", - "今", - "二", - "彳", - "行", - "十", - "土", - "丶", - "寸", - "寺", - "時", - "乙", - "丿", - "乂", - "气", - "気", - "冂", - "巾", - "亠", - "市", - "目", - "儿", - "見", - "八", - "小", - "凵", - "県", - "月", - "彐", - "門", - "間", - "木", - "東", - "山", - "出", - "本", - "中", - "刀", - "分", - "耳", - "又", - "取", - "最", - "言", - "田", - "心", - "思", - "刂", - "前", - "京", - "尹", - "事", - "生", - "厶", - "云", - "会", - "未", - "来", - "白", - "冫", - "楽", - "灬", - "馬", - "尸", - "尺", - "駅", - "明", - "耂", - "者", - "了", - "阝", - "都", - "高", - "卜", - "占", - "厂", - "广", - "店", - "子", - "申", - "奄", - "亻", - "俺", - "上", - "方", - "冖", - "学", - "衣", - "艮", - "食", - "自", - ], - # Jap-Katakana - "Japanese—": [ - "ー", - "ン", - "ス", - "・", - "ル", - "ト", - "リ", - "イ", - "ア", - "ラ", - "ッ", - "ク", - "ド", - "シ", - "レ", - "ジ", - "タ", - "フ", - "ロ", - "カ", - "テ", - "マ", - "ィ", - "グ", - "バ", - "ム", - "プ", - "オ", - "コ", - "デ", - "ニ", - "ウ", - "メ", - "サ", - "ビ", - "ナ", - "ブ", - "ャ", - "エ", - "ュ", - "チ", - "キ", - "ズ", - "ダ", - "パ", - "ミ", - "ェ", - "ョ", - "ハ", - "セ", - "ベ", - "ガ", - "モ", - "ツ", - "ネ", - "ボ", - "ソ", - "ノ", - "ァ", - "ヴ", - "ワ", - "ポ", - "ペ", - "ピ", - "ケ", - "ゴ", - "ギ", - "ザ", - "ホ", - "ゲ", - "ォ", - "ヤ", - "ヒ", - "ユ", - "ヨ", - "ヘ", - "ゼ", - "ヌ", - "ゥ", - "ゾ", - "ヶ", - "ヂ", - "ヲ", - "ヅ", - "ヵ", - "ヱ", - "ヰ", - "ヮ", - "ヽ", - "゠", - "ヾ", - "ヷ", - "ヿ", - "ヸ", - "ヹ", - "ヺ", - ], - # Jap-Hiragana - "Japanese——": [ - "の", - "に", - "る", - "た", - "と", - "は", - "し", - "い", - "を", - "で", - "て", - "が", - "な", - "れ", - "か", - "ら", - "さ", - "っ", - "り", - "す", - "あ", - "も", - "こ", - "ま", - "う", - "く", - "よ", - "き", - "ん", - "め", - "お", - "け", - "そ", - "つ", - "だ", - "や", - "え", - "ど", - "わ", - "ち", - "み", - "せ", - "じ", - "ば", - "へ", - "び", - "ず", - "ろ", - "ほ", - "げ", - "む", - "べ", - "ひ", - "ょ", - "ゆ", - "ぶ", - "ご", - "ゃ", - "ね", - "ふ", - "ぐ", - "ぎ", - "ぼ", - "ゅ", - "づ", - "ざ", - "ぞ", - "ぬ", - "ぜ", - "ぱ", - "ぽ", - "ぷ", - "ぴ", - "ぃ", - "ぁ", - "ぇ", - "ぺ", - "ゞ", - "ぢ", - "ぉ", - "ぅ", - "ゐ", - "ゝ", - "ゑ", - "゛", - "゜", - "ゎ", - "ゔ", - "゚", - "ゟ", - "゙", - "ゕ", - "ゖ", - ], - "Portuguese": [ - "a", - "e", - "o", - "s", - "i", - "r", - "d", - "n", - "t", - "m", - "u", - "c", - "l", - "p", - "g", - "v", - "b", - "f", - "h", - "ã", - "q", - "é", - "ç", - "á", - "z", - "í", - ], - "Swedish": [ - "e", - "a", - "n", - "r", - "t", - "s", - "i", - "l", - "d", - "o", - "m", - "k", - "g", - "v", - "h", - "f", - "u", - "p", - "ä", - "c", - "b", - "ö", - "å", - "y", - "j", - "x", - ], - "Chinese": [ - "的", - "一", - "是", - "不", - "了", - "在", - "人", - "有", - "我", - "他", - "这", - "个", - "们", - "中", - "来", - "上", - "大", - "为", - "和", - "国", - "地", - "到", - "以", - "说", - "时", - "要", - "就", - "出", - "会", - "可", - "也", - "你", - "对", - "生", - "能", - "而", - "子", - "那", - "得", - "于", - "着", - "下", - "自", - "之", - "年", - "过", - "发", - "后", - "作", - "里", - "用", - "道", - "行", - "所", - "然", - "家", - "种", - "事", - "成", - "方", - "多", - "经", - "么", - "去", - "法", - "学", - "如", - "都", - "同", - "现", - "当", - "没", - "动", - "面", - "起", - "看", - "定", - "天", - "分", - "还", - "进", - "好", - "小", - "部", - "其", - "些", - "主", - "样", - "理", - "心", - "她", - "本", - "前", - "开", - "但", - "因", - "只", - "从", - "想", - "实", - ], - "Ukrainian": [ - "о", - "а", - "н", - "і", - "и", - "р", - "в", - "т", - "е", - "с", - "к", - "л", - "у", - "д", - "м", - "п", - "з", - "я", - "ь", - "б", - "г", - "й", - "ч", - "х", - "ц", - "ї", - ], - "Norwegian": [ - "e", - "r", - "n", - "t", - "a", - "s", - "i", - "o", - "l", - "d", - "g", - "k", - "m", - "v", - "f", - "p", - "u", - "b", - "h", - "å", - "y", - "j", - "ø", - "c", - "æ", - "w", - ], - "Finnish": [ - "a", - "i", - "n", - "t", - "e", - "s", - "l", - "o", - "u", - "k", - "ä", - "m", - "r", - "v", - "j", - "h", - "p", - "y", - "d", - "ö", - "g", - "c", - "b", - "f", - "w", - "z", - ], - "Vietnamese": [ - "n", - "h", - "t", - "i", - "c", - "g", - "a", - "o", - "u", - "m", - "l", - "r", - "à", - "đ", - "s", - "e", - "v", - "p", - "b", - "y", - "ư", - "d", - "á", - "k", - "ộ", - "ế", - ], - "Czech": [ - "o", - "e", - "a", - "n", - "t", - "s", - "i", - "l", - "v", - "r", - "k", - "d", - "u", - "m", - "p", - "í", - "c", - "h", - "z", - "á", - "y", - "j", - "b", - "ě", - "é", - "ř", - ], - "Hungarian": [ - "e", - "a", - "t", - "l", - "s", - "n", - "k", - "r", - "i", - "o", - "z", - "á", - "é", - "g", - "m", - "b", - "y", - "v", - "d", - "h", - "u", - "p", - "j", - "ö", - "f", - "c", - ], - "Korean": [ - "이", - "다", - "에", - "의", - "는", - "로", - "하", - "을", - "가", - "고", - "지", - "서", - "한", - "은", - "기", - "으", - "년", - "대", - "사", - "시", - "를", - "리", - "도", - "인", - "스", - "일", - ], - "Indonesian": [ - "a", - "n", - "e", - "i", - "r", - "t", - "u", - "s", - "d", - "k", - "m", - "l", - "g", - "p", - "b", - "o", - "h", - "y", - "j", - "c", - "w", - "f", - "v", - "z", - "x", - "q", - ], - "Turkish": [ - "a", - "e", - "i", - "n", - "r", - "l", - "ı", - "k", - "d", - "t", - "s", - "m", - "y", - "u", - "o", - "b", - "ü", - "ş", - "v", - "g", - "z", - "h", - "c", - "p", - "ç", - "ğ", - ], - "Romanian": [ - "e", - "i", - "a", - "r", - "n", - "t", - "u", - "l", - "o", - "c", - "s", - "d", - "p", - "m", - "ă", - "f", - "v", - "î", - "g", - "b", - "ș", - "ț", - "z", - "h", - "â", - "j", - ], - "Farsi": [ - "ا", - "ی", - "ر", - "د", - "ن", - "ه", - "و", - "م", - "ت", - "ب", - "س", - "ل", - "ک", - "ش", - "ز", - "ف", - "گ", - "ع", - "خ", - "ق", - "ج", - "آ", - "پ", - "ح", - "ط", - "ص", - ], - "Arabic": [ - "ا", - "ل", - "ي", - "م", - "و", - "ن", - "ر", - "ت", - "ب", - "ة", - "ع", - "د", - "س", - "ف", - "ه", - "ك", - "ق", - "أ", - "ح", - "ج", - "ش", - "ط", - "ص", - "ى", - "خ", - "إ", - ], - "Danish": [ - "e", - "r", - "n", - "t", - "a", - "i", - "s", - "d", - "l", - "o", - "g", - "m", - "k", - "f", - "v", - "u", - "b", - "h", - "p", - "å", - "y", - "ø", - "æ", - "c", - "j", - "w", - ], - "Serbian": [ - "а", - "и", - "о", - "е", - "н", - "р", - "с", - "у", - "т", - "к", - "ј", - "в", - "д", - "м", - "п", - "л", - "г", - "з", - "б", - "a", - "i", - "e", - "o", - "n", - "ц", - "ш", - ], - "Lithuanian": [ - "i", - "a", - "s", - "o", - "r", - "e", - "t", - "n", - "u", - "k", - "m", - "l", - "p", - "v", - "d", - "j", - "g", - "ė", - "b", - "y", - "ų", - "š", - "ž", - "c", - "ą", - "į", - ], - "Slovene": [ - "e", - "a", - "i", - "o", - "n", - "r", - "s", - "l", - "t", - "j", - "v", - "k", - "d", - "p", - "m", - "u", - "z", - "b", - "g", - "h", - "č", - "c", - "š", - "ž", - "f", - "y", - ], - "Slovak": [ - "o", - "a", - "e", - "n", - "i", - "r", - "v", - "t", - "s", - "l", - "k", - "d", - "m", - "p", - "u", - "c", - "h", - "j", - "b", - "z", - "á", - "y", - "ý", - "í", - "č", - "é", - ], - "Hebrew": [ - "י", - "ו", - "ה", - "ל", - "ר", - "ב", - "ת", - "מ", - "א", - "ש", - "נ", - "ע", - "ם", - "ד", - "ק", - "ח", - "פ", - "ס", - "כ", - "ג", - "ט", - "צ", - "ן", - "ז", - "ך", - ], - "Bulgarian": [ - "а", - "и", - "о", - "е", - "н", - "т", - "р", - "с", - "в", - "л", - "к", - "д", - "п", - "м", - "з", - "г", - "я", - "ъ", - "у", - "б", - "ч", - "ц", - "й", - "ж", - "щ", - "х", - ], - "Croatian": [ - "a", - "i", - "o", - "e", - "n", - "r", - "j", - "s", - "t", - "u", - "k", - "l", - "v", - "d", - "m", - "p", - "g", - "z", - "b", - "c", - "č", - "h", - "š", - "ž", - "ć", - "f", - ], - "Hindi": [ - "क", - "र", - "स", - "न", - "त", - "म", - "ह", - "प", - "य", - "ल", - "व", - "ज", - "द", - "ग", - "ब", - "श", - "ट", - "अ", - "ए", - "थ", - "भ", - "ड", - "च", - "ध", - "ष", - "इ", - ], - "Estonian": [ - "a", - "i", - "e", - "s", - "t", - "l", - "u", - "n", - "o", - "k", - "r", - "d", - "m", - "v", - "g", - "p", - "j", - "h", - "ä", - "b", - "õ", - "ü", - "f", - "c", - "ö", - "y", - ], - "Thai": [ - "า", - "น", - "ร", - "อ", - "ก", - "เ", - "ง", - "ม", - "ย", - "ล", - "ว", - "ด", - "ท", - "ส", - "ต", - "ะ", - "ป", - "บ", - "ค", - "ห", - "แ", - "จ", - "พ", - "ช", - "ข", - "ใ", - ], - "Greek": [ - "α", - "τ", - "ο", - "ι", - "ε", - "ν", - "ρ", - "σ", - "κ", - "η", - "π", - "ς", - "υ", - "μ", - "λ", - "ί", - "ό", - "ά", - "γ", - "έ", - "δ", - "ή", - "ω", - "χ", - "θ", - "ύ", - ], - "Tamil": [ - "க", - "த", - "ப", - "ட", - "ர", - "ம", - "ல", - "ன", - "வ", - "ற", - "ய", - "ள", - "ச", - "ந", - "இ", - "ண", - "அ", - "ஆ", - "ழ", - "ங", - "எ", - "உ", - "ஒ", - "ஸ", - ], - "Kazakh": [ - "а", - "ы", - "е", - "н", - "т", - "р", - "л", - "і", - "д", - "с", - "м", - "қ", - "к", - "о", - "б", - "и", - "у", - "ғ", - "ж", - "ң", - "з", - "ш", - "й", - "п", - "г", - "ө", - ], -} - -LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) diff --git a/port/lib/python3.11/site-packages/charset_normalizer/legacy.py b/port/lib/python3.11/site-packages/charset_normalizer/legacy.py deleted file mode 100644 index 360a310..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/legacy.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any -from warnings import warn - -from .api import from_bytes -from .constant import CHARDET_CORRESPONDENCE, TOO_SMALL_SEQUENCE - -# TODO: remove this check when dropping Python 3.7 support -if TYPE_CHECKING: - from typing_extensions import TypedDict - - class ResultDict(TypedDict): - encoding: str | None - language: str - confidence: float | None - - -def detect( - byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any -) -> ResultDict: - """ - chardet legacy method - Detect the encoding of the given byte string. It should be mostly backward-compatible. - Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) - This function is deprecated and should be used to migrate your project easily, consult the documentation for - further information. Not planned for removal. - - :param byte_str: The byte sequence to examine. - :param should_rename_legacy: Should we rename legacy encodings - to their more modern equivalents? - """ - if len(kwargs): - warn( - f"charset-normalizer disregard arguments '{','.join(list(kwargs.keys()))}' in legacy function detect()" - ) - - if not isinstance(byte_str, (bytearray, bytes)): - raise TypeError( # pragma: nocover - f"Expected object of type bytes or bytearray, got: {type(byte_str)}" - ) - - if isinstance(byte_str, bytearray): - byte_str = bytes(byte_str) - - r = from_bytes(byte_str).best() - - encoding = r.encoding if r is not None else None - language = r.language if r is not None and r.language != "Unknown" else "" - confidence = 1.0 - r.chaos if r is not None else None - - # automatically lower confidence - # on small bytes samples. - # https://github.com/jawah/charset_normalizer/issues/391 - if ( - confidence is not None - and confidence >= 0.9 - and encoding - not in { - "utf_8", - "ascii", - } - and r.bom is False # type: ignore[union-attr] - and len(byte_str) < TOO_SMALL_SEQUENCE - ): - confidence -= 0.2 - - # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process - # but chardet does return 'utf-8-sig' and it is a valid codec name. - if r is not None and encoding == "utf_8" and r.bom: - encoding += "_sig" - - if should_rename_legacy is False and encoding in CHARDET_CORRESPONDENCE: - encoding = CHARDET_CORRESPONDENCE[encoding] - - return { - "encoding": encoding, - "language": language, - "confidence": confidence, - } diff --git a/port/lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so b/port/lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so deleted file mode 100755 index f71a5afcc365d22b97b203a2781f515882b92ed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15912 zcmeHOZ)_aZ5r5|-;QZ;?v?Qc4B3qP5Ng;=ANC>4N=lI_m*@>GthzOze`u3bVbbqY7 zb%@injpPR5mPl44P^tPMt@se3w4!{VQY$2fP(Y}qsZ@!mRaHw>&{-4`N>hbO&2{Fz z`JLCBbKpZ&RbpRsJ2StTc{4lvcJtQz-gmnDdm3Ufg|_G z*kI&Gg~E?T_PZ*6SH%zXyu<@-G~MVNInV9VUzlzXJ5YU2gbiNwJ?4*E#vn{#4+_6; zkRRvySsTi}SK=*J7fbR7mDAPdcPj;3LciYK`;|5M&Y9=`?p`>%^at-gche(YrSI7p z&V}8V(~td3eo5lu8e2i!$IrZ4{rSaLdWo&uI8UpNW}GmbLs0$WMR1O91r3FFh}P@p znMLrs3AgAMZaoCt83sw-Prom!m1^)7qx_!O{8aE+!R0nl%5e_niv_3byCvUol+!mf z;CSg$`e3%~r%OWvow;HmJ>-t$(neQby!lJ<*=n$_0om_}8E%QyA9#mRMYq@pV}m zJ`L(!qgJ?Yai1lneigYdfh)l;hj7Sm?KB~zr+$k;pgk_%c z&P|hSpV;v{0rrVyCz(8O)n84i-N8Jiw!AvqwEh^`s&higKCA7wjxgDL&7Qh!pZ##B zefH`SJNAbC`)mHK)WHV{(?Mf(cC=}I*StTU|FIn#$ybfvwcnoH@itj1d+MUUin@M> zUiT^oD6NV|hc}k}o0PG~DRwPB`_DZ|O37zGd7X|cwU3Kh`S2Q@5#@cro;qir*m{N( z_SBn|Uobp*SInOJwZGdw{(=7hDPPvgOO-!rWnPi?oZoC8|C8Usm&2aA@Yv(kS$pbI zs-6CY#p_z0#OB`3Pcr%DiBp5 zsz6kMr~*+1q6$P6_`Fmgm2peuwC@y(rM&)FSW4tQ$H`BOO{A3mtarVILwZjNbiH=o zKk+I4v6dwdTGS8!ao~kZ)#}%Y{^4@9%6)quRjWTD%HNo|#g6P%vBS-=mQ^=5PSal- zHV}3@{f5bJj1A(=J@K^1hwET3 z>o56TjT`h=u2qXH56j|6ykkwvqDZW1d|LD?*qGX14WSjarmYn!ZmJ^dF~vnwGvm>)Bud@EWnLXM?eLS;k~N8^q|lfz3tHf!6B>I?#GH z$hGALIV0CA5;J@~AoDm{sy^aR_X`@|mkl)fab8f;;sK4%NNnI=5ghkFaNf=lQ)^Uf z(jXYOof^MIVLi3cD)j_09Jls75yc^G-&|Xl4f|(_sh9s^=k-I~Pm{Wv6Ara{{hTJ7 z26{?i48Y}Q#KdUDJ=S>x|CPqSq{8>X>)Ie*+iwATUT+>#t84WE&d(pl@tgtv2{8@4 zt07c>zJL~t0Z!OZ#Ny6*JJwv$u z16$ynG@B~hVlO&A$hCk+Mp!{46HtDVg z*~IZ23I3QDfvyotQ1=vdI0cv08rw?qDzKY;EJ zT`>5g+wX?_@&7I;-Vb2UwGKA^_QE0B0b0TcJpx=P>W8#W63#rX-%-mLf^INk?HG=K ziZnt0Qf7-x9%|!EJJEX_=EnLG(msN zpDN;S*E|gaKhXCGW*+%t-rCx_(B4QU7I>!b(~skeIYYX^pP#S6#OZajTl@e3 diff --git a/port/lib/python3.11/site-packages/charset_normalizer/md.py b/port/lib/python3.11/site-packages/charset_normalizer/md.py deleted file mode 100644 index 12ce024..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/md.py +++ /dev/null @@ -1,635 +0,0 @@ -from __future__ import annotations - -from functools import lru_cache -from logging import getLogger - -from .constant import ( - COMMON_SAFE_ASCII_CHARACTERS, - TRACE, - UNICODE_SECONDARY_RANGE_KEYWORD, -) -from .utils import ( - is_accentuated, - is_arabic, - is_arabic_isolated_form, - is_case_variable, - is_cjk, - is_emoticon, - is_hangul, - is_hiragana, - is_katakana, - is_latin, - is_punctuation, - is_separator, - is_symbol, - is_thai, - is_unprintable, - remove_accent, - unicode_range, - is_cjk_uncommon, -) - - -class MessDetectorPlugin: - """ - Base abstract class used for mess detection plugins. - All detectors MUST extend and implement given methods. - """ - - def eligible(self, character: str) -> bool: - """ - Determine if given character should be fed in. - """ - raise NotImplementedError # pragma: nocover - - def feed(self, character: str) -> None: - """ - The main routine to be executed upon character. - Insert the logic in witch the text would be considered chaotic. - """ - raise NotImplementedError # pragma: nocover - - def reset(self) -> None: # pragma: no cover - """ - Permit to reset the plugin to the initial state. - """ - raise NotImplementedError - - @property - def ratio(self) -> float: - """ - Compute the chaos ratio based on what your feed() has seen. - Must NOT be lower than 0.; No restriction gt 0. - """ - raise NotImplementedError # pragma: nocover - - -class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._punctuation_count: int = 0 - self._symbol_count: int = 0 - self._character_count: int = 0 - - self._last_printable_char: str | None = None - self._frenzy_symbol_in_word: bool = False - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character != self._last_printable_char - and character not in COMMON_SAFE_ASCII_CHARACTERS - ): - if is_punctuation(character): - self._punctuation_count += 1 - elif ( - character.isdigit() is False - and is_symbol(character) - and is_emoticon(character) is False - ): - self._symbol_count += 2 - - self._last_printable_char = character - - def reset(self) -> None: # Abstract - self._punctuation_count = 0 - self._character_count = 0 - self._symbol_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - ratio_of_punctuation: float = ( - self._punctuation_count + self._symbol_count - ) / self._character_count - - return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 - - -class TooManyAccentuatedPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._character_count: int = 0 - self._accentuated_count: int = 0 - - def eligible(self, character: str) -> bool: - return character.isalpha() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_accentuated(character): - self._accentuated_count += 1 - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._accentuated_count = 0 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - ratio_of_accentuation: float = self._accentuated_count / self._character_count - return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 - - -class UnprintablePlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._unprintable_count: int = 0 - self._character_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if is_unprintable(character): - self._unprintable_count += 1 - self._character_count += 1 - - def reset(self) -> None: # Abstract - self._unprintable_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._unprintable_count * 8) / self._character_count - - -class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._successive_count: int = 0 - self._character_count: int = 0 - - self._last_latin_character: str | None = None - - def eligible(self, character: str) -> bool: - return character.isalpha() and is_latin(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - if ( - self._last_latin_character is not None - and is_accentuated(character) - and is_accentuated(self._last_latin_character) - ): - if character.isupper() and self._last_latin_character.isupper(): - self._successive_count += 1 - # Worse if its the same char duplicated with different accent. - if remove_accent(character) == remove_accent(self._last_latin_character): - self._successive_count += 1 - self._last_latin_character = character - - def reset(self) -> None: # Abstract - self._successive_count = 0 - self._character_count = 0 - self._last_latin_character = None - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._successive_count * 2) / self._character_count - - -class SuspiciousRange(MessDetectorPlugin): - def __init__(self) -> None: - self._suspicious_successive_range_count: int = 0 - self._character_count: int = 0 - self._last_printable_seen: str | None = None - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character.isspace() - or is_punctuation(character) - or character in COMMON_SAFE_ASCII_CHARACTERS - ): - self._last_printable_seen = None - return - - if self._last_printable_seen is None: - self._last_printable_seen = character - return - - unicode_range_a: str | None = unicode_range(self._last_printable_seen) - unicode_range_b: str | None = unicode_range(character) - - if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): - self._suspicious_successive_range_count += 1 - - self._last_printable_seen = character - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._suspicious_successive_range_count = 0 - self._last_printable_seen = None - - @property - def ratio(self) -> float: - if self._character_count <= 13: - return 0.0 - - ratio_of_suspicious_range_usage: float = ( - self._suspicious_successive_range_count * 2 - ) / self._character_count - - return ratio_of_suspicious_range_usage - - -class SuperWeirdWordPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._word_count: int = 0 - self._bad_word_count: int = 0 - self._foreign_long_count: int = 0 - - self._is_current_word_bad: bool = False - self._foreign_long_watch: bool = False - - self._character_count: int = 0 - self._bad_character_count: int = 0 - - self._buffer: str = "" - self._buffer_accent_count: int = 0 - self._buffer_glyph_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if character.isalpha(): - self._buffer += character - if is_accentuated(character): - self._buffer_accent_count += 1 - if ( - self._foreign_long_watch is False - and (is_latin(character) is False or is_accentuated(character)) - and is_cjk(character) is False - and is_hangul(character) is False - and is_katakana(character) is False - and is_hiragana(character) is False - and is_thai(character) is False - ): - self._foreign_long_watch = True - if ( - is_cjk(character) - or is_hangul(character) - or is_katakana(character) - or is_hiragana(character) - or is_thai(character) - ): - self._buffer_glyph_count += 1 - return - if not self._buffer: - return - if ( - character.isspace() or is_punctuation(character) or is_separator(character) - ) and self._buffer: - self._word_count += 1 - buffer_length: int = len(self._buffer) - - self._character_count += buffer_length - - if buffer_length >= 4: - if self._buffer_accent_count / buffer_length >= 0.5: - self._is_current_word_bad = True - # Word/Buffer ending with an upper case accentuated letter are so rare, - # that we will consider them all as suspicious. Same weight as foreign_long suspicious. - elif ( - is_accentuated(self._buffer[-1]) - and self._buffer[-1].isupper() - and all(_.isupper() for _ in self._buffer) is False - ): - self._foreign_long_count += 1 - self._is_current_word_bad = True - elif self._buffer_glyph_count == 1: - self._is_current_word_bad = True - self._foreign_long_count += 1 - if buffer_length >= 24 and self._foreign_long_watch: - camel_case_dst = [ - i - for c, i in zip(self._buffer, range(0, buffer_length)) - if c.isupper() - ] - probable_camel_cased: bool = False - - if camel_case_dst and (len(camel_case_dst) / buffer_length <= 0.3): - probable_camel_cased = True - - if not probable_camel_cased: - self._foreign_long_count += 1 - self._is_current_word_bad = True - - if self._is_current_word_bad: - self._bad_word_count += 1 - self._bad_character_count += len(self._buffer) - self._is_current_word_bad = False - - self._foreign_long_watch = False - self._buffer = "" - self._buffer_accent_count = 0 - self._buffer_glyph_count = 0 - elif ( - character not in {"<", ">", "-", "=", "~", "|", "_"} - and character.isdigit() is False - and is_symbol(character) - ): - self._is_current_word_bad = True - self._buffer += character - - def reset(self) -> None: # Abstract - self._buffer = "" - self._is_current_word_bad = False - self._foreign_long_watch = False - self._bad_word_count = 0 - self._word_count = 0 - self._character_count = 0 - self._bad_character_count = 0 - self._foreign_long_count = 0 - - @property - def ratio(self) -> float: - if self._word_count <= 10 and self._foreign_long_count == 0: - return 0.0 - - return self._bad_character_count / self._character_count - - -class CjkUncommonPlugin(MessDetectorPlugin): - """ - Detect messy CJK text that probably means nothing. - """ - - def __init__(self) -> None: - self._character_count: int = 0 - self._uncommon_count: int = 0 - - def eligible(self, character: str) -> bool: - return is_cjk(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_cjk_uncommon(character): - self._uncommon_count += 1 - return - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._uncommon_count = 0 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - uncommon_form_usage: float = self._uncommon_count / self._character_count - - # we can be pretty sure it's garbage when uncommon characters are widely - # used. otherwise it could just be traditional chinese for example. - return uncommon_form_usage / 10 if uncommon_form_usage > 0.5 else 0.0 - - -class ArchaicUpperLowerPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._buf: bool = False - - self._character_count_since_last_sep: int = 0 - - self._successive_upper_lower_count: int = 0 - self._successive_upper_lower_count_final: int = 0 - - self._character_count: int = 0 - - self._last_alpha_seen: str | None = None - self._current_ascii_only: bool = True - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - is_concerned = character.isalpha() and is_case_variable(character) - chunk_sep = is_concerned is False - - if chunk_sep and self._character_count_since_last_sep > 0: - if ( - self._character_count_since_last_sep <= 64 - and character.isdigit() is False - and self._current_ascii_only is False - ): - self._successive_upper_lower_count_final += ( - self._successive_upper_lower_count - ) - - self._successive_upper_lower_count = 0 - self._character_count_since_last_sep = 0 - self._last_alpha_seen = None - self._buf = False - self._character_count += 1 - self._current_ascii_only = True - - return - - if self._current_ascii_only is True and character.isascii() is False: - self._current_ascii_only = False - - if self._last_alpha_seen is not None: - if (character.isupper() and self._last_alpha_seen.islower()) or ( - character.islower() and self._last_alpha_seen.isupper() - ): - if self._buf is True: - self._successive_upper_lower_count += 2 - self._buf = False - else: - self._buf = True - else: - self._buf = False - - self._character_count += 1 - self._character_count_since_last_sep += 1 - self._last_alpha_seen = character - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._character_count_since_last_sep = 0 - self._successive_upper_lower_count = 0 - self._successive_upper_lower_count_final = 0 - self._last_alpha_seen = None - self._buf = False - self._current_ascii_only = True - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return self._successive_upper_lower_count_final / self._character_count - - -class ArabicIsolatedFormPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._character_count: int = 0 - self._isolated_form_count: int = 0 - - def reset(self) -> None: # Abstract - self._character_count = 0 - self._isolated_form_count = 0 - - def eligible(self, character: str) -> bool: - return is_arabic(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_arabic_isolated_form(character): - self._isolated_form_count += 1 - - @property - def ratio(self) -> float: - if self._character_count < 8: - return 0.0 - - isolated_form_usage: float = self._isolated_form_count / self._character_count - - return isolated_form_usage - - -@lru_cache(maxsize=1024) -def is_suspiciously_successive_range( - unicode_range_a: str | None, unicode_range_b: str | None -) -> bool: - """ - Determine if two Unicode range seen next to each other can be considered as suspicious. - """ - if unicode_range_a is None or unicode_range_b is None: - return True - - if unicode_range_a == unicode_range_b: - return False - - if "Latin" in unicode_range_a and "Latin" in unicode_range_b: - return False - - if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: - return False - - # Latin characters can be accompanied with a combining diacritical mark - # eg. Vietnamese. - if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( - "Combining" in unicode_range_a or "Combining" in unicode_range_b - ): - return False - - keywords_range_a, keywords_range_b = ( - unicode_range_a.split(" "), - unicode_range_b.split(" "), - ) - - for el in keywords_range_a: - if el in UNICODE_SECONDARY_RANGE_KEYWORD: - continue - if el in keywords_range_b: - return False - - # Japanese Exception - range_a_jp_chars, range_b_jp_chars = ( - unicode_range_a - in ( - "Hiragana", - "Katakana", - ), - unicode_range_b in ("Hiragana", "Katakana"), - ) - if (range_a_jp_chars or range_b_jp_chars) and ( - "CJK" in unicode_range_a or "CJK" in unicode_range_b - ): - return False - if range_a_jp_chars and range_b_jp_chars: - return False - - if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: - if "CJK" in unicode_range_a or "CJK" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - # Chinese/Japanese use dedicated range for punctuation and/or separators. - if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( - unicode_range_a in ["Katakana", "Hiragana"] - and unicode_range_b in ["Katakana", "Hiragana"] - ): - if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: - return False - if "Forms" in unicode_range_a or "Forms" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - return True - - -@lru_cache(maxsize=2048) -def mess_ratio( - decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False -) -> float: - """ - Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. - """ - - detectors: list[MessDetectorPlugin] = [ - md_class() for md_class in MessDetectorPlugin.__subclasses__() - ] - - length: int = len(decoded_sequence) + 1 - - mean_mess_ratio: float = 0.0 - - if length < 512: - intermediary_mean_mess_ratio_calc: int = 32 - elif length <= 1024: - intermediary_mean_mess_ratio_calc = 64 - else: - intermediary_mean_mess_ratio_calc = 128 - - for character, index in zip(decoded_sequence + "\n", range(length)): - for detector in detectors: - if detector.eligible(character): - detector.feed(character) - - if ( - index > 0 and index % intermediary_mean_mess_ratio_calc == 0 - ) or index == length - 1: - mean_mess_ratio = sum(dt.ratio for dt in detectors) - - if mean_mess_ratio >= maximum_threshold: - break - - if debug: - logger = getLogger("charset_normalizer") - - logger.log( - TRACE, - "Mess-detector extended-analysis start. " - f"intermediary_mean_mess_ratio_calc={intermediary_mean_mess_ratio_calc} mean_mess_ratio={mean_mess_ratio} " - f"maximum_threshold={maximum_threshold}", - ) - - if len(decoded_sequence) > 16: - logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") - logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") - - for dt in detectors: - logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") - - return round(mean_mess_ratio, 3) diff --git a/port/lib/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so b/port/lib/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so deleted file mode 100755 index 7ce82fbb96a7f3b07230265061574cece6a70273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282232 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

?4fx_b8%_zsc-ljPv&^ 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 Ov2gm@0>Z*$@BaV>7|TTf diff --git a/port/lib/python3.11/site-packages/charset_normalizer/models.py b/port/lib/python3.11/site-packages/charset_normalizer/models.py deleted file mode 100644 index 1042758..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/models.py +++ /dev/null @@ -1,360 +0,0 @@ -from __future__ import annotations - -from encodings.aliases import aliases -from hashlib import sha256 -from json import dumps -from re import sub -from typing import Any, Iterator, List, Tuple - -from .constant import RE_POSSIBLE_ENCODING_INDICATION, TOO_BIG_SEQUENCE -from .utils import iana_name, is_multi_byte_encoding, unicode_range - - -class CharsetMatch: - def __init__( - self, - payload: bytes, - guessed_encoding: str, - mean_mess_ratio: float, - has_sig_or_bom: bool, - languages: CoherenceMatches, - decoded_payload: str | None = None, - preemptive_declaration: str | None = None, - ): - self._payload: bytes = payload - - self._encoding: str = guessed_encoding - self._mean_mess_ratio: float = mean_mess_ratio - self._languages: CoherenceMatches = languages - self._has_sig_or_bom: bool = has_sig_or_bom - self._unicode_ranges: list[str] | None = None - - self._leaves: list[CharsetMatch] = [] - self._mean_coherence_ratio: float = 0.0 - - self._output_payload: bytes | None = None - self._output_encoding: str | None = None - - self._string: str | None = decoded_payload - - self._preemptive_declaration: str | None = preemptive_declaration - - def __eq__(self, other: object) -> bool: - if not isinstance(other, CharsetMatch): - if isinstance(other, str): - return iana_name(other) == self.encoding - return False - return self.encoding == other.encoding and self.fingerprint == other.fingerprint - - def __lt__(self, other: object) -> bool: - """ - Implemented to make sorted available upon CharsetMatches items. - """ - if not isinstance(other, CharsetMatch): - raise ValueError - - chaos_difference: float = abs(self.chaos - other.chaos) - coherence_difference: float = abs(self.coherence - other.coherence) - - # Below 1% difference --> Use Coherence - if chaos_difference < 0.01 and coherence_difference > 0.02: - return self.coherence > other.coherence - elif chaos_difference < 0.01 and coherence_difference <= 0.02: - # When having a difficult decision, use the result that decoded as many multi-byte as possible. - # preserve RAM usage! - if len(self._payload) >= TOO_BIG_SEQUENCE: - return self.chaos < other.chaos - return self.multi_byte_usage > other.multi_byte_usage - - return self.chaos < other.chaos - - @property - def multi_byte_usage(self) -> float: - return 1.0 - (len(str(self)) / len(self.raw)) - - def __str__(self) -> str: - # Lazy Str Loading - if self._string is None: - self._string = str(self._payload, self._encoding, "strict") - return self._string - - def __repr__(self) -> str: - return f"" - - def add_submatch(self, other: CharsetMatch) -> None: - if not isinstance(other, CharsetMatch) or other == self: - raise ValueError( - "Unable to add instance <{}> as a submatch of a CharsetMatch".format( - other.__class__ - ) - ) - - other._string = None # Unload RAM usage; dirty trick. - self._leaves.append(other) - - @property - def encoding(self) -> str: - return self._encoding - - @property - def encoding_aliases(self) -> list[str]: - """ - Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. - """ - also_known_as: list[str] = [] - for u, p in aliases.items(): - if self.encoding == u: - also_known_as.append(p) - elif self.encoding == p: - also_known_as.append(u) - return also_known_as - - @property - def bom(self) -> bool: - return self._has_sig_or_bom - - @property - def byte_order_mark(self) -> bool: - return self._has_sig_or_bom - - @property - def languages(self) -> list[str]: - """ - Return the complete list of possible languages found in decoded sequence. - Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. - """ - return [e[0] for e in self._languages] - - @property - def language(self) -> str: - """ - Most probable language found in decoded sequence. If none were detected or inferred, the property will return - "Unknown". - """ - if not self._languages: - # Trying to infer the language based on the given encoding - # Its either English or we should not pronounce ourselves in certain cases. - if "ascii" in self.could_be_from_charset: - return "English" - - # doing it there to avoid circular import - from charset_normalizer.cd import encoding_languages, mb_encoding_languages - - languages = ( - mb_encoding_languages(self.encoding) - if is_multi_byte_encoding(self.encoding) - else encoding_languages(self.encoding) - ) - - if len(languages) == 0 or "Latin Based" in languages: - return "Unknown" - - return languages[0] - - return self._languages[0][0] - - @property - def chaos(self) -> float: - return self._mean_mess_ratio - - @property - def coherence(self) -> float: - if not self._languages: - return 0.0 - return self._languages[0][1] - - @property - def percent_chaos(self) -> float: - return round(self.chaos * 100, ndigits=3) - - @property - def percent_coherence(self) -> float: - return round(self.coherence * 100, ndigits=3) - - @property - def raw(self) -> bytes: - """ - Original untouched bytes. - """ - return self._payload - - @property - def submatch(self) -> list[CharsetMatch]: - return self._leaves - - @property - def has_submatch(self) -> bool: - return len(self._leaves) > 0 - - @property - def alphabets(self) -> list[str]: - if self._unicode_ranges is not None: - return self._unicode_ranges - # list detected ranges - detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] - # filter and sort - self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) - return self._unicode_ranges - - @property - def could_be_from_charset(self) -> list[str]: - """ - The complete list of encoding that output the exact SAME str result and therefore could be the originating - encoding. - This list does include the encoding available in property 'encoding'. - """ - return [self._encoding] + [m.encoding for m in self._leaves] - - def output(self, encoding: str = "utf_8") -> bytes: - """ - Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. - Any errors will be simply ignored by the encoder NOT replaced. - """ - if self._output_encoding is None or self._output_encoding != encoding: - self._output_encoding = encoding - decoded_string = str(self) - if ( - self._preemptive_declaration is not None - and self._preemptive_declaration.lower() - not in ["utf-8", "utf8", "utf_8"] - ): - patched_header = sub( - RE_POSSIBLE_ENCODING_INDICATION, - lambda m: m.string[m.span()[0] : m.span()[1]].replace( - m.groups()[0], - iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] - ), - decoded_string[:8192], - count=1, - ) - - decoded_string = patched_header + decoded_string[8192:] - - self._output_payload = decoded_string.encode(encoding, "replace") - - return self._output_payload # type: ignore - - @property - def fingerprint(self) -> str: - """ - Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. - """ - return sha256(self.output()).hexdigest() - - -class CharsetMatches: - """ - Container with every CharsetMatch items ordered by default from most probable to the less one. - Act like a list(iterable) but does not implements all related methods. - """ - - def __init__(self, results: list[CharsetMatch] | None = None): - self._results: list[CharsetMatch] = sorted(results) if results else [] - - def __iter__(self) -> Iterator[CharsetMatch]: - yield from self._results - - def __getitem__(self, item: int | str) -> CharsetMatch: - """ - Retrieve a single item either by its position or encoding name (alias may be used here). - Raise KeyError upon invalid index or encoding not present in results. - """ - if isinstance(item, int): - return self._results[item] - if isinstance(item, str): - item = iana_name(item, False) - for result in self._results: - if item in result.could_be_from_charset: - return result - raise KeyError - - def __len__(self) -> int: - return len(self._results) - - def __bool__(self) -> bool: - return len(self._results) > 0 - - def append(self, item: CharsetMatch) -> None: - """ - Insert a single match. Will be inserted accordingly to preserve sort. - Can be inserted as a submatch. - """ - if not isinstance(item, CharsetMatch): - raise ValueError( - "Cannot append instance '{}' to CharsetMatches".format( - str(item.__class__) - ) - ) - # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) - if len(item.raw) < TOO_BIG_SEQUENCE: - for match in self._results: - if match.fingerprint == item.fingerprint and match.chaos == item.chaos: - match.add_submatch(item) - return - self._results.append(item) - self._results = sorted(self._results) - - def best(self) -> CharsetMatch | None: - """ - Simply return the first match. Strict equivalent to matches[0]. - """ - if not self._results: - return None - return self._results[0] - - def first(self) -> CharsetMatch | None: - """ - Redundant method, call the method best(). Kept for BC reasons. - """ - return self.best() - - -CoherenceMatch = Tuple[str, float] -CoherenceMatches = List[CoherenceMatch] - - -class CliDetectionResult: - def __init__( - self, - path: str, - encoding: str | None, - encoding_aliases: list[str], - alternative_encodings: list[str], - language: str, - alphabets: list[str], - has_sig_or_bom: bool, - chaos: float, - coherence: float, - unicode_path: str | None, - is_preferred: bool, - ): - self.path: str = path - self.unicode_path: str | None = unicode_path - self.encoding: str | None = encoding - self.encoding_aliases: list[str] = encoding_aliases - self.alternative_encodings: list[str] = alternative_encodings - self.language: str = language - self.alphabets: list[str] = alphabets - self.has_sig_or_bom: bool = has_sig_or_bom - self.chaos: float = chaos - self.coherence: float = coherence - self.is_preferred: bool = is_preferred - - @property - def __dict__(self) -> dict[str, Any]: # type: ignore - return { - "path": self.path, - "encoding": self.encoding, - "encoding_aliases": self.encoding_aliases, - "alternative_encodings": self.alternative_encodings, - "language": self.language, - "alphabets": self.alphabets, - "has_sig_or_bom": self.has_sig_or_bom, - "chaos": self.chaos, - "coherence": self.coherence, - "unicode_path": self.unicode_path, - "is_preferred": self.is_preferred, - } - - def to_json(self) -> str: - return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/port/lib/python3.11/site-packages/charset_normalizer/py.typed b/port/lib/python3.11/site-packages/charset_normalizer/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/charset_normalizer/utils.py b/port/lib/python3.11/site-packages/charset_normalizer/utils.py deleted file mode 100644 index 6bf0384..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/utils.py +++ /dev/null @@ -1,414 +0,0 @@ -from __future__ import annotations - -import importlib -import logging -import unicodedata -from codecs import IncrementalDecoder -from encodings.aliases import aliases -from functools import lru_cache -from re import findall -from typing import Generator - -from _multibytecodec import ( # type: ignore[import-not-found,import] - MultibyteIncrementalDecoder, -) - -from .constant import ( - ENCODING_MARKS, - IANA_SUPPORTED_SIMILAR, - RE_POSSIBLE_ENCODING_INDICATION, - UNICODE_RANGES_COMBINED, - UNICODE_SECONDARY_RANGE_KEYWORD, - UTF8_MAXIMAL_ALLOCATION, - COMMON_CJK_CHARACTERS, -) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_accentuated(character: str) -> bool: - try: - description: str = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - return ( - "WITH GRAVE" in description - or "WITH ACUTE" in description - or "WITH CEDILLA" in description - or "WITH DIAERESIS" in description - or "WITH CIRCUMFLEX" in description - or "WITH TILDE" in description - or "WITH MACRON" in description - or "WITH RING ABOVE" in description - ) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def remove_accent(character: str) -> str: - decomposed: str = unicodedata.decomposition(character) - if not decomposed: - return character - - codes: list[str] = decomposed.split(" ") - - return chr(int(codes[0], 16)) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def unicode_range(character: str) -> str | None: - """ - Retrieve the Unicode range official name from a single character. - """ - character_ord: int = ord(character) - - for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): - if character_ord in ord_range: - return range_name - - return None - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_latin(character: str) -> bool: - try: - description: str = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - return "LATIN" in description - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_punctuation(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "P" in character_category: - return True - - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Punctuation" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_symbol(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "S" in character_category or "N" in character_category: - return True - - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Forms" in character_range and character_category != "Lo" - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_emoticon(character: str) -> bool: - character_range: str | None = unicode_range(character) - - if character_range is None: - return False - - return "Emoticons" in character_range or "Pictographs" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_separator(character: str) -> bool: - if character.isspace() or character in {"|", "+", "<", ">"}: - return True - - character_category: str = unicodedata.category(character) - - return "Z" in character_category or character_category in {"Po", "Pd", "Pc"} - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_case_variable(character: str) -> bool: - return character.islower() != character.isupper() - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_cjk(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "CJK" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hiragana(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "HIRAGANA" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_katakana(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "KATAKANA" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hangul(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "HANGUL" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_thai(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "THAI" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_arabic(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "ARABIC" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_arabic_isolated_form(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: # Defensive: unicode database outdated? - return False - - return "ARABIC" in character_name and "ISOLATED FORM" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_cjk_uncommon(character: str) -> bool: - return character not in COMMON_CJK_CHARACTERS - - -@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) -def is_unicode_range_secondary(range_name: str) -> bool: - return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_unprintable(character: str) -> bool: - return ( - character.isspace() is False # includes \n \t \r \v - and character.isprintable() is False - and character != "\x1a" # Why? Its the ASCII substitute character. - and character != "\ufeff" # bug discovered in Python, - # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. - ) - - -def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> str | None: - """ - Extract using ASCII-only decoder any specified encoding in the first n-bytes. - """ - if not isinstance(sequence, bytes): - raise TypeError - - seq_len: int = len(sequence) - - results: list[str] = findall( - RE_POSSIBLE_ENCODING_INDICATION, - sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), - ) - - if len(results) == 0: - return None - - for specified_encoding in results: - specified_encoding = specified_encoding.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if encoding_alias == specified_encoding: - return encoding_iana - if encoding_iana == specified_encoding: - return encoding_iana - - return None - - -@lru_cache(maxsize=128) -def is_multi_byte_encoding(name: str) -> bool: - """ - Verify is a specific encoding is a multi byte one based on it IANA name - """ - return name in { - "utf_8", - "utf_8_sig", - "utf_16", - "utf_16_be", - "utf_16_le", - "utf_32", - "utf_32_le", - "utf_32_be", - "utf_7", - } or issubclass( - importlib.import_module(f"encodings.{name}").IncrementalDecoder, - MultibyteIncrementalDecoder, - ) - - -def identify_sig_or_bom(sequence: bytes) -> tuple[str | None, bytes]: - """ - Identify and extract SIG/BOM in given sequence. - """ - - for iana_encoding in ENCODING_MARKS: - marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] - - if isinstance(marks, bytes): - marks = [marks] - - for mark in marks: - if sequence.startswith(mark): - return iana_encoding, mark - - return None, b"" - - -def should_strip_sig_or_bom(iana_encoding: str) -> bool: - return iana_encoding not in {"utf_16", "utf_32"} - - -def iana_name(cp_name: str, strict: bool = True) -> str: - """Returns the Python normalized encoding name (Not the IANA official name).""" - cp_name = cp_name.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if cp_name in [encoding_alias, encoding_iana]: - return encoding_iana - - if strict: - raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") - - return cp_name - - -def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: - if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): - return 0.0 - - decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder - decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder - - id_a: IncrementalDecoder = decoder_a(errors="ignore") - id_b: IncrementalDecoder = decoder_b(errors="ignore") - - character_match_count: int = 0 - - for i in range(255): - to_be_decoded: bytes = bytes([i]) - if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): - character_match_count += 1 - - return character_match_count / 254 - - -def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: - """ - Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using - the function cp_similarity. - """ - return ( - iana_name_a in IANA_SUPPORTED_SIMILAR - and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] - ) - - -def set_logging_handler( - name: str = "charset_normalizer", - level: int = logging.INFO, - format_string: str = "%(asctime)s | %(levelname)s | %(message)s", -) -> None: - logger = logging.getLogger(name) - logger.setLevel(level) - - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter(format_string)) - logger.addHandler(handler) - - -def cut_sequence_chunks( - sequences: bytes, - encoding_iana: str, - offsets: range, - chunk_size: int, - bom_or_sig_available: bool, - strip_sig_or_bom: bool, - sig_payload: bytes, - is_multi_byte_decoder: bool, - decoded_payload: str | None = None, -) -> Generator[str, None, None]: - if decoded_payload and is_multi_byte_decoder is False: - for i in offsets: - chunk = decoded_payload[i : i + chunk_size] - if not chunk: - break - yield chunk - else: - for i in offsets: - chunk_end = i + chunk_size - if chunk_end > len(sequences) + 8: - continue - - cut_sequence = sequences[i : i + chunk_size] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode( - encoding_iana, - errors="ignore" if is_multi_byte_decoder else "strict", - ) - - # multi-byte bad cutting detector and adjustment - # not the cleanest way to perform that fix but clever enough for now. - if is_multi_byte_decoder and i > 0: - chunk_partial_size_chk: int = min(chunk_size, 16) - - if ( - decoded_payload - and chunk[:chunk_partial_size_chk] not in decoded_payload - ): - for j in range(i, i - 4, -1): - cut_sequence = sequences[j:chunk_end] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode(encoding_iana, errors="ignore") - - if chunk[:chunk_partial_size_chk] in decoded_payload: - break - - yield chunk diff --git a/port/lib/python3.11/site-packages/charset_normalizer/version.py b/port/lib/python3.11/site-packages/charset_normalizer/version.py deleted file mode 100644 index c843e53..0000000 --- a/port/lib/python3.11/site-packages/charset_normalizer/version.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Expose version -""" - -from __future__ import annotations - -__version__ = "3.4.4" -VERSION = __version__.split(".") diff --git a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/INSTALLER b/port/lib/python3.11/site-packages/click-8.1.8.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/LICENSE.txt b/port/lib/python3.11/site-packages/click-8.1.8.dist-info/LICENSE.txt deleted file mode 100644 index d12a849..0000000 --- a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2014 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/METADATA b/port/lib/python3.11/site-packages/click-8.1.8.dist-info/METADATA deleted file mode 100644 index 366d1a7..0000000 --- a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/METADATA +++ /dev/null @@ -1,74 +0,0 @@ -Metadata-Version: 2.3 -Name: click -Version: 8.1.8 -Summary: Composable command line interface toolkit -Maintainer-email: Pallets -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Requires-Dist: colorama; platform_system == 'Windows' -Requires-Dist: importlib-metadata; python_version < '3.8' -Project-URL: Changes, https://click.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://click.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/click/ - -# $ click_ - -Click is a Python package for creating beautiful command line interfaces -in a composable way with as little code as necessary. It's the "Command -Line Interface Creation Kit". It's highly configurable but comes with -sensible defaults out of the box. - -It aims to make the process of writing command line tools quick and fun -while also preventing any frustration caused by the inability to -implement an intended CLI API. - -Click in three points: - -- Arbitrary nesting of commands -- Automatic help page generation -- Supports lazy loading of subcommands at runtime - - -## A Simple Example - -```python -import click - -@click.command() -@click.option("--count", default=1, help="Number of greetings.") -@click.option("--name", prompt="Your name", help="The person to greet.") -def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" - for _ in range(count): - click.echo(f"Hello, {name}!") - -if __name__ == '__main__': - hello() -``` - -``` -$ python hello.py --count=3 -Your name: Click -Hello, Click! -Hello, Click! -Hello, Click! -``` - - -## Donate - -The Pallets organization develops and supports Click and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - diff --git a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD b/port/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD deleted file mode 100644 index e38eddf..0000000 --- a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/RECORD +++ /dev/null @@ -1,38 +0,0 @@ -click-8.1.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.1.8.dist-info/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click-8.1.8.dist-info/METADATA,sha256=WJtQ6uGS2ybLfvUE4vC0XIhIBr4yFGwjrMBR2fiCQ-Q,2263 -click-8.1.8.dist-info/RECORD,, -click-8.1.8.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 -click/__init__.py,sha256=j1DJeCbga4ribkv5uyvIAzI0oFN13fW9mevDKShFelo,3188 -click/__pycache__/__init__.cpython-311.pyc,, -click/__pycache__/_compat.cpython-311.pyc,, -click/__pycache__/_termui_impl.cpython-311.pyc,, -click/__pycache__/_textwrap.cpython-311.pyc,, -click/__pycache__/_winconsole.cpython-311.pyc,, -click/__pycache__/core.cpython-311.pyc,, -click/__pycache__/decorators.cpython-311.pyc,, -click/__pycache__/exceptions.cpython-311.pyc,, -click/__pycache__/formatting.cpython-311.pyc,, -click/__pycache__/globals.cpython-311.pyc,, -click/__pycache__/parser.cpython-311.pyc,, -click/__pycache__/shell_completion.cpython-311.pyc,, -click/__pycache__/termui.cpython-311.pyc,, -click/__pycache__/testing.cpython-311.pyc,, -click/__pycache__/types.cpython-311.pyc,, -click/__pycache__/utils.cpython-311.pyc,, -click/_compat.py,sha256=IGKh_J5QdfKELitnRfTGHneejWxoCw_NX9tfMbdcg3w,18730 -click/_termui_impl.py,sha256=a5z7I9gOFeMmu7Gb6_RPyQ8GPuVP1EeblixcWSPSQPk,24783 -click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 -click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 -click/core.py,sha256=Q1nEVdctZwvIPOlt4vfHko0TYnHCeE40UEEul8Wpyvs,114748 -click/decorators.py,sha256=7t6F-QWowtLh6F_6l-4YV4Y4yNTcqFQEu9i37zIz68s,18925 -click/exceptions.py,sha256=V7zDT6emqJ8iNl0kF1P5kpFmLMWQ1T1L7aNNKM4YR0w,9600 -click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 -click/globals.py,sha256=cuJ6Bbo073lgEEmhjr394PeM-QFmXM-Ci-wmfsd7H5g,1954 -click/parser.py,sha256=h4sndcpF5OHrZQN8vD8IWb5OByvW7ABbhRToxovrqS8,19067 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=TR0dXEGcvWb9Eo3aaQEXGhnvNS3FF4H4QcuLnvAvYo4,18636 -click/termui.py,sha256=dLxiS70UOvIYBda_nEEZaPAFOVDVmRs1sEPMuLDowQo,28310 -click/testing.py,sha256=3RA8anCf7TZ8-5RAF5it2Te-aWXBAL5VLasQnMiC2ZQ,16282 -click/types.py,sha256=BD5Qqq4h-8kawBmOIzJlmq4xzThAf4wCvaOLZSBDNx0,36422 -click/utils.py,sha256=ce-IrO9ilII76LGkU354pOdHbepM8UftfNH7SfMU_28,20330 diff --git a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL b/port/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL deleted file mode 100644 index e3c6fee..0000000 --- a/port/lib/python3.11/site-packages/click-8.1.8.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.10.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/port/lib/python3.11/site-packages/click/__init__.py b/port/lib/python3.11/site-packages/click/__init__.py deleted file mode 100644 index 2610d0e..0000000 --- a/port/lib/python3.11/site-packages/click/__init__.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -Click is a simple Python module inspired by the stdlib optparse to make -writing command line scripts fun. Unlike other modules, it's based -around a simple API that does not come with too much magic and is -composable. -""" - -from .core import Argument as Argument -from .core import BaseCommand as BaseCommand -from .core import Command as Command -from .core import CommandCollection as CommandCollection -from .core import Context as Context -from .core import Group as Group -from .core import MultiCommand as MultiCommand -from .core import Option as Option -from .core import Parameter as Parameter -from .decorators import argument as argument -from .decorators import command as command -from .decorators import confirmation_option as confirmation_option -from .decorators import group as group -from .decorators import help_option as help_option -from .decorators import HelpOption as HelpOption -from .decorators import make_pass_decorator as make_pass_decorator -from .decorators import option as option -from .decorators import pass_context as pass_context -from .decorators import pass_obj as pass_obj -from .decorators import password_option as password_option -from .decorators import version_option as version_option -from .exceptions import Abort as Abort -from .exceptions import BadArgumentUsage as BadArgumentUsage -from .exceptions import BadOptionUsage as BadOptionUsage -from .exceptions import BadParameter as BadParameter -from .exceptions import ClickException as ClickException -from .exceptions import FileError as FileError -from .exceptions import MissingParameter as MissingParameter -from .exceptions import NoSuchOption as NoSuchOption -from .exceptions import UsageError as UsageError -from .formatting import HelpFormatter as HelpFormatter -from .formatting import wrap_text as wrap_text -from .globals import get_current_context as get_current_context -from .parser import OptionParser as OptionParser -from .termui import clear as clear -from .termui import confirm as confirm -from .termui import echo_via_pager as echo_via_pager -from .termui import edit as edit -from .termui import getchar as getchar -from .termui import launch as launch -from .termui import pause as pause -from .termui import progressbar as progressbar -from .termui import prompt as prompt -from .termui import secho as secho -from .termui import style as style -from .termui import unstyle as unstyle -from .types import BOOL as BOOL -from .types import Choice as Choice -from .types import DateTime as DateTime -from .types import File as File -from .types import FLOAT as FLOAT -from .types import FloatRange as FloatRange -from .types import INT as INT -from .types import IntRange as IntRange -from .types import ParamType as ParamType -from .types import Path as Path -from .types import STRING as STRING -from .types import Tuple as Tuple -from .types import UNPROCESSED as UNPROCESSED -from .types import UUID as UUID -from .utils import echo as echo -from .utils import format_filename as format_filename -from .utils import get_app_dir as get_app_dir -from .utils import get_binary_stream as get_binary_stream -from .utils import get_text_stream as get_text_stream -from .utils import open_file as open_file - -__version__ = "8.1.8" diff --git a/port/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f0cf7991fab3d9d99e740c5181344df8de33cd9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3721 zcma)-OH&(15XVQL7m^TQjNh2WVBSbPZNL}|0&HR%h=I#owpOb}+IU|zyE4YPt>x%~igoDpl!j@$i&%2z34Ro7PPCbkAt_x9;u?gTJ5G|E&f&#{R;= z)nCUYd>iXz>{nJ{oK<3#4l8DN@QxUACvYe4B#r~ed7L-_oZt!KByf@^iBrHSo+3^I zr+J#V3%HAS5odriJVTtdvUZN=h;zW*yqmZiIM4IMdEg%2L)-)0%X^7?f%|wLaUbw4 zev9}Pa6j)S?gzfjZxi1J9^eDS1HgCq9pXE{clll7yVgDXKEF?V5BLFpKztwgA%95x z0QeDqMEnqVkPi|+0)EUN6AuCp@gd^JzzSE0hk%FqFtK7iu}Am_@i6cxA0>WbJ+;U9 z81aZTZcp$D;!$hTp5jx)Pl2cTH1Qbl44)w$2cG4##1p^;ULc+XF7hJr6!09MBc2AH z=kvrfzzckVcouk(FA^7km-rHK5qOy|6VF-C?C1PB@jUPfUm;!qUgfLAi@@)WR(A@@sbiTR4aJ2h;xf8FqnN?Cuaq_4sAM$Z z)?wxKMz)UjA*B{571!_;#|<#Jp`4pR4bnp1x?Y3iRZ~|mqv>bhd(ZW?vSk!9f5+g7 zFd1v4w?wsW8%_Y6-G)S^<_=+)y1~9nEV-6t=z-}v&F`JS_>3zPuVHf@K<<6r3e1~@ z$wTjQcGr<6G}{Oa0n^gjP1cltov~kcoikI|8m>{HiOocb>Sgq7&9J;1f94GguM_lR zqg7AyeYIlfuFwJ(Qzfs%KcTzPWf`M&5pU8dd7x^Y!l*Pdw^yF$=Ld*7SB4|nAICAkCl7>@C} z#tg;2TG5U5@448oW?Q??h32W3<@HyMK-KF)z~QPlRp*+)Ad62&k?neeo_k3GnG!mSF!_sh*0Ftk0oA3jFJ zseW)_;nY;!xx)DN;o&=QB}+Be)bY#ojusdvri~oO9>Hf~@7>|n2|#Aga<$-t=1|)^ z_YcsS-gmBD&6{>|;nDIVEx93z z%dPgDQD@aN$nU_-#TD36&GXcXi5=_1VcB#vaiRKwFf<#SJ?O+ExN&v4p5aiOFNu}H zd|~Ba@_i$vsufpP)kYldsv+RD%tRa|fs#Z?p`=l|Q1I<8vLKDj^#%6@yy=hJ6uxY$2?#ZQ_jo}Zr=kKkc&=31s(^ni-++%J0ca#$?P&li0&FlIeX{|LVz zzo_GTq^PQCe+y|pgs^1xkccc!g3vo%+1H~!D6);O(u9txRc5gQ3*ix~XAB#Y!F z5Fuj2p==SG4rPnjU?^L=$de(HtX;0w9kynl4Vh%^;z)&470V%$ERusj%!sXqvPJR| Wh!DvoKt+G%2Y$)ozxWZJWB&oEmqjK3 diff --git a/port/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/_compat.cpython-311.pyc deleted file mode 100644 index d46d5a9c70c0c9c923ee2eb7c16ce450fe1efcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28663 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 diff --git a/port/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc deleted file mode 100644 index 38baff3b5db77d64799a156d857c3ac0c6f36dfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33264 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 Pa=1}_xNYh%w(I``=$k)) diff --git a/port/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/_textwrap.cpython-311.pyc deleted file mode 100644 index b16f6dc28235145a86cccbe7b39e19436606dffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2633 zcmaJ@TW=dh6rR0$ZEtSQrF9#(ZqkI9mY7@$sI90<3nc<2pdt_vuyVbd#K~su&aUHJ z)>0&bPS*9@!Ho*I-FrZ` zkb>Hj~T(!HTXEg=nKa zy%Jwa;CL>Vi+_~H#!OmGrQ;dk;%e$zJhNiVrM0o)k&(EbGL+ZA=>i~Fk0;esav?4e zQ0D*-!CgDuEC^m%e` z#Sd8d6m3y}OYq!e2c9KQi{PpMr5ZW3%zTb=RE(O8(ROP}OBtzzD%B2Xcj(z`x^g`W zhpjKgSR8^N@ev?)D6Pt{zR#qatUY6u4u(!iv0J7LHV-C#~okWg$`(#IkVI5{?#^D#AdGb=Qtr!m-j|MHngzgmqZff37Na z6y7DzPTzRpvLzm`4xA-pU)k;dI1K7Pb3kymEY`aogg73t7kTsx-+r-&u~~xneGnie z%`Ib9V7AaK%G3Kw8CCK=3@CW*Wo6+q`f~IOfLWf&vj89ua8UjjnOY!Og$oZ7ui$`$ zF1hR826e{d?jn=Di@u`|mY!QPLLHEFWF2=UWSSU1}>U(QoIO68XyVQKq#d(b!GKX zGe(*OgJ7g*fvlryOIv~dBivUSzklKT3zhzHtAD%_K4XQ?IEeShTykTgaA~uv+8wsK zhYIiQw1qZ5zL_iJs^N$gj&JfiV(aaRn-j&Ja?dNJE+Eh=;*cc{mEFG6)_Hs7=1MVi zBY!Jj7J4y3DEt}3rZGgQmK7>M?=@>Doq%k|s%O%RaFr6++vxu&QpYFl@oDhibwy^03P`@6%Rq9P7@ TmTV4Lp}{9a@Yi#sZV>+iX>V%Z diff --git a/port/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/_winconsole.cpython-311.pyc deleted file mode 100644 index 27968195d45f5e80259208178e7de8f0e0dc2323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13323 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 O$=C)R>@TYrfd38kKyLN` diff --git a/port/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/core.cpython-311.pyc deleted file mode 100644 index 68ba260210f782625ddfd63333ba39e07f94400d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142552 zcmdSC3vgW7c^-KC1#|-qG#-sNKsEq^M1w%{JtRR6ha~tIzCg~9!?7@u8%^8>*(A^n z-ENRW3}|tbv4v3(3!{Q|pqSdgsnG-zQ8qU#C*z7zJF=uIIqULvGwo%kv&_Ot;lXQM&VkvFcr1W%uP&$;KG$A8ZG-{&7yRaHp1-a7bKR}X$-lm0#3 zXji2gdGcSJlJveLOR{Z38WF#?5gXszN9_FT7;*5gbHvHNu8}hQ+9%2<-6L)rz2lhh zOje9kaNLP_>MNBoFa z$dwZfll3F@9QRH%PBx7+al8ug=8} zqGNKy$OewrBffEDBgg#{fyvI1PL4Mq-Zj$2@y3bn$xS1hINpSK&qxo)n-SkUvYF#8 z6I&*GM|wHlig<7&$niGB`$qaW-afH)vVWwX;~j_(j0|vm1LC2P5XUznzHMY1#{-CO zAKA|FPQ-VN?667Evg2Ia@xoAszqK^cUq`IVkr<56N3m=1bah z#1HH7Lvp|Q8^+hh%jAJ~oFhj(l6*nlCU2K_pq!m@zq~7YRNgAv#w+CA@3=;WwbAJzI-xTfp5RUZPBwJ(lXg*q@ezT z@3=n1OW)C6ltxa;2T;;!?SZAFgX^ZyH}p1`-@!LtL`~1wrIV6;=p9LZDJoq*tCjwt z1K-AfagChgT!)b>STv5qoN@#yM~hO`lIKI%Dcd6$B?!?dZ8%o6;3;jv=h-+ ziqc-?w3A4Cc}?0y`4rl!L*E*>(Nj$Q?37QV4=!=3XHe??qBgw7DQA&#F8W$gT`qIl zFw)MiNqb$kU6g{a{zvM*;h-(=h+G-NPxV+Lo{GMinvBFFSECA^c#gjrOI=Jw#%@sZ z^pqS)MZ>q0$kY@kmtT#h=mjLY<3_wpiB3f$^t9@d5*dqL!TXnPPeuPD%^y59*xKsB1&X3n&N`1hbCfUH;%tK7M)7P5^-d8QcaMv=3Fe9jK#0&xsg`! zS`zg=t|$qrbJfeyiK!C_Wio=g(F5=GL@XXoa7jtrS576S!fI0~d1^X&O}qcdmah$u zPeiVUDC&aP-ZoNL&s_l&e%NXLRgZ0>4d@ksDFGGai|qNQINv&_m&C zXcCg#oRmyatLiR9#$w~QPfVcpuZt1+2wg#q7j?y5^$;pE5v49Xm5NU0Z6`u_({&{= z9hdXA%X!CG>dk!lkQnuRMJzrh@<;O+!ql`9r^HEsgFL1$jTk}~{&(a5lfOW4MzUce zP3cRcBwg3zDQvRZH7i}$C#)5W@7QPU%ch*#8ilGM6sk}nhO2)dLIdQ#brAn%%_BJ)lHd}S}5Bx(GpLjs>2-F7pgY`b;q z*0u`(^zp<*EU|40v27EvE8C`Sr>-U9yFxp5Y)i&c(Sa!}B$(;RZDX`NY#U1`(a_ZG zd@FsO;5-_>8B4~lOhmQnBo*4434KVui{Q`k@2>QVI;pC9{=_#9F4uq1mhlc`y#sfT zuhuj?s_A}M)4e>Dsp-wu^cEzSYZC`^&RnJMYcGBErKQ14<>qYV=7Qw(Y|1sZJ!;(Y zuyMUC9Kz_Yx2Y*OYG0+Vx6&byW9Rdjq*88c6i8swzO^rV2`eSq_I{EACyNa@oIfNnQW zK`Y27f#qJrL{J>E?T#~Um+g0)DINUruJgBm;i7E)%fDrpowGKCE)L658a9nj&)Th% z@47zmP)fNaXVIj#}G08XwUbz-kthvN|MR_qyv1<{8lLb+zoxjrrEBy|)H*pmMNp3UI8zY{42jwXW*R6x8BI~Cq9(LL%p3{a!bj1%C~AX< z`TJL<(G~cMBTPmo#;Js&8ixYCGiBoWOdYRC$Q=9dEUie#&&>x z7SlXF78RiBeRVpXicN}*R(TPFo_Eqto_B{CV#8s~`XhL(9Hn50f@7TPS}dM2=Dc!< z9@dA)u0_Xggt>3k;Zg{}JC6U!EP}gIp-l2NXDd4jlFjA&_Q(Ur?|nYgb2Qs?lpo~W z)pKRJa$iC6xGD-xTh+mWL-JJ3ISXD})r%beg;L>h>8ru0_*GIAYv25tD@$?sE(uS_({!GWVEdA{(lxz75ZmFsz>+L9b^e41T z{LE2SS@v@YK|v~Wl_`hOu)G_KnGyle<}0p5Qe)S`$=FQPvc-Ck&4K?NvnL`F%z3os0Mi_RWxW<&f!KGMvx>tAP^8k z=;F#Nm+8q2`cq%+i*l;*X=x|c`9I{04Klx<@V*e{tRJy8j?y5PL_V3fjl})tORU1LB z(mTIr?!}zHY3|7U@myt1y0U$__JgM7joA3`=p+jG6xZX*hJxgvH?^SXO_8loj$~v{ zZa_8OaaKrQtvKR$EN*K+&s=F=O!sZYb)DC6z&(h#KBp2xa6J5%zXF0Nj3hLMCJkq`_D;nZ$M=@V`sQ zSgH)*iUB1$ki0fMK0blsWe{3%nGiezA-!}g@3*eS#;!4D$e+3u#hcWxH==Ss?IE|K zs3v~tr6^H*aeSX}*eD>>RBcm*jA79l0YW8-x<|*NKwZbswwu^msYKIwiM*k}sZcaT zXs?UUF5 z1JUtuWTNgE!$1(_8Hf_DEoK?s05KMcQQt*UgIt$usnk?*aGSs>LsNJwno6P~*HKO~ zgq>+yG`=t@Ht-^Z{-am&ps~q;eT>qwGL1rmsS{p_Q#3|DU{r z;2XC0C6Dy3eHrn!S1|!}#}?m+bx&Wjczps7(Yz1HMP$$&+vlXXQ(K$NWSCc)wT;^W z!1m$11B($h09Pz7N8ij>Fzvt;b>1~Tk%*+QXC=c7C|HDOwZ|Lso5~1c>N0d!EJN-j z5v(_&w`clk^9b_{NQSY}5dln44sZ<}oB&NTkvtUAa#LRt1P2SMJPI?#x#1Ogne-E;@#S^-F_`ClB!GeJLstM;qL1+lT}F zOy_kSTlf&^Cf;3{hxn%JrH3l z*aecw!O>rf#-}Gk#}SNTg#fJ$sEvU}#%e?hMv`AO-y3n0#XeY znLIcc*caN)1z_h6a1~0lik353Nf0X`8WY+vsS3>YLE^iDwmmgh>Wb#)VhU zpSy4gCD3vh)hPc;g;=)vif|Y-&on6KFc?$eFHT1$h$g^Yc{nU5#t?B*r{|rK=~N%%2%q9@VO%w@@3-VA4v?e zyih2U_$~)uLnIkPa996Vuvfa=1&M-IslI(-(_-+wt&3alp2;}}b9HUz`$M_vra5^& z_U?`O8+T9UoG%omAIViU&Rv@S+`Dhgzj60O&UrZPJS=KK6|hX7Zakpt$sv%z#`Jj& z_{4}K>Kt)_fvXe9vPpapb<2)}c+vCJfATrGOfHw*C`HF9WXWLn${uq{w8E59VM!^w zt`pv-Je8I_=C{3;l(Orz5b_nJa`m#z7?7#lD$Cndrj+V+Q+&~CxyF)OZF;YE-ITg@ zQ|c`#W!DKiR@-2dY{X=LQT`eu|5aPGVx6`&Sl%+%xpCc;CfPaOB{xH0Q!6(iSDo=C z+?DLzal70C#(up#EVtsSHHw!ClE7<$66wK9t*wayub-3*xtnTLfs3`_|O98>6!oc{V{nWF8S~ zO-*yz+y;DyM0`C@eV1ApLN03K7Of{hHJ6UK-j`QNpjxueOV1(H2g1vuk?+;oq{7^@+q4JssTX3-3b{$%i+nXzCV;hpK!_ufxI)C1K;^C_CLl}!y_F(TcLL;9JjLjeCiF;-DY2;( zxFylCX=a@O|BC|20zD1N0*qk16P*YJ0;f{I_u|B1nV7gu#IKMIaACw>)mX&S@d=`R zfhFAzK%h4OvQ(gYDI%;RV??vilUT|`44WDR%5{92iD~d*$AG3z0ZA=x9NG=h5OI_7 zADOroREUz8&^yFv(>Ua()1Y|4=><6sI$eoIn9c_l7zvC+$jAjm(I_PmC$W(D2=5xD#f9Yaneqod4ch(;7SajRHX zCAxEvF;=y21B}_K;wlWi`elp63V1eZFJ2SzlG%t?#$0BRlWrN$HVQY`6BzrG(KtA) zH0~*I-MJlvZd)(Zh*0Cn1SEQLRKQj2X4G6RhzS9131yu^)TZK_Cse6iDginYAgH}c z-1#JWA2{{I?R83_dJw`*L<_~mSNpkjI-p*OP9$#80L1{=f31QnJ&xHn2rvXdUWtJX ziHW1mKYSZ7q67%WEN>9b9|o)e#6ZMH$72vnQY}TC<_6y5x>8Q!XpRL;pt(*}^}#S8 z7n7FSkM6?X=x`zqh{K2C8u&k}B$^oJFB_AB3Y23>njnyYvMlCVg~TMV6)-`t_Vo8j?Sh!=yr5wPgx<NdnUQ&WTu zsBCtHim-qY_Uag53qS;bCq!gW^dvfn)QM>MiN<;LL50xGMjt(+f2g=9`UPAcNO~i2 z!er1440`Nl3^gOj#KuCL?q`%_*&vUpGntt|)bAt?m`EmoC_Jl}tH7!BMU)z*B0w}r zVx)&b=m>h?8Re)Wt|2(s;LGPGD@ct^tmVUVcWGsB0KCTkk}|Td8ZX zl1|3nR6*cb;35h#HV#wU#Rjon^I{BV;pzB|IFLgRc?qc352ljxy%5_Q6E0>VI( zHd?x7EHRN#1{pm7El2w>FDCjHsjg(pLr;rV~A!t$Qh!9+Vr3*C$C@YhpeaBfp0L1}R`ZfOtyUqLFFaw< zHCkmXy?u*C+5){PQ6Gj>Y-Cf@*6kCb@LQVB>tNs_?)Wp>XL*;h5JM0s3ra!%h{!{* zk2+#U=;w7nY;%k*QN7iIh)kecft>0^=cB0}>jFsY3TK%XCP@Y~8 zb2!F91?lTHCzTf0?9gAkger}W7JU+R1YrnpqQNonH}g2HS6y@gW&t<{8al6{d(Z$C z+=%CtQaz(yYA>wQ$$INVXY)h>3_j)4dqaAcm<3qt^~+OA+HDfGnTz6CI6B&o-Y&h( zP#X3=z3!ur0#TX6Bquq9Nbe(;DbX2d+bA5N`I^SJ`sfvDB zvsN76Q7_Pnt~7%4m-k^#2o?M=bAg6Wu_nNmkm2oC^WCy8uGHS6UnuZf+Hj|AwhU$K zWysVsdh2J)^_o{}rQ9i>g@#~Qzn^vMd35389rr9WlEeD_Yz1iz8p4q~6|)sc*M%js zm7K1R^qtDtN~G)evtCZuMTB>}vtFd@_p?=ZtI!*6v|sPXJ5_OqY`gFN~@&!aXi75eQ`xLv#B8P}oRrAY5ty{s+AI~%nW(yR}b4de8>))+kxttw1k_jHo29KtLNB`v2*D|lZo_+Oo%G0`9Sv_}P>4kLLK(4NN zu@4$*Wl|dz?|vNI{-E*W#!u=p!DHFrF+8duCGzI9cVn)mC0)~#t7%NvbRo>vbfs%T ztF3`-YyYFx?GIbGKWNFc9>}&Hm^-t2`~rQaxzH@_-bb;GtCcP3%FgBS^yYoJj_z#7 z&beWHbNeAt<;wPS<))R!bnrkfusIvpmxju^TiSKZM#&piE8EhQ-MNjMvm5uOz3m0B z)VYHaI#w&Y(v^L=%>&uZ$J5?!B!rIhE1Om;JJXfHTu*lLddJ_I^$(=|`*TqD8&3N}D71M)wrP9Xe+GXKc7N~Cqg^K- z?mC&-bt=2-lz56lYr8*1v%7Xb>fHaZbAP7uK(_Nh+KcvgP-8lGJ?cF0u=BvjL!Z=V zI*(^N(dG@SyN*)@(7!cvFD_k9cWle~TNlsH9mgko2|y}VE1S}l8<$U{H@%Q+>&&)= z=FUw&|M(?s1mpw445v!vN$leRswU?ZC9>Ke>s( zYVWgb&WBWS73+NQPC8Y`a%RI-(KSbW0~AAag*8m^IgllpNDE znN7UF2>=(gNg>o6Q=vYBF#DbXsn0%x)r}F-Zn+O6HYQQ=I zEI2?AkgB*pO?lwnMC}e-fokausM!hQu?qbi%EQ)p>I%>c_EC^Tt7K(o$wfI?!1yAi zg&_N4G?j!gy+NZu1K9_+c#URXu*_K9igeK_({@e z3w?iO8POTPww#$u`F-R{4j~y!TC3FDzBv1+Y5T*b?GOB!rWdkJFXUP}?rq2gHe~~Q za$B}$w+!Vr_hmO9$#reccI_`zmDf}hBoTNj)&e5|A_LE1SvTX)P*O=Wv zX3gd*#b9Z}+b}(`4=aSX!OrCG<42*LTlsASrq<>?VF)0B{9_5P)!M8-`eSNv58k*d z<=o!6%K6HLFJ|1$6nX6SFI>vFTd@+S-K{xa{ahtCDes24MVQT(JQQQbK;E9ZVllMS z+jxB6C|Yg^*8Nvi%0_^e`Wpl}b-iEBauwC~+635km2iL-dotAROFTAU9|$ zRtSHB%?QDW@@)#J0OcPcNYVr+h}L&P-ij?dp?LDIs22|)H^9bAhE(Q$gb~&Jfu+ue zv_G`vyft4t{ngX&o}E8CclNQn{@tqisyY70eG4tnv56?8rBiFnG`dmzlRrQpEP7^b zN#J2m2OtlCWRFBPII8UrEEQ$D)d<5T#Vfm|9cb(=yRgBrNuQH!_=hjlt@%RHu#xsL z{qLsSYwJ^#ThpWuIwGggx0gs-O~fIVMWLH(;W%pczZ%;^leI%I1srb@Sf0N0fNjm< zDscOSun;UIQu_$7u6&?38HKtsGhRnYL0QctgqLroMuUPYNkdKi8jUrj@hk-k2zA9D zJ|nP0W`e0>rE_pqUZ7qtm4T{B&q>1>=qM}4KyRAInU$kQg^)ooHNl+c6ulIUKP&RLW`x93s4b+igM-Eq>7oO<6ZyihpRMKleFi4q16(=MCPN(8}ov6FbmyprMQo_E6_}Yf9 z8FR>QL4Aw?{wZ=hxJH06F4U(0j^qr2IO?hem5>1dG%-d(j-X8gW44*=L-FA#c&;%0 zqLKhrnnnymJ7y)zw{^%his3yF-Z*$&hs_DE<@d2v=IzQ&tEr!h0d1yA+X(sg-_r8^ z$H=c*`3*`nFzT~;I@^t2EVYg?iYFVnwH8wA}=^spIs>r%V z4Sq(kpX;|qLQ#y2ZA#@Tll*Oz(3z|8FH|m8E`2dm6QIZf{?WHOIrY<^Kakeo)~*vcX}&nb8{pO{qb|iZcV7wMD*x zyHxZ&eh^2+{fhwnjvLalD z!~hZmNy!w1=&WL(!?w_Q1bPjj6U&fbNdox}R%=lzU=VT4A?@6#hE2mv@GLw(i@D&z6eJWasvKTpcNsc zm8jAQlJ~1pHoXzTiUgeT)HP8Ud}1ULP*T$eR zBlJJj{Q>Gv*ky$!ALOPi{zXwQtDSO7EfNAe*ll6nn+r4b31wrJ20DbaDfzn*nSOK; zh9Fv?!WTvVL7k0EBlR}YB9pw0;hr@0;8S;qvqy$chR+=TT;RpP_?EXcbNM@=3D^W} zF;-k!J+MO1_8O+7X>2yVjG30$Q?O^CxRP6nUQ;TNF4~-kKlFxHkuTs?E_m(7sYLzb zCB7>>!<7Coe}v4ZdbJPr2ev?P{MyAWPbHja-w`zp1h4`wV#*d%0LtIR!x^u(~L9489O&v9efE*w1|}$od{_1P`wK-B?8#{$8KOh8k@!pnPlNO zpiY;m0QgDCm{Av6ph!1Jl?|FTZ+O-VthAq?iWiPSVi*pN>SYP}45UwZ9D_TFBBGio zafqHv+pp1}8G^OvC|Mt6d)~$Bc6kqpa5#!hZw4K1V*UL#Zp~C+H9J7kYd+Jcg9G_Y z(w_$iF#7Q>0K*T!c;xGT=F29{966PJ#hcv*~A&y{6*l6ci-8O6lf(V}d^j zX%joavQRJtMGQ$VAY$E9N|SiSE{S;O`PV4oRn@IaAOd|t)she>DAs*Y0c@}f(hSb6CHR8Bv z>fWLo;Dsl2T=M}I5)`;v)F?#or0+ffod}wj*EZ;WDXqN=;Nt=4P=s%)MV;3$DW59c33P{>_rNUEp2MjubLzjaeBK321uc( zt7IOscF>4WOBuA2;S0Ukd`fI1v?W30i+zY<1mR%~a(dD9IB2x6e5IGZ8#L`58c|}M zrGq>XibjCY7lv2^#~u`5H^}G*V^X79KWh^nf&l^M0#H;qH9^W+s>y873ntb*EDrf9 z%Ur=zM(2MINfs9>RhEX&Gz^J$S^FbI%Na?hu$;Ys$oLLreTUNS zLxQPg8xQ?|uweZL?@0;NzHJNQL5Y0k`H36>S5iOPX4m zoelLIT^ew?sn1E{SA(nHUjtW^Ltk+WxUxKkb4?wtXq#lX>V4?zU8&9Zwq|`>)9$Tn z(J4ZV9Qgm_R}nnVCRohNG&`%Xra^>?GQ}m6i%R>%TYt)XZ`UsmXl#%EHvAde@p>MPu5_qlwuI- z+=ADs+qdF5rgH`OtPtKka&LI(-jHzzvhG0I9r)>U$b`yJ01v~Pn4RSE<_@$*4E8g$ zG)#A#hJ50Bd%=wB8kjD04D41fQU*qB$ca)FS~-$r<-#hbE#*43eCs)3v}$m`xnm!k zJKC3ZeG~0{`i0X+UB|@oyvUQ4wM;l}+$uYkb#q0_n?)Y$SlhwI`U|#M+p?*Z##>f! z1%Ntd{ue^QNO>KIGss-klN-^$AWeC>1L4g}9ne!=%|=HV?KdHGW^tNoVZfvUnSP)Y zHe|H&k;a(zu-KsB(^nwmR+mhcU(x1Clq-Lhy}Hqj3i?@_kncRLCDyD>T6lrbZ=|6b>O?VGQPc8ANWxAs&lqn zN9VmavK`wWbsTuuap2=)nT{jbjw9ev)t zn+W`KlCm%@@0zg40|P8MOz>d{-SkJ4Qx&?cLagS@RoBhmNLTmd>YEl1%pC)X<*Vlh zl&T8dDuw+T%iS!93au5~)?d-u3VF}lJ!ZGE&`i=-uws993hAWjsqkuP^7BTLqwn^p z+ey&q4_=E&178>)V`6|+1ubuEyl`p=7iUU5h(N8K*_K)bnzeHeV%2smEh|*^2 zhg3w){E#~A5Z=2ht#0a_bFNm`rK>l|6IPQ1`SuBmPD%?018+LIpi zBys|{Yy5L50Vp&~+C?45op%|Lr!Y8*9YdjG?$+8N^s+8%Z(7t3srwj|?w%zBM0Ia9 zHET3LE-1lV5MUMq>Mp=c?N}mL^wlLEg#oLknU5|XH30+=B_@A$yGv%H8Y>gvl-S#> zD5UYnc`Rrhv5p0>?Z_s$`!n;^E+){PjqpFUFRUJz=GF5%qsyq)J(}1*GBmhJXx;_i&O>LH@ONg9=3ff>R{;#9az7Nj8^pV?Y(B4 z<@q=&gfS>BW|Xp6GgPSnh&!wxPJVA8^JNrM=(VW4F->Ypd$rlClc385<4ny%`p7Vn z(Lr0q>1od$3=AXGHeOv@+W=*aiUs7r!L!((wNC?G0C|rTvKE913}T@BLxE$$dKtU6 z{z;+Gy6e-dd<$t#6(?OB;_^F7xF;gh+JzStX{!aNSDOG>^xWy zt(Y#n5Zh+v*?YZM^>mU{A9UgDU6mdQ4-aGz!q$ZP0IIcG3q@*zu*en`i0UK4+Q#9* zkV`g(MIoJEjU4>n5VvgPPI|*&p3~iTskiARIK=i!*o2yvH)X1~WUIHN-CM*Sqi?9l zh1_C~*?@@EA+2?4ao5zDx<(N1A%&E&i^-$BD?%p#7z7gE{vK70G=lC*Kdr8R_v-xB zxhk>XQZ3-89C(Ul?DRDyfOKo+iaD@cy#Zorih*O3aJY^Ghg%yffdnw6NM8ymq*$tT z?Y~3Z+O?F?=vun_eX4&oGE)8P7IwdTeg1k$y*|C(&&^LRqIP&=j*zs$&^`ft0R7fQ z1z-ac;Hz>wW@PeOAyiCsNYvSl5ypptg5f&^w#9~KM!K0sWJsoDmCMn)$;?2B{k$?^=PS9XUMGZZb zkL(6r38*@S<}eneO)mm7%k-+nHVe@Xl-M;M^Gu6|Tdzs_L+aaZ6ai=hvfTRjQVYl4 zotd9m+OqQc{m*~0DeXI%@tw^2PNv-_xs&sCVYRTZuFd{gT`DxB?rLv@LZSY^#UwH``g&9{{Q3y+FF^sg-+s`W28xR)?EMCvR5Cjv|3iBrRk$8kw( z)?KrgTI=qqe0LTn4&bm2y#aT9X1)`&`_P>4=-bbiZDuFThL$o;Coq*^{RVNo*5Nxj zt);^T#dPckxKKl6OJrC$%{p${lzn)jbCHxCvt_0EL$FRMTc(|B%{A+?e$`rA95rJ4 z;z7JUe{9xuUFU>7pA8hWAno81xKbo5P_JT@+dZTc>7tMbzgau1TO1$Qe$zGvTP^x$ zt(OhsUHUm`OP12NBp>ai${}34^c#$YJ0oeVQG(aY_^--GBlMD;ID;o2eG^VEAQGqT z3*K``7={ycASWUnF>v7&Lk39-IjLI-%7$&;r0s~MOb8)ODttTeI+e*HG~L?)5O1~{ z7q~drf%Zn!M|GNFxJAHoeN7~k9EvpLQAICGD8gX1#PUH3ikb$Z#(>lK|Hg*9vvidN zX~13&)ID0|UJ#Rz#b zWtwF^TdInjdeK3gf&q34geWE2kDeQ%dRuD6@@nXJg1(7sih!CWEq!em+OeWhSE8sh zOaQp)yFxole1e7MWcn@I0XU(OO$>dK>RgQw^MOa3)kPWYWBw@banP8eF*e*2@wpo+ zuN8fK!lcqTNfk0PZh^X@7g^&%&{$m7t!oUZbbf~ncUIKW2sY8H@S&ym1*tjFsIh`C z+-nVvPEX;aDA+Qj5(8+hnaX@FLJmDTIx03R5OF*i;4lWpVDx!aNkgz~M}?9aJm0Cx z1A3)s07$e;FOBPL9|6PQ)Q}b%%l!aye1r#S$Fkcq)x#7I;LJ;ymnv6HgIJxt1JCW~ zZ!U+YmkPc->%_((t_tgkce3qEe# znDf8(Gl#vY4yq|lb>K$l?Xfh)WHD1LLn(4*j?hrvU+=C-BR z9(9Bsc7#@vnT}oAj$Qb6Un9QV*SK(EY0tgEjDPc|z^1Bd=1)KJc0BZUERAQpJy~y0 zn*UIVxuKs{buMqtR0XqD__p1%i-TOPpU86DAjma!F3c?NPB-mbc>w|bNCi}+8M#R3 zbQkHIstFFQETdFt?Rb#Inqb%8(BD(})(u4R&lxgYu+ z$7&rvY;q6nbNz6mm*V@JLkB%SJjl;qvLXH>iQ+%1bslRd|539IAxu0CbaZmxl{B1!2#v@L0RLiaG6pwcwBM=xV==!4>zLMQQs39M0Bv#Cmm+rBSg1y&P6N)ie-js}Qx&S0GZ56}AEW!o7-cm!TGC-kJWER^ic6 zb?e5e{(LL&Oe>Kx0)tYW8S3Oc4nAO69xtoE00@Z1la??f@f!I5&{Lv)m|9U@L#+55 zr*gGQGd_)IQ6Dq{u97Ldfn^Wc1+7ax-)_qIf>|Gy2%Bf{aa~)weP5<-f3|La+Pi6RCG=KJRFn2uX^DmviDQa|(T43`BRV&eKVD~~97<^TquKL>NZqDCXdM)kSy?hCQ z_*=QGM%}vwb%z5S=oo?0{Ac1yfd34P`8s0anza#RGe&Bk`Og<5KSZI_Jipg7#MrG?oF_w|If^$ir_hP1@IS2c45{e?kTVC_FfiUs^L)N~P|kxzdJ$FjoSs zp4Icn7kuaou58NqwqjO_#<0LOL>eGOmbqt zKypJ|H^Ji3UkmP0PSevk1qlkKC}^aBm9%#wmUj{!p7({r>==-jz9fzcai3>Te31z_ zu7Ga}$C3E$eD%3$K11o8@T5rx4nY@$3!x)b^KOmjru_H(@EEMEm1RVg59q$?C@3WT zKwyQWjLLT?a8j!K6y{I_CN;|M@~xl&Q@7b@K=~d$(|BsCNeaMh zkrX=xB<|%Q6Vw8Yj~FCGlAnQvc-Qo=VE??0PC?=Ds6*QR;@$HLuPk0(I-hOmPdg9d zFXKE26|&$!t_MB~dUBzixx>eDeWBdIj$GFk3U}|z?b@5$vp+X<66W2x;6S1Ky4|&< z0Q&~lmetzUf{Sm?^P`C zg21kpAJj?h9rp&8$L_sUsOJZMsXb6=;Ao@N)_$*V`BJvEuh7I#nx(Gp4_a4_Wjl8i zTKGw;)YaPh(Mk9R#d zoejQ}-Eg?Dk&`jOYQZSp1RcmiCqL4iI>zzQCEP(jtIq!K+$u{CtTs$)Zda3%I zU*VjE7rd^D<*I^&pW>js&GpjCE7^e;KaOMv4i_Zce)06O0hMj(WE_HpO;`#!n&lg>Zt`D7$Jc!8f42hHUK+18+r8&czHTN*1!_%Q;#?(}q% ziw4CSR9CqC%U}H9=1Sy)+w>{_gIB&c@`>$xKvQv39N^=1fUd>|w)-%m#La^*@=tMq z3YEVzvbuX;!C`j=fb6;gIAoD;avOK>@2aO_zIEZq;_<8p6I9E^S*g-B?~D}e^wcei z+QUU1hH{$Sb=amBhR8;c*z`mz?&Q*ud&ie|d@#6j|pW>j# zPB3c?+;$iG5W!MC|11+_pguCi+)ls>s)L{6!0U8vUFxQ%TZ;p4nd@cr)taz|dlSa7 zu9{VUZ^4CMOg^j%(}i-1yQO;nBBmV0G36@hH0K(E84>8+MGva=viz(54l2uUD$8#w z%g<%aH&AIN2sD-EFI4Yx?OMeua5CL~AnQL^aN%Arj^bL?C{9(IZ(68bY*?}_G!q0> z(qqXQT({M__ACLc@$;bed$0vYE}TNB-zIM~Z{Z<*v{Q#sohP68!U%P5e_F z)YZ7QQ%3xt_|}ilXLp?CyLAKJ7RRs;>X%QAJ-O*5N=-Y>uJmzSQ4@y($8p)2j&qE7 zWamhQ>=>zpTw;q{hNDZoTKQ4)QC8)al(Os9MlPgiHIdB6s~8*+*)6+pM2ZIo(bUKl zQ70eqRr~A`a9~O$4os;-{wf?^<3+q)eZLB6Rk-(??yGU%!0qr^YHMx>9lAw08ef(c z(xF>M+fBVC)1g~>3sD#6c!gY#wlwj#*DsL{GAsEl^o1XFZPxojFCDFFKuQazG~x&! zOBr&L(WfY*897_=4MKtW(vDY?d--rNqcvsM+qFFAHXEhMEtb}sdyKwdlw?k6liQ2? zM(!B*;s~wceh}eYKthH1+*At7YdiYFaIK0qQy! z!n@Ii=a_>S*D87a5u|zPmN%i)joeDTSL7aZA2Af_X@I=VfV_b00_R|BzLE%!At8>8 z{5D9kOCTAqkhn&pzjcSvg5t)38Zr2@4jj2a-kw3^Kx#=W7=w*SMC3W4hz*Go)8TP8 zMk9+s79f!+sBmJ=-i-AxfE6$Sz9mXSRxl8lF4e?`@SzPq03^!8yCl7&4{K}yW^D4g z@oYFuysQb(OmWa`Hw7&Z;*=e(2>B?r1)?1pr|jT^;+$cP@gT%-ls~GdMEwacGBmy3 ze$j>^E3Yd!b^>Zh;$4!m3FfM>qsJ){P%h@yfZ59>lZ$Nl27?8n`iY~_u?TgLx$jA+ zwq6erX-{Lo?ck4b`6wK!UueImNeZkAX2U?>1`8lqnBqNhj|`6vXt-)n1||%#YBaH` z?uLLQ&&5s0+h{tytl5*XDG^l%YHRQ_0y0%dRn;SbSWd`aWr-N1k5{H+6MPPpF8;Q- z8z{x>FnRkm?6F5x_IMbqIP%w%G`TERd)1<~N_8~z7&Qn7-=2D2Jtzxm@;J(BO0zeI zg$bREML?~owF;)Z{#C1^c(W4c4BvB=*t=d3M49>6StF&gb zk^G5E!$KffqdnGoL%8L|l-4iehtU0#J_KM6lP0{L2yJ<&OOQT1o`RYem#)hV)(Z1U zn~`K;oYDgecDTI;o)ro&r6ZPsUDi$XF)5be>%%cBI|( zC%6eAykX&*>J1?cPqGd(bGc(e?>UBg{Vn?Q(|!2q<1Nm&5)yQ=;F?&5uK@rx!#+|2 z2o0$g7G}?P!ctoG9>@R!vpy_+`X}ftas9)l(lyA1E5N`Jom;McViZc&IO+=L0I<`m zbt-7g%2MtC88%>WLm={zY7I=IW@ZvHyKAP|3>W6c-6Gf^v=Xq+_PvjsFakTMe1eCc*$#c=AoqJbnZjX( z*@6t|zl~(GcLq07(NS>GR|MPQ>93>yPrC39y!83@FYI1Cl&$Ye`}X5+<R!Xd3^DRo~WiDOe7~&=vW&s0@pA zH2h0QZ-n+ZurJ*LllON+hRyii4YMv(Vq92&Xc!n_M?&c+Ak=d;>7BM7k-C?G9_ovm zD$b^T5vU(TF&g;m5^gMsiRr7?Obg$o^<2%Un%h~`dZdDiF|8z@GP%xqkLw=xSgItgiaJ!NeG34@ z0YnTN+M!sak0EevPzgn+5gFnw^?hW-{->V%$Z;L{fy zX?B=2BY{?{T9Hm>8^}$m6obsQre4N0heILKW z(1{>SF7JYs-(*s0q6PSOk&v(8KIBu$f^OmG!@8O(LCSj-d6j=d0q^^6#PkmxqH?^f z>8@7GiUycdev?-60$uuK+|u;i=Q342*(z`fZ62`O5s*9B^Itu`G_>r`csFOgo73LS(C$)GISUlK zJX@gHWqxK9V8n#h)|y@7l5MAvAVSmv;iPhkSEVPk z1boHz6(?c$vVB6Dw0+fSldej49Pio;jQ(xeeD_tG+0FtfI*RlZuO0`@`3%4C%69nV zpxUgt=A3gj@UxxoxKlb8T$0{}cAyo-Iwo0BM5~2_4R09j_^wPAyFj}h0T6{I2Zm4E zw6N)^hezVLO)zR`mc`=gQ&sIM6gUe*YD1qL+%0VvW_}R+#{dYhHuHeGjhdDIpv9me z0QglM-C`CnKMpI%HP+vZ5ObknoINEaxUNV5#3C~Ar zHu|R8I5-YNm5oJ5&p|jE78gb>RfAyGPd8pQH^fZro?=L5J$P+d5*>(Xq84vV2OUjQ z%Y{bH<;VnlgI-c@FP12 zMJEwZ!{F~M;2ZfmBB|i%SP_I34mDANuDm_8U9f*xmxgAo*yf24$2NcWE^B;z<~c~7 zMcNY9?9<>K=w>{HdfujJea-Fwna^jC064c!aF%ez;uJ_^13F!XXJbUGV4jpHve{xezsnN`lE<}KHX;&mtJ z$v2KMhs9DU(t6=$5q)TK0z+zf$_Wa7NWn`8K5_{xh_@12#pn*YB7gQ!lKb#7{p3_R}hP2Ei;a|E>1*&y}xM*TUeodQ+~hfeu_DM=#y? zwtjmycRO9ej-4t+B8lh#b|QZ{(0;6i8p zjQaiO6d+bhv054n1aQ?+$KNKulTCBg+@pC9^pUPIVZ*+3Xf~5wf|B>afni*ZOu#ZE z3=|=%JfuE+j9`oaN4sb;FzHP*VU7EUGSS;#Lz+Tw-U-R6ur21FPf-icbz;x+mFm@EfXxOiu0rNFQlzb@Ue}wnSgK!(;T^q4Q?ym8 zm!%&`;hisQZLK3|e#1B)?Qi7!`ZzxK_w_eQk3g}VFrW~lTB`50Gdlo3Wd5wx6iB7bUG%f@P6^gC#~IJP9i%`&uw$1gR2;1O$Hy2qpw}kb*Mi3~>$YcCbk6 z=p76lk|~_iK~iTTshKJRk`DcJlb;Q6&-hb}twtt9nt{-=+HD8IZLKc{7pN_?~Dk znyG(?s;yr@E?8TgS`RsK2)u`zZ|oSv5#H1sDr^k~uj3;sKTma5!?ItNmm4Q}@cV(l zQJu~$T?wuY^$QgZ+hHL`#`i&02#y`v1Y#NTcC80t_hk&X-Wol^m0<;ZQ?s_~2a{7i zjgS!p5~EbA$DH`hn39OI*H++JF(%c8eJN>V&@tVp>r+~S!mmV<*EEubyu+xf01Ul` zU4`kq0=?$u$mnQS_@Lh1hr&bW&s{is{L=9*j1JExJq-}`^a}BLjAY)uW;lzmNYMwH z<%fO%5C+4T(lk_JQa}BpXbUX!j1Leei+oZF?FpX3DC!wCMLXK;Vmz zr`|J5(pDlU7El+f2O&{erR}P<#+ZKr2XOa^6_AhJpf=G;M@t?!i*zfh`^>rsa~$Zm zaHaHqp~2S+DY7RrSHm1fAy#wEHGo$FSsx4>XUsitbs}*EEKwX9qQsNz4IK(SF~xeW zHhnG{zljRLS2O_4x@SOSK{`jT3zA^X*PkI;AZFb!AzlasF4BQpEdLtBdGOd^aLN|5 zmx^uwOL90Yq6p(ebM9c1iq2?>KE&F9r60zAwB-Sy00@a&mXQ~y5UETT_<+YDVZ6&K zSIH+v1joXl-^^X7ziqH!EEUw#sea^$Ut6hlPPVY;GS*^L()d6>54WX|b%x#;ZW>J11S=BcYtKY)UrE5> z$0>3wtxQj)lx`}hESUnGuPB7uDmC=PNk@g}aS9<$Cm@Go`SSA@MHwz+j3@H0;}=d{ zIBs}4$d_FLD4sg65JkZS!t;be#E3GFAXu?JL*N)ym&H*b%KkeP{0f33ku@~*;u7Xb zr78FS+kx!e2*80Ex4}=}+`-57jf?x1jw~HrI=Xmp?$}R#wez=@HhuL=b6-k#zcBZu z$4%YK$1+X9Y*TQ-`RPyVp}F$j;NsxivDHd{y0ZOobAP5elx+^poq~Fkr|OZr`=Psg z`S{BI2NN0hP}WTv6$NL=(_FB(Rkh|CHZNStHf&zL{a{nN;V}L_?h(HQsj_zCCqp>i z@*lMQ{kG+cnU)}&AuJrtwe>;5)X5RAlHN&TWxF3-;%4TeZTDMW$(Ec-3#u= zHT8?`rP_OKdRZv0=ueagGoP|5Q;>uC!`^R2@7;JMB?myXi?8g^> zG?LkQA-nTJrt_6-=PTbBT0H&Cbbr(0%S*4kcV_X-0{*S~TZm^Fpt$%)wJ3N{1&aKl z8U~QCDk9OQ7UX;z(4AG?C7T5PTXW0eTR1bn$P8;HXSaZaSpMSZLZs4{v^`>C0nOI_yE?U}*RRXLv$K9jgprZwAFEH1Nj%Ht8 zn+Z=!9N~^b-DjOpG;@8+@jTr5JC4$9yLGgCiZp@ffcYdCL14p_$>kHS$+A0T?E0!~ zmfc^$nT6{^FcQC`vs>?!r*u_tuvHA!TM6%;s@K4DDRCoN}|3r2-tq0-ck{8`@IlLWuqZUkaiKZ9asy3E}F(x}Zi<$OQ+4fU&=W=a(m+qw7 z_KLqpZ7)7-dok1YQnu}-xwAiQgh}oD@vq01Kc8vbnQh!TSGnrL9%J*==e%`uCsy6N z)7HP$s?dzzs$R)fy)tKi?5>=5FVwy3o%hc1KbBRnmy$8GPrqnd z({z5)j({9zn)RS(ZQ!KaiIa|rY@2C1G7$sgil(csVu869!Y~ph^pWbOo8>HjiQ+5@ z5_u@U62Z1s`Bgmq3iT!lBjEhq*F2Y+zr6%^l)>fA2I{O)(ci2-Y{L_`vaUdgi8}f&vc(WM;2aQ*4=H-4y#Xiv2kS zUbb-EGi=7M5L_vv6ue0V9HxNunv_O*M!|8y9BDPb zYx-BP*OQSu1>2>~19#6Y>{xtZY0KhEX(x=_`!mk|)u#5e)4#f*EA4Ds?LgQHBgYfA z)3!pn&vhQAoD{CYI{o@m{d}U};)i9zc>I-Y&z=WkAMg17o(I>nJx8*wN7a|yWHjwD z-WR2)VVBp{ytoyZT@MDc{fGEjanNpa4U(}beu{%Ko9mcu>2-R1 z%ti*0^jjiCz9HMvNlF>AtvJMQiLhGQvbEspb)h5#t3b(wjlPQ>l}Wyu`SFE|^EV3R zbng~c{d==D-Qt}J2{z_1HKjzaR8d=~q8OEA3NG1PuGei#SIM;XbsNmZFFzQ%|Ax5x z_?7Qp{$%L;>YaFI39Fs13$~>#K%wxv9QhzBVkJUvo2zLV8S(QV$v+=|@%uN^CoX4S zLU-Y5aWE)sYRe?JHGsQ=-hQ|{C{&ia+R65`U5tP2z1HQSdmFRW!GeoYRO5N_Vo*-^ zZei13znCa^=)OW~?H6TuMb}i((`u=rsolnejqBtQLnV2OD(fnbdisr*NB?c@(q7Yd{Ye}UWKm-&juGzY6S3Y zkge-l-nC-8?^+(r)`bc#N!#qa&F<=hn*{(CBIF~0BOlj( zAGz>k-9RizvkPS=^Y)LT+fiW=xyEQtn7J?w_$p0s+H3aRmzn{4UL%Wwd6OqqH5ig>UC3m>!#F1 zE9F}JufzX({P)ZD@zyzL_`?{uYQ!s(A+R5BS8JoPeqW6{`MsuhydysKy)qaTlc{ix zUXCuJHMbkNT9B)jbG1h6xE5t{8=lp#ebYRqc(Wb3{LjqQfm{uGE}f!~HyC}6vNj@D zqnfJ;_W|5DtM}BFPTaT1+vVHsgIw)J&&X`Gqv+WdJljz8tQXHV z^0Od%UGFV(n|VA+rocS55AO%~eHt|brk(Ouq;zshe-uXG=F;T>Q!kY9D26bKU31c# zwvlciU_00YQRFW{g$@bHA=vvs$BA5kEG9O_W|1=SJg-1K>W0atRxm#yKZq*hz}$%d zV(Ni~6ky>WQ47$x%R(5TE4Yc*RbdIO;>OzQj0*;Y*vbS^iGrnK|?gkX&27iuqSWx}wQdsm}q)L+sxgk&1ba*bUt z98iHnZ9F=n>O12hpZKKusa0!5Dt@9x6eAl!7E_7=DycDM^E|F~(9= zhJS6qG0{PX4-8PdO;Y=!QRZ7wqzN8K%~VK3(7PmHCanM+t}OM6Cz$6IjwQKz)L+O; zYOgF2=JVsPLFWLcL=i6shS-Mi1FbDJQhF7^L|`GjRx?pgngr&`sWMqnEB)P~2vi%Q zabm`h+z$l^JqcMhbrCCAsPO#MYL#dPI)}VE^J^OL$7DGg9}HZJ!5@LzDMELHIZq6Z z5HaA0LrslXeGz^E;4qbhmV;<&a+*{>;B}IZ+QA|WQ*Y?pv%*AV9pweB?Pf@$PSXok z*VEF>ogI4PM@I$lkP?KLk)!I7pO9GT%DO6t2S=*os86iB7&T(UL32be2Umh5TBw!o z8Q`hS-LBVCNWf^;kZmmrped`Btj$>3a-LG&UXxJLEKw_(CMeuAowx?22E)u}GnYow z3*DqU1F#lH!$16)=Z*6hE}c3*eDMpHP6+86Sz0Oo9Qa^JIHkResImtSamFOCxA_WV zRP#PD+mc~OOrg00z1pHBDDNw3lyU$C<|_;^6TSedGz=8K;8O@gi~oekH*8j8BCCpE zX+AdTpBF1=f!{2Jb%m{2=alU#SW;oo9^!&!tQ4j%^98j~DXim>vu@m#>1j~?3=_wm zuUQZ7bWBX9GIiQvwgPuLE;n0=J6(x&){8r@R*K=vpepZzz6->U%q60M5aU2YpvV+J z^d~7%3a%o^d(A7pa*du-7b`Ku;J^J_6lbGxePoLZ;NQD~ z!$g&&lXip^P&iCeF&zG<=*Q$8BtcjF7aJr`^}FTs<&WIW58cg6{`AIe8Ta$D!>qB(Ocko|a1^M$oUxqu=u<9`!Bd7tL$LM1!26Dg@@l;5Eom4vjZsn(OXcoNRk znR|$Fp5$Lp7m><1e3n$z&cA_EVH;Z?HTFGh>|5EDY221=+y)U=Wh0#~UE95|GmYRa z1an7MjbmbO0c^*p3$&{Y5$+OF*P$+1)>16L#fvkaj=s(mFf1iyTWPQ^J{PqZHIaF7 zo=Lv0z`(sUoD-6+gP4k05_DfuHL=M%*{uOS1x7t)NhmQgVW!H|bm%kLEGwU&-NQj= z-anRrz!0||WosQ^bReGCcaB~>d7N*n8pevwyv>-4fo^IO$pp0B;i zXQP6UQ`P)Mr-Cd5jdPWlJXr7u5KN1pY1z{$6euyU6@X@y1D(}jQrju#76rTCtO3q$GMttY@<{q&R0ltY@WQ=C5dI$#oZo)-Cn+XSWn+Me6ggv>2mPH6P?H&kt5zzQIJo0XN=-sm7x?hp;?#g<1 zrMt-UR`bA>K zjOpC5R16?#Fx7;%ud)T545ux>4tQo7RhdAHXnxHJqtZ(`%ow)Uj3IDx(Pna+R-UGH zz^sM2IcbKX@S+>hHl&C9#9-FrC(40>TVB)(o8 zcHN$?+_dTqrLBLffxhL6m4lhUzHDIM+_9{;1E*SNeSx(5|E2ED!{fTHJHc9kDxeBg zg(~b@VIg*a#KH~S2`(Zfk&;MRHe;KFP(=zN2~e*9QG@}RlGO>IFfB--T8Kj>Wrudd z5#?YqOg^N?Nod9H&z?VKs_?yO)Q4`SnVFF%nVHT9HSNU7%w*r*-gT=*4-wIhz!;jQ+SRBBQ|H@vZSv}wmEsW=nqKpmeCsnIx@TNOXoQ9jSY z&qJ7wq(=?Yc>X4CboL8R9cK>5AyLWPSTTT${;Y2tp?g!uqZKi2(6G<=sKTt)<^W(I zoD<&*N>Lxqr9VZae;;l=pzR5?MZZKmfz8j9DO4`%m4msSh67F3N_b$0o;ofw3mmJ;&kAd)8lW$JWPFR zMjLzn5H}B^G;*-0ZAoM~`^d>=v8^*JAV@s-^vHu^2v!rK#9sQ4q2XCWN~XpR&GH1~XnAozYr% zwg-ysG&SA_c@h(4;z3@N%`Pn_ETbh_@~#FA!zxF#TBJNtLS6MM_acZK1MXYY_O;p5 z5Z)1L^v|P>pwXAJ%1$<;h}cJB@toYA_H@afu9T;XnMzg5o+^OFRir%~vZo{E>ENf8 z%bv>lzN9zpX_r0iDfO4#wzZY@FC%&8mGx_VpLY1oy?unQ_1!!GqQ zJ}~SSs@Gt+TeSDru|w{>m1mg>KxIjv#n7v<)AcZ|_!hj@dxRmHp->&`V1!tdCDz0C zpx*dkbdR?D$v$gGrM69U`vdwaK!$y6gN%oG>DN)8(sek{U}J{(zo7^3!2yB}aJEKB zM?fFPrFnW25X>RGAAKl|wMcWcS0s4V+A{VkOwL9BfLS zOb6TLAk@X$$-=I9%U;O1ZU-6HH9XS;uv|fT$@0W{n~wx?DjApYqfqJoe&j`d1H(8}!Z&tGOAt?O3RwG!UXi0Mz^CCLm6)`h*AA?@0P`$?< z6*1im9CHY9z+nAq9t*$3R`bD~;l4)v=~a*DL$M3^j`wkyqs~3(b?Qd6)y52VE7Fv7 zgL+e`r8g-FK2Lq=ukk4)GLa5-$f1sz{TY1nY9<(Y zukfA1`TcJPt_S7=?ko+< z!G>giI@l@)TT{VS>MY_dd!f$KMxDj*Ob@_vrF51Dc!j}fyoDn`Ogl>V7dbyFa_uk9 z|ERZE%fW;{04Vk`K&^l|$$>0qZE>`VnasVR!L?1h?Q7d1u0Gk%fF zQJUfdyn2yjPPb@^-qL-Y&hK`*_HD}lZl4`4gTI>EBgu}?;^O|FfPski=tvwju4kn| zBV#+U(`axUOb_F-WSusJ@3oe9D~p|kFmev7=5~qpYg>oVvTS`YGb<;FHRXWJ0&4#Q z{EOrBNd2^H+A-}mLYb13&N?KOB`z~-3{zP((C_nd1Fd0!<-$@3G3p?2jBuGh?YLG0 z7Vs66lSXDHBvYxMM=5D?JZkFcY=oGKIb*Kz8vU)6MQn~cY0!h!zlph%LH$m@8gDdQ zH|f{b#htl)t>tZgOJmZM{WOV(@PQmh)a#@MlBPbPGd4#wAK77nUy%nZxY7)KLSBS4 z`6inWlT;pIa$?Q{rx{eMG^7cBMq9rG8PLRZ+hofF{XsWW@hIJ)z)OYv((AaEs9=Or z9mUHkozkzNg-NVgcb=Z{bQ~69>4MVVPa9n|u7@l8uXnODF&I^uIg(gA?gpPs_WWPM16*mpp?3(R+~8>)?WHsH|J5>|3tv zTO3@9ERClt56G1VW*?t9IM+Yd&$L3mw}`fZkaAopDaVzPxVypfOk`&!vg5UZ((w=;+^LC;opAYt1o;b@nPSh>uayxd^KIWMXud4*PJfiDi?44q%hB4 z^kbkX09%xtpba8r&TF2Grw}4zE1u}GCz>pk>o=!8TV&6clxGXdbEYtxudl6m|7X;c zg&=s$NDx>>SJvUq7?_II4mj;F(!9o1?G*NxtcY_lH`cJ26pR>jm>MX(e7sf;ja$1( zJWP9cmb7o}y84LF!;O(~4bNo!;h^6T&=q?_nhHXzkrC9UaYPiAc8PU5fHtRd7ALo= zJVh)lpBs{hDLKG9QNx1Y7yT0LcGgSNEX%9$AG@V0>Pb!r5d%-garWFvoSf)R$H0js ziAUx$ihjyMk30lKQ6wzWDzs^7gH+``azFh~cwlCD|5rSjgyCwj&n>k2=c)I-ffojT zqszPbZfRL2c;pkOqYNz$&i_^vdGqXi(~Y*7v+1HHxu^-~8ve*n@@)RlyCrj%lbcha zwsfdX4z(?er+ocsU%%|@#|5oxcVQG^40KbLAtx0i}@(rvxZN3fg z#Z6V(gw$jMm1~XmM<|eY?Z4vq71yu0bAXjQqz`Ao$JQAvxf|^_5sA)uPW(D%V9b=+ zhgE0>bMEw;ZeydKbw2>?ynoiMH{V1T?lejv(SkWPC(8xCG-+G&tTV37M!=HL=I#lb zWWV+V7O6RBYz%Ua8TVOd%=w1roDE@XQpsPpsMkOOF0x;n~%7F3FnYgjzSUeiiiupqvau|9K*u52Kv4gUDM3 zI6sSvcbyu*dB^&4u(KB4-S3qF@>~F+Yay=#Y~D%yJgE=fAUd}lF*36aJLOyPNC;`S z(^Kx&L?8&jZeW-zlBV0>Z?a7tmQ3gsaf1}Cigf;`G-91XI9br;_sXjwNc!HF-}!QK zGF{dym-Vg@7I`Mpz|iIKTQ8;}+taX59ofF-#0#*SayvW@wS}bZlmkjUwt^Bv7e*&8 zGHE5?%72+&l4R|whcW&E!!0?qEMLS6DM8Mkk;9yguh84`lVW4iY~bVtGl2dWd&!>{c(9ia`T7H>GB@A9M;9Xp&Gy` zT%Uq%`A`icqiPy%9D@~kTo>4CqAS(?%hmmh&)z~^AaD78%PVDF%Vh*L zGLSCYEti4*+ar7Sq&#~vfl>uoy{!=F7&s*APA3l?Is~eI4wr3B(ow3#QF6w}xkOGs zIk~Vfh^H$cFGk1M|4Ycx>QOIZLwel28ZQKNG?POEih&Om*l08p3(N9 zMEfWbv6h)5CJ}={5dSp6bK6?=D+cz43199s)+pSV;L)~MaHf07D>>I(Xfx$-&|uWR zHAf49Xpr++J7Z&Hw(iLEZplQOG7Zg{=JrenUq?4&%BnL}(Y2~NHxS0)7;rP_(F0&J z=rtP}Z=Zkq#;FA-kRhI3D3ELVnckFLFBN`R*P9^1w-0K=0vegHxREE+*Iv zoEGYDH7{1l?YsES>J;a>_uDBEbY6T?obSZMIfoncB1Cw{X>s4}LrZK32A{h6h~+mLC)jnxU3x$BeY(KrD>VRESzJ(TaPPOsZtI)9k}K1vsM^2zEH zQK=l}LLk%<+*zICB7)F>L+^1~Ji#Zc6AidKC@P#5QEE8dImsuh(|}h=#E8?9pHF0h z9(Pu!p}^fn03$dpUgXmcTzs-RsM)S0iVdg5FYxKkIG?Oeaj82(6^xS(i-H>+6$Ll^ z+Td&|bnhTQ6r2Pe3NHB0;8fNNEEJpw3k4@577A|p*`qo<84hEl&<+*l{=N$&vlZkb z<~RjNwo`5s#6^9~4GY;C=^OXx>E$6RNF3?xv*FcJa4NciDHBaq{imYiWKFcLwAkx;)2s^w+Ot>QBTpP?A} zECzH0#VjBU!gwBzH2~_s%W)TIVMNZ^;}K&%0OU{tAcqojD6vvNCY18CGNd+V8aU*f zZi}cz}xaih(W7FgpsobP0uSe@3!^Qeb%sR4%moF9OSqbN$Dmcb_Kz+q^VNU3A!>!82( z35!jtCOfV4Y0E)CPH48lgzYfsz5{_?;SG>PJTn3;U<*6yhi~KSJ z64Jf@e`w>Yn)MJwQ$fYQsmjy}tb_uHL0TZFQL+kvM!`J=Vs;aRw9j4SfyqV_ zK?hNA0R&iv9$%DE7fp%bbv}>XJ$3Sbjcv52h!h8q+>EHuc7hpca<;;{%0sgS`zzBw+f zew3l4TPSZK8w8|5#fzq_AcIFQ0NFuO(O7i+3q{h+k_;1w0Ts5=qL2y+a4&4RPR*vF zgko_rL-4$4PU=uND8@NOMeO9EW6YLVEzR8(d9P))SZ_*d)0GZkkY5d06574$<}?YF ze{BweSK`Ca?0KKKSfrHgFxmbwvmkX#Q?SWIyzG49U}MY5c@?@BKG7KVZ`bkwX6MFflhws3&v>!= z9c0K%yn3m0%A-?YiNJW7?i297D1#4Z0m{eg_G{e)4?zDwrkrdC(&>}?jveTU{?fi@ z4xji!H!vZ7NqN?*KcnZ+JQaTR$CEpsG)`6A%ecw2d5MQ~s_r(QV9M|^ouLN4gLF!N zOb*w0P}x1xx`@!pK8&2KdQ=>sRgVM^OPF?vNsr-$iki;+dJd06)&iCOgo6K5a&%@7 zk$cqC`B3;h3`S7G`BR#4w~9#cBVzZg;v3@iM4&SLYi`0MkQtD`(~|PEBun6k-@U?0 z(kgA(ma5%0bNrqPIMBS400$cH71pE*H)LR?*XHzZ&un;Fz+B(kuniaY8v4moU8bZG zUS623ADde*`o+uWVe4)gOj#@`5p48T`?V@C{Iwp5)N2Poqmd82ckrgZ)>}1ixQN-U zJ8UdK<6cLa%_0$s5yZ8VLg7Di?}fFi!rW4s*DgbzO&cwYsi6@`A1!WKAiQb2oqP8o zsRP+-b3l$>48#fUSJ+iPPwhX6Af;{O43P7Gkn?-w{2e*e15NwSm*|`Clf!*$E8auG zY~uOTV9yIS7j3GTJ5dr(CM!&x$cSj*L+%nm1c{Ec9-;x{={@%%ic&iy$08ka1WW?2 z7XtQhAdXL(+|A3S5Gz|aAoM$D4&MWB@ynTD`MuJLmC}yo(vF40>C%3=v>&fRX&|4E;)x;j#MqDf+RuSim$STNj&dLrA(j?b#)JcBMSKpwfa{mgxc1{QeE@k2bjW zw|PJ6w8J&^Me2v#7hlE2FQzY|y4O~mjg_yt8T>Qne&s}?N#oxBJVN&$NO0!XKJ*;6~8NFGUhx@Avy z%G1qa{ME~z>iH8%6k@0B=}f6VQHt{j!qgVEQl#4X71*<;4dQWJt4GXXyaPAJ4vr5b z5#I2Tk`j$pLw|^B0OAxWdgLI2iKtf!!?L)=I<-I2OV5bRMT3run^mFu#f-G+Y)Dj#5k!~#*O`-wGP!{HTC=%=E3lmN% z7@to1YGJgpR%INpgb6lKZTt-C+hkFIM2Ph-5!G33MWqF!ub0|rsd*XO6Lh9hNK0q5rK@XX6c}~5RF?L;di%_u;dvB+wz9vr0WFslBppg2_4gK-UQt52EvpDi zf+%DKO->;`Tg3;Rs6ixZ{m7Iy+adhv5i83lrOogv*u45hGgI3r>psy!*wT#d#`E9>yOkR9;eA*KjOq}nkjFZ_a&c8mG6ca zQTcB1TYOoZ=iHgH^0}AhOHyT7n0Lg>zqWUGOcHPL8)PY;bb8{0( z(R(HW{ztl^X@vLUIiF`RQmFa#YU!Tb_$f1bfU-qW0K65Ssj8E!HqAT%o&8jxF?ktI zrWNL^V1J1+{X2Po{L-D)^tQ+4ZIA!p>2%w1x$St$cbwGt z>y!I4piqy960nQhDi$UCS!`U zpujb8pS1{WL-1*bQQ*s}epK3KSlzL^Ff6)bSW=NEcd zP}@bR&#k>TWm(z59(Vq_Ir8MlQSVf~bP{y7VZhP~!8WdmNMo&Nv65}3yA|~fq(1wY z%3jRRHHuq%wAPZ9qT2euT63{Uhnf;?E(lUcJiV1>sdg2C66J!Y%WJ~0>5XKe4;(TplNBM#P4 zB*F1-<8u{Za1fs+Xw{?Y4zgI3dDO8G-Qx%SiQTD1V7RpbT~$!*6N$!{Noo z#i85H-#UNmym)4GdC*w(3@VHBwnD>doS_4G6-9}aejh=vIxh~rA|z23=ox8sN#CNZ zcnuOwyf~m`I-pgxEi8$0DUoXYs!IY3n?=PEB36X5MC^UlO^*fDW{}g&w{Iw z(iu;tvUa7ibGee>l`4DWN{pu-??!fJj%I+zRot-5RwD}1#gH=Tn;EO z@wG`>FvGZA`8{9ct>bSVpFgz_PE~iMeciGOp#pJNUts2y*{7>BzB}gRG06X#}^x;b&`no8Au070eH2$|@D1qh5%KBcxtZ{DX=_sp)t>H>_=uEXk%)InG*vw;q&_HX)i;j(pj>XWT$FPZm01JNOFBMlry18sjab?u)j`%VYf&Sk z^}>_`A)^w+Avw<3MgfIsp0&;<%~2W$A|qY}MX=@(`4|zC=m> z3OR4UX$uIphL`4Oo|(TxS3G5NZV!=9R`O)hoTq7$S{S?Va$J@9lKu^OVvCHlgC-G) zukKlM3H@gZ^V{@_zL$tWBdGU(j~BF)$95PJV&*401B?Z6DAPYBWip(j5Wh@iMPlbd zNx|XtR(zx9CMZ~3d%vb?pd|-X^(s zD{6nE>_*vd*M7AYD0>y1az!Uw@SfkZ7`a`U>KI(;UFf}2oUS?`S3#*j|Iir7Cma+M z;k00lZ?mtNWM0QJROW)DtNQNKsj{|oNxKYKE?qz-Jup<}TG#8dbjj6!K9P5p_FVkP9t!K_D2b=E(OWw}Ep8sCaJ4N#ec!OofRIo8qS+i2vzFgV9 z0AlD)W2&+}U3o~ZJT#Y|DS_;@Jw$Pl3q$Dhdlt6d+OyKJZ@FXNotAXRQMu!2y6SPc z>Tz0fs2+_U(c0q)J1su6w|+hO#;gDU9@zo{yp}oTtD-jsFpxZvJh2!fDzf3OFEo4j+Tpj3y?JcDFYT+7 zeRU~c9V)ZD5_D)W1Ro0hTOO_U)cVOps$o?kQ&md_EIWJF3T;&#pV;!MilHQ2RXmqZ znh_Q61>OlH^EF(O%!baJpI_{SRL7ia?%eeYYh|`DKe?n#bW3ANn7nUoIAp3LOSK`YUuKwH2 z`!+kjyVzws{+ zgoWj1p&9;+Chq@&B)|Ypo-I-hJKCWehtuIEIot&HTXj>)Q-KL75MC*&T`r={{KwKo zU2;*^j1%)RSZ6!t`{b&=RMj5ld~IAV+qmdSmu;8Jw(}6EG3Y$$;vTuUXJ&9MC_YQb zb^S9t?gq-|%hQ1dIna>okpoc4vimm@$Bc$JXY$0&&!&S=6YEX|yA{j@nq+&^C4F*9 z-%82Aa>+ny@6)N00Riuj_MMP@CsMu>7(r8k)|ppkUP&HUXj~Xy+_$)YasRDXQh}{0 z&sHYTxF}8ilUf4z&mb<)KjEs!>vov`{*nc9fDJ+F(*CsL*$GZHHpIm)F__gFciJkq zs=#K`j=F|UM1r;ImuHT_rkK$HLNihadRK1_M828907%wqvfMs#QnnXglL#?G0v%| zgy=tt(tM{;%%hVVwjyAzwcv}iA=9O9yBK6M6fuN*FS0ue4M8;`n%%JW40=?)Z=P&35OVDnkTPjKEkI4CVa7e#gRsAMaHP%=AA%>a6 zZj4PRO7(BeQAVoYB=K?uMfx-ZEIe709=6D8%L9g8^_lQ>E4IM?3$mhiiFpFH;*nPpqG4b zVNz}ykSlhGSc1Y@e29D&lVWz5t|;!D&J*^aP|U_DOEDYI0B5j{)8rJ|(KzYa(YQfF zTE{7HK;ajwKAcE17$?#U#%X=W(?PMrNkTOkrzQJ$3hwN?)As}Woh|Y<0A8u@4Oge^ zm568SnhmGLX+He`;`+F=I@|p2a#AeDNmne!jjmXX8-AVBsoigPw~&r8orRJyU5Wd3 z-Nzgi?roWH<(iYu4UIRO7s59?`0k#!;9A*S=z8V+;Ptv>{mu4;=j4XXi!a@Nd1?4I z%vBf7NAHkbV~8sHd=ncghtv-~!=VTc;S6 zh4pPer~^B9B0zjuVEIzpo-l@DlteH-kNfm6jmpIOQ^dq70;IkjtAyINF`a(hAJn#u zZ``_?FrI7d>$pD-;S>EUybEy2z%l03=tuVrwQ%=~LDhfE6LXyPu!6Q13fiGq71X~y z4@e>T&x;j8NxB%}Xd*2!AMPSrsD5J{#&pCyNV_Xm^oGkkkDn?rg%&V=9}Al9Jh;_i{FEX$ zdi^{sZ=X6ph}F;rQKFIT6#V0ss5u4ZJEW%sC0ZIQjhDsB00}^?hUg+bOuZy8Rt}%# z?2~+HT_tYlnJD23_^M>(^eRx8)vIpS1s{46T%CPUmVYM6D9GPneW1|jBvZ{=r}|nA zZxu{DMXOV>@J>=wMjdou;L+EbZhLeT5&^WAfmPn%g^}U&3i+>){5hidfP>bRU$Whhe7)i$e;YK4%5jb(YHp6HbFH+?*IArBr=MWc{uaX1Pbe zmtkpUs3dEvnE_Jp95^#5QqoNkpP?)dvpph~UZ<3qv}!+vo~jr%dFG5#=m~7#s0QjuWzt+$iYJ8=p%m@0RloB5 zG^c#EkgHML2=y#h)M7P9+8r}-P-u}$V)c^W3<_{EO(4+ zJqSp7n1#h*<`7Cgwq@+dTCzhG1j@78BAmA{Et1(3Brgm}*zP@&#I}7QMEGhiDpA>N z-}V~srtH7&xK^x6WE0?{BKfy!A2#wdU|E>j63P{pg&VlzY6_o*g`MVSBS?otBO-;g zU)fRdOAZlnmD+k_-hLx5X~%{5scW|Lv@GDI$6{6bwHb~t5YQQMaZ^h$( z-EL}7B!dC&4-iXH^B-sp3XEU7Q7diA!DO0{SN+N}imnevQfT!?(5t9m$K19I09 z2o5yD(jcStal9s202TOx7>B}#I((|#6CMdm!6415*($~GPN8tX-9Q+X4xnVfaNv6W z39h9l$l)fSunq_50lhb|4p$4whME%NWJpxM;ZZ-efG6=48h{7OyHucVE^+-8Y-AP& zW_I2!u1Zz+3JFZuK)egvEeDcK3(mz@%CjTw*&%y&;38AY7S!irX-^d_5~)UsU>BaF zJAIn82f81`jnwqnn05FqhhT>O1P$ES+azMLO!`G0lq~J0^y44t&+I>Vr%|*pX1M<~ zo|+_s5uA-E+WXYrz%Ep!4+OvRG{r`(5F8F6*P0``eTeG5!lOjX-nr!D2u;z@P{h#y zj*a!&0Do!(KXpU4!#VAowMzrWRy%8txilKVX66=38^$S*%3+ldi`mbESU~MNW*t(& zQL;gUyAKrKHpoWJ+CPu9Ogm$FZ`vVurS%A@Zq|`|vnFPd2ftci{0^Y4`P_Fr<324K zgLZMuYkE#{cYGL0yI6q{oq(n4+yFl%qO%Yhe$bG4tq?LTIGfAj1fGFV@(l%;LSlX+4%YsM4bu7G#`FmeJD$Q9bHJi;)3#ys0q{ zsPiypVZ-b`auJ$QBLL0-YL2QpDD>q7@d5NwL6ulX64*x55<|LFlu`w0!_Ze%N&yWt zdJ+W9L}GmG;>e@`Q&B_axt+%qaDD;lfm~=oE2NR)Rm}Xz0qCU>XfnnPoZsBUNRJj0 zCxP}u^io%;kV}^?j6gq3fh{6ULEyu@5KoYmPVM{L;hQzh_L0^Y51tQAHzkJ-u^ngU zfkN59+xl!G9&J&w+}hrL{xX5Ox3y9+4?TY&-qu3Ip)y$ORo%^l!m4xlLW0$hy0gWh zXcW=e&Dei%;BVGBOQKFLB6y}Oy?7c*WJ&G^R>ullOf!{2eSFI<{TO{$)rR6xo`*N) zIMWy>mD z9G#U)Oi-2ItPR$yF6vtnrJMs28eSx-w0GSB`4DB`K0<@g01+__HZP1kDli%fm`2}L zmMaF>g}3zG$L3Ea>u)@lj%<)4*p$ShkAva418;k;d*`2ir)aJy`SKjxOyIFkoVHNi zbzI*ot(-kPbCN`R$V#7FSVQE_#$@xqZU1`v!n5gyKDnVU)vzN|9hIxQXAaG6o_!LW zZExB8A%e2}Fm$UVc~q_dk%VV|aF|bz>=eL2ERkK|>bdRnC*R(4eNW2QaE}%K#ni(? zKMH^jl$;=>a?Wsni`T~abk)s+-ejR@C44hRJ#`Y0D~V_S^PM_h+xy5G)|1b0uLKi6`*yBe1AYC%!fM7j;=TP zYP>tFo3u$5ldthPQ7e3yC*N41Y0C9I!j$VDf+)IepRnTjX{KCmSr}%u;s0lta5;=m zJKc(iX)3}zqLS^ufXP;bn`5etDpM7EP$pO{*Z*QBT4U;s{lh@9fGaH)%zp(FfUQ5QK_qXgGA8pP?eSA9qVgd zn_dY-mjlrx#AV4zBn zW)dh-{cp|Tr(Jq-T5Y{su0A=}1LG<~H_j%XyD_d(X1T*D4O zKg_d*BiGwAKL54DbNl2-Q}V<@OY-w_q!*j!N0% zLKvUK7b@l2{*>$BQW+fa!%&eIWN-J}d2gIrb2!{PGr*32cFjpw%`G?Md`0`$m2*#D zKLsJfr*A%+ERah&pj5kXE*04fV%VaPcx6@zZiR z_>Y&vb}ff=C31+XPnARXU$dE=&)V$*!W}2t{Kv_#`Hwq(WN`BA?hUm0kCVRnj~jmS zV26h;K_j4pYKKbZ-v1FES#i#JgS;r_jJtH~hj^aOZHu`~Z(I-C;>Sj|OV<^P<;B#^ z?tE-^7tm%jKXb*r*xW0`*0+x^&an+|jNiBom>2WGXA%1(UlpnHb|5Ulo=&~1UuAf3bB97_Qbh%R3+ z(W-DwXx~mi(PEbn%o512g7wXuG7b|e#Y1FZ3rhcBt^gaD0G-UJz#P%g@NoPRuy*xL zz1Yavvq0AxMIy|YpkTBm#wMg;q)TP6DJ&X1u;4^6zb_7ZU@Gc^+KClPJyM+XG1X4Jvz|-a{$rUJ}>u;YOL$&_w z+h>>TB+_`AW>-Em7B=+GsNTgskr(ex8$gC!ck#^H2fJSl<74t|ml0`L|j47iVI3|0*E2MTc8oz9A zNyOWuN)?!G8d$s3eGD6VTr8|hr))TY-)tgXRtt#xDr$DJI=h7Qw|_!qREum}wcYdh zuK89xZ0H{Nc+Ij0)UxsuV^=r)WmAl_$e|Ls|2iCVX+Yt03yUVBinEVwv1TyOU9VMR zs|)!NhZHhyAWYE)naixe43?v7*g@*z*S6}-3NTyLcBq1+L*&r5liIeld`SO5uf7dO zF&Bk?AvktSpVnlToPk#Th>Gru_!hKkX(g1LV34tr9T?LMm92ytmqU%o!G-d4s8_X(XVF0W!HgbYY*+b8);c^ExfSgNJnsLeWID`#dxy z80tDosT(C{jGRm4=u|w@=}d65=&Mer`>7!^P0kXu+$7hh$vxzooZqGF5Z!N}$=4kD zM3IwIN|Lhu+t%_uWSRwzfp(@xP}vMa7INQ>L&=?THB5>32(KPN9(&180a3?=Y5*LH z)rmMDo%saOoh^$e`DArG1u!sk8H%Fr2vJZt87L^+@gsv%p69M43JNEkg2D|yd9WjD zgG-2%tWB&I7as5^^jTb(JH?c39ObDV7U_)qar#m@upN(5R}bqp2u5uCY%s|VMASR7%eBfH8jBW7(li;Veb8BP_8^ZBG zyv@6ASne0K@8PFNjqjWdciJ0c$i{0!ELIU&Eu?rLW(w<^bG?uap%t3a8#KJ}v4tRG z$r$Y#72z#e_#u(d++{~1d^t;goqUBXA(`{#;oRso<9;!umSC({Pc_2Oo*Qf17^m@C z|1uViInP!?coG7&u`t4+ok~7n8EM@bV&TRJ{6nmjtrL|%$Z?%~$EeIG z7k+Z)V!h`U+d(8oSr#u>QU!5I^Xz=8LU}_rhAI(em6{$1Mfb<5(2lBOHJnmo&1!8_ zFEa>t*1lnpoj6r(330OsQOUb8L}P7gq2p_<=09!UKzgFt>CtobPn3pww4v%)L%fD_ zPVFi$)`+sM<@+Y&P#xPKCXPET@5Yvy)lxKH@u<-s!rp+e>pARZV`vc@{&ax306K0*j>@Yf`Ag_!iZG_+lW)(&4Aa`-aj)X;`pu@3leX8(^`Hl2t)XAgNm zsjc&csVqIQE~KR;XWI2%OQQ1zk!w?4y77Ih_I=JYqJ%cWSDWIC#PB!azMb!TzzLx- zLi^GZ9-XG_M{F%?gmX$8hr&tNL0u7?uJzNnR5%C#+1-6{->p zDTs7Iy_iIrSv)ctJ;?QnhM?B!Q$y0w#gq8pOm`HsK#UlDC}`*3=IH&xo8oe zDBYn8R6=M-rY{w+a!~@xjYN=eFkTg4>dY_V$^ey@QYwrnrdtm zWuSB`n3#SZ*(1Y%YPnFh(O`yOK%E^Si)`aaa1TV7sFeu>04>9MOXDSq;Lnav5DRu> z6jld@ViYtDA$THIG1L%s(&Ao*msmzoOe~yCtEQG* z7Ro5m5TYEvqHtElH*F}$vk09d+SP^JL9HA-S>VY7;~&Y*ktiOL6ng62s4Uku9gqQ$1Yr`@_@H*X6c4j4XQbp27C5lf) z;t&F~m~LR$Ldzm582y5#X_O>{T4>3GY>54#Si)8XgC=)E*g+Up&K;uv*AkI7(qFM8d;F zZ_k`j>QnS0Bolpw2W>(>5mwW5iULg%z2W(>iBaSHp$rZ@GT^nCd4wdiHWKJvNNL8R zT8!fd6}K|*@dSubhVfhB5W2;A(xL76X_52n^Qcjt5F{~zQ3FN+ zK|AKc*eHfbH50H&!bvlvMJWm`R`qkPF~;FJ({0TR>Q)bir#Exqo5E-Xj+r{OqyWo!aZu@5*pj5!Td+Q>PSv>-%>$6{DK4kboZW2>uPEjh;yom?&CJF%h? z(nNoT4TaTwr71}N9agTZZf8EMjEEqd8m1mxq$j087rYs;K!AE5Ch4H z|NC#kr5!-*$!Y&d)tBi!Wxr&P*{8f_Zaj$~VVhXnEi`T!~Sk~Td&?8&0eKG5ndfn8ccshjps z`Ct2e7y;SkwT*Y^{>QuY>nXqaTPqOww12d=(Kg<#f6-)8t&>{+^i;Qtk6+I+w-d~b7kN4;~ zu;zIxPf1}D;&H?ZQFgxRfH9Vse=2}_C{k*}V#@P%l(jH(Ydp6FjtLDxYM&=3gDu?A zTf`z0liOq@N(R?xI%(svk14}Rzdk-;*(#AT;ABsWGGypqD^ufTT9~w`vuX=b0OOch zyC)xC_Y;tZL{7snTkda}Zcr0jzbo3)J=w8tU?L19XTozKcE2u0FT_XBjlZy(C(e@v zdI*!nq6h?K!JqDGtAN%gMoX;0nExacR$oWnrLT}foqE-$a9~bTLGgIH>ce`6$g8mg zB881+T69V@$nw}Km0~F3kyQ++C3HKCprkUoDu=ULdRmb4r_F?zG(_H3DO%TP942XK zH&5cdKhjWY3yN*?2t7SQUO7^ZfJSvg%p8?Ao^zx;m_x0e_X^d?;6G7ZWaIQj2xKK_ zG$KmWcnHx5*2gY>ia1%cFxJFvx-jG<-a>jHZPRM=`cs|;7*|YrYT0eYX7x({!R7vg z8DCk-S2N!`KlO>zu^ISSaMGS0NZxqo`mb-FkIA(?Kz?lQkT+~yaxI-pZ#X1xI7F|Z z=<5s3z-nmt+7(7-bowhZ<<&R5H?V;@=e}27K~5B2{TbyXj0vlE)vaVvxFSY z?55&cxS5*z8=nJ4t^Q!^PUEfc1;fN;z|e&Qm8wwjPkgq{{>8)Tj-7JH&Q$fG`NQ*v z?=;Okc`r~6*vL#6c8~KzO>2(4lBSPaJ3suTrJ8itVY%z@46kDmSyk`ETcdpD``NoNbn)HUPRL7f_H|$Mq*qiCwk!m=S>`Hds zDWA{hgg>!Rma2XNzdHxT8LpleNFr2Ju5Gmi+fYIXI#N3~fGkihs%_=2*4w^c-*Cw397bQ#4jLzEw!D86j#-ikv!dn`*J$P9z_mt| z;F`yJdXrl@`I~t2f%p(E{Oi<-K?xbpwb>ijI^|*0O|8W2HwsvS>_>+M**!8Uh)pc6 zi3A@9!$;>uV=>7CJeX%=V;7=i#|bo~am5OTwbXTXXqYI^*w`>LOPSlQED~rKAWa!X zxmT>}2L(KPx6#TmLzY0UQscp33e93T=EncJ zoi!w+W`qVIP?iB}rplq2%B(9=g~!GcH_p?)MI}yi6{7_Q8q!6La#3T-)0kach)5)j zyqkMBOZNPlKr2TT`4wG z5`wlOR)ezA68%!;V+uYbbvB8>TdWnc8s>DtSgS}EcY(?MxLml7QzsQ>^TPD>j^IMl|5{r~|T7626*TaS7;b!x-Va8epEYy>FtraEI@7#ll3 zaY-%dGtsjnQes@$)1q)LjDd%whHjW7)s4&XR|cYkVyB-r9mlai(1#Ay6Szwxt@m8KFd+p10%0hcj z$$J8|k9wdjR&23!D-oRrE;3J&zp6Eg=f=3y=5tp>Kmvu_{2ew=SIk&3y4Zy&yX81DlSMH551hC$9W zHc)TovEkDY8tPz3q49`n9;JR2k0;CY!I0D>K;BVPiA(T}>5}k;uGYg;1r3f_hgDkN5{d>k$DuT1K&2@o z>v-f;X)IJNRVbwF;~}Zi7C02jl=B!X##Uf@@gr&lzlu-M%JXcY zlJ`9Cc;+KFDui958TZ{#R1S5{rG)dF2RW3o%1XPBD-dAD&f_~<|!x_3JU$;1~BH0d%r zJpSstWev&A>9RJttSuF6`{~^8QcA*a5fxDt!bTBg%BtSG^3IiH$wF+& zId>&pwo@+KnF{XAUiWHk?ijv&*J);10M^fmk;=~fFAEm!Vf_!eH5DI4)rbH4hbStC zX5zgH_-f81o@F0Xcr$Bhq>7pMYE9Wu+Ko=|En(DS)&7cTm$ax=h&QG6N!!pKCwD!1 zf$Hs0v-}>RGNwHIR5ATt{Zy*@sin~T$>09mS3j40X`yM+nXc)VYx?on^5e2^v#+{Y zgaYa1L0~7+ZcVX<1-Az;KTQ(|YsmwVR#t6Ez|xCLFaDq;z5BSl`#4^utDlnLmOUkx zJ(UVRmEANDm}u^YP;l0!fx$JaL70c9X`2!G)jD|1I$zX=E`^=(tZ}$9ZgI!J=6Fz8 z=5Cgo^=ypqL1DoJ8PcV1p`#-c9<6DZ#OAMISXMfT`weVjKeS8a9h=-B#LHlh45ByF zV$w;lNJI~W9{^FyLTHoi>w5bVw)Cc>m!W^J_{EsQoLkx$lXf8a|8(6>+K=dd@%^k> zYshLpJCLeAkh`DJ8{<#(vpnelQYO$0xo~)1qVZjtr(!y&rTb^@ZRM26Z_!|Y-iCdh z7w2DGC`s3DlxsJp%Qwm8o95gfhf4u*G;n<&8M#@x9PUVkJMLCC-z|@3ss}UGkKL`V zOS*sK=#8VF>ZSoHiOPl|j$=j3j&FRYha^?O^bsc!W0tb46tlh^5_avu-l$ArlCem}+Y%iPSPoOCxMh0}D;J+Ls*5?E|Uyfw|tf-aD?8 z@4%YN>#cr&=tdm-iQeiD?Y9d4py&2xxph0=Kg1~ou;jG?!781P-53Gl&deU{Li%^T z|I&>K@DTjF2)U9k9>vMC6%}7QHQ&4JuSxl9D4?h9YDiDp)u5iH&0W0t6mCHgYz2#u z=t_h{S8KLMcB7QpU5M1X*M2u#Zmjc#Qwyh--07~}a@TG=PnYkJ;fD9fVIXbpA=dHb zxry0Vuf3Y`)QEJl3f1aaDlg%mEE z>%WJ>IXYke=JA>1^W!(BXO1s!SnB=#j>Qh~7VM)5k#mj0M*!5iIp;sX1#)gn;+%ct zK&LRlDM-!u(paKe5Y{!91;YYl11MvBsZX-6>WbDFi*w=GS8GX&wS|C z)Lq4P=21i<5y8&FC>W)<9(dWpl|iL|g_&5J_)WsbMh1xK#TKfE^Y{?;5CoI2X*o!+ zTpQBCO>%G(@%I9vy>6R7xl+@+T+_R_IbE||u0h|nd$-*!Zb&8;n^MJF)5Tlm;;kv) zR{kPY*aW8Fdr!XeWU?_i4s2RpvKU!_CI}1~wz&@fZ(L9v>g#8;W5`08NgVyHkvn0o z1F0>yHHX~flrcv06hZX?E3K%L(Tzr5fZu2VJB}6s%AwczI&oNbB{*cP=oPe+R&5f( zUKj0g8!!Tn(tv-8oOcnKiM9J}JYer;*6wOVwZkfSY6>5$R_~Fy-tVK<@M{QB?0@Y@ z71nas`?!!`@y>svFJ0Io7q$TY!CQMb1VD=SYTv0%x^5PxL!HDYBTN(;Q7d7c0k9`d zT!F1tRd)lxTP}YsJ9Bw=OUkaFdhd(xd@*?_UD5$uv^mGUFb(jb+Dui=+!6XCo6xoR zHWc?Zkx+0_D@ZjMI%f~HZ2Hm#v(f7ri8hMexXm5e4z|$)22hvT z_q1!Y5^SUbJw0F}0Z`Fs@;PCD9YzT{!7@k-~RUtfD*l6p)df>7{2%p+* zpF_SW=LT`(07QZ9CJ`U4`Rt_902iEi;KVGk3;vQ<`W#+JTdBz)G-d1N3EZxF53-sZ z#D1jL$q$K7NdFp+il55EJ@dY)3dN%PA8^I^sTlp$2|)S~0h?qAz{|T3SA;Fl`Jr+7 zOVpx>m}F^-qK0JS!pW4sH|_70{k_!5fhqzAc;YM7-OJV8u(1dde7jt|efG(jgL7M8 zFnPt-wCrn2p1k?F#k{m{tL&pGV9k~1uYvf>N_qQoIY4<9-Rbfza`_gL>JzLj7br7~ z2*QD3XSuAC`hO*Mi|&BxrfH3O2lpxJT-Kd@DGQ*K1}h_BPMi0%CkgqGVJNvl z)LDZ>_xNU9*+ifvzH^v3g;Wl$YO>?|9-bO$G>UH`0d2q2mqy~yl$8t-0_)0~9U%=M zoWU=0295LMB@>l-4t8&2>vaB@;|)+j4`nqtVI3RW^g{{|&&XM_?m%K`BqGPMJj#AO zi{L;2jy8xHng_Bu3Cb2}pJ={LbG5RvfER32xZyccPh)vLZZam9Di?b5dz$xptbd-k%AU0%MN`CpbFu1 zoPGf+;yL(tlT<_Ph+kP(R%}UCY)QT}-#R~pfBfOr^5aUxRK!C_8;wBU$M?p$Y1K=y zoo1PCs$6wMSuHZBXR>^~lul5xw&GJ>K9bxV(9n`ia>GEXe#eYA6NtPu`R1fZ*uoK< z(-m7}xPdKlU`xugh0`c)LI9>6FpbhDku~1?GSG>yUBo1TFR~AszOtxnNPkEhO;jZ; zZ0fsO51=a}G3=#Xa9(u1>9ULc92Zz+PHX!GZAijP%AxOi8K)+F5{bF>xFM;6YSC8{ zyow`E4QH(&VvGyYI2P8ZjN4CI&s1b<6jf8&Oi6TeOFN0nZnIcD zYkoKve7;Js&4I z5w)NIi0~xL7-A=hmEm#-PXqEP#$<=y>eIGWvXe{R+lEP)qcc;}Jb z$h7(d70y=b%}lE?Jf1W#t<1$}7+R=}PzHDZ8g=4Eqy$W$RON2*TMW(bp5MJtpRVeZ zt2(vEqQlZa1i{`q8dMJBTHu@Mw!WExMKi0!xOzwEiY-nLAaNREqr#=47se6BoZu-+ z+}98Qaj1xcBo{WP3SnZpa;3CqxwL1oadCXLpNXi zgGOOZh972v`%>oLJvFz;AAprBcc&|N%ayz5@;?TA^_KVRZ#1Xsd*sSqi1&wg%3(+c z?z~4j3@d?_hc(ooOAjC(gFc~k7h0E5wd|9BPE)oR#!G)e%1B=fC4spZch}^L^ z)wEZx-Y19luNAUqAETSk6E=6*Vh4;vPo!E8-g)VJI6WcPJSi6+Tl2HWB3m$YZF0Wx z+LzY?{2)j%hWN5r#0Z<$Yhiv6v0+oUgfC0UTNz)L+d{?H3+8)nY)$qpfZw{3HLc4UH~>-l8iF;%w_EPdp^c`1CmBUQdj z4(_H!_g?#tolbwzkDcy{g0(6RsF`pjTlkVoR+O*eUUEd-1&ktpVxj)lhU6)^cGH>- z&#X?T-90eRnA`)Pz1>D9&*^R=z;j@wUq2017Tf^}lg>IIxUd4w_Q4lky7ltn@GTet zACSE}*4*%io@{aoY?PU0t#0hLN_mZkdM5j}l5|lns^BxuKsQ3W)c8*AL17iUpp#@Woyg40XbDkD~Dsu>8HYPWpaxw)XBdXPq1D z6gV6Sohc5SA2AB`a}Gl|`+=<9M985yEneo+oqj%9oxEaq4aZAom~?Mj7+eh9E?GD# zH*8&V;-OlnCG&w)s73a+uDS7a&1QC5d)&2TxE`lPY$ospY|%f<7gp!2J>OlD90K${ zz*I{XU3{`S#a{S9J>x_P;)|u8?;vPAu{xzecVr=-EDJ=~I6>kz#2Im8b(->EJ^neu zIW0z@l}r1+b5QQt&-Yd*SnP)REZDlIbB=wkl?gvzn!<3 zxLwFMRwvKx-kJo<52pom6`ZV2QHgsG`M_y0!6yuUFQ*QDM&5&x!P9jeo*aiUBWTA4 zH6CqZ<4aA%p<_gZQ@sdg^ieUi53ZFoa`FtszXZZ?DH|fEol) zUO_B^{}TL@m33_$6Dvc>G(pd6K!8fF4^SAz_f#6?YT5yh+0EhA#~L_S#xS)~((421YJ9^A`dMKKaia)PDJNry zdMhy00luzO)5D;jTD<1k(Nm#cAw3(i)1&9=pC%35Zko~7Dzv)M^Wb9W%_{AUULJFct|J_KnP|cF#(x>V4d+Z=#B7B0ATA>STBM61>>wF!YIJ< zUVwt8fPf_3@}cP2I76V2(i-#UXcjg1F^vt}-MrS*umXDnAOGGih|`C{}!i)Vc>L(viEFmWk9ESUMY!N`SX zt%ajueu~CxN+KG0{502{q7^54n4V7+Vv+r*qo+ujAp(qlC_tsh&~7VNE#*q@wT6yL z!y-VR2uqGy4F{yM3lpa)@dMPT$Y2l;E=n6gp<_TG+)$B21q@d0xa+_q64)CCx^ZDq z$rKsIB({|YlpPGwP|yW+oB+|jIUVF50|Hu+LHeKCso{u^lFpz8^NRA++Lb!!Sb=D@ zf;0p}mxel4nk3rxI4L4fs|UU@451Q2sdSz(ltn3-0Zvs68WVh`+C#bTQ!HXmR3|vr zhh*zc>ww5Y_W#282tk`tpF?8M`^4^=Io~4}M=(ZH8Z`*P+*!qBKrXOAJDR2cD$V4Z~hH+DADiyAmqi92lVtnqT>J_ci0_vc62_T0ws8TO7&l(R4OGSZ0F0cv5 zz-iFVJUj9V)hK!iXdM;T^kG3!L(}wUm99y1k-#?QSxGcWQ%Q*d0FbX3RYZv^Wz3o3 zuf`_E(dErm#3r}~6zFbcAHhg&Y3Pc`mx`hJlnS-;AjCd^DH^ct9wU%h-n78BCF)yj zWT0pWOOJ{MNPV=0qfsI}+9FQlOmgPTUXdqEnm~FO17wIsyX97MH74OCCOp~%(uq3+ zqc;IEb0VSabVBURnZaB%*rR8fVpIo6G)asb*nC0HRVqdulElbH`o}7Dh+)o{Z#4{! z&NI+I+?aA_ev<(+@yr?8hC+t9HPU#jHgh0*Y9ledKdZ>FbHJ;4BCWvglNi})7V8L! ztQ4$2X4OC_L(za!!Y*!hrMBHfI?W zP+N*W5L&PZ-|5hT28f`TZNffA!V{VdlMnJn2H?T`t4&j$*HALk`J;XCr!jqyu6#Ue z8?VuGf%h7N#v%-tKN^|J=lleXp(MOh9!i5LPLg@bmnx@TUs^KR>Q(nmvBe+AY z)r=xcusPQr|V~Kt@R%-$Q zw7sbL9B)#6A@nl!IxA$2Z8JrA`Twf>_SiO#G*7ljN~FX$DT#WM)RU4eS+=ZL4?A%z zJC+~H!*XmVn^PQ9cI-HE(v@mjHaU5Q(Yc}A?aYV|d&E3rqci4cIKT2FC;g(NW>`^5oTIj4R%Kwlc> zRHj4Ri6hmwNgQ8mE>O6Q>BgN47LOuz1x0RsAF=7n#rlZaX2mvq9knjS1{|ri5!L5Y z2JOi5DW#=5)wU+;?<@mV)ZfWUpfXNa3DnYE*5~7_@Fwc_5jUX(p<-Q>mB3Zu&eB`E zbz_RVJT0l_(tp@9BND;_G7CL2gBQ z7x(SsVtZr+r(ap)t7jL)F&xBtIC$aaVVY;ye5U&PpoJ=*Orivz$TMb-q;#0t&T?WO z3*pV$nQ<^Se1t7Bi3-(Dl@GgROwFIaMrjtR@I?L7x_jAVRF;lsQ>49n2V-3iNmiKW zdI!Uu;-Ayh^#KL1Q1D}_^qmy^69p**Fv3-r-fU_WPogTtmna}*JT~!()Jw&)6#NP0 z^92PADuae#v6a%X4;rBu=`LjLkAu&`NHtPBVZe~|rfdop=PB7~1X;`U!s0Uok|Lg= zb8M=;N_oCahi55ZO2N!>qMmE)>q&v~^0FeZ2hct2DLijhKy@zHJm8l|m-Q6LoVk+y z1@MA7JwcSC7(%KjwfGVRUy5Dga(SxXnDa@-cvOKP|C1FrP8zwcMIUr6AR)5$-}5%h z-p=$?#v7Ks;lxy~t!H^&YTE|wNyXy-GxOD&Yc;aPpK6gThn7d~^kIkX?mXWk%+&nk#6iUlY^B6pVoqspr{i3606{~LK|gkm5iMK)Wl9R}kb+0=`sCe5rJYA9Wjlv;ayCiM?p$+wvL;yrb!yp7LNNPCuDOHG0MfFh zBef`ZY|S)plbg4(RCZs=45K4#>4@AjN%luTzT5)P#O{g2lxz#ZDXV0eK>iR&Tf3#k zFx#(m{d_ZvD9%RGN$FNPf=SbLThf;6=%Prju3oBZBOuB@lA6Ma11y`6LfIItJClpa zIEvHME<@RNWTiRdpOpQRiK%PTxi)%bn-U63q2ssD-SK_i^y|Iy)UnLqae44K2hR)+ zP_3Yx4K0Y&!WxH)62w#8yB4DljnV@8YbUaG9~SO4cS>CcGtGzO=0lS25FUP= z9_T*AuN=rUAC#L9O1^{nI=YkJpSMr~o{UR6(FN5XO>yW{hOd5sfJkdCS*<5M)7tyg z4D@LTGi?L=C9QJ3hLFZ&38J3=5U;IF2hbJ!>HobQy@?nqbQe{w=hO&(Hf^gFf;Hr=!D(# zH4)~}ny+uw*O&42%f5c-om$*$7XPZn&x|AJ>rOD_BA^Rge@6knTR%IOx5KyeeR%%` zmMsFP5g>3GTunuwJ+X)0j5PC4QOSxwsx!#_FZGfYD}qPj)oFFTrY1y0 zOJxBp9v}EKwQ1{*Xzf=ykMjGFvbOR%udHOXpx=ArrVVoaR(Y%|qcvVzs9~=b<^?e8 zH2_<$S^uSy!ZqW!s+}@`_H|F*sCLTk6VT?aO~%caPQ|OmlX$Y)oweU3V!2|tRrWnl zuhkK)qJmLf78xolAxG*WHvP&ft*&9UPb>Q_=D0bny{yLd>7rHClkg@@@v5j9>qEkp zGU`nO0jn)=iW7HovMH_Uz$-#P)lZCFE>mb;%dM`X7?4F5L&yYWq-k7sj zWk)W)2`&mVlKom3`dXNXIf-N>(Htk#1FxF*_&3N9=06pM3SD z$jM!??jn^39$pb8U8@Gnlf6k}D(PBWGTe@?46i)>^N~;AzV-IC zpHXlPL2PsnlR?mnlkh^s`UcLSsQyZ;7`{LP8xm}G#siB6V*N80ifbITl3%(=CLio( z5*8Jt(tWZ0@cuQ0H4nMdc$Mm$NlGX;hU-&gs26#nkFHBhIR$z*Z;n;>A!jPuU`H1!mSG#|1Q}NWBOfqOuG90carY_h8!^OZDY$3+{0{`3jyHU z2~r&aXvC&wC{_AI^Z&$|KBYS&LVtXsAfA$>3+d*fx;!J8b zy-R8wmR!U4JS~drnJ?=l*E85a+Th8ogp3o0jv_V=s4;R=06*e zx5kM1R`p-vuFupviL8A{KI-$3XNgP(=XHHP#4&nkUe(1S>hr>pI!phv=8AFYq{Pf%D})8QM7)@6Ex~f~8IzBfG*og93%k|C2UQj0ljW*6c4vkPF<)Uu z)4_aRqcM?85V%DV+H=2}|pwirtuVc4V(=7;~KCBB|WjEtC_1^XyL*IC}-MeOMTeY=esL>c1I(g&p*>QQ zR(bW>+-W5cuP!%c)Yl4Du;$8jyBI9x6)9U!q*cjBDGjXSYs#f2`e)H-d`?yNU9v># z;)2$F)>T8ANab}ufZ7PR%2p#-n*!{nboYX-6H+Ga85IpcSgOVRL{O@#Bb=oPkG_4;)BBfz4zm1+iW zq)H(dca+YbQ`3}<07r0#DqR#?wfCP><%|(`;r*$O)cnr{iuqsOqCKD1^!#FqbrN*A zj}z-Rs-<%M0XFuAig}5ljqcO6uLgZR>5nj$n8of$W95-AUd91fa>Pvl$1I3TSv`#7O9jF+pt@V|m91jwpo36~>I zGQJ#O6$qXPGp+HesYFRfgE&&>-Dop8*0^f=HvBuxCwdngv*KM81^_oCJm=h9A`eBf z7X`(~Ue1Yk5aP@v!l zXMj|$3cwd7wuC0}-xFc?JRbZz242!Juso7!-vZ;qt4}5#PuAs}SjY+X0i~y3a&;E@ z_4X~xrd#0X3id6E%Of=mrMlLd2UeR0GR>Ri=FK>PE#n$ufJBLDzP9-#y*OiRRKddn zNJ;faV-bUZ7(qmZfbcHq@H98T9P|-|BtC^30h>$4y`OSah^!D$l`e5I|!FZDvkZDxD{XdYoYIJ zA^iW~#l?R`4T)UL{ULAszslaYe_HCFUO9Pt+w$w5j@}x@LD|ON*xFanxes&p6;Wuh zs!%9a6r`dm3L;fh2NxE9fzK4Hnh3;vJTE>={h*UenW-6wCy|I-YqP%b zCv?czN82gJB*F~ci^+@snC@T;o)0MY1O>mQfZ7{J_I#IOzoXzP1y55jMHNS~@oeqc zXb}NHWNRuK^SLaWsLZTuZicCzG8y&b(5&PFWg6PWHOjyVTMcr~`_lZJ$mH1cl0|of z3~cBcrKK*;#WrDj4d&{w22ErRx|CU~>W3q1FN&d=wjC>S)~nSTWWxdOaTF7BWlZEj zPv_Y&8y1R+-@~(`ETvN^OU*ky!Va9lz+vj2)22 z4)AkH%0qGnAs6L-%>aJ8xJqoxm=_+YR?<3c7h4uFu{jeo=H+*1w-*)q97>j4xw#aQ;*4iFfZF}U-6H?nFnYJmpZ7Sp1E4%heuDwWI zkMf2gW(#yBjIssLn?~y(!;adt+PZ1^$jU{jbyKEwr`)ziB(UlRM&UU*_7&%n+I+m$vB5)Cpc6_`>?WoOmboCOrKAmhc`sI zV@ncpbH(nGNe&-YTH587fdsS-@NMd?M}_p{eYRhDA+vo(A+D#}KB5H2XiYyV1;_Z7 zbR-@3+%2iYx2OKDdwFNZJtn(>c<7|0-9KykxQUM`cXnc*>7SMn2B+oVG{4U;yUF9C zd#mi;nm5?(Blm)#^u$lvKWV4yOqT%9t+S7$7v>!puctwFBOmA_ERV)o5-{sk=u@B zT(h!^MCvH1y^#>Je%dXEc5uFC-e`dtH&h6kuRoWs;qmV9C)1xCUU_=8YgFnQy)*Lp z*ylT?iKhVXb;G*mA71qjXZ+h_|F*<*&grLO^c6~xI+1bp%C26?)l0k>uxtctpJH== z|ImAfZn{(BKLQeM#?~v_dLoNtS)g<=U@y zHSTRQ{JPD$x5vm_@BE(5yEgKq<`RJe3TUUi=^w2XD8rUC0pyS-qx{C34 zXyRddzZ$3|@hNa9G4k?XbQ)_{4AcBq;?4pfbDW%Yl~!!HOI^Jc))sxZuCC$4;G%}( zQR2HS(gaZWm4hRdI4=bl%?YBb7FEr@@-;}B=J|C$LM$vtIOM`KB7nj+PWQ6;^%306 z0Qofjme{;cOI2pj$$6JdUyW)HMDk6##OBfr#g0-CLIoCy;i75-C6873Py;A*^fE4D zCd)gZfkg~Tv(=wA$pH+5h$&62H(KN-z-(68aScJzta$wlsJm&^+b?y6Q$_5k6vWs6MP1hBdI_B)Wt$&ueWeOKSS_U4*1wCW52U1U~*8%F0=*|}A+Y~?LQ z{n{uJW?9}+a)^Kv2t^jG3lZnPOH~I9?+W13sO_bAh4xp=@VJ+V!>8sh)@#??+FSwW zg;bxZDe=WM`Rh~SNNsh9tE~-jl|P8M%H=D#v#Gjb0d_vlex_bQi!jCh$85or6Eeq> z=ONu(fcO%|x2GWjgp3!~w&b7;CS}ANe**w>WGcplzp(W@Ut1(&xG@6s^Pq^&9G9IX z3kQBSasie}Bt4yf3t&tz6`O{25jid6>U=um24;Q-Ga>jxW4E6LCLVKg!tUh;PLMp4 zt28)hh4~eUp$m`I*hukvAYkRdklZwe%BpvHK^4g)(_0XEn8y(2Orh)(vBeHZX~GNw z-W-XhHJ&19v@X|t~Ka>p7A!+iOL2`WAj{0wiM#B0~SBRPBchFKM2Ku>5DNXy$Yo?hA0 zo2Y>#PX)0Yh9+iesVrK1rO#d_vD* zzsrZUv&Q9p+H2s+=zz8>OYJJ~%Z-b)HY)r|J-@PU3}zg>Z%I#yb6f}zn#s(da6zB0 zsN*(+_u%TfWlOsQ$V3C-teq6t+KR0SD@_WNW2~jnbSi;1AEo9)YeTgDdv?#&W7m$Y z*~6>$@N#FyJ}BD<3*f+tw>~kA=45xvw$8lKYHiNByt1oDa%~0l_jRk}>MkrZ>Zhdo zsTJSPoBnObzwXEkKMq72oWPdYS3-TR&H%i}-J8&3K4WoH39wmhJJqO$-w&{v1AuEO zjv{EY)-@Eat8GUAy<(^tqC)_G&*lMfx3)!9ZZnu)%D=fLe=$(0G?=Y4)C*Z~lxQUV zY*he`{*;%^C&{1kG{z7x% z$(a2oH}iVANJ(snAwA9)$QUtV>8Ia+=XTff;;p4j|4zAoXQp9iqApk0P;hHo8DZLc z4J!~Z-pE79^6MXWq&x1_H>b8jr8kzT@0aWQ!CO3ei#%3=cyYH)4iI!}ybU543TZ9A947-3jDL7@!M5GWUwVxTj{-@37EgE0ko)IUc4 zsZVNp$FFkCbgFnAp*yHzB6p#lVNR(NAQ>#?`cc}S~4^&nZ|L949R?@?dUuv)$2 zl6QRh_2ll~H1$h9klb{v-8k{AeG6)6jGm$u1Wl=DpsMnMZ~a?9^i@?FP8RT%!2hf- z;D6#}n0*Twjesa&*uuAI@St@^1sKr2Z+O8H1Sq{>KQh70BKeN;?aSb@@Ef=&>7xz2 zin-+6-QDU{_KsmESNLXNk*sJ;HT+%VB>s#F_A15Rq<|T^L@7oJB3UEk2F%qbH_;(0 zp7p@z|Cy5iZwlCaNmTrcM5`7Q#ObN3GKlUYzQx`L&mlsKSxo$>=0*)yJX=1sGLrG{ zko`NZ+7sr)8{lWz+`oZlR~>C+xIi@7a#S9g!XDg);%yoKR@uKbX};IgCpQfxtCQ8l z;&2vDjL-=->0UdWH@dBxaxN%m1@F1Myk)HH#XjR5ml3+gW!E@U9Kj8Md{is-%ZrF+ zd`D&9(UL>a#6A=e<}Zsk=g2=>!*KQL@>KgG@=$cglR}TK%ZiPf(sP9MnM;S zX0|S_1Yyc%I_AoV1{(1NO8jGrm4HfLrbC7k%YaH->5wGOOxK5FjF!+!8Sp7LG$U%qOba7Zb5OE5Hc6k$k* zw=3QK%GO6fN-He^XgMl<;GL{FKK4xXlA8I9P)6V&2P7`moZ-*YkJ-Rw4OD9`_sC zg83#M2k(1B_|z7jq?IS}Ub~QQ<7e98SvTLo;{n1m4f1#h48vj#bx|Sf^WFRkhaBZ` zUU!8mth_sKtTi{S10lsZcmUWS@NYNwYcNOYh%iU7F9I(%ryhbiigbB{K3EXC%?^Ud z#BSwHwj+p49F+$%!g;~`gg}UmEK(V>kzFdJDBJxJKuifz^#4zEQipjPTxOZKF)&Qp z6FMpO-x8g)cst9ZJP7#BwS;Pk9Z)UJEK(kfxH+~bb|q|296%JXLD1tcGn7y4bSR%V zrUGb#KxYB|l=cOb&lYLZq#W9rH{x8eb!pH~aW-%GJpwkzvSI5K21NB&q#eIHj{%Kn z=6S<&Ld5VKv;&^Q>W82+Bi@J!aCR!+YrdwWH4`!8ib|)>TQygzaiy5MAyNatL<^%c zEdb`Lo3}-3=4+s(XT4(5Q|8av3s-6Zrsn_*=0;Dp&0CRD3ni&7iKdK5<0`(dw(J|7 zF9UwGqa5ytW8TA_Rxzj3ric@%yoFRXICkOK2iVPeevZLKdT_3R0r@q8E9evd1FHO_ z0l{wZ3~0s$z^#!b0`&dQl8P*V;8ds-u;2g&rGm}}fDJeQcHqqX!n{ZrX^cY%4$&I~ zM00u`W(7JhzoKyoM;anlBZK}s3zRW{?h`}{_tX3$%ZK2Ns2r+UdI>mBga4-~8Y?s` zBfz!1u<+(dF~UkqJVU1AD_%SWrC{>5Q3=e3Xt1oMXnHZjAy2+QrD(uK)P)v4BQ2~z zkr}>fKpG}wsJgTjYMVH<{#Wkr82}hnOH~Wa8>Tk`8U!RjiAfBFF1E0PCz9&85z88< z&K#)BaOz#*+ryRs0Hf+GjEp#F3ArmOEg>(HXDM|F87Z2JxpmL3)3Y1iMYk=mmuwtx zU>~<4r`qD`3Pdf(#^wNk1}{@{ec`|v@QcwJE-uW!1wb`oJHImjHbW{aevm+K$pD{` z*RvdTps%+eb5f1=3jkKggA8_xpag@U#D7Qy_$LZpq3_CQHpW$Ds@esn7PD_JefLUC zExIx0E_N2x)O?u;^uNV5kYTVhu=%9A7V;MI_Iq!qnljE#+1V*Mhd^~DElEqRCGgSM zhhynu%O|-kV`X@?Wd!Hz>QgY6ZpQ`#2dVW~#&cZu9G7gzb7h9oh0_$Irx-OVi<^)!-46J04igvMbfaTjBJQR4qn*4!q2wX?R)dO*Q9<_~aP$57UI(R~4j=i1pdN9U@8fEFBK*%3|{6(`6I!P-Rz%i#}( z-XF?%I%Q91Vh?>U;=RF~!PA;NmF%ZKoW^G@xL1Y0uH^QshbXBhQOmw&$yiOtfumYt z-?bJE6W>*cHgK!UGhk6Lt4p=P8o-4wAHKAMTREo;d{|Tls&*SW9xYKB(357|xyl_N zVv3acg-ffgf^sYV%G!bvqBm_xs~=V}w2}%IyTpMyBk;ElTV`TAieHgHS_r`q!z2V} z7bwkVNYzeq6C3Hp z<9I9Zh1pQd{A8yn-|ryzqP)2Waqd2j#s_d#;GUc2A)2MRh>E!Y(X>jfE#ZHpR(TuA zxh)~^@r~BwKty0RXIS61q@GE8l5r^Burc=8jOUo_IVRbT-K%pXE?ym1n_N>nR+)aN z`6Q;2p!gd!l68f3U zIZ7+4T-T|8h1_CI#Sb`0TB}<3X*sGwV&I}I$hUx%>JrR9NEDp|H+y zaztx*NQQoV)0+F~#tUj#tmMQCqVXb){rVq9X0 zq2ZNTpoNWD8<}{aJu^z1Pk-$42-4`CYJLxoi#4e4tTPS!uk^~jcp6^W;#jk^tXf(i zwP*qwOFz_pEG-$!6SCzAskrgR^%QOh`@ezbbrO%|I-rdERbqEBf~m~uP8p|*F}Z$) zr*QW`H;^e}&H0)|$QK ze+9ep!0$A7X!tX9MEn`-i!11d@@J3^>Uz2$B$&Io!;5aM!;5Z=E@o{2#~A(O&H_7f zc!6DcfE4=$?hIwWK&&1*=I&7T6W$AszD>v*6#IhzjXoo5TF1rL>Dxa;Cm8zG0gCNM zkgWy?B_J>vTQysE>H@%4nE_^0q;3NsERMH%{_IPliSnRMnYA+YU;q z#kAJXTCr#p7ujX7K)G`%k=FVmsl8`w=Zo%0qasOpL?;C<3dksnd!w#L45*X@^1Zl7 z1#F;8H1cI@&YZvS5)ckVKb@kzZIrBLMzdAOJwdhDM>joB zv3|Ok2%cqRR&7}_NLR_WhBgWK;lmn{5 zvKdaKa3ych2YrSk!f_#QtQV@G{Vh~0o&Y;gHVyIp=%ajp@JY7MnXP$qF)_P?2U`ST zJh__$Cf5&RWEaMlqinbG`p@6EbMo^ucTaxly?gre3-Ti~?0k7(F;uy7+s80{2_Re% zuvelzv@yriugEQ1*){%VCK>*y%*CWEJ!Z`+*Om5s6`k$!3)_^2#_Q+OEpo%=yb*^v z2#{jw0n+d{;}G&g$OoQH9F)!ed<~s2=!4NlVK?Te${}36p9Mq+QasS67&%cZz_nZD z@IE{LKzsEq-;`Ov+*vui&(1&4UY)6pnS{o?p>mjb{(<)DY5Nlv0m6dHVdBJncIAQg`mAeO5QrYxc$awl OKEL|lA&J-=^nU;heDgy9 diff --git a/port/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/decorators.cpython-311.pyc deleted file mode 100644 index e944f179eb376110f52cdff460c637d6ec3adc24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26325 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 diff --git a/port/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/globals.cpython-311.pyc deleted file mode 100644 index 4aae6661651185a21dff829ca801ce1bf3ef66d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3343 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 GhyNevjF3$L diff --git a/port/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/shell_completion.cpython-311.pyc deleted file mode 100644 index 30e4ba9a96646f619fbb1d1745e47dab15a671ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24118 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 diff --git a/port/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/termui.cpython-311.pyc deleted file mode 100644 index fef349b1955e8886b584bf8d114aa22bc75126da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34467 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 a3A$3X+J6fV;LDvc{`g4ck4+O65C0dzeS0qe diff --git a/port/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/testing.cpython-311.pyc deleted file mode 100644 index 79fe96050a36bee88c66a6caa322e3028a596792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25958 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 diff --git a/port/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/types.cpython-311.pyc deleted file mode 100644 index e7b8667698d380fe6bfbf00e66d8fd4a613c0198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53701 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 M(L86TKc-UtUkdk;M*si- diff --git a/port/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc b/port/lib/python3.11/site-packages/click/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 5ec12f191c8dfcb16112c00d57c00c355398c48d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28029 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 CdyGE- diff --git a/port/lib/python3.11/site-packages/click/_compat.py b/port/lib/python3.11/site-packages/click/_compat.py deleted file mode 100644 index 9153d15..0000000 --- a/port/lib/python3.11/site-packages/click/_compat.py +++ /dev/null @@ -1,623 +0,0 @@ -import codecs -import io -import os -import re -import sys -import typing as t -from weakref import WeakKeyDictionary - -CYGWIN = sys.platform.startswith("cygwin") -WIN = sys.platform.startswith("win") -auto_wrap_for_ansi: t.Optional[t.Callable[[t.TextIO], t.TextIO]] = None -_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") - - -def _make_text_stream( - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = "replace" - return _NonClosingTextIOWrapper( - stream, - encoding, - errors, - line_buffering=True, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def is_ascii_encoding(encoding: str) -> bool: - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream: t.IO[t.Any]) -> str: - """Returns the default stream encoding if not found.""" - rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() - if is_ascii_encoding(rv): - return "utf-8" - return rv - - -class _NonClosingTextIOWrapper(io.TextIOWrapper): - def __init__( - self, - stream: t.BinaryIO, - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, - force_writable: bool = False, - **extra: t.Any, - ) -> None: - self._stream = stream = t.cast( - t.BinaryIO, _FixupStream(stream, force_readable, force_writable) - ) - super().__init__(stream, encoding, errors, **extra) - - def __del__(self) -> None: - try: - self.detach() - except Exception: - pass - - def isatty(self) -> bool: - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream: - """The new io interface needs more from streams than streams - traditionally implement. As such, this fix-up code is necessary in - some circumstances. - - The forcing of readable and writable flags are there because some tools - put badly patched objects on sys (one such offender are certain version - of jupyter notebook). - """ - - def __init__( - self, - stream: t.BinaryIO, - force_readable: bool = False, - force_writable: bool = False, - ): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._stream, name) - - def read1(self, size: int) -> bytes: - f = getattr(self._stream, "read1", None) - - if f is not None: - return t.cast(bytes, f(size)) - - return self._stream.read(size) - - def readable(self) -> bool: - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self) -> bool: - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.write("") # type: ignore - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self) -> bool: - x = getattr(self._stream, "seekable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - return isinstance(stream.read(0), bytes) - except Exception: - return default - # This happens in some cases where the stream was already - # closed. In this case, we assume the default. - - -def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - -def _find_binary_reader(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_reader(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_reader(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _find_binary_writer(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_writer(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_writer(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _stream_is_misconfigured(stream: t.TextIO) -> bool: - """A stream is misconfigured if its encoding is ASCII.""" - # If the stream does not have an encoding set, we assume it's set - # to ASCII. This appears to happen in certain unittest - # environments. It's not quite clear what the correct behavior is - # but this at least will force Click to recover somehow. - return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") - - -def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: - """A stream attribute is compatible if it is equal to the - desired value or the desired value is unset and the attribute - has a value. - """ - stream_value = getattr(stream, attr, None) - return stream_value == value or (value is None and stream_value is not None) - - -def _is_compatible_text_stream( - stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> bool: - """Check if a stream's encoding and errors attributes are - compatible with the desired values. - """ - return _is_compat_stream_attr( - stream, "encoding", encoding - ) and _is_compat_stream_attr(stream, "errors", errors) - - -def _force_correct_text_stream( - text_stream: t.IO[t.Any], - encoding: t.Optional[str], - errors: t.Optional[str], - is_binary: t.Callable[[t.IO[t.Any], bool], bool], - find_binary: t.Callable[[t.IO[t.Any]], t.Optional[t.BinaryIO]], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if is_binary(text_stream, False): - binary_reader = t.cast(t.BinaryIO, text_stream) - else: - text_stream = t.cast(t.TextIO, text_stream) - # If the stream looks compatible, and won't default to a - # misconfigured ascii encoding, return it as-is. - if _is_compatible_text_stream(text_stream, encoding, errors) and not ( - encoding is None and _stream_is_misconfigured(text_stream) - ): - return text_stream - - # Otherwise, get the underlying binary reader. - possible_binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if possible_binary_reader is None: - return text_stream - - binary_reader = possible_binary_reader - - # Default errors to replace instead of strict in order to get - # something that works. - if errors is None: - errors = "replace" - - # Wrap the binary stream in a text stream with the correct - # encoding parameters. - return _make_text_stream( - binary_reader, - encoding, - errors, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def _force_correct_text_reader( - text_reader: t.IO[t.Any], - encoding: t.Optional[str], - errors: t.Optional[str], - force_readable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_reader, - encoding, - errors, - _is_binary_reader, - _find_binary_reader, - force_readable=force_readable, - ) - - -def _force_correct_text_writer( - text_writer: t.IO[t.Any], - encoding: t.Optional[str], - errors: t.Optional[str], - force_writable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - -def get_binary_stdin() -> t.BinaryIO: - reader = _find_binary_reader(sys.stdin) - if reader is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdin.") - return reader - - -def get_binary_stdout() -> t.BinaryIO: - writer = _find_binary_writer(sys.stdout) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdout.") - return writer - - -def get_binary_stderr() -> t.BinaryIO: - writer = _find_binary_writer(sys.stderr) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stderr.") - return writer - - -def get_text_stdin( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) - - -def get_text_stdout( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) - - -def get_text_stderr( - encoding: t.Optional[str] = None, errors: t.Optional[str] = None -) -> t.TextIO: - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) - - -def _wrap_io_open( - file: t.Union[str, "os.PathLike[str]", int], - mode: str, - encoding: t.Optional[str], - errors: t.Optional[str], -) -> t.IO[t.Any]: - """Handles not passing ``encoding`` and ``errors`` in binary mode.""" - if "b" in mode: - return open(file, mode) - - return open(file, mode, encoding=encoding, errors=errors) - - -def open_stream( - filename: "t.Union[str, os.PathLike[str]]", - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, -) -> t.Tuple[t.IO[t.Any], bool]: - binary = "b" in mode - filename = os.fspath(filename) - - # Standard streams first. These are simple because they ignore the - # atomic flag. Use fsdecode to handle Path("-"). - if os.fsdecode(filename) == "-": - if any(m in mode for m in ["w", "a", "x"]): - if binary: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if binary: - return get_binary_stdin(), False - return get_text_stdin(encoding=encoding, errors=errors), False - - # Non-atomic writes directly go out through the regular open functions. - if not atomic: - return _wrap_io_open(filename, mode, encoding, errors), True - - # Some usability stuff for atomic writes - if "a" in mode: - raise ValueError( - "Appending to an existing file is not supported, because that" - " would involve an expensive `copy`-operation to a temporary" - " file. Open the file in normal `w`-mode and copy explicitly" - " if that's what you're after." - ) - if "x" in mode: - raise ValueError("Use the `overwrite`-parameter instead.") - if "w" not in mode: - raise ValueError("Atomic writes only make sense with `w`-mode.") - - # Atomic writes are more complicated. They work by opening a file - # as a proxy in the same folder and then using the fdopen - # functionality to wrap it in a Python file. Then we wrap it in an - # atomic file that moves the file over on close. - import errno - import random - - try: - perm: t.Optional[int] = os.stat(filename).st_mode - except OSError: - perm = None - - flags = os.O_RDWR | os.O_CREAT | os.O_EXCL - - if binary: - flags |= getattr(os, "O_BINARY", 0) - - while True: - tmp_filename = os.path.join( - os.path.dirname(filename), - f".__atomic-write{random.randrange(1 << 32):08x}", - ) - try: - fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) - break - except OSError as e: - if e.errno == errno.EEXIST or ( - os.name == "nt" - and e.errno == errno.EACCES - and os.path.isdir(e.filename) - and os.access(e.filename, os.W_OK) - ): - continue - raise - - if perm is not None: - os.chmod(tmp_filename, perm) # in case perm includes bits in umask - - f = _wrap_io_open(fd, mode, encoding, errors) - af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) - return t.cast(t.IO[t.Any], af), True - - -class _AtomicFile: - def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self) -> str: - return self._real_filename - - def close(self, delete: bool = False) -> None: - if self.closed: - return - self._f.close() - os.replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._f, name) - - def __enter__(self) -> "_AtomicFile": - return self - - def __exit__(self, exc_type: t.Optional[t.Type[BaseException]], *_: t.Any) -> None: - self.close(delete=exc_type is not None) - - def __repr__(self) -> str: - return repr(self._f) - - -def strip_ansi(value: str) -> str: - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi( - stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None -) -> bool: - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(stream) and not _is_jupyter_kernel_output(stream) - return not color - - -# On Windows, wrap the output streams with colorama to support ANSI -# color codes. -# NOTE: double check is needed so mypy does not analyze this on Linux -if sys.platform.startswith("win") and WIN: - from ._winconsole import _get_windows_console_stream - - def _get_argv_encoding() -> str: - import locale - - return locale.getpreferredencoding() - - _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def auto_wrap_for_ansi( - stream: t.TextIO, color: t.Optional[bool] = None - ) -> t.TextIO: - """Support ANSI color and style codes on Windows by wrapping a - stream with colorama. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - - if cached is not None: - return cached - - import colorama - - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = t.cast(t.TextIO, ansi_wrapper.stream) - _write = rv.write - - def _safe_write(s): - try: - return _write(s) - except BaseException: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write - - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - - return rv - -else: - - def _get_argv_encoding() -> str: - return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() - - def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] - ) -> t.Optional[t.TextIO]: - return None - - -def term_len(x: str) -> int: - return len(strip_ansi(x)) - - -def isatty(stream: t.IO[t.Any]) -> bool: - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func( - src_func: t.Callable[[], t.Optional[t.TextIO]], - wrapper_func: t.Callable[[], t.TextIO], -) -> t.Callable[[], t.Optional[t.TextIO]]: - cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def func() -> t.Optional[t.TextIO]: - stream = src_func() - - if stream is None: - return None - - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - cache[stream] = rv - except Exception: - pass - return rv - - return func - - -_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) -_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) -_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) - - -binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams: t.Mapping[ - str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] -] = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/port/lib/python3.11/site-packages/click/_termui_impl.py b/port/lib/python3.11/site-packages/click/_termui_impl.py deleted file mode 100644 index ad9f8f6..0000000 --- a/port/lib/python3.11/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,788 +0,0 @@ -""" -This module contains implementations for the termui module. To keep the -import time of Click down, some infrequently used functionality is -placed in this module and only imported as needed. -""" - -import contextlib -import math -import os -import sys -import time -import typing as t -from gettext import gettext as _ -from io import StringIO -from shutil import which -from types import TracebackType - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import isatty -from ._compat import open_stream -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -V = t.TypeVar("V") - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -class ProgressBar(t.Generic[V]): - def __init__( - self, - iterable: t.Optional[t.Iterable[V]], - length: t.Optional[int] = None, - fill_char: str = "#", - empty_char: str = " ", - bar_template: str = "%(bar)s", - info_sep: str = " ", - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - label: t.Optional[str] = None, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, - width: int = 30, - ) -> None: - self.fill_char = fill_char - self.empty_char = empty_char - self.bar_template = bar_template - self.info_sep = info_sep - self.show_eta = show_eta - self.show_percent = show_percent - self.show_pos = show_pos - self.item_show_func = item_show_func - self.label: str = label or "" - - if file is None: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - file = StringIO() - - self.file = file - self.color = color - self.update_min_steps = update_min_steps - self._completed_intervals = 0 - self.width: int = width - self.autowidth: bool = width == 0 - - if length is None: - from operator import length_hint - - length = length_hint(iterable, -1) - - if length == -1: - length = None - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = t.cast(t.Iterable[V], range(length)) - self.iter: t.Iterable[V] = iter(iterable) - self.length = length - self.pos = 0 - self.avg: t.List[float] = [] - self.last_eta: float - self.start: float - self.start = self.last_eta = time.time() - self.eta_known: bool = False - self.finished: bool = False - self.max_width: t.Optional[int] = None - self.entered: bool = False - self.current_item: t.Optional[V] = None - self.is_hidden: bool = not isatty(self.file) - self._last_line: t.Optional[str] = None - - def __enter__(self) -> "ProgressBar[V]": - self.entered = True - self.render_progress() - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - self.render_finish() - - def __iter__(self) -> t.Iterator[V]: - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - self.render_progress() - return self.generator() - - def __next__(self) -> V: - # Iteration is defined in terms of a generator function, - # returned by iter(self); use that to define next(). This works - # because `self.iter` is an iterable consumed by that generator, - # so it is re-entry safe. Calling `next(self.generator())` - # twice works and does "what you want". - return next(iter(self)) - - def render_finish(self) -> None: - if self.is_hidden: - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self) -> float: - if self.finished: - return 1.0 - return min(self.pos / (float(self.length or 1) or 1), 1.0) - - @property - def time_per_iteration(self) -> float: - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self) -> float: - if self.length is not None and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self) -> str: - if self.eta_known: - t = int(self.eta) - seconds = t % 60 - t //= 60 - minutes = t % 60 - t //= 60 - hours = t % 24 - t //= 24 - if t > 0: - return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" - else: - return f"{hours:02}:{minutes:02}:{seconds:02}" - return "" - - def format_pos(self) -> str: - pos = str(self.pos) - if self.length is not None: - pos += f"/{self.length}" - return pos - - def format_pct(self) -> str: - return f"{int(self.pct * 100): 4}%"[1:] - - def format_bar(self) -> str: - if self.length is not None: - bar_length = int(self.pct * self.width) - bar = self.fill_char * bar_length - bar += self.empty_char * (self.width - bar_length) - elif self.finished: - bar = self.fill_char * self.width - else: - chars = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - chars[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(chars) - return bar - - def format_progress_line(self) -> str: - show_percent = self.show_percent - - info_bits = [] - if self.length is not None and show_percent is None: - show_percent = not self.show_pos - - if self.show_pos: - info_bits.append(self.format_pos()) - if show_percent: - info_bits.append(self.format_pct()) - if self.show_eta and self.eta_known and not self.finished: - info_bits.append(self.format_eta()) - if self.item_show_func is not None: - item_info = self.item_show_func(self.current_item) - if item_info is not None: - info_bits.append(item_info) - - return ( - self.bar_template - % { - "label": self.label, - "bar": self.format_bar(), - "info": self.info_sep.join(info_bits), - } - ).rstrip() - - def render_progress(self) -> None: - import shutil - - if self.is_hidden: - # Only output the label as it changes if the output is not a - # TTY. Use file=stderr if you expect to be piping stdout. - if self._last_line != self.label: - self._last_line = self.label - echo(self.label, file=self.file, color=self.color) - - return - - buf = [] - # Update width in case the terminal has been resized - if self.autowidth: - old_width = self.width - self.width = 0 - clutter_length = term_len(self.format_progress_line()) - new_width = max(0, shutil.get_terminal_size().columns - clutter_length) - if new_width < old_width: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) # type: ignore - self.max_width = new_width - self.width = new_width - - clear_width = self.width - if self.max_width is not None: - clear_width = self.max_width - - buf.append(BEFORE_BAR) - line = self.format_progress_line() - line_len = term_len(line) - if self.max_width is None or self.max_width < line_len: - self.max_width = line_len - - buf.append(line) - buf.append(" " * (clear_width - line_len)) - line = "".join(buf) - # Render the line only if it changed. - - if line != self._last_line: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps: int) -> None: - self.pos += n_steps - if self.length is not None and self.pos >= self.length: - self.finished = True - - if (time.time() - self.last_eta) < 1.0: - return - - self.last_eta = time.time() - - # self.avg is a rolling list of length <= 7 of steps where steps are - # defined as time elapsed divided by the total progress through - # self.length. - if self.pos: - step = (time.time() - self.start) / self.pos - else: - step = time.time() - self.start - - self.avg = self.avg[-6:] + [step] - - self.eta_known = self.length is not None - - def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: - """Update the progress bar by advancing a specified number of - steps, and optionally set the ``current_item`` for this new - position. - - :param n_steps: Number of steps to advance. - :param current_item: Optional item to set as ``current_item`` - for the updated position. - - .. versionchanged:: 8.0 - Added the ``current_item`` optional parameter. - - .. versionchanged:: 8.0 - Only render when the number of steps meets the - ``update_min_steps`` threshold. - """ - if current_item is not None: - self.current_item = current_item - - self._completed_intervals += n_steps - - if self._completed_intervals >= self.update_min_steps: - self.make_step(self._completed_intervals) - self.render_progress() - self._completed_intervals = 0 - - def finish(self) -> None: - self.eta_known = False - self.current_item = None - self.finished = True - - def generator(self) -> t.Iterator[V]: - """Return a generator which yields the items added to the bar - during construction, and updates the progress bar *after* the - yielded block returns. - """ - # WARNING: the iterator interface for `ProgressBar` relies on - # this and only works because this is a simple generator which - # doesn't create or manage additional state. If this function - # changes, the impact should be evaluated both against - # `iter(bar)` and `next(bar)`. `next()` in particular may call - # `self.generator()` repeatedly, and this must remain safe in - # order for that interface to work. - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - - if self.is_hidden: - yield from self.iter - else: - for rv in self.iter: - self.current_item = rv - - # This allows show_item_func to be updated before the - # item is processed. Only trigger at the beginning of - # the update interval. - if self._completed_intervals == 0: - self.render_progress() - - yield rv - self.update(1) - - self.finish() - self.render_progress() - - -def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: - """Decide what method to use for paging through text.""" - stdout = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if stdout is None: - stdout = StringIO() - - if not isatty(sys.stdin) or not isatty(stdout): - return _nullpager(stdout, generator, color) - pager_cmd = (os.environ.get("PAGER", None) or "").strip() - if pager_cmd: - if WIN: - if _tempfilepager(generator, pager_cmd, color): - return - elif _pipepager(generator, pager_cmd, color): - return - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if (WIN or sys.platform.startswith("os2")) and _tempfilepager( - generator, "more", color - ): - return - if _pipepager(generator, "less", color): - return - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if _pipepager(generator, "more", color): - return - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> bool: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - - Returns True if the command was found, False otherwise and thus another - pager should be attempted. - """ - cmd_absolute = which(cmd) - if cmd_absolute is None: - return False - - import subprocess - - env = dict(os.environ) - - # If we're piping to less we might support colors under the - # condition that - cmd_detail = cmd.rsplit("/", 1)[-1].split() - if color is None and cmd_detail[0] == "less": - less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" - if not less_flags: - env["LESS"] = "-R" - color = True - elif "r" in less_flags or "R" in less_flags: - color = True - - c = subprocess.Popen( - [cmd_absolute], - shell=True, - stdin=subprocess.PIPE, - env=env, - errors="replace", - text=True, - ) - assert c.stdin is not None - try: - for text in generator: - if not color: - text = strip_ansi(text) - - c.stdin.write(text) - except (OSError, KeyboardInterrupt): - pass - else: - c.stdin.close() - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - return True - - -def _tempfilepager( - generator: t.Iterable[str], - cmd: str, - color: t.Optional[bool], -) -> bool: - """Page through text by invoking a program on a temporary file. - - Returns True if the command was found, False otherwise and thus another - pager should be attempted. - """ - # Which is necessary for Windows, it is also recommended in the Popen docs. - cmd_absolute = which(cmd) - if cmd_absolute is None: - return False - - import subprocess - import tempfile - - fd, filename = tempfile.mkstemp() - # TODO: This never terminates if the passed generator never terminates. - text = "".join(generator) - if not color: - text = strip_ansi(text) - encoding = get_best_encoding(sys.stdout) - with open_stream(filename, "wb")[0] as f: - f.write(text.encode(encoding)) - try: - subprocess.call([cmd_absolute, filename]) - except OSError: - # Command not found - pass - finally: - os.close(fd) - os.unlink(filename) - - return True - - -def _nullpager( - stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] -) -> None: - """Simply print unformatted text. This is the ultimate fallback.""" - for text in generator: - if not color: - text = strip_ansi(text) - stream.write(text) - - -class Editor: - def __init__( - self, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - ) -> None: - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self) -> str: - if self.editor is not None: - return self.editor - for key in "VISUAL", "EDITOR": - rv = os.environ.get(key) - if rv: - return rv - if WIN: - return "notepad" - for editor in "sensible-editor", "vim", "nano": - if which(editor) is not None: - return editor - return "vi" - - def edit_file(self, filename: str) -> None: - import subprocess - - editor = self.get_editor() - environ: t.Optional[t.Dict[str, str]] = None - - if self.env: - environ = os.environ.copy() - environ.update(self.env) - - try: - c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) - exit_code = c.wait() - if exit_code != 0: - raise ClickException( - _("{editor}: Editing failed").format(editor=editor) - ) - except OSError as e: - raise ClickException( - _("{editor}: Editing failed: {e}").format(editor=editor, e=e) - ) from e - - def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: - import tempfile - - if not text: - data = b"" - elif isinstance(text, (bytes, bytearray)): - data = text - else: - if text and not text.endswith("\n"): - text += "\n" - - if WIN: - data = text.replace("\n", "\r\n").encode("utf-8-sig") - else: - data = text.encode("utf-8") - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - f: t.BinaryIO - - try: - with os.fdopen(fd, "wb") as f: - f.write(data) - - # If the filesystem resolution is 1 second, like Mac OS - # 10.12 Extended, or 2 seconds, like FAT32, and the editor - # closes very fast, require_save can fail. Set the modified - # time to be 2 seconds in the past to work around this. - os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) - # Depending on the resolution, the exact value might not be - # recorded, so get the new recorded value. - timestamp = os.path.getmtime(name) - - self.edit_file(name) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - with open(name, "rb") as f: - rv = f.read() - - if isinstance(text, (bytes, bytearray)): - return rv - - return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore - finally: - os.unlink(name) - - -def open_url(url: str, wait: bool = False, locate: bool = False) -> int: - import subprocess - - def _unquote_file(url: str) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if sys.platform == "darwin": - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif WIN: - if locate: - url = _unquote_file(url) - args = ["explorer", f"/select,{url}"] - else: - args = ["start"] - if wait: - args.append("/WAIT") - args.append("") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - elif CYGWIN: - if locate: - url = _unquote_file(url) - args = ["cygstart", os.path.dirname(url)] - else: - args = ["cygstart"] - if wait: - args.append("-w") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 - - -def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: - if ch == "\x03": - raise KeyboardInterrupt() - - if ch == "\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - - if ch == "\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - return None - - -if WIN: - import msvcrt - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - yield -1 - - def getchar(echo: bool) -> str: - # The function `getch` will return a bytes object corresponding to - # the pressed character. Since Windows 10 build 1803, it will also - # return \x00 when called a second time after pressing a regular key. - # - # `getwch` does not share this probably-bugged behavior. Moreover, it - # returns a Unicode object by default, which is what we want. - # - # Either of these functions will return \x00 or \xe0 to indicate - # a special key, and you need to call the same function again to get - # the "rest" of the code. The fun part is that \u00e0 is - # "latin small letter a with grave", so if you type that on a French - # keyboard, you _also_ get a \xe0. - # E.g., consider the Up arrow. This returns \xe0 and then \x48. The - # resulting Unicode string reads as "a with grave" + "capital H". - # This is indistinguishable from when the user actually types - # "a with grave" and then "capital H". - # - # When \xe0 is returned, we assume it's part of a special-key sequence - # and call `getwch` again, but that means that when the user types - # the \u00e0 character, `getchar` doesn't return until a second - # character is typed. - # The alternative is returning immediately, but that would mess up - # cross-platform handling of arrow keys and others that start with - # \xe0. Another option is using `getch`, but then we can't reliably - # read non-ASCII characters, because return values of `getch` are - # limited to the current 8-bit codepage. - # - # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` - # is doing the right thing in more situations than with `getch`. - func: t.Callable[[], str] - - if echo: - func = msvcrt.getwche # type: ignore - else: - func = msvcrt.getwch # type: ignore - - rv = func() - - if rv in ("\x00", "\xe0"): - # \x00 and \xe0 are control characters that indicate special key, - # see above. - rv += func() - - _translate_ch_to_exc(rv) - return rv - -else: - import termios - import tty - - @contextlib.contextmanager - def raw_terminal() -> t.Iterator[int]: - f: t.Optional[t.TextIO] - fd: int - - if not isatty(sys.stdin): - f = open("/dev/tty") - fd = f.fileno() - else: - fd = sys.stdin.fileno() - f = None - - try: - old_settings = termios.tcgetattr(fd) - - try: - tty.setraw(fd) - yield fd - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - - if f is not None: - f.close() - except termios.error: - pass - - def getchar(echo: bool) -> str: - with raw_terminal() as fd: - ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") - - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - - _translate_ch_to_exc(ch) - return ch diff --git a/port/lib/python3.11/site-packages/click/_textwrap.py b/port/lib/python3.11/site-packages/click/_textwrap.py deleted file mode 100644 index b47dcbd..0000000 --- a/port/lib/python3.11/site-packages/click/_textwrap.py +++ /dev/null @@ -1,49 +0,0 @@ -import textwrap -import typing as t -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word( - self, - reversed_chunks: t.List[str], - cur_line: t.List[str], - cur_len: int, - width: int, - ) -> None: - space_left = max(width - cur_len, 1) - - if self.break_long_words: - last = reversed_chunks[-1] - cut = last[:space_left] - res = last[space_left:] - cur_line.append(cut) - reversed_chunks[-1] = res - elif not cur_line: - cur_line.append(reversed_chunks.pop()) - - @contextmanager - def extra_indent(self, indent: str) -> t.Iterator[None]: - old_initial_indent = self.initial_indent - old_subsequent_indent = self.subsequent_indent - self.initial_indent += indent - self.subsequent_indent += indent - - try: - yield - finally: - self.initial_indent = old_initial_indent - self.subsequent_indent = old_subsequent_indent - - def indent_only(self, text: str) -> str: - rv = [] - - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - - if idx > 0: - indent = self.subsequent_indent - - rv.append(f"{indent}{line}") - - return "\n".join(rv) diff --git a/port/lib/python3.11/site-packages/click/_winconsole.py b/port/lib/python3.11/site-packages/click/_winconsole.py deleted file mode 100644 index 6b20df3..0000000 --- a/port/lib/python3.11/site-packages/click/_winconsole.py +++ /dev/null @@ -1,279 +0,0 @@ -# This module is based on the excellent work by Adam Bartoš who -# provided a lot of what went into the implementation here in -# the discussion to issue1602 in the Python bug tracker. -# -# There are some general differences in regards to how this works -# compared to the original patches as we do not need to patch -# the entire interpreter but just work in our little world of -# echo and prompt. -import io -import sys -import time -import typing as t -from ctypes import byref -from ctypes import c_char -from ctypes import c_char_p -from ctypes import c_int -from ctypes import c_ssize_t -from ctypes import c_ulong -from ctypes import c_void_p -from ctypes import POINTER -from ctypes import py_object -from ctypes import Structure -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -from ._compat import _NonClosingTextIOWrapper - -assert sys.platform == "win32" -import msvcrt # noqa: E402 -from ctypes import windll # noqa: E402 -from ctypes import WINFUNCTYPE # noqa: E402 - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetConsoleMode = kernel32.GetConsoleMode -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ("CommandLineToArgvW", windll.shell32) -) -LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) - -STDIN_HANDLE = GetStdHandle(-10) -STDOUT_HANDLE = GetStdHandle(-11) -STDERR_HANDLE = GetStdHandle(-12) - -PyBUF_SIMPLE = 0 -PyBUF_WRITABLE = 1 - -ERROR_SUCCESS = 0 -ERROR_NOT_ENOUGH_MEMORY = 8 -ERROR_OPERATION_ABORTED = 995 - -STDIN_FILENO = 0 -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -EOF = b"\x1a" -MAX_BYTES_WRITTEN = 32767 - -try: - from ctypes import pythonapi -except ImportError: - # On PyPy we cannot get buffers so our ability to operate here is - # severely limited. - get_buffer = None -else: - - class Py_buffer(Structure): - _fields_ = [ - ("buf", c_void_p), - ("obj", py_object), - ("len", c_ssize_t), - ("itemsize", c_ssize_t), - ("readonly", c_int), - ("ndim", c_int), - ("format", c_char_p), - ("shape", c_ssize_p), - ("strides", c_ssize_p), - ("suboffsets", c_ssize_p), - ("internal", c_void_p), - ] - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release - - def get_buffer(obj, writable=False): - buf = Py_buffer() - flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE - PyObject_GetBuffer(py_object(obj), byref(buf), flags) - - try: - buffer_type = c_char * buf.len - return buffer_type.from_address(buf.buf) - finally: - PyBuffer_Release(byref(buf)) - - -class _WindowsConsoleRawIOBase(io.RawIOBase): - def __init__(self, handle): - self.handle = handle - - def isatty(self): - super().isatty() - return True - - -class _WindowsConsoleReader(_WindowsConsoleRawIOBase): - def readable(self): - return True - - def readinto(self, b): - bytes_to_be_read = len(b) - if not bytes_to_be_read: - return 0 - elif bytes_to_be_read % 2: - raise ValueError( - "cannot read odd number of bytes from UTF-16-LE encoded console" - ) - - buffer = get_buffer(b, writable=True) - code_units_to_be_read = bytes_to_be_read // 2 - code_units_read = c_ulong() - - rv = ReadConsoleW( - HANDLE(self.handle), - buffer, - code_units_to_be_read, - byref(code_units_read), - None, - ) - if GetLastError() == ERROR_OPERATION_ABORTED: - # wait for KeyboardInterrupt - time.sleep(0.1) - if not rv: - raise OSError(f"Windows error: {GetLastError()}") - - if buffer[0] == EOF: - return 0 - return 2 * code_units_read.value - - -class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): - def writable(self): - return True - - @staticmethod - def _get_error_message(errno): - if errno == ERROR_SUCCESS: - return "ERROR_SUCCESS" - elif errno == ERROR_NOT_ENOUGH_MEMORY: - return "ERROR_NOT_ENOUGH_MEMORY" - return f"Windows error {errno}" - - def write(self, b): - bytes_to_be_written = len(b) - buf = get_buffer(b) - code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 - code_units_written = c_ulong() - - WriteConsoleW( - HANDLE(self.handle), - buf, - code_units_to_be_written, - byref(code_units_written), - None, - ) - bytes_written = 2 * code_units_written.value - - if bytes_written == 0 and bytes_to_be_written > 0: - raise OSError(self._get_error_message(GetLastError())) - return bytes_written - - -class ConsoleStream: - def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self) -> str: - return self.buffer.name - - def write(self, x: t.AnyStr) -> int: - if isinstance(x, str): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: - for line in lines: - self.write(line) - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._text_stream, name) - - def isatty(self) -> bool: - return self.buffer.isatty() - - def __repr__(self): - return f"" - - -def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f: t.TextIO) -> bool: - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except (OSError, io.UnsupportedOperation): - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream( - f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] -) -> t.Optional[t.TextIO]: - if ( - get_buffer is not None - and encoding in {"utf-16-le", None} - and errors in {"strict", None} - and _is_console(f) - ): - func = _stream_factories.get(f.fileno()) - if func is not None: - b = getattr(f, "buffer", None) - - if b is None: - return None - - return func(b) diff --git a/port/lib/python3.11/site-packages/click/core.py b/port/lib/python3.11/site-packages/click/core.py deleted file mode 100644 index e630501..0000000 --- a/port/lib/python3.11/site-packages/click/core.py +++ /dev/null @@ -1,3047 +0,0 @@ -import enum -import errno -import inspect -import os -import sys -import typing as t -from collections import abc -from contextlib import contextmanager -from contextlib import ExitStack -from functools import update_wrapper -from gettext import gettext as _ -from gettext import ngettext -from itertools import repeat -from types import TracebackType - -from . import types -from .exceptions import Abort -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import Exit -from .exceptions import MissingParameter -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import join_options -from .globals import pop_context -from .globals import push_context -from .parser import _flag_needs_value -from .parser import OptionParser -from .parser import split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .utils import _detect_program_name -from .utils import _expand_args -from .utils import echo -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .decorators import HelpOption - from .shell_completion import CompletionItem - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -V = t.TypeVar("V") - - -def _complete_visible_commands( - ctx: "Context", incomplete: str -) -> t.Iterator[t.Tuple[str, "Command"]]: - """List all the subcommands of a group that start with the - incomplete value and aren't hidden. - - :param ctx: Invocation context for the group. - :param incomplete: Value being completed. May be empty. - """ - multi = t.cast(MultiCommand, ctx.command) - - for name in multi.list_commands(ctx): - if name.startswith(incomplete): - command = multi.get_command(ctx, name) - - if command is not None and not command.hidden: - yield name, command - - -def _check_multicommand( - base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False -) -> None: - if not base_command.chain or not isinstance(cmd, MultiCommand): - return - if register: - hint = ( - "It is not possible to add multi commands as children to" - " another multi command that is in chain mode." - ) - else: - hint = ( - "Found a multi command as subcommand to a multi command" - " that is in chain mode. This is not supported." - ) - raise RuntimeError( - f"{hint}. Command {base_command.name!r} is set to chain and" - f" {cmd_name!r} was added as a subcommand but it in itself is a" - f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" - f" within a chained {type(base_command).__name__} named" - f" {base_command.name!r})." - ) - - -def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: - return list(zip(*repeat(iter(iterable), batch_size))) - - -@contextmanager -def augment_usage_errors( - ctx: "Context", param: t.Optional["Parameter"] = None -) -> t.Iterator[None]: - """Context manager that attaches extra information to exceptions.""" - try: - yield - except BadParameter as e: - if e.ctx is None: - e.ctx = ctx - if param is not None and e.param is None: - e.param = param - raise - except UsageError as e: - if e.ctx is None: - e.ctx = ctx - raise - - -def iter_params_for_processing( - invocation_order: t.Sequence["Parameter"], - declaration_order: t.Sequence["Parameter"], -) -> t.List["Parameter"]: - """Returns all declared parameters in the order they should be processed. - - The declared parameters are re-shuffled depending on the order in which - they were invoked, as well as the eagerness of each parameters. - - The invocation order takes precedence over the declaration order. I.e. the - order in which the user provided them to the CLI is respected. - - This behavior and its effect on callback evaluation is detailed at: - https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order - """ - - def sort_key(item: "Parameter") -> t.Tuple[bool, float]: - try: - idx: float = invocation_order.index(item) - except ValueError: - idx = float("inf") - - return not item.is_eager, idx - - return sorted(declaration_order, key=sort_key) - - -class ParameterSource(enum.Enum): - """This is an :class:`~enum.Enum` that indicates the source of a - parameter's value. - - Use :meth:`click.Context.get_parameter_source` to get the - source for a parameter by name. - - .. versionchanged:: 8.0 - Use :class:`~enum.Enum` and drop the ``validate`` method. - - .. versionchanged:: 8.0 - Added the ``PROMPT`` value. - """ - - COMMANDLINE = enum.auto() - """The value was provided by the command line args.""" - ENVIRONMENT = enum.auto() - """The value was provided with an environment variable.""" - DEFAULT = enum.auto() - """Used the default specified by the parameter.""" - DEFAULT_MAP = enum.auto() - """Used a default provided by :attr:`Context.default_map`.""" - PROMPT = enum.auto() - """Used a prompt to confirm a default or provide a value.""" - - -class Context: - """The context is a special internal object that holds state relevant - for the script execution at every single level. It's normally invisible - to commands unless they opt-in to getting access to it. - - The context is useful as it can pass internal objects around and can - control special execution features such as reading data from - environment variables. - - A context can be used as context manager in which case it will call - :meth:`close` on teardown. - - :param command: the command class for this context. - :param parent: the parent context. - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it is usually - the name of the script, for commands below it it's - the name of the script. - :param obj: an arbitrary object of user data. - :param auto_envvar_prefix: the prefix to use for automatic environment - variables. If this is `None` then reading - from environment variables is disabled. This - does not affect manually set environment - variables which are always read. - :param default_map: a dictionary (like object) with default values - for parameters. - :param terminal_width: the width of the terminal. The default is - inherit from parent context. If no context - defines the terminal width then auto - detection will be applied. - :param max_content_width: the maximum width for content rendered by - Click (this currently only affects help - pages). This defaults to 80 characters if - not overridden. In other words: even if the - terminal is larger than that, Click will not - format things wider than 80 characters by - default. In addition to that, formatters might - add some safety mapping on the right. - :param resilient_parsing: if this flag is enabled then Click will - parse without any interactivity or callback - invocation. Default values will also be - ignored. This is useful for implementing - things such as completion support. - :param allow_extra_args: if this is set to `True` then extra arguments - at the end will not raise an error and will be - kept on the context. The default is to inherit - from the command. - :param allow_interspersed_args: if this is set to `False` then options - and arguments cannot be mixed. The - default is to inherit from the command. - :param ignore_unknown_options: instructs click to ignore options it does - not know and keeps them for later - processing. - :param help_option_names: optionally a list of strings that define how - the default help parameter is named. The - default is ``['--help']``. - :param token_normalize_func: an optional function that is used to - normalize tokens (options, choices, - etc.). This for instance can be used to - implement case insensitive behavior. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are used in texts that Click prints which is by - default not the case. This for instance would affect - help output. - :param show_default: Show the default value for commands. If this - value is not set, it defaults to the value from the parent - context. ``Command.show_default`` overrides this default for the - specific command. - - .. versionchanged:: 8.1 - The ``show_default`` parameter is overridden by - ``Command.show_default``, instead of the other way around. - - .. versionchanged:: 8.0 - The ``show_default`` parameter defaults to the value from the - parent context. - - .. versionchanged:: 7.1 - Added the ``show_default`` parameter. - - .. versionchanged:: 4.0 - Added the ``color``, ``ignore_unknown_options``, and - ``max_content_width`` parameters. - - .. versionchanged:: 3.0 - Added the ``allow_extra_args`` and ``allow_interspersed_args`` - parameters. - - .. versionchanged:: 2.0 - Added the ``resilient_parsing``, ``help_option_names``, and - ``token_normalize_func`` parameters. - """ - - #: The formatter class to create with :meth:`make_formatter`. - #: - #: .. versionadded:: 8.0 - formatter_class: t.Type["HelpFormatter"] = HelpFormatter - - def __init__( - self, - command: "Command", - parent: t.Optional["Context"] = None, - info_name: t.Optional[str] = None, - obj: t.Optional[t.Any] = None, - auto_envvar_prefix: t.Optional[str] = None, - default_map: t.Optional[t.MutableMapping[str, t.Any]] = None, - terminal_width: t.Optional[int] = None, - max_content_width: t.Optional[int] = None, - resilient_parsing: bool = False, - allow_extra_args: t.Optional[bool] = None, - allow_interspersed_args: t.Optional[bool] = None, - ignore_unknown_options: t.Optional[bool] = None, - help_option_names: t.Optional[t.List[str]] = None, - token_normalize_func: t.Optional[t.Callable[[str], str]] = None, - color: t.Optional[bool] = None, - show_default: t.Optional[bool] = None, - ) -> None: - #: the parent context or `None` if none exists. - self.parent = parent - #: the :class:`Command` for this context. - self.command = command - #: the descriptive information name - self.info_name = info_name - #: Map of parameter names to their parsed values. Parameters - #: with ``expose_value=False`` are not stored. - self.params: t.Dict[str, t.Any] = {} - #: the leftover arguments. - self.args: t.List[str] = [] - #: protected arguments. These are arguments that are prepended - #: to `args` when certain parsing scenarios are encountered but - #: must be never propagated to another arguments. This is used - #: to implement nested parsing. - self.protected_args: t.List[str] = [] - #: the collected prefixes of the command's options. - self._opt_prefixes: t.Set[str] = set(parent._opt_prefixes) if parent else set() - - if obj is None and parent is not None: - obj = parent.obj - - #: the user object stored. - self.obj: t.Any = obj - self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and info_name is not None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - - self.default_map: t.Optional[t.MutableMapping[str, t.Any]] = default_map - - #: This flag indicates if a subcommand is going to be executed. A - #: group callback can use this information to figure out if it's - #: being executed directly or because the execution flow passes - #: onwards to a subcommand. By default it's None, but it can be - #: the name of the subcommand to execute. - #: - #: If chaining is enabled this will be set to ``'*'`` in case - #: any commands are executed. It is however not possible to - #: figure out which ones. If you require this knowledge you - #: should use a :func:`result_callback`. - self.invoked_subcommand: t.Optional[str] = None - - if terminal_width is None and parent is not None: - terminal_width = parent.terminal_width - - #: The width of the terminal (None is autodetection). - self.terminal_width: t.Optional[int] = terminal_width - - if max_content_width is None and parent is not None: - max_content_width = parent.max_content_width - - #: The maximum width of formatted content (None implies a sensible - #: default which is 80 for most things). - self.max_content_width: t.Optional[int] = max_content_width - - if allow_extra_args is None: - allow_extra_args = command.allow_extra_args - - #: Indicates if the context allows extra args or if it should - #: fail on parsing. - #: - #: .. versionadded:: 3.0 - self.allow_extra_args = allow_extra_args - - if allow_interspersed_args is None: - allow_interspersed_args = command.allow_interspersed_args - - #: Indicates if the context allows mixing of arguments and - #: options or not. - #: - #: .. versionadded:: 3.0 - self.allow_interspersed_args: bool = allow_interspersed_args - - if ignore_unknown_options is None: - ignore_unknown_options = command.ignore_unknown_options - - #: Instructs click to ignore options that a command does not - #: understand and will store it on the context for later - #: processing. This is primarily useful for situations where you - #: want to call into external programs. Generally this pattern is - #: strongly discouraged because it's not possibly to losslessly - #: forward all arguments. - #: - #: .. versionadded:: 4.0 - self.ignore_unknown_options: bool = ignore_unknown_options - - if help_option_names is None: - if parent is not None: - help_option_names = parent.help_option_names - else: - help_option_names = ["--help"] - - #: The names for the help options. - self.help_option_names: t.List[str] = help_option_names - - if token_normalize_func is None and parent is not None: - token_normalize_func = parent.token_normalize_func - - #: An optional normalization function for tokens. This is - #: options, choices, commands etc. - self.token_normalize_func: t.Optional[t.Callable[[str], str]] = ( - token_normalize_func - ) - - #: Indicates if resilient parsing is enabled. In that case Click - #: will do its best to not cause any failures and default values - #: will be ignored. Useful for completion. - self.resilient_parsing: bool = resilient_parsing - - # If there is no envvar prefix yet, but the parent has one and - # the command on this level has a name, we can expand the envvar - # prefix automatically. - if auto_envvar_prefix is None: - if ( - parent is not None - and parent.auto_envvar_prefix is not None - and self.info_name is not None - ): - auto_envvar_prefix = ( - f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" - ) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - - if auto_envvar_prefix is not None: - auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") - - self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix - - if color is None and parent is not None: - color = parent.color - - #: Controls if styling output is wanted or not. - self.color: t.Optional[bool] = color - - if show_default is None and parent is not None: - show_default = parent.show_default - - #: Show option default values when formatting help text. - self.show_default: t.Optional[bool] = show_default - - self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] - self._depth = 0 - self._parameter_source: t.Dict[str, ParameterSource] = {} - self._exit_stack = ExitStack() - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire CLI - structure. - - .. code-block:: python - - with Context(cli) as ctx: - info = ctx.to_info_dict() - - .. versionadded:: 8.0 - """ - return { - "command": self.command.to_info_dict(self), - "info_name": self.info_name, - "allow_extra_args": self.allow_extra_args, - "allow_interspersed_args": self.allow_interspersed_args, - "ignore_unknown_options": self.ignore_unknown_options, - "auto_envvar_prefix": self.auto_envvar_prefix, - } - - def __enter__(self) -> "Context": - self._depth += 1 - push_context(self) - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - self._depth -= 1 - if self._depth == 0: - self.close() - pop_context() - - @contextmanager - def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: - """This helper method can be used with the context object to promote - it to the current thread local (see :func:`get_current_context`). - The default behavior of this is to invoke the cleanup functions which - can be disabled by setting `cleanup` to `False`. The cleanup - functions are typically used for things such as closing file handles. - - If the cleanup is intended the context object can also be directly - used as a context manager. - - Example usage:: - - with ctx.scope(): - assert get_current_context() is ctx - - This is equivalent:: - - with ctx: - assert get_current_context() is ctx - - .. versionadded:: 5.0 - - :param cleanup: controls if the cleanup functions should be run or - not. The default is to run these functions. In - some situations the context only wants to be - temporarily pushed in which case this can be disabled. - Nested pushes automatically defer the cleanup. - """ - if not cleanup: - self._depth += 1 - try: - with self as rv: - yield rv - finally: - if not cleanup: - self._depth -= 1 - - @property - def meta(self) -> t.Dict[str, t.Any]: - """This is a dictionary which is shared with all the contexts - that are nested. It exists so that click utilities can store some - state here if they need to. It is however the responsibility of - that code to manage this dictionary well. - - The keys are supposed to be unique dotted strings. For instance - module paths are a good choice for it. What is stored in there is - irrelevant for the operation of click. However what is important is - that code that places data here adheres to the general semantics of - the system. - - Example usage:: - - LANG_KEY = f'{__name__}.lang' - - def set_language(value): - ctx = get_current_context() - ctx.meta[LANG_KEY] = value - - def get_language(): - return get_current_context().meta.get(LANG_KEY, 'en_US') - - .. versionadded:: 5.0 - """ - return self._meta - - def make_formatter(self) -> HelpFormatter: - """Creates the :class:`~click.HelpFormatter` for the help and - usage output. - - To quickly customize the formatter class used without overriding - this method, set the :attr:`formatter_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`formatter_class` attribute. - """ - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width - ) - - def with_resource(self, context_manager: t.ContextManager[V]) -> V: - """Register a resource as if it were used in a ``with`` - statement. The resource will be cleaned up when the context is - popped. - - Uses :meth:`contextlib.ExitStack.enter_context`. It calls the - resource's ``__enter__()`` method and returns the result. When - the context is popped, it closes the stack, which calls the - resource's ``__exit__()`` method. - - To register a cleanup function for something that isn't a - context manager, use :meth:`call_on_close`. Or use something - from :mod:`contextlib` to turn it into a context manager first. - - .. code-block:: python - - @click.group() - @click.option("--name") - @click.pass_context - def cli(ctx): - ctx.obj = ctx.with_resource(connect_db(name)) - - :param context_manager: The context manager to enter. - :return: Whatever ``context_manager.__enter__()`` returns. - - .. versionadded:: 8.0 - """ - return self._exit_stack.enter_context(context_manager) - - def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Register a function to be called when the context tears down. - - This can be used to close resources opened during the script - execution. Resources that support Python's context manager - protocol which would be used in a ``with`` statement should be - registered with :meth:`with_resource` instead. - - :param f: The function to execute on teardown. - """ - return self._exit_stack.callback(f) - - def close(self) -> None: - """Invoke all close callbacks registered with - :meth:`call_on_close`, and exit all context managers entered - with :meth:`with_resource`. - """ - self._exit_stack.close() - # In case the context is reused, create a new exit stack. - self._exit_stack = ExitStack() - - @property - def command_path(self) -> str: - """The computed command path. This is used for the ``usage`` - information on the help page. It's automatically created by - combining the info names of the chain of contexts to the root. - """ - rv = "" - if self.info_name is not None: - rv = self.info_name - if self.parent is not None: - parent_command_path = [self.parent.command_path] - - if isinstance(self.parent.command, Command): - for param in self.parent.command.get_params(self): - parent_command_path.extend(param.get_usage_pieces(self)) - - rv = f"{' '.join(parent_command_path)} {rv}" - return rv.lstrip() - - def find_root(self) -> "Context": - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: - """Finds the closest object of a given type.""" - node: t.Optional[Context] = self - - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - - node = node.parent - - return None - - def ensure_object(self, object_type: t.Type[V]) -> V: - """Like :meth:`find_object` but sets the innermost object to a - new instance of `object_type` if it does not exist. - """ - rv = self.find_object(object_type) - if rv is None: - self.obj = rv = object_type() - return rv - - @t.overload - def lookup_default( - self, name: str, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: ... - - @t.overload - def lookup_default( - self, name: str, call: "te.Literal[False]" = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... - - def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: - """Get the default for a parameter from :attr:`default_map`. - - :param name: Name of the parameter. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - if self.default_map is not None: - value = self.default_map.get(name) - - if call and callable(value): - return value() - - return value - - return None - - def fail(self, message: str) -> "te.NoReturn": - """Aborts the execution of the program with a specific error - message. - - :param message: the error message to fail with. - """ - raise UsageError(message, self) - - def abort(self) -> "te.NoReturn": - """Aborts the script.""" - raise Abort() - - def exit(self, code: int = 0) -> "te.NoReturn": - """Exits the application with a given exit code.""" - raise Exit(code) - - def get_usage(self) -> str: - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self) -> str: - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def _make_sub_context(self, command: "Command") -> "Context": - """Create a new context of the same type as this context, but - for a new command. - - :meta private: - """ - return type(self)(command, info_name=command.name, parent=self) - - @t.overload - def invoke( - __self, - __callback: "t.Callable[..., V]", - *args: t.Any, - **kwargs: t.Any, - ) -> V: ... - - @t.overload - def invoke( - __self, - __callback: "Command", - *args: t.Any, - **kwargs: t.Any, - ) -> t.Any: ... - - def invoke( - __self, - __callback: t.Union["Command", "t.Callable[..., V]"], - *args: t.Any, - **kwargs: t.Any, - ) -> t.Union[t.Any, V]: - """Invokes a command callback in exactly the way it expects. There - are two ways to invoke this method: - - 1. the first argument can be a callback and all other arguments and - keyword arguments are forwarded directly to the function. - 2. the first argument is a click command object. In that case all - arguments are forwarded as well but proper click parameters - (options and click arguments) must be keyword arguments and Click - will fill in defaults. - - Note that before Click 3.2 keyword arguments were not properly filled - in against the intention of this code and no context was created. For - more information about this change and why it was done in a bugfix - release see :ref:`upgrade-to-3.2`. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if :meth:`forward` is called at multiple levels. - """ - if isinstance(__callback, Command): - other_cmd = __callback - - if other_cmd.callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - else: - __callback = t.cast("t.Callable[..., V]", other_cmd.callback) - - ctx = __self._make_sub_context(other_cmd) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - kwargs[param.name] = param.type_cast_value( # type: ignore - ctx, param.get_default(ctx) - ) - - # Track all kwargs as params, so that forward() will pass - # them on in subsequent calls. - ctx.params.update(kwargs) - else: - ctx = __self - - with augment_usage_errors(__self): - with ctx: - return __callback(*args, **kwargs) - - def forward(__self, __cmd: "Command", *args: t.Any, **kwargs: t.Any) -> t.Any: - """Similar to :meth:`invoke` but fills in default keyword - arguments from the current context if the other command expects - it. This cannot invoke callbacks directly, only other commands. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if ``forward`` is called at multiple levels. - """ - # Can only forward to other commands, not direct callbacks. - if not isinstance(__cmd, Command): - raise TypeError("Callback is not a command.") - - for param in __self.params: - if param not in kwargs: - kwargs[param] = __self.params[param] - - return __self.invoke(__cmd, *args, **kwargs) - - def set_parameter_source(self, name: str, source: ParameterSource) -> None: - """Set the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - :param name: The name of the parameter. - :param source: A member of :class:`~click.core.ParameterSource`. - """ - self._parameter_source[name] = source - - def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: - """Get the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - This can be useful for determining when a user specified a value - on the command line that is the same as the default value. It - will be :attr:`~click.core.ParameterSource.DEFAULT` only if the - value was actually taken from the default. - - :param name: The name of the parameter. - :rtype: ParameterSource - - .. versionchanged:: 8.0 - Returns ``None`` if the parameter was not provided from any - source. - """ - return self._parameter_source.get(name) - - -class BaseCommand: - """The base command implements the minimal API contract of commands. - Most code will never use this as it does not implement a lot of useful - functionality but it can act as the direct subclass of alternative - parsing methods that do not depend on the Click parser. - - For instance, this can be used to bridge Click and other systems like - argparse or docopt. - - Because base commands do not implement a lot of the API that other - parts of Click take for granted, they are not supported for all - operations. For instance, they cannot be used with the decorators - usually and they have no built-in callback system. - - .. versionchanged:: 2.0 - Added the `context_settings` parameter. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - """ - - #: The context class to create with :meth:`make_context`. - #: - #: .. versionadded:: 8.0 - context_class: t.Type[Context] = Context - #: the default for the :attr:`Context.allow_extra_args` flag. - allow_extra_args = False - #: the default for the :attr:`Context.allow_interspersed_args` flag. - allow_interspersed_args = True - #: the default for the :attr:`Context.ignore_unknown_options` flag. - ignore_unknown_options = False - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, - ) -> None: - #: the name the command thinks it has. Upon registering a command - #: on a :class:`Group` the group will default the command name - #: with this information. You should instead use the - #: :class:`Context`\'s :attr:`~Context.info_name` attribute. - self.name = name - - if context_settings is None: - context_settings = {} - - #: an optional dictionary with defaults passed to the context. - self.context_settings: t.MutableMapping[str, t.Any] = context_settings - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire structure - below this command. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - :param ctx: A :class:`Context` representing this command. - - .. versionadded:: 8.0 - """ - return {"name": self.name} - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def get_usage(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get usage") - - def get_help(self, ctx: Context) -> str: - raise NotImplementedError("Base commands cannot get help") - - def make_context( - self, - info_name: t.Optional[str], - args: t.List[str], - parent: t.Optional[Context] = None, - **extra: t.Any, - ) -> Context: - """This function when given an info name and arguments will kick - off the parsing and create a new :class:`Context`. It does not - invoke the actual command callback though. - - To quickly customize the context class used without overriding - this method, set the :attr:`context_class` attribute. - - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it's usually - the name of the script, for commands below it's - the name of the command. - :param args: the arguments to parse as list of strings. - :param parent: the parent context if available. - :param extra: extra keyword arguments forwarded to the context - constructor. - - .. versionchanged:: 8.0 - Added the :attr:`context_class` attribute. - """ - for key, value in self.context_settings.items(): - if key not in extra: - extra[key] = value - - ctx = self.context_class( - self, # type: ignore[arg-type] - info_name=info_name, - parent=parent, - **extra, - ) - - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - """Given a context and a list of arguments this creates the parser - and parses the arguments, then modifies the context as necessary. - This is automatically invoked by :meth:`make_context`. - """ - raise NotImplementedError("Base commands do not know how to parse arguments.") - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the command. The default - implementation is raising a not implemented error. - """ - raise NotImplementedError("Base commands are not invocable by default") - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of chained multi-commands. - - Any command could be part of a chained multi-command, so sibling - commands are valid at any point during command completion. Other - command classes will return more completions. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List[CompletionItem] = [] - - while ctx.parent is not None: - ctx = ctx.parent - - if isinstance(ctx.command, MultiCommand) and ctx.command.chain: - results.extend( - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - if name not in ctx.protected_args - ) - - return results - - @t.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: "te.Literal[True]" = True, - **extra: t.Any, - ) -> "te.NoReturn": ... - - @t.overload - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = ..., - **extra: t.Any, - ) -> t.Any: ... - - def main( - self, - args: t.Optional[t.Sequence[str]] = None, - prog_name: t.Optional[str] = None, - complete_var: t.Optional[str] = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: t.Any, - ) -> t.Any: - """This is the way to invoke a script with all the bells and - whistles as a command line application. This will always terminate - the application after a call. If this is not wanted, ``SystemExit`` - needs to be caught. - - This method is also available by directly calling the instance of - a :class:`Command`. - - :param args: the arguments that should be used for parsing. If not - provided, ``sys.argv[1:]`` is used. - :param prog_name: the program name that should be used. By default - the program name is constructed by taking the file - name from ``sys.argv[0]``. - :param complete_var: the environment variable that controls the - bash completion support. The default is - ``"__COMPLETE"`` with prog_name in - uppercase. - :param standalone_mode: the default behavior is to invoke the script - in standalone mode. Click will then - handle exceptions and convert them into - error messages and the function will never - return but shut down the interpreter. If - this is set to `False` they will be - propagated to the caller and the return - value of this function is the return value - of :meth:`invoke`. - :param windows_expand_args: Expand glob patterns, user dir, and - env vars in command line args on Windows. - :param extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - - .. versionchanged:: 8.0.1 - Added the ``windows_expand_args`` parameter to allow - disabling command line arg expansion on Windows. - - .. versionchanged:: 8.0 - When taking arguments from ``sys.argv`` on Windows, glob - patterns, user dir, and env vars are expanded. - - .. versionchanged:: 3.0 - Added the ``standalone_mode`` parameter. - """ - if args is None: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - args = _expand_args(args) - else: - args = list(args) - - if prog_name is None: - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt) as e: - echo(file=sys.stderr) - raise Abort() from e - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - # in non-standalone mode, return the exit code - # note that this is only reached if `self.invoke` above raises - # an Exit explicitly -- thus bypassing the check there which - # would return its result - # the results of non-standalone execution may therefore be - # somewhat ambiguous: if there are codepaths which lead to - # `ctx.exit(1)` and to `return 1`, the caller won't be able to - # tell the difference between the two - return e.exit_code - except Abort: - if not standalone_mode: - raise - echo(_("Aborted!"), file=sys.stderr) - sys.exit(1) - - def _main_shell_completion( - self, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - complete_var: t.Optional[str] = None, - ) -> None: - """Check if the shell is asking for tab completion, process - that, then exit early. Called from :meth:`main` before the - program is invoked. - - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. Defaults to - ``_{PROG_NAME}_COMPLETE``. - - .. versionchanged:: 8.2.0 - Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). - """ - if complete_var is None: - complete_name = prog_name.replace("-", "_").replace(".", "_") - complete_var = f"_{complete_name}_COMPLETE".upper() - - instruction = os.environ.get(complete_var) - - if not instruction: - return - - from .shell_completion import shell_complete - - rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) - sys.exit(rv) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Alias for :meth:`main`.""" - return self.main(*args, **kwargs) - - -class Command(BaseCommand): - """Commands are the basic building block of command line interfaces in - Click. A basic command handles command line parsing and might dispatch - more parsing to commands nested below it. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - :param callback: the callback to invoke. This is optional. - :param params: the parameters to register with this command. This can - be either :class:`Option` or :class:`Argument` objects. - :param help: the help string to use for this command. - :param epilog: like the help string but it's printed at the end of the - help page after everything else. - :param short_help: the short help to use for this command. This is - shown on the command listing of the parent command. - :param add_help_option: by default each command registers a ``--help`` - option. This can be disabled by this parameter. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is disabled by default. - If enabled this will add ``--help`` as argument - if no arguments are passed - :param hidden: hide this command from help outputs. - - :param deprecated: issues a message indicating that - the command is deprecated. - - .. versionchanged:: 8.1 - ``help``, ``epilog``, and ``short_help`` are stored unprocessed, - all formatting is done when outputting help text, not at init, - and is done even if not using the ``@command`` decorator. - - .. versionchanged:: 8.0 - Added a ``repr`` showing the command name. - - .. versionchanged:: 7.1 - Added the ``no_args_is_help`` parameter. - - .. versionchanged:: 2.0 - Added the ``context_settings`` parameter. - """ - - def __init__( - self, - name: t.Optional[str], - context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, - callback: t.Optional[t.Callable[..., t.Any]] = None, - params: t.Optional[t.List["Parameter"]] = None, - help: t.Optional[str] = None, - epilog: t.Optional[str] = None, - short_help: t.Optional[str] = None, - options_metavar: t.Optional[str] = "[OPTIONS]", - add_help_option: bool = True, - no_args_is_help: bool = False, - hidden: bool = False, - deprecated: bool = False, - ) -> None: - super().__init__(name, context_settings) - #: the callback to execute when the command fires. This might be - #: `None` in which case nothing happens. - self.callback = callback - #: the list of parameters for this command in the order they - #: should show up in the help page and execute. Eager parameters - #: will automatically be handled before non eager ones. - self.params: t.List[Parameter] = params or [] - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - self.short_help = short_help - self.add_help_option = add_help_option - self._help_option: t.Optional[HelpOption] = None - self.no_args_is_help = no_args_is_help - self.hidden = hidden - self.deprecated = deprecated - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - info_dict.update( - params=[param.to_info_dict() for param in self.get_params(ctx)], - help=self.help, - epilog=self.epilog, - short_help=self.short_help, - hidden=self.hidden, - deprecated=self.deprecated, - ) - return info_dict - - def get_usage(self, ctx: Context) -> str: - """Formats the usage line into a string and returns it. - - Calls :meth:`format_usage` internally. - """ - formatter = ctx.make_formatter() - self.format_usage(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_params(self, ctx: Context) -> t.List["Parameter"]: - rv = self.params - help_option = self.get_help_option(ctx) - - if help_option is not None: - rv = [*rv, help_option] - - return rv - - def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the usage line into the formatter. - - This is a low-level method called by :meth:`get_usage`. - """ - pieces = self.collect_usage_pieces(ctx) - formatter.write_usage(ctx.command_path, " ".join(pieces)) - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] if self.options_metavar else [] - - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - - return rv - - def get_help_option_names(self, ctx: Context) -> t.List[str]: - """Returns the names for the help option.""" - all_names = set(ctx.help_option_names) - for param in self.params: - all_names.difference_update(param.opts) - all_names.difference_update(param.secondary_opts) - return list(all_names) - - def get_help_option(self, ctx: Context) -> t.Optional["Option"]: - """Returns the help option object. - - Unless ``add_help_option`` is ``False``. - - .. versionchanged:: 8.1.8 - The help option is now cached to avoid creating it multiple times. - """ - help_options = self.get_help_option_names(ctx) - - if not help_options or not self.add_help_option: - return None - - # Cache the help option object in private _help_option attribute to - # avoid creating it multiple times. Not doing this will break the - # callback odering by iter_params_for_processing(), which relies on - # object comparison. - if self._help_option is None: - # Avoid circular import. - from .decorators import HelpOption - - self._help_option = HelpOption(help_options) - - return self._help_option - - def make_parser(self, ctx: Context) -> OptionParser: - """Creates the underlying option parser for this command.""" - parser = OptionParser(ctx) - for param in self.get_params(ctx): - param.add_to_parser(parser, ctx) - return parser - - def get_help(self, ctx: Context) -> str: - """Formats the help into a string and returns it. - - Calls :meth:`format_help` internally. - """ - formatter = ctx.make_formatter() - self.format_help(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_short_help_str(self, limit: int = 45) -> str: - """Gets short help for the command or makes it by shortening the - long help string. - """ - if self.short_help: - text = inspect.cleandoc(self.short_help) - elif self.help: - text = make_default_short_help(self.help, limit) - else: - text = "" - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - return text.strip() - - def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help into the formatter if it exists. - - This is a low-level method called by :meth:`get_help`. - - This calls the following methods: - - - :meth:`format_usage` - - :meth:`format_help_text` - - :meth:`format_options` - - :meth:`format_epilog` - """ - self.format_usage(ctx, formatter) - self.format_help_text(ctx, formatter) - self.format_options(ctx, formatter) - self.format_epilog(ctx, formatter) - - def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help text to the formatter if it exists.""" - if self.help is not None: - # truncate the help text to the first form feed - text = inspect.cleandoc(self.help).partition("\f")[0] - else: - text = "" - - if self.deprecated: - text = _("(Deprecated) {text}").format(text=text) - - if text: - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(text) - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes all the options into the formatter if they exist.""" - opts = [] - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - opts.append(rv) - - if opts: - with formatter.section(_("Options")): - formatter.write_dl(opts) - - def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - epilog = inspect.cleandoc(self.epilog) - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(epilog) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - parser = self.make_parser(ctx) - opts, args, param_order = parser.parse_args(args=args) - - for param in iter_params_for_processing(param_order, self.get_params(ctx)): - value, args = param.handle_parse_result(ctx, opts, args) - - if args and not ctx.allow_extra_args and not ctx.resilient_parsing: - ctx.fail( - ngettext( - "Got unexpected extra argument ({args})", - "Got unexpected extra arguments ({args})", - len(args), - ).format(args=" ".join(map(str, args))) - ) - - ctx.args = args - ctx._opt_prefixes.update(parser._opt_prefixes) - return args - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - if self.deprecated: - message = _( - "DeprecationWarning: The command {name!r} is deprecated." - ).format(name=self.name) - echo(style(message, fg="red"), err=True) - - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options and chained multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: t.List[CompletionItem] = [] - - if incomplete and not incomplete[0].isalnum(): - for param in self.get_params(ctx): - if ( - not isinstance(param, Option) - or param.hidden - or ( - not param.multiple - and ctx.get_parameter_source(param.name) # type: ignore - is ParameterSource.COMMANDLINE - ) - ): - continue - - results.extend( - CompletionItem(name, help=param.help) - for name in [*param.opts, *param.secondary_opts] - if name.startswith(incomplete) - ) - - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class MultiCommand(Command): - """A multi command is the basic implementation of a command that - dispatches to subcommands. The most common version is the - :class:`Group`. - - :param invoke_without_command: this controls how the multi command itself - is invoked. By default it's only invoked - if a subcommand is provided. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is enabled by default if - `invoke_without_command` is disabled or disabled - if it's enabled. If enabled this will add - ``--help`` as argument if no arguments are - passed. - :param subcommand_metavar: the string that is used in the documentation - to indicate the subcommand place. - :param chain: if this is set to `True` chaining of multiple subcommands - is enabled. This restricts the form of commands in that - they cannot have optional arguments but it allows - multiple commands to be chained together. - :param result_callback: The result callback to attach to this multi - command. This can be set or changed later with the - :meth:`result_callback` decorator. - :param attrs: Other command arguments described in :class:`Command`. - """ - - allow_extra_args = True - allow_interspersed_args = False - - def __init__( - self, - name: t.Optional[str] = None, - invoke_without_command: bool = False, - no_args_is_help: t.Optional[bool] = None, - subcommand_metavar: t.Optional[str] = None, - chain: bool = False, - result_callback: t.Optional[t.Callable[..., t.Any]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if no_args_is_help is None: - no_args_is_help = not invoke_without_command - - self.no_args_is_help = no_args_is_help - self.invoke_without_command = invoke_without_command - - if subcommand_metavar is None: - if chain: - subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - else: - subcommand_metavar = "COMMAND [ARGS]..." - - self.subcommand_metavar = subcommand_metavar - self.chain = chain - # The result callback that is stored. This can be set or - # overridden with the :func:`result_callback` decorator. - self._result_callback = result_callback - - if self.chain: - for param in self.params: - if isinstance(param, Argument) and not param.required: - raise RuntimeError( - "Multi commands in chain mode cannot have" - " optional arguments." - ) - - def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - commands = {} - - for name in self.list_commands(ctx): - command = self.get_command(ctx, name) - - if command is None: - continue - - sub_ctx = ctx._make_sub_context(command) - - with sub_ctx.scope(cleanup=False): - commands[name] = command.to_info_dict(sub_ctx) - - info_dict.update(commands=commands, chain=self.chain) - return info_dict - - def collect_usage_pieces(self, ctx: Context) -> t.List[str]: - rv = super().collect_usage_pieces(ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - super().format_options(ctx, formatter) - self.format_commands(ctx, formatter) - - def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: - """Adds a result callback to the command. By default if a - result callback is already registered this will chain them but - this can be disabled with the `replace` parameter. The result - callback is invoked with the return value of the subcommand - (or the list of return values from all subcommands if chaining - is enabled) as well as the parameters as they would be passed - to the main callback. - - Example:: - - @click.group() - @click.option('-i', '--input', default=23) - def cli(input): - return 42 - - @cli.result_callback() - def process_result(result, input): - return result + input - - :param replace: if set to `True` an already existing result - callback will be removed. - - .. versionchanged:: 8.0 - Renamed from ``resultcallback``. - - .. versionadded:: 3.0 - """ - - def decorator(f: F) -> F: - old_callback = self._result_callback - - if old_callback is None or replace: - self._result_callback = f - return f - - def function(__value, *args, **kwargs): # type: ignore - inner = old_callback(__value, *args, **kwargs) - return f(inner, *args, **kwargs) - - self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv # type: ignore[return-value] - - return decorator - - def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: - """Extra format methods for multi methods that adds all the commands - after the options. - """ - commands = [] - for subcommand in self.list_commands(ctx): - cmd = self.get_command(ctx, subcommand) - # What is this, the tool lied about a command. Ignore it - if cmd is None: - continue - if cmd.hidden: - continue - - commands.append((subcommand, cmd)) - - # allow for 3 times the default spacing - if len(commands): - limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) - - rows = [] - for subcommand, cmd in commands: - help = cmd.get_short_help_str(limit) - rows.append((subcommand, help)) - - if rows: - with formatter.section(_("Commands")): - formatter.write_dl(rows) - - def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - rest = super().parse_args(ctx, args) - - if self.chain: - ctx.protected_args = rest - ctx.args = [] - elif rest: - ctx.protected_args, ctx.args = rest[:1], rest[1:] - - return ctx.args - - def invoke(self, ctx: Context) -> t.Any: - def _process_result(value: t.Any) -> t.Any: - if self._result_callback is not None: - value = ctx.invoke(self._result_callback, value, **ctx.params) - return value - - if not ctx.protected_args: - if self.invoke_without_command: - # No subcommand was invoked, so the result callback is - # invoked with the group return value for regular - # groups, or an empty list for chained groups. - with ctx: - rv = super().invoke(ctx) - return _process_result([] if self.chain else rv) - ctx.fail(_("Missing command.")) - - # Fetch args back out - args = [*ctx.protected_args, *ctx.args] - ctx.args = [] - ctx.protected_args = [] - - # If we're not in chain mode, we only allow the invocation of a - # single command but we also inform the current context about the - # name of the command to invoke. - if not self.chain: - # Make sure the context is entered so we do not clean up - # resources until the result processor has worked. - with ctx: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - ctx.invoked_subcommand = cmd_name - super().invoke(ctx) - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) - with sub_ctx: - return _process_result(sub_ctx.command.invoke(sub_ctx)) - - # In chain mode we create the contexts step by step, but after the - # base command has been invoked. Because at that point we do not - # know the subcommands yet, the invoked subcommand attribute is - # set to ``*`` to inform the command that subcommands are executed - # but nothing else. - with ctx: - ctx.invoked_subcommand = "*" if args else None - super().invoke(ctx) - - # Otherwise we make every single context and invoke them in a - # chain. In that case the return value to the result processor - # is the list of all invoked subcommand's results. - contexts = [] - while args: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - sub_ctx = cmd.make_context( - cmd_name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - ) - contexts.append(sub_ctx) - args, sub_ctx.args = sub_ctx.args, [] - - rv = [] - for sub_ctx in contexts: - with sub_ctx: - rv.append(sub_ctx.command.invoke(sub_ctx)) - return _process_result(rv) - - def resolve_command( - self, ctx: Context, args: t.List[str] - ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: - cmd_name = make_str(args[0]) - original_cmd_name = cmd_name - - # Get the command - cmd = self.get_command(ctx, cmd_name) - - # If we can't find the command but there is a normalization - # function available, we try with that one. - if cmd is None and ctx.token_normalize_func is not None: - cmd_name = ctx.token_normalize_func(cmd_name) - cmd = self.get_command(ctx, cmd_name) - - # If we don't find the command we want to show an error message - # to the user that it was not provided. However, there is - # something else we should do: if the first argument looks like - # an option we want to kick off parsing again for arguments to - # resolve things like --help which now should go to the main - # place. - if cmd is None and not ctx.resilient_parsing: - if split_opt(cmd_name)[0]: - self.parse_args(ctx, ctx.args) - ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) - return cmd_name if cmd else None, cmd, args[1:] - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - """Given a context and a command name, this returns a - :class:`Command` object if it exists or returns `None`. - """ - raise NotImplementedError - - def list_commands(self, ctx: Context) -> t.List[str]: - """Returns a list of subcommand names in the order they should - appear. - """ - return [] - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. Looks - at the names of options, subcommands, and chained - multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results = [ - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - ] - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class Group(MultiCommand): - """A group allows a command to have subcommands attached. This is - the most common way to implement nesting in Click. - - :param name: The name of the group command. - :param commands: A dict mapping names to :class:`Command` objects. - Can also be a list of :class:`Command`, which will use - :attr:`Command.name` to create the dict. - :param attrs: Other command arguments described in - :class:`MultiCommand`, :class:`Command`, and - :class:`BaseCommand`. - - .. versionchanged:: 8.0 - The ``commands`` argument can be a list of command objects. - """ - - #: If set, this is used by the group's :meth:`command` decorator - #: as the default :class:`Command` class. This is useful to make all - #: subcommands use a custom command class. - #: - #: .. versionadded:: 8.0 - command_class: t.Optional[t.Type[Command]] = None - - #: If set, this is used by the group's :meth:`group` decorator - #: as the default :class:`Group` class. This is useful to make all - #: subgroups use a custom group class. - #: - #: If set to the special value :class:`type` (literally - #: ``group_class = type``), this group's class will be used as the - #: default class. This makes a custom group class continue to make - #: custom groups. - #: - #: .. versionadded:: 8.0 - group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None - # Literal[type] isn't valid, so use Type[type] - - def __init__( - self, - name: t.Optional[str] = None, - commands: t.Optional[ - t.Union[t.MutableMapping[str, Command], t.Sequence[Command]] - ] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - - if commands is None: - commands = {} - elif isinstance(commands, abc.Sequence): - commands = {c.name: c for c in commands if c.name is not None} - - #: The registered subcommands by their exported names. - self.commands: t.MutableMapping[str, Command] = commands - - def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: - """Registers another :class:`Command` with this group. If the name - is not provided, the name of the command is used. - """ - name = name or cmd.name - if name is None: - raise TypeError("Command has no name.") - _check_multicommand(self, name, cmd, register=True) - self.commands[name] = cmd - - @t.overload - def command(self, __func: t.Callable[..., t.Any]) -> Command: ... - - @t.overload - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... - - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], Command], Command]: - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` and - immediately registers the created command with this group by - calling :meth:`add_command`. - - To customize the command class used, set the - :attr:`command_class` attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`command_class` attribute. - """ - from .decorators import command - - func: t.Optional[t.Callable[..., t.Any]] = None - - if args and callable(args[0]): - assert ( - len(args) == 1 and not kwargs - ), "Use 'command(**kwargs)(callable)' to provide arguments." - (func,) = args - args = () - - if self.command_class and kwargs.get("cls") is None: - kwargs["cls"] = self.command_class - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd: Command = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - @t.overload - def group(self, __func: t.Callable[..., t.Any]) -> "Group": ... - - @t.overload - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: ... - - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], "Group"], "Group"]: - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` and - immediately registers the created group with this group by - calling :meth:`add_command`. - - To customize the group class used, set the :attr:`group_class` - attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`group_class` attribute. - """ - from .decorators import group - - func: t.Optional[t.Callable[..., t.Any]] = None - - if args and callable(args[0]): - assert ( - len(args) == 1 and not kwargs - ), "Use 'group(**kwargs)(callable)' to provide arguments." - (func,) = args - args = () - - if self.group_class is not None and kwargs.get("cls") is None: - if self.group_class is type: - kwargs["cls"] = type(self) - else: - kwargs["cls"] = self.group_class - - def decorator(f: t.Callable[..., t.Any]) -> "Group": - cmd: Group = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - return self.commands.get(cmd_name) - - def list_commands(self, ctx: Context) -> t.List[str]: - return sorted(self.commands) - - -class CommandCollection(MultiCommand): - """A command collection is a multi command that merges multiple multi - commands together into one. This is a straightforward implementation - that accepts a list of different multi commands as sources and - provides all the commands for each of them. - - See :class:`MultiCommand` and :class:`Command` for the description of - ``name`` and ``attrs``. - """ - - def __init__( - self, - name: t.Optional[str] = None, - sources: t.Optional[t.List[MultiCommand]] = None, - **attrs: t.Any, - ) -> None: - super().__init__(name, **attrs) - #: The list of registered multi commands. - self.sources: t.List[MultiCommand] = sources or [] - - def add_source(self, multi_cmd: MultiCommand) -> None: - """Adds a new multi command to the chain dispatcher.""" - self.sources.append(multi_cmd) - - def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: - for source in self.sources: - rv = source.get_command(ctx, cmd_name) - - if rv is not None: - if self.chain: - _check_multicommand(self, cmd_name, rv) - - return rv - - return None - - def list_commands(self, ctx: Context) -> t.List[str]: - rv: t.Set[str] = set() - - for source in self.sources: - rv.update(source.list_commands(ctx)) - - return sorted(rv) - - -def _check_iter(value: t.Any) -> t.Iterator[t.Any]: - """Check if the value is iterable but not a string. Raises a type - error, or return an iterator over the value. - """ - if isinstance(value, str): - raise TypeError - - return iter(value) - - -class Parameter: - r"""A parameter to a command comes in two versions: they are either - :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently - not supported by design as some of the internals for parsing are - intentionally not finalized. - - Some settings are supported by both options and arguments. - - :param param_decls: the parameter declarations for this option or - argument. This is a list of flags or argument - names. - :param type: the type that should be used. Either a :class:`ParamType` - or a Python type. The latter is converted into the former - automatically if supported. - :param required: controls if this is optional or not. - :param default: the default value if omitted. This can also be a callable, - in which case it's invoked when the default is needed - without any arguments. - :param callback: A function to further process or validate the value - after type conversion. It is called as ``f(ctx, param, value)`` - and must return the value. It is called for all sources, - including prompts. - :param nargs: the number of arguments to match. If not ``1`` the return - value is a tuple instead of single value. The default for - nargs is ``1`` (except if the type is a tuple, then it's - the arity of the tuple). If ``nargs=-1``, all remaining - parameters are collected. - :param metavar: how the value is represented in the help page. - :param expose_value: if this is `True` then the value is passed onwards - to the command callback and stored on the context, - otherwise it's skipped. - :param is_eager: eager values are processed before non eager ones. This - should not be set for arguments or it will inverse the - order of processing. - :param envvar: a string or list of strings that are environment variables - that should be checked. - :param shell_complete: A function that returns custom shell - completions. Used instead of the param's type completion if - given. Takes ``ctx, param, incomplete`` and must return a list - of :class:`~click.shell_completion.CompletionItem` or a list of - strings. - - .. versionchanged:: 8.0 - ``process_value`` validates required parameters and bounded - ``nargs``, and invokes the parameter callback before returning - the value. This allows the callback to validate prompts. - ``full_process_value`` is removed. - - .. versionchanged:: 8.0 - ``autocompletion`` is renamed to ``shell_complete`` and has new - semantics described above. The old name is deprecated and will - be removed in 8.1, until then it will be wrapped to match the - new requirements. - - .. versionchanged:: 8.0 - For ``multiple=True, nargs>1``, the default must be a list of - tuples. - - .. versionchanged:: 8.0 - Setting a default is no longer required for ``nargs>1``, it will - default to ``None``. ``multiple=True`` or ``nargs=-1`` will - default to ``()``. - - .. versionchanged:: 7.1 - Empty environment variables are ignored rather than taking the - empty string value. This makes it possible for scripts to clear - variables if they can't unset them. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. The old callback format will still work, but it will - raise a warning to give you a chance to migrate the code easier. - """ - - param_type_name = "parameter" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - required: bool = False, - default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, - callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, - nargs: t.Optional[int] = None, - multiple: bool = False, - metavar: t.Optional[str] = None, - expose_value: bool = True, - is_eager: bool = False, - envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, - shell_complete: t.Optional[ - t.Callable[ - [Context, "Parameter", str], - t.Union[t.List["CompletionItem"], t.List[str]], - ] - ] = None, - ) -> None: - self.name: t.Optional[str] - self.opts: t.List[str] - self.secondary_opts: t.List[str] - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - self.type: types.ParamType = types.convert_type(type, default) - - # Default nargs to what the type tells us if we have that - # information available. - if nargs is None: - if self.type.is_composite: - nargs = self.type.arity - else: - nargs = 1 - - self.required = required - self.callback = callback - self.nargs = nargs - self.multiple = multiple - self.expose_value = expose_value - self.default = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - self._custom_shell_complete = shell_complete - - if __debug__: - if self.type.is_composite and nargs != self.type.arity: - raise ValueError( - f"'nargs' must be {self.type.arity} (or None) for" - f" type {self.type!r}, but it was {nargs}." - ) - - # Skip no default or callable default. - check_default = default if not callable(default) else None - - if check_default is not None: - if multiple: - try: - # Only check the first value against nargs. - check_default = next(_check_iter(check_default), None) - except TypeError: - raise ValueError( - "'default' must be a list when 'multiple' is true." - ) from None - - # Can be None for multiple with empty default. - if nargs != 1 and check_default is not None: - try: - _check_iter(check_default) - except TypeError: - if multiple: - message = ( - "'default' must be a list of lists when 'multiple' is" - " true and 'nargs' != 1." - ) - else: - message = "'default' must be a list when 'nargs' != 1." - - raise ValueError(message) from None - - if nargs > 1 and len(check_default) != nargs: - subject = "item length" if multiple else "length" - raise ValueError( - f"'default' {subject} must match nargs={nargs}." - ) - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - return { - "name": self.name, - "param_type_name": self.param_type_name, - "opts": self.opts, - "secondary_opts": self.secondary_opts, - "type": self.type.to_info_dict(), - "required": self.required, - "nargs": self.nargs, - "multiple": self.multiple, - "default": self.default, - "envvar": self.envvar, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - raise NotImplementedError() - - @property - def human_readable_name(self) -> str: - """Returns the human readable name of this parameter. This is the - same as the name for options, but the metavar for arguments. - """ - return self.name # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - - metavar = self.type.get_metavar(self) - - if metavar is None: - metavar = self.type.name.upper() - - if self.nargs != 1: - metavar += "..." - - return metavar - - @t.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - """Get the default for the parameter. Tries - :meth:`Context.lookup_default` first, then the local default. - - :param ctx: Current context. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0.2 - Type casting is no longer performed when getting a default. - - .. versionchanged:: 8.0.1 - Type casting can fail in resilient parsing mode. Invalid - defaults will not prevent showing help text. - - .. versionchanged:: 8.0 - Looks at ``ctx.default_map`` first. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - value = ctx.lookup_default(self.name, call=False) # type: ignore - - if value is None: - value = self.default - - if call and callable(value): - value = value() - - return value - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - raise NotImplementedError() - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, t.Any] - ) -> t.Tuple[t.Any, ParameterSource]: - value = opts.get(self.name) # type: ignore - source = ParameterSource.COMMANDLINE - - if value is None: - value = self.value_from_envvar(ctx) - source = ParameterSource.ENVIRONMENT - - if value is None: - value = ctx.lookup_default(self.name) # type: ignore - source = ParameterSource.DEFAULT_MAP - - if value is None: - value = self.get_default(ctx) - source = ParameterSource.DEFAULT - - return value, source - - def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: - """Convert and validate a value against the option's - :attr:`type`, :attr:`multiple`, and :attr:`nargs`. - """ - if value is None: - return () if self.multiple or self.nargs == -1 else None - - def check_iter(value: t.Any) -> t.Iterator[t.Any]: - try: - return _check_iter(value) - except TypeError: - # This should only happen when passing in args manually, - # the parser should construct an iterable when parsing - # the command line. - raise BadParameter( - _("Value must be an iterable."), ctx=ctx, param=self - ) from None - - if self.nargs == 1 or self.type.is_composite: - - def convert(value: t.Any) -> t.Any: - return self.type(value, param=self, ctx=ctx) - - elif self.nargs == -1: - - def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] - return tuple(self.type(x, self, ctx) for x in check_iter(value)) - - else: # nargs > 1 - - def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] - value = tuple(check_iter(value)) - - if len(value) != self.nargs: - raise BadParameter( - ngettext( - "Takes {nargs} values but 1 was given.", - "Takes {nargs} values but {len} were given.", - len(value), - ).format(nargs=self.nargs, len=len(value)), - ctx=ctx, - param=self, - ) - - return tuple(self.type(x, self, ctx) for x in value) - - if self.multiple: - return tuple(convert(x) for x in check_iter(value)) - - return convert(value) - - def value_is_missing(self, value: t.Any) -> bool: - if value is None: - return True - - if (self.nargs != 1 or self.multiple) and value == (): - return True - - return False - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - value = self.type_cast_value(ctx, value) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - if self.callback is not None: - value = self.callback(ctx, self, value) - - return value - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - if self.envvar is None: - return None - - if isinstance(self.envvar, str): - rv = os.environ.get(self.envvar) - - if rv: - return rv - else: - for envvar in self.envvar: - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is not None and self.nargs != 1: - rv = self.type.split_envvar_value(rv) - - return rv - - def handle_parse_result( - self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] - ) -> t.Tuple[t.Any, t.List[str]]: - with augment_usage_errors(ctx, param=self): - value, source = self.consume_value(ctx, opts) - ctx.set_parameter_source(self.name, source) # type: ignore - - try: - value = self.process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - - value = None - - if self.expose_value: - ctx.params[self.name] = value # type: ignore - - return value, args - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - pass - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [] - - def get_error_hint(self, ctx: Context) -> str: - """Get a stringified version of the param for use in error messages to - indicate which param caused the error. - """ - hint_list = self.opts or [self.human_readable_name] - return " / ".join(f"'{x}'" for x in hint_list) - - def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: - """Return a list of completions for the incomplete value. If a - ``shell_complete`` function was given during init, it is used. - Otherwise, the :attr:`type` - :meth:`~click.types.ParamType.shell_complete` function is used. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - if self._custom_shell_complete is not None: - results = self._custom_shell_complete(ctx, self, incomplete) - - if results and isinstance(results[0], str): - from click.shell_completion import CompletionItem - - results = [CompletionItem(c) for c in results] - - return t.cast(t.List["CompletionItem"], results) - - return self.type.shell_complete(ctx, self, incomplete) - - -class Option(Parameter): - """Options are usually optional values on the command line and - have some extra features that arguments don't have. - - All other parameters are passed onwards to the parameter constructor. - - :param show_default: Show the default value for this option in its - help text. Values are not shown by default, unless - :attr:`Context.show_default` is ``True``. If this value is a - string, it shows that string in parentheses instead of the - actual value. This is particularly useful for dynamic options. - For single option boolean flags, the default remains hidden if - its value is ``False``. - :param show_envvar: Controls if an environment variable should be - shown on the help page. Normally, environment variables are not - shown. - :param prompt: If set to ``True`` or a non empty string then the - user will be prompted for input. If set to ``True`` the prompt - will be the option name capitalized. - :param confirmation_prompt: Prompt a second time to confirm the - value if it was prompted for. Can be set to a string instead of - ``True`` to customize the message. - :param prompt_required: If set to ``False``, the user will be - prompted for input only when the option was specified as a flag - without a value. - :param hide_input: If this is ``True`` then the input on the prompt - will be hidden from the user. This is useful for password input. - :param is_flag: forces this option to act as a flag. The default is - auto detection. - :param flag_value: which value should be used for this flag if it's - enabled. This is set to a boolean automatically if - the option string contains a slash to mark two options. - :param multiple: if this is set to `True` then the argument is accepted - multiple times and recorded. This is similar to ``nargs`` - in how it works but supports arbitrary number of - arguments. - :param count: this flag makes an option increment an integer. - :param allow_from_autoenv: if this is enabled then the value of this - parameter will be pulled from an environment - variable in case a prefix is defined on the - context. - :param help: the help string. - :param hidden: hide this option from help outputs. - :param attrs: Other command arguments described in :class:`Parameter`. - - .. versionchanged:: 8.1.0 - Help text indentation is cleaned here instead of only in the - ``@option`` decorator. - - .. versionchanged:: 8.1.0 - The ``show_default`` parameter overrides - ``Context.show_default``. - - .. versionchanged:: 8.1.0 - The default of a single option boolean flag is not shown if the - default value is ``False``. - - .. versionchanged:: 8.0.1 - ``type`` is detected from ``flag_value`` if given. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - show_default: t.Union[bool, str, None] = None, - prompt: t.Union[bool, str] = False, - confirmation_prompt: t.Union[bool, str] = False, - prompt_required: bool = True, - hide_input: bool = False, - is_flag: t.Optional[bool] = None, - flag_value: t.Optional[t.Any] = None, - multiple: bool = False, - count: bool = False, - allow_from_autoenv: bool = True, - type: t.Optional[t.Union[types.ParamType, t.Any]] = None, - help: t.Optional[str] = None, - hidden: bool = False, - show_choices: bool = True, - show_envvar: bool = False, - **attrs: t.Any, - ) -> None: - if help: - help = inspect.cleandoc(help) - - default_is_missing = "default" not in attrs - super().__init__(param_decls, type=type, multiple=multiple, **attrs) - - if prompt is True: - if self.name is None: - raise TypeError("'name' is required with 'prompt=True'.") - - prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() - elif prompt is False: - prompt_text = None - else: - prompt_text = prompt - - self.prompt = prompt_text - self.confirmation_prompt = confirmation_prompt - self.prompt_required = prompt_required - self.hide_input = hide_input - self.hidden = hidden - - # If prompt is enabled but not required, then the option can be - # used as a flag to indicate using prompt or flag_value. - self._flag_needs_value = self.prompt is not None and not self.prompt_required - - if is_flag is None: - if flag_value is not None: - # Implicitly a flag because flag_value was set. - is_flag = True - elif self._flag_needs_value: - # Not a flag, but when used as a flag it shows a prompt. - is_flag = False - else: - # Implicitly a flag because flag options were given. - is_flag = bool(self.secondary_opts) - elif is_flag is False and not self._flag_needs_value: - # Not a flag, and prompt is not enabled, can be used as a - # flag if flag_value is set. - self._flag_needs_value = flag_value is not None - - self.default: t.Union[t.Any, t.Callable[[], t.Any]] - - if is_flag and default_is_missing and not self.required: - if multiple: - self.default = () - else: - self.default = False - - if flag_value is None: - flag_value = not self.default - - self.type: types.ParamType - if is_flag and type is None: - # Re-guess the type from the flag value instead of the - # default. - self.type = types.convert_type(None, flag_value) - - self.is_flag: bool = is_flag - self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) - self.flag_value: t.Any = flag_value - - # Counting - self.count = count - if count: - if type is None: - self.type = types.IntRange(min=0) - if default_is_missing: - self.default = 0 - - self.allow_from_autoenv = allow_from_autoenv - self.help = help - self.show_default = show_default - self.show_choices = show_choices - self.show_envvar = show_envvar - - if __debug__: - if self.nargs == -1: - raise TypeError("nargs=-1 is not supported for options.") - - if self.prompt and self.is_flag and not self.is_bool_flag: - raise TypeError("'prompt' is not valid for non-boolean flag.") - - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Secondary flag is not valid for non-boolean flag.") - - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError( - "'prompt' with 'hide_input' is not valid for boolean flag." - ) - - if self.count: - if self.multiple: - raise TypeError("'count' is not valid with 'multiple'.") - - if self.is_flag: - raise TypeError("'count' is not valid with 'is_flag'.") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - help=self.help, - prompt=self.prompt, - is_flag=self.is_flag, - flag_value=self.flag_value, - count=self.count, - hidden=self.hidden, - ) - return info_dict - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if decl.isidentifier(): - if name is not None: - raise TypeError(f"Name '{name}' defined twice") - name = decl - else: - split_char = ";" if decl[:1] == "/" else "/" - if split_char in decl: - first, second = decl.split(split_char, 1) - first = first.rstrip() - if first: - possible_names.append(split_opt(first)) - opts.append(first) - second = second.lstrip() - if second: - secondary_opts.append(second.lstrip()) - if first == second: - raise ValueError( - f"Boolean option {decl!r} cannot use the" - " same flag for true/false." - ) - else: - possible_names.append(split_opt(decl)) - opts.append(decl) - - if name is None and possible_names: - possible_names.sort(key=lambda x: -len(x[0])) # group long options first - name = possible_names[0][1].replace("-", "_").lower() - if not name.isidentifier(): - name = None - - if name is None: - if not expose_value: - return None, opts, secondary_opts - raise TypeError( - f"Could not determine name for option with declarations {decls!r}" - ) - - if not opts and not secondary_opts: - raise TypeError( - f"No options defined but a name was passed ({name})." - " Did you mean to declare an argument instead? Did" - f" you mean to pass '--{name}'?" - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - action = f"{action}_const" - - if self.is_bool_flag and self.secondary_opts: - parser.add_option( - obj=self, opts=self.opts, dest=self.name, action=action, const=True - ) - parser.add_option( - obj=self, - opts=self.secondary_opts, - dest=self.name, - action=action, - const=False, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - const=self.flag_value, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - nargs=self.nargs, - ) - - def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: - if self.hidden: - return None - - any_prefix_is_slash = False - - def _write_opts(opts: t.Sequence[str]) -> str: - nonlocal any_prefix_is_slash - - rv, any_slashes = join_options(opts) - - if any_slashes: - any_prefix_is_slash = True - - if not self.is_flag and not self.count: - rv += f" {self.make_metavar()}" - - return rv - - rv = [_write_opts(self.opts)] - - if self.secondary_opts: - rv.append(_write_opts(self.secondary_opts)) - - help = self.help or "" - extra = [] - - if self.show_envvar: - envvar = self.envvar - - if envvar is None: - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - - if envvar is not None: - var_str = ( - envvar - if isinstance(envvar, str) - else ", ".join(str(d) for d in envvar) - ) - extra.append(_("env var: {var}").format(var=var_str)) - - # Temporarily enable resilient parsing to avoid type casting - # failing for the default. Might be possible to extend this to - # help formatting in general. - resilient = ctx.resilient_parsing - ctx.resilient_parsing = True - - try: - default_value = self.get_default(ctx, call=False) - finally: - ctx.resilient_parsing = resilient - - show_default = False - show_default_is_str = False - - if self.show_default is not None: - if isinstance(self.show_default, str): - show_default_is_str = show_default = True - else: - show_default = self.show_default - elif ctx.show_default is not None: - show_default = ctx.show_default - - if show_default_is_str or (show_default and (default_value is not None)): - if show_default_is_str: - default_string = f"({self.show_default})" - elif isinstance(default_value, (list, tuple)): - default_string = ", ".join(str(d) for d in default_value) - elif inspect.isfunction(default_value): - default_string = _("(dynamic)") - elif self.is_bool_flag and self.secondary_opts: - # For boolean flags that have distinct True/False opts, - # use the opt without prefix instead of the value. - default_string = split_opt( - (self.opts if default_value else self.secondary_opts)[0] - )[1] - elif self.is_bool_flag and not self.secondary_opts and not default_value: - default_string = "" - elif default_value == "": - default_string = '""' - else: - default_string = str(default_value) - - if default_string: - extra.append(_("default: {default}").format(default=default_string)) - - if ( - isinstance(self.type, types._NumberRangeBase) - # skip count with default range type - and not (self.count and self.type.min == 0 and self.type.max is None) - ): - range_str = self.type._describe_range() - - if range_str: - extra.append(range_str) - - if self.required: - extra.append(_("required")) - - if extra: - extra_str = "; ".join(extra) - help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - @t.overload - def get_default( - self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - # If we're a non boolean flag our default is more complex because - # we need to look at all flags in the same group to figure out - # if we're the default one in which case we return the flag - # value as default. - if self.is_flag and not self.is_bool_flag: - for param in ctx.command.params: - if param.name == self.name and param.default: - return t.cast(Option, param).flag_value - - return None - - return super().get_default(ctx, call=call) - - def prompt_for_value(self, ctx: Context) -> t.Any: - """This is an alternative flow that can be activated in the full - value processing if a value does not exist. It will prompt the - user until a valid value exists and then returns the processed - value as result. - """ - assert self.prompt is not None - - # Calculate the default before prompting anything to be stable. - default = self.get_default(ctx) - - # If this is a prompt for a flag we need to handle this - # differently. - if self.is_bool_flag: - return confirm(self.prompt, default) - - return prompt( - self.prompt, - default=default, - type=self.type, - hide_input=self.hide_input, - show_choices=self.show_choices, - confirmation_prompt=self.confirmation_prompt, - value_proc=lambda x: self.process_value(ctx, x), - ) - - def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: - rv = super().resolve_envvar_value(ctx) - - if rv is not None: - return rv - - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: - rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) - - if rv is None: - return None - - value_depth = (self.nargs != 1) + bool(self.multiple) - - if value_depth > 0: - rv = self.type.split_envvar_value(rv) - - if self.multiple and self.nargs != 1: - rv = batch(rv, self.nargs) - - return rv - - def consume_value( - self, ctx: Context, opts: t.Mapping[str, "Parameter"] - ) -> t.Tuple[t.Any, ParameterSource]: - value, source = super().consume_value(ctx, opts) - - # The parser will emit a sentinel value if the option can be - # given as a flag without a value. This is different from None - # to distinguish from the flag not being given at all. - if value is _flag_needs_value: - if self.prompt is not None and not ctx.resilient_parsing: - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - else: - value = self.flag_value - source = ParameterSource.COMMANDLINE - - elif ( - self.multiple - and value is not None - and any(v is _flag_needs_value for v in value) - ): - value = [self.flag_value if v is _flag_needs_value else v for v in value] - source = ParameterSource.COMMANDLINE - - # The value wasn't set, or used the param's default, prompt if - # prompting is enabled. - elif ( - source in {None, ParameterSource.DEFAULT} - and self.prompt is not None - and (self.required or self.prompt_required) - and not ctx.resilient_parsing - ): - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - - return value, source - - -class Argument(Parameter): - """Arguments are positional parameters to a command. They generally - provide fewer features than options but can have infinite ``nargs`` - and are required by default. - - All parameters are passed onwards to the constructor of :class:`Parameter`. - """ - - param_type_name = "argument" - - def __init__( - self, - param_decls: t.Sequence[str], - required: t.Optional[bool] = None, - **attrs: t.Any, - ) -> None: - if required is None: - if attrs.get("default") is not None: - required = False - else: - required = attrs.get("nargs", 1) > 0 - - if "multiple" in attrs: - raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") - - super().__init__(param_decls, required=required, **attrs) - - if __debug__: - if self.default is not None and self.nargs == -1: - raise TypeError("'default' is not supported for nargs=-1.") - - @property - def human_readable_name(self) -> str: - if self.metavar is not None: - return self.metavar - return self.name.upper() # type: ignore - - def make_metavar(self) -> str: - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(self) - if not var: - var = self.name.upper() # type: ignore - if not self.required: - var = f"[{var}]" - if self.nargs != 1: - var += "..." - return var - - def _parse_decls( - self, decls: t.Sequence[str], expose_value: bool - ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: - if not decls: - if not expose_value: - return None, [], [] - raise TypeError("Argument is marked as exposed, but does not have a name.") - if len(decls) == 1: - name = arg = decls[0] - name = name.replace("-", "_").lower() - else: - raise TypeError( - "Arguments take exactly one parameter declaration, got" - f" {len(decls)}." - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx: Context) -> t.List[str]: - return [self.make_metavar()] - - def get_error_hint(self, ctx: Context) -> str: - return f"'{self.make_metavar()}'" - - def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/port/lib/python3.11/site-packages/click/decorators.py b/port/lib/python3.11/site-packages/click/decorators.py deleted file mode 100644 index bcf8906..0000000 --- a/port/lib/python3.11/site-packages/click/decorators.py +++ /dev/null @@ -1,562 +0,0 @@ -import inspect -import types -import typing as t -from functools import update_wrapper -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .globals import get_current_context -from .utils import echo - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") -T = t.TypeVar("T") -_AnyCallable = t.Callable[..., t.Any] -FC = t.TypeVar("FC", bound=t.Union[_AnyCallable, Command]) - - -def pass_context(f: "t.Callable[te.Concatenate[Context, P], R]") -> "t.Callable[P, R]": - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(new_func, f) - - -def pass_obj(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": - """Similar to :func:`pass_context`, but only pass the object on the - context onwards (:attr:`Context.obj`). This is useful if that object - represents the state of a nested system. - """ - - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - -def make_pass_decorator( - object_type: t.Type[T], ensure: bool = False -) -> t.Callable[["t.Callable[te.Concatenate[T, P], R]"], "t.Callable[P, R]"]: - """Given an object type this creates a decorator that will work - similar to :func:`pass_obj` but instead of passing the object of the - current context, it will find the innermost context of type - :func:`object_type`. - - This generates a decorator that works roughly like this:: - - from functools import update_wrapper - - def decorator(f): - @pass_context - def new_func(ctx, *args, **kwargs): - obj = ctx.find_object(object_type) - return ctx.invoke(f, obj, *args, **kwargs) - return update_wrapper(new_func, f) - return decorator - - :param object_type: the type of the object to pass. - :param ensure: if set to `True`, a new object will be created and - remembered on the context if it's not there yet. - """ - - def decorator(f: "t.Callable[te.Concatenate[T, P], R]") -> "t.Callable[P, R]": - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": - ctx = get_current_context() - - obj: t.Optional[T] - if ensure: - obj = ctx.ensure_object(object_type) - else: - obj = ctx.find_object(object_type) - - if obj is None: - raise RuntimeError( - "Managed to invoke callback without a context" - f" object of type {object_type.__name__!r}" - " existing." - ) - - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - return decorator - - -def pass_meta_key( - key: str, *, doc_description: t.Optional[str] = None -) -> "t.Callable[[t.Callable[te.Concatenate[t.Any, P], R]], t.Callable[P, R]]": - """Create a decorator that passes a key from - :attr:`click.Context.meta` as the first argument to the decorated - function. - - :param key: Key in ``Context.meta`` to pass. - :param doc_description: Description of the object being passed, - inserted into the decorator's docstring. Defaults to "the 'key' - key from Context.meta". - - .. versionadded:: 8.0 - """ - - def decorator(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": - def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: - ctx = get_current_context() - obj = ctx.meta[key] - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - if doc_description is None: - doc_description = f"the {key!r} key from :attr:`click.Context.meta`" - - decorator.__doc__ = ( - f"Decorator that passes {doc_description} as the first argument" - " to the decorated function." - ) - return decorator - - -CmdType = t.TypeVar("CmdType", bound=Command) - - -# variant: no call, directly as decorator for a function. -@t.overload -def command(name: _AnyCallable) -> Command: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) -@t.overload -def command( - name: t.Optional[str], - cls: t.Type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) -@t.overload -def command( - name: None = None, - *, - cls: t.Type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def command( - name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Command]: ... - - -def command( - name: t.Union[t.Optional[str], _AnyCallable] = None, - cls: t.Optional[t.Type[CmdType]] = None, - **attrs: t.Any, -) -> t.Union[Command, t.Callable[[_AnyCallable], t.Union[Command, CmdType]]]: - r"""Creates a new :class:`Command` and uses the decorated function as - callback. This will also automatically attach all decorated - :func:`option`\s and :func:`argument`\s as parameters to the command. - - The name of the command defaults to the name of the function with - underscores replaced by dashes. If you want to change that, you can - pass the intended name as the first argument. - - All keyword arguments are forwarded to the underlying command class. - For the ``params`` argument, any decorated params are appended to - the end of the list. - - Once decorated the function turns into a :class:`Command` instance - that can be invoked as a command line utility or be attached to a - command :class:`Group`. - - :param name: the name of the command. This defaults to the function - name with underscores replaced by dashes. - :param cls: the command class to instantiate. This defaults to - :class:`Command`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.1 - The ``params`` argument can be used. Decorated params are - appended to the end of the list. - """ - - func: t.Optional[t.Callable[[_AnyCallable], t.Any]] = None - - if callable(name): - func = name - name = None - assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." - assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." - - if cls is None: - cls = t.cast(t.Type[CmdType], Command) - - def decorator(f: _AnyCallable) -> CmdType: - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - - attr_params = attrs.pop("params", None) - params = attr_params if attr_params is not None else [] - - try: - decorator_params = f.__click_params__ # type: ignore - except AttributeError: - pass - else: - del f.__click_params__ # type: ignore - params.extend(reversed(decorator_params)) - - if attrs.get("help") is None: - attrs["help"] = f.__doc__ - - if t.TYPE_CHECKING: - assert cls is not None - assert not callable(name) - - cmd = cls( - name=name or f.__name__.lower().replace("_", "-"), - callback=f, - params=params, - **attrs, - ) - cmd.__doc__ = f.__doc__ - return cmd - - if func is not None: - return decorator(func) - - return decorator - - -GrpType = t.TypeVar("GrpType", bound=Group) - - -# variant: no call, directly as decorator for a function. -@t.overload -def group(name: _AnyCallable) -> Group: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) -@t.overload -def group( - name: t.Optional[str], - cls: t.Type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) -@t.overload -def group( - name: None = None, - *, - cls: t.Type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def group( - name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Group]: ... - - -def group( - name: t.Union[str, _AnyCallable, None] = None, - cls: t.Optional[t.Type[GrpType]] = None, - **attrs: t.Any, -) -> t.Union[Group, t.Callable[[_AnyCallable], t.Union[Group, GrpType]]]: - """Creates a new :class:`Group` with a function as callback. This - works otherwise the same as :func:`command` just that the `cls` - parameter is set to :class:`Group`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - """ - if cls is None: - cls = t.cast(t.Type[GrpType], Group) - - if callable(name): - return command(cls=cls, **attrs)(name) - - return command(name, cls, **attrs) - - -def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] # type: ignore - - f.__click_params__.append(param) # type: ignore - - -def argument( - *param_decls: str, cls: t.Optional[t.Type[Argument]] = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an argument to the command. All positional arguments are - passed as parameter declarations to :class:`Argument`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Argument` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default argument class, refer to :class:`Argument` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the argument class to instantiate. This defaults to - :class:`Argument`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Argument - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def option( - *param_decls: str, cls: t.Optional[t.Type[Option]] = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an option to the command. All positional arguments are - passed as parameter declarations to :class:`Option`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Option` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default option class, refer to :class:`Option` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the option class to instantiate. This defaults to - :class:`Option`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Option - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--yes`` option which shows a prompt before continuing if - not passed. If the prompt is declined, the program will exit. - - :param param_decls: One or more option names. Defaults to the single - value ``"--yes"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value: - ctx.abort() - - if not param_decls: - param_decls = ("--yes",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("callback", callback) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("prompt", "Do you want to continue?") - kwargs.setdefault("help", "Confirm the action without prompting.") - return option(*param_decls, **kwargs) - - -def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--password`` option which prompts for a password, hiding - input and asking to enter the value again for confirmation. - - :param param_decls: One or more option names. Defaults to the single - value ``"--password"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - if not param_decls: - param_decls = ("--password",) - - kwargs.setdefault("prompt", True) - kwargs.setdefault("confirmation_prompt", True) - kwargs.setdefault("hide_input", True) - return option(*param_decls, **kwargs) - - -def version_option( - version: t.Optional[str] = None, - *param_decls: str, - package_name: t.Optional[str] = None, - prog_name: t.Optional[str] = None, - message: t.Optional[str] = None, - **kwargs: t.Any, -) -> t.Callable[[FC], FC]: - """Add a ``--version`` option which immediately prints the version - number and exits the program. - - If ``version`` is not provided, Click will try to detect it using - :func:`importlib.metadata.version` to get the version for the - ``package_name``. On Python < 3.8, the ``importlib_metadata`` - backport must be installed. - - If ``package_name`` is not provided, Click will try to detect it by - inspecting the stack frames. This will be used to detect the - version, so it must match the name of the installed package. - - :param version: The version number to show. If not provided, Click - will try to detect it. - :param param_decls: One or more option names. Defaults to the single - value ``"--version"``. - :param package_name: The package name to detect the version from. If - not provided, Click will try to detect it. - :param prog_name: The name of the CLI to show in the message. If not - provided, it will be detected from the command. - :param message: The message to show. The values ``%(prog)s``, - ``%(package)s``, and ``%(version)s`` are available. Defaults to - ``"%(prog)s, version %(version)s"``. - :param kwargs: Extra arguments are passed to :func:`option`. - :raise RuntimeError: ``version`` could not be detected. - - .. versionchanged:: 8.0 - Add the ``package_name`` parameter, and the ``%(package)s`` - value for messages. - - .. versionchanged:: 8.0 - Use :mod:`importlib.metadata` instead of ``pkg_resources``. The - version is detected based on the package name, not the entry - point name. The Python package name must match the installed - package name, or be passed with ``package_name=``. - """ - if message is None: - message = _("%(prog)s, version %(version)s") - - if version is None and package_name is None: - frame = inspect.currentframe() - f_back = frame.f_back if frame is not None else None - f_globals = f_back.f_globals if f_back is not None else None - # break reference cycle - # https://docs.python.org/3/library/inspect.html#the-interpreter-stack - del frame - - if f_globals is not None: - package_name = f_globals.get("__name__") - - if package_name == "__main__": - package_name = f_globals.get("__package__") - - if package_name: - package_name = package_name.partition(".")[0] - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - nonlocal prog_name - nonlocal version - - if prog_name is None: - prog_name = ctx.find_root().info_name - - if version is None and package_name is not None: - metadata: t.Optional[types.ModuleType] - - try: - from importlib import metadata - except ImportError: - # Python < 3.8 - import importlib_metadata as metadata # type: ignore - - try: - version = metadata.version(package_name) # type: ignore - except metadata.PackageNotFoundError: # type: ignore - raise RuntimeError( - f"{package_name!r} is not installed. Try passing" - " 'package_name' instead." - ) from None - - if version is None: - raise RuntimeError( - f"Could not determine the version for {package_name!r} automatically." - ) - - echo( - message % {"prog": prog_name, "package": package_name, "version": version}, - color=ctx.color, - ) - ctx.exit() - - if not param_decls: - param_decls = ("--version",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show the version and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) - - -class HelpOption(Option): - """Pre-configured ``--help`` option which immediately prints the help page - and exits the program. - """ - - def __init__( - self, - param_decls: t.Optional[t.Sequence[str]] = None, - **kwargs: t.Any, - ) -> None: - if not param_decls: - param_decls = ("--help",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show this message and exit.")) - kwargs.setdefault("callback", self.show_help) - - super().__init__(param_decls, **kwargs) - - @staticmethod - def show_help(ctx: Context, param: Parameter, value: bool) -> None: - """Callback that print the help page on ```` and exits.""" - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Decorator for the pre-configured ``--help`` option defined above. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - kwargs.setdefault("cls", HelpOption) - return option(*param_decls, **kwargs) diff --git a/port/lib/python3.11/site-packages/click/exceptions.py b/port/lib/python3.11/site-packages/click/exceptions.py deleted file mode 100644 index 0b83151..0000000 --- a/port/lib/python3.11/site-packages/click/exceptions.py +++ /dev/null @@ -1,296 +0,0 @@ -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .globals import resolve_color_default -from .utils import echo -from .utils import format_filename - -if t.TYPE_CHECKING: - from .core import Command - from .core import Context - from .core import Parameter - - -def _join_param_hints( - param_hint: t.Optional[t.Union[t.Sequence[str], str]], -) -> t.Optional[str]: - if param_hint is not None and not isinstance(param_hint, str): - return " / ".join(repr(x) for x in param_hint) - - return param_hint - - -class ClickException(Exception): - """An exception that Click can handle and show to the user.""" - - #: The exit code for this exception. - exit_code = 1 - - def __init__(self, message: str) -> None: - super().__init__(message) - # The context will be removed by the time we print the message, so cache - # the color settings here to be used later on (in `show`) - self.show_color: t.Optional[bool] = resolve_color_default() - self.message = message - - def format_message(self) -> str: - return self.message - - def __str__(self) -> str: - return self.message - - def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: - if file is None: - file = get_text_stderr() - - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=self.show_color, - ) - - -class UsageError(ClickException): - """An internal exception that signals a usage error. This typically - aborts any further handling. - - :param message: the error message to display. - :param ctx: optionally the context that caused this error. Click will - fill in the context automatically in some situations. - """ - - exit_code = 2 - - def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: - super().__init__(message) - self.ctx = ctx - self.cmd: t.Optional[Command] = self.ctx.command if self.ctx else None - - def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: - if file is None: - file = get_text_stderr() - color = None - hint = "" - if ( - self.ctx is not None - and self.ctx.command.get_help_option(self.ctx) is not None - ): - hint = _("Try '{command} {option}' for help.").format( - command=self.ctx.command_path, option=self.ctx.help_option_names[0] - ) - hint = f"{hint}\n" - if self.ctx is not None: - color = self.ctx.color - echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=color, - ) - - -class BadParameter(UsageError): - """An exception that formats out a standardized error message for a - bad parameter. This is useful when thrown from a callback or type as - Click will attach contextual information to it (for instance, which - parameter it is). - - .. versionadded:: 2.0 - - :param param: the parameter object that caused this error. This can - be left out, and Click will attach this info itself - if possible. - :param param_hint: a string that shows up as parameter name. This - can be used as alternative to `param` in cases - where custom validation should happen. If it is - a string it's used as such, if it's a list then - each item is quoted and separated. - """ - - def __init__( - self, - message: str, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - ) -> None: - super().__init__(message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - return _("Invalid value: {message}").format(message=self.message) - - return _("Invalid value for {param_hint}: {message}").format( - param_hint=_join_param_hints(param_hint), message=self.message - ) - - -class MissingParameter(BadParameter): - """Raised if click required an option or argument but it was not - provided when invoking the script. - - .. versionadded:: 4.0 - - :param param_type: a string that indicates the type of the parameter. - The default is to inherit the parameter type from - the given `param`. Valid values are ``'parameter'``, - ``'option'`` or ``'argument'``. - """ - - def __init__( - self, - message: t.Optional[str] = None, - ctx: t.Optional["Context"] = None, - param: t.Optional["Parameter"] = None, - param_hint: t.Optional[str] = None, - param_type: t.Optional[str] = None, - ) -> None: - super().__init__(message or "", ctx, param, param_hint) - self.param_type = param_type - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint: t.Optional[str] = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - param_hint = None - - param_hint = _join_param_hints(param_hint) - param_hint = f" {param_hint}" if param_hint else "" - - param_type = self.param_type - if param_type is None and self.param is not None: - param_type = self.param.param_type_name - - msg = self.message - if self.param is not None: - msg_extra = self.param.type.get_missing_message(self.param) - if msg_extra: - if msg: - msg += f". {msg_extra}" - else: - msg = msg_extra - - msg = f" {msg}" if msg else "" - - # Translate param_type for known types. - if param_type == "argument": - missing = _("Missing argument") - elif param_type == "option": - missing = _("Missing option") - elif param_type == "parameter": - missing = _("Missing parameter") - else: - missing = _("Missing {param_type}").format(param_type=param_type) - - return f"{missing}{param_hint}.{msg}" - - def __str__(self) -> str: - if not self.message: - param_name = self.param.name if self.param else None - return _("Missing parameter: {param_name}").format(param_name=param_name) - else: - return self.message - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__( - self, - option_name: str, - message: t.Optional[str] = None, - possibilities: t.Optional[t.Sequence[str]] = None, - ctx: t.Optional["Context"] = None, - ) -> None: - if message is None: - message = _("No such option: {name}").format(name=option_name) - - super().__init__(message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self) -> str: - if not self.possibilities: - return self.message - - possibility_str = ", ".join(sorted(self.possibilities)) - suggest = ngettext( - "Did you mean {possibility}?", - "(Possible options: {possibilities})", - len(self.possibilities), - ).format(possibility=possibility_str, possibilities=possibility_str) - return f"{self.message} {suggest}" - - -class BadOptionUsage(UsageError): - """Raised if an option is generally supplied but the use of the option - was incorrect. This is for instance raised if the number of arguments - for an option is not correct. - - .. versionadded:: 4.0 - - :param option_name: the name of the option being used incorrectly. - """ - - def __init__( - self, option_name: str, message: str, ctx: t.Optional["Context"] = None - ) -> None: - super().__init__(message, ctx) - self.option_name = option_name - - -class BadArgumentUsage(UsageError): - """Raised if an argument is generally supplied but the use of the argument - was incorrect. This is for instance raised if the number of values - for an argument is not correct. - - .. versionadded:: 6.0 - """ - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: - if hint is None: - hint = _("unknown error") - - super().__init__(hint) - self.ui_filename: str = format_filename(filename) - self.filename = filename - - def format_message(self) -> str: - return _("Could not open file {filename!r}: {message}").format( - filename=self.ui_filename, message=self.message - ) - - -class Abort(RuntimeError): - """An internal signalling exception that signals Click to abort.""" - - -class Exit(RuntimeError): - """An exception that indicates that the application should exit with some - status code. - - :param code: the status code to exit with. - """ - - __slots__ = ("exit_code",) - - def __init__(self, code: int = 0) -> None: - self.exit_code: int = code diff --git a/port/lib/python3.11/site-packages/click/formatting.py b/port/lib/python3.11/site-packages/click/formatting.py deleted file mode 100644 index ddd2a2f..0000000 --- a/port/lib/python3.11/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -import typing as t -from contextlib import contextmanager -from gettext import gettext as _ - -from ._compat import term_len -from .parser import split_opt - -# Can force a width. This is used by the test system -FORCED_WIDTH: t.Optional[int] = None - - -def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: - widths: t.Dict[int, int] = {} - - for row in rows: - for idx, col in enumerate(row): - widths[idx] = max(widths.get(idx, 0), term_len(col)) - - return tuple(y for x, y in sorted(widths.items())) - - -def iter_rows( - rows: t.Iterable[t.Tuple[str, str]], col_count: int -) -> t.Iterator[t.Tuple[str, ...]]: - for row in rows: - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text: str, - width: int = 78, - initial_indent: str = "", - subsequent_indent: str = "", - preserve_paragraphs: bool = False, -) -> str: - """A helper function that intelligently wraps text. By default, it - assumes that it operates on a single paragraph of text but if the - `preserve_paragraphs` parameter is provided it will intelligently - handle paragraphs (defined by two empty lines). - - If paragraphs are handled, a paragraph can be prefixed with an empty - line containing the ``\\b`` character (``\\x08``) to indicate that - no rewrapping should happen in that block. - - :param text: the text that should be rewrapped. - :param width: the maximum width for the text. - :param initial_indent: the initial indent that should be placed on the - first line as a string. - :param subsequent_indent: the indent string that should be placed on - each consecutive line. - :param preserve_paragraphs: if this flag is set then the wrapping will - intelligently handle paragraphs. - """ - from ._textwrap import TextWrapper - - text = text.expandtabs() - wrapper = TextWrapper( - width, - initial_indent=initial_indent, - subsequent_indent=subsequent_indent, - replace_whitespace=False, - ) - if not preserve_paragraphs: - return wrapper.fill(text) - - p: t.List[t.Tuple[int, bool, str]] = [] - buf: t.List[str] = [] - indent = None - - def _flush_par() -> None: - if not buf: - return - if buf[0].strip() == "\b": - p.append((indent or 0, True, "\n".join(buf[1:]))) - else: - p.append((indent or 0, False, " ".join(buf))) - del buf[:] - - for line in text.splitlines(): - if not line: - _flush_par() - indent = None - else: - if indent is None: - orig_len = term_len(line) - line = line.lstrip() - indent = orig_len - term_len(line) - buf.append(line) - _flush_par() - - rv = [] - for indent, raw, text in p: - with wrapper.extra_indent(" " * indent): - if raw: - rv.append(wrapper.indent_only(text)) - else: - rv.append(wrapper.fill(text)) - - return "\n\n".join(rv) - - -class HelpFormatter: - """This class helps with formatting text-based help pages. It's - usually just needed for very special internal cases, but it's also - exposed so that developers can write their own fancy outputs. - - At present, it always writes into memory. - - :param indent_increment: the additional increment for each level. - :param width: the width for the text. This defaults to the terminal - width clamped to a maximum of 78. - """ - - def __init__( - self, - indent_increment: int = 2, - width: t.Optional[int] = None, - max_width: t.Optional[int] = None, - ) -> None: - import shutil - - self.indent_increment = indent_increment - if max_width is None: - max_width = 80 - if width is None: - width = FORCED_WIDTH - if width is None: - width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) - self.width = width - self.current_indent = 0 - self.buffer: t.List[str] = [] - - def write(self, string: str) -> None: - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self) -> None: - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self) -> None: - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage( - self, prog: str, args: str = "", prefix: t.Optional[str] = None - ) -> None: - """Writes a usage line into the buffer. - - :param prog: the program name. - :param args: whitespace separated list of arguments. - :param prefix: The prefix for the first line. Defaults to - ``"Usage: "``. - """ - if prefix is None: - prefix = f"{_('Usage:')} " - - usage_prefix = f"{prefix:>{self.current_indent}}{prog} " - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = " " * term_len(usage_prefix) - self.write( - wrap_text( - args, - text_width, - initial_indent=usage_prefix, - subsequent_indent=indent, - ) - ) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write("\n") - indent = " " * (max(self.current_indent, term_len(prefix)) + 4) - self.write( - wrap_text( - args, text_width, initial_indent=indent, subsequent_indent=indent - ) - ) - - self.write("\n") - - def write_heading(self, heading: str) -> None: - """Writes a heading into the buffer.""" - self.write(f"{'':>{self.current_indent}}{heading}:\n") - - def write_paragraph(self) -> None: - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text: str) -> None: - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - indent = " " * self.current_indent - self.write( - wrap_text( - text, - self.width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl( - self, - rows: t.Sequence[t.Tuple[str, str]], - col_max: int = 30, - col_spacing: int = 2, - ) -> None: - """Writes a definition list into the buffer. This is how options - and commands are usually formatted. - - :param rows: a list of two item tuples for the terms and values. - :param col_max: the maximum width of the first column. - :param col_spacing: the number of spaces between the first and - second column. - """ - rows = list(rows) - widths = measure_table(rows) - if len(widths) != 2: - raise TypeError("Expected two columns for definition list") - - first_col = min(widths[0], col_max) + col_spacing - - for first, second in iter_rows(rows, len(widths)): - self.write(f"{'':>{self.current_indent}}{first}") - if not second: - self.write("\n") - continue - if term_len(first) <= first_col - col_spacing: - self.write(" " * (first_col - term_len(first))) - else: - self.write("\n") - self.write(" " * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) - lines = wrapped_text.splitlines() - - if lines: - self.write(f"{lines[0]}\n") - - for line in lines[1:]: - self.write(f"{'':>{first_col + self.current_indent}}{line}\n") - else: - self.write("\n") - - @contextmanager - def section(self, name: str) -> t.Iterator[None]: - """Helpful context manager that writes a paragraph, a heading, - and the indents. - - :param name: the section name that is written as heading. - """ - self.write_paragraph() - self.write_heading(name) - self.indent() - try: - yield - finally: - self.dedent() - - @contextmanager - def indentation(self) -> t.Iterator[None]: - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self) -> str: - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: - """Given a list of option strings this joins them in the most appropriate - way and returns them in the form ``(formatted_string, - any_prefix_is_slash)`` where the second item in the tuple is a flag that - indicates if any of the option prefixes was a slash. - """ - rv = [] - any_prefix_is_slash = False - - for opt in options: - prefix = split_opt(opt)[0] - - if prefix == "/": - any_prefix_is_slash = True - - rv.append((len(prefix), opt)) - - rv.sort(key=lambda x: x[0]) - return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/port/lib/python3.11/site-packages/click/globals.py b/port/lib/python3.11/site-packages/click/globals.py deleted file mode 100644 index 191e712..0000000 --- a/port/lib/python3.11/site-packages/click/globals.py +++ /dev/null @@ -1,67 +0,0 @@ -import typing as t -from threading import local - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .core import Context - -_local = local() - - -@t.overload -def get_current_context(silent: "te.Literal[False]" = False) -> "Context": ... - - -@t.overload -def get_current_context(silent: bool = ...) -> t.Optional["Context"]: ... - - -def get_current_context(silent: bool = False) -> t.Optional["Context"]: - """Returns the current click context. This can be used as a way to - access the current context object from anywhere. This is a more implicit - alternative to the :func:`pass_context` decorator. This function is - primarily useful for helpers such as :func:`echo` which might be - interested in changing its behavior based on the current context. - - To push the current context, :meth:`Context.scope` can be used. - - .. versionadded:: 5.0 - - :param silent: if set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return t.cast("Context", _local.stack[-1]) - except (AttributeError, IndexError) as e: - if not silent: - raise RuntimeError("There is no active click context.") from e - - return None - - -def push_context(ctx: "Context") -> None: - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context() -> None: - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: - """Internal helper to get the default value of the color flag. If a - value is passed it's returned unchanged, otherwise it's looked up from - the current context. - """ - if color is not None: - return color - - ctx = get_current_context(silent=True) - - if ctx is not None: - return ctx.color - - return None diff --git a/port/lib/python3.11/site-packages/click/parser.py b/port/lib/python3.11/site-packages/click/parser.py deleted file mode 100644 index 600b843..0000000 --- a/port/lib/python3.11/site-packages/click/parser.py +++ /dev/null @@ -1,531 +0,0 @@ -""" -This module started out as largely a copy paste from the stdlib's -optparse module with the features removed that we do not need from -optparse because we implement them in Click on a higher level (for -instance type handling, help formatting and a lot more). - -The plan is to remove more and more from here over time. - -The reason this is a different module and not optparse from the stdlib -is that there are differences in 2.x and 3.x about the error messages -generated and optparse in the stdlib uses gettext for no good reason -and might cause us issues. - -Click uses parts of optparse written by Gregory P. Ward and maintained -by the Python Software Foundation. This is limited to code in parser.py. - -Copyright 2001-2006 Gregory P. Ward. All rights reserved. -Copyright 2002-2006 Python Software Foundation. All rights reserved. -""" - -# This code uses parts of optparse written by Gregory P. Ward and -# maintained by the Python Software Foundation. -# Copyright 2001-2006 Gregory P. Ward -# Copyright 2002-2006 Python Software Foundation -import typing as t -from collections import deque -from gettext import gettext as _ -from gettext import ngettext - -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .core import Argument as CoreArgument - from .core import Context - from .core import Option as CoreOption - from .core import Parameter as CoreParameter - -V = t.TypeVar("V") - -# Sentinel value that indicates an option was passed as a flag without a -# value but is not a flag option. Option.consume_value uses this to -# prompt or use the flag_value. -_flag_needs_value = object() - - -def _unpack_args( - args: t.Sequence[str], nargs_spec: t.Sequence[int] -) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: - """Given an iterable of arguments and an iterable of nargs specifications, - it returns a tuple with all the unpacked arguments at the first index - and all remaining arguments as the second. - - The nargs specification is the number of arguments that should be consumed - or `-1` to indicate that this position should eat up all the remainders. - - Missing items are filled with `None`. - """ - args = deque(args) - nargs_spec = deque(nargs_spec) - rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] - spos: t.Optional[int] = None - - def _fetch(c: "te.Deque[V]") -> t.Optional[V]: - try: - if spos is None: - return c.popleft() - else: - return c.pop() - except IndexError: - return None - - while nargs_spec: - nargs = _fetch(nargs_spec) - - if nargs is None: - continue - - if nargs == 1: - rv.append(_fetch(args)) - elif nargs > 1: - x = [_fetch(args) for _ in range(nargs)] - - # If we're reversed, we're pulling in the arguments in reverse, - # so we need to turn them around. - if spos is not None: - x.reverse() - - rv.append(tuple(x)) - elif nargs < 0: - if spos is not None: - raise TypeError("Cannot have two nargs < 0") - - spos = len(rv) - rv.append(None) - - # spos is the position of the wildcard (star). If it's not `None`, - # we fill it with the remainder. - if spos is not None: - rv[spos] = tuple(args) - args = [] - rv[spos + 1 :] = reversed(rv[spos + 1 :]) - - return tuple(rv), list(args) - - -def split_opt(opt: str) -> t.Tuple[str, str]: - first = opt[:1] - if first.isalnum(): - return "", opt - if opt[1:2] == first: - return opt[:2], opt[2:] - return first, opt[1:] - - -def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = split_opt(opt) - return f"{prefix}{ctx.token_normalize_func(opt)}" - - -def split_arg_string(string: str) -> t.List[str]: - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - - .. code-block:: python - - split_arg_string("example 'my file") - ["example", "my file"] - - split_arg_string("example my\\") - ["example", "my"] - - :param string: String to split. - """ - import shlex - - lex = shlex.shlex(string, posix=True) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -class Option: - def __init__( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ): - self._short_opts = [] - self._long_opts = [] - self.prefixes: t.Set[str] = set() - - for opt in opts: - prefix, value = split_opt(opt) - if not prefix: - raise ValueError(f"Invalid start character for option ({opt})") - self.prefixes.add(prefix[0]) - if len(prefix) == 1 and len(value) == 1: - self._short_opts.append(opt) - else: - self._long_opts.append(opt) - self.prefixes.add(prefix) - - if action is None: - action = "store" - - self.dest = dest - self.action = action - self.nargs = nargs - self.const = const - self.obj = obj - - @property - def takes_value(self) -> bool: - return self.action in ("store", "append") - - def process(self, value: t.Any, state: "ParsingState") -> None: - if self.action == "store": - state.opts[self.dest] = value # type: ignore - elif self.action == "store_const": - state.opts[self.dest] = self.const # type: ignore - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) # type: ignore - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) # type: ignore - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore - else: - raise ValueError(f"unknown action '{self.action}'") - state.order.append(self.obj) - - -class Argument: - def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process( - self, - value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], - state: "ParsingState", - ) -> None: - if self.nargs > 1: - assert value is not None - holes = sum(1 for x in value if x is None) - if holes == len(value): - value = None - elif holes != 0: - raise BadArgumentUsage( - _("Argument {name!r} takes {nargs} values.").format( - name=self.dest, nargs=self.nargs - ) - ) - - if self.nargs == -1 and self.obj.envvar is not None and value == (): - # Replace empty tuple with None so that a value from the - # environment may be tried. - value = None - - state.opts[self.dest] = value # type: ignore - state.order.append(self.obj) - - -class ParsingState: - def __init__(self, rargs: t.List[str]) -> None: - self.opts: t.Dict[str, t.Any] = {} - self.largs: t.List[str] = [] - self.rargs = rargs - self.order: t.List[CoreParameter] = [] - - -class OptionParser: - """The option parser is an internal class that is ultimately used to - parse options and arguments. It's modelled after optparse and brings - a similar but vastly simplified API. It should generally not be used - directly as the high level Click classes wrap it for you. - - It's not nearly as extensible as optparse or argparse as it does not - implement features that are implemented on a higher level (such as - types or defaults). - - :param ctx: optionally the :class:`~click.Context` where this parser - should go with. - """ - - def __init__(self, ctx: t.Optional["Context"] = None) -> None: - #: The :class:`~click.Context` for this parser. This might be - #: `None` for some advanced use cases. - self.ctx = ctx - #: This controls how the parser deals with interspersed arguments. - #: If this is set to `False`, the parser will stop on the first - #: non-option. Click uses this to implement nested subcommands - #: safely. - self.allow_interspersed_args: bool = True - #: This tells the parser how to deal with unknown options. By - #: default it will error out (which is sensible), but there is a - #: second mode where it will ignore it and continue processing - #: after shifting all the unknown options into the resulting args. - self.ignore_unknown_options: bool = False - - if ctx is not None: - self.allow_interspersed_args = ctx.allow_interspersed_args - self.ignore_unknown_options = ctx.ignore_unknown_options - - self._short_opt: t.Dict[str, Option] = {} - self._long_opt: t.Dict[str, Option] = {} - self._opt_prefixes = {"-", "--"} - self._args: t.List[Argument] = [] - - def add_option( - self, - obj: "CoreOption", - opts: t.Sequence[str], - dest: t.Optional[str], - action: t.Optional[str] = None, - nargs: int = 1, - const: t.Optional[t.Any] = None, - ) -> None: - """Adds a new option named `dest` to the parser. The destination - is not inferred (unlike with optparse) and needs to be explicitly - provided. Action can be any of ``store``, ``store_const``, - ``append``, ``append_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - opts = [normalize_opt(opt, self.ctx) for opt in opts] - option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) - self._opt_prefixes.update(option.prefixes) - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - def add_argument( - self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 - ) -> None: - """Adds a positional argument named `dest` to the parser. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - self._args.append(Argument(obj, dest=dest, nargs=nargs)) - - def parse_args( - self, args: t.List[str] - ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: - """Parses positional arguments and returns ``(values, args, order)`` - for the parsed options and arguments as well as the leftover - arguments if there are any. The order is a list of objects as they - appear on the command line. If arguments appear multiple times they - will be memorized multiple times as well. - """ - state = ParsingState(args) - try: - self._process_args_for_options(state) - self._process_args_for_args(state) - except UsageError: - if self.ctx is None or not self.ctx.resilient_parsing: - raise - return state.opts, state.largs, state.order - - def _process_args_for_args(self, state: ParsingState) -> None: - pargs, args = _unpack_args( - state.largs + state.rargs, [x.nargs for x in self._args] - ) - - for idx, arg in enumerate(self._args): - arg.process(pargs[idx], state) - - state.largs = args - state.rargs = [] - - def _process_args_for_options(self, state: ParsingState) -> None: - while state.rargs: - arg = state.rargs.pop(0) - arglen = len(arg) - # Double dashes always handled explicitly regardless of what - # prefixes are valid. - if arg == "--": - return - elif arg[:1] in self._opt_prefixes and arglen > 1: - self._process_opts(arg, state) - elif self.allow_interspersed_args: - state.largs.append(arg) - else: - state.rargs.insert(0, arg) - return - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt( - self, opt: str, explicit_value: t.Optional[str], state: ParsingState - ) -> None: - if opt not in self._long_opt: - from difflib import get_close_matches - - possibilities = get_close_matches(opt, self._long_opt) - raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) - - option = self._long_opt[opt] - if option.takes_value: - # At this point it's safe to modify rargs by injecting the - # explicit value, because no exception is raised in this - # branch. This means that the inserted value will be fully - # consumed. - if explicit_value is not None: - state.rargs.insert(0, explicit_value) - - value = self._get_value_from_state(opt, option, state) - - elif explicit_value is not None: - raise BadOptionUsage( - opt, _("Option {name!r} does not take a value.").format(name=opt) - ) - - else: - value = None - - option.process(value, state) - - def _match_short_opt(self, arg: str, state: ParsingState) -> None: - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = normalize_opt(f"{prefix}{ch}", self.ctx) - option = self._short_opt.get(opt) - i += 1 - - if not option: - if self.ignore_unknown_options: - unknown_options.append(ch) - continue - raise NoSuchOption(opt, ctx=self.ctx) - if option.takes_value: - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - state.rargs.insert(0, arg[i:]) - stop = True - - value = self._get_value_from_state(opt, option, state) - - else: - value = None - - option.process(value, state) - - if stop: - break - - # If we got any unknown options we recombine the string of the - # remaining options and re-attach the prefix, then report that - # to the state as new larg. This way there is basic combinatorics - # that can be achieved while still ignoring unknown arguments. - if self.ignore_unknown_options and unknown_options: - state.largs.append(f"{prefix}{''.join(unknown_options)}") - - def _get_value_from_state( - self, option_name: str, option: Option, state: ParsingState - ) -> t.Any: - nargs = option.nargs - - if len(state.rargs) < nargs: - if option.obj._flag_needs_value: - # Option allows omitting the value. - value = _flag_needs_value - else: - raise BadOptionUsage( - option_name, - ngettext( - "Option {name!r} requires an argument.", - "Option {name!r} requires {nargs} arguments.", - nargs, - ).format(name=option_name, nargs=nargs), - ) - elif nargs == 1: - next_rarg = state.rargs[0] - - if ( - option.obj._flag_needs_value - and isinstance(next_rarg, str) - and next_rarg[:1] in self._opt_prefixes - and len(next_rarg) > 1 - ): - # The next arg looks like the start of an option, don't - # use it as the value if omitting the value is allowed. - value = _flag_needs_value - else: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - return value - - def _process_opts(self, arg: str, state: ParsingState) -> None: - explicit_value = None - # Long option handling happens in two parts. The first part is - # supporting explicitly attached values. In any case, we will try - # to long match the option first. - if "=" in arg: - long_opt, explicit_value = arg.split("=", 1) - else: - long_opt = arg - norm_long_opt = normalize_opt(long_opt, self.ctx) - - # At this point we will match the (assumed) long option through - # the long option matching code. Note that this allows options - # like "-foo" to be matched as long options. - try: - self._match_long_opt(norm_long_opt, explicit_value, state) - except NoSuchOption: - # At this point the long option matching failed, and we need - # to try with short options. However there is a special rule - # which says, that if we have a two character options prefix - # (applies to "--foo" for instance), we do not dispatch to the - # short option code and will instead raise the no option - # error. - if arg[:2] not in self._opt_prefixes: - self._match_short_opt(arg, state) - return - - if not self.ignore_unknown_options: - raise - - state.largs.append(arg) diff --git a/port/lib/python3.11/site-packages/click/py.typed b/port/lib/python3.11/site-packages/click/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/click/shell_completion.py b/port/lib/python3.11/site-packages/click/shell_completion.py deleted file mode 100644 index 07d0f09..0000000 --- a/port/lib/python3.11/site-packages/click/shell_completion.py +++ /dev/null @@ -1,603 +0,0 @@ -import os -import re -import typing as t -from gettext import gettext as _ - -from .core import Argument -from .core import BaseCommand -from .core import Context -from .core import MultiCommand -from .core import Option -from .core import Parameter -from .core import ParameterSource -from .parser import split_arg_string -from .utils import echo - - -def shell_complete( - cli: BaseCommand, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - instruction: str, -) -> int: - """Perform shell completion for the given CLI program. - - :param cli: Command being called. - :param ctx_args: Extra arguments to pass to - ``cli.make_context``. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - :param instruction: Value of ``complete_var`` with the completion - instruction and shell, in the form ``instruction_shell``. - :return: Status code to exit with. - """ - shell, _, instruction = instruction.partition("_") - comp_cls = get_completion_class(shell) - - if comp_cls is None: - return 1 - - comp = comp_cls(cli, ctx_args, prog_name, complete_var) - - if instruction == "source": - echo(comp.source()) - return 0 - - if instruction == "complete": - echo(comp.complete()) - return 0 - - return 1 - - -class CompletionItem: - """Represents a completion value and metadata about the value. The - default metadata is ``type`` to indicate special shell handling, - and ``help`` if a shell supports showing a help string next to the - value. - - Arbitrary parameters can be passed when creating the object, and - accessed using ``item.attr``. If an attribute wasn't passed, - accessing it returns ``None``. - - :param value: The completion suggestion. - :param type: Tells the shell script to provide special completion - support for the type. Click uses ``"dir"`` and ``"file"``. - :param help: String shown next to the value if supported. - :param kwargs: Arbitrary metadata. The built-in implementations - don't use this, but custom type completions paired with custom - shell support could use it. - """ - - __slots__ = ("value", "type", "help", "_info") - - def __init__( - self, - value: t.Any, - type: str = "plain", - help: t.Optional[str] = None, - **kwargs: t.Any, - ) -> None: - self.value: t.Any = value - self.type: str = type - self.help: t.Optional[str] = help - self._info = kwargs - - def __getattr__(self, name: str) -> t.Any: - return self._info.get(name) - - -# Only Bash >= 4.4 has the nosort option. -_SOURCE_BASH = """\ -%(complete_func)s() { - local IFS=$'\\n' - local response - - response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ -%(complete_var)s=bash_complete $1) - - for completion in $response; do - IFS=',' read type value <<< "$completion" - - if [[ $type == 'dir' ]]; then - COMPREPLY=() - compopt -o dirnames - elif [[ $type == 'file' ]]; then - COMPREPLY=() - compopt -o default - elif [[ $type == 'plain' ]]; then - COMPREPLY+=($value) - fi - done - - return 0 -} - -%(complete_func)s_setup() { - complete -o nosort -F %(complete_func)s %(prog_name)s -} - -%(complete_func)s_setup; -""" - -_SOURCE_ZSH = """\ -#compdef %(prog_name)s - -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - (( ! $+commands[%(prog_name)s] )) && return 1 - - response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ -%(complete_var)s=zsh_complete %(prog_name)s)}") - - for type key descr in ${response}; do - if [[ "$type" == "plain" ]]; then - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - elif [[ "$type" == "dir" ]]; then - _path_files -/ - elif [[ "$type" == "file" ]]; then - _path_files -f - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -a completions - fi -} - -if [[ $zsh_eval_context[-1] == loadautofunc ]]; then - # autoload from fpath, call function directly - %(complete_func)s "$@" -else - # eval/source/. command, register function for later - compdef %(complete_func)s %(prog_name)s -fi -""" - -_SOURCE_FISH = """\ -function %(complete_func)s; - set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ -COMP_CWORD=(commandline -t) %(prog_name)s); - - for completion in $response; - set -l metadata (string split "," $completion); - - if test $metadata[1] = "dir"; - __fish_complete_directories $metadata[2]; - else if test $metadata[1] = "file"; - __fish_complete_path $metadata[2]; - else if test $metadata[1] = "plain"; - echo $metadata[2]; - end; - end; -end; - -complete --no-files --command %(prog_name)s --arguments \ -"(%(complete_func)s)"; -""" - - -class ShellComplete: - """Base class for providing shell completion support. A subclass for - a given shell will override attributes and methods to implement the - completion instructions (``source`` and ``complete``). - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - - .. versionadded:: 8.0 - """ - - name: t.ClassVar[str] - """Name to register the shell as with :func:`add_completion_class`. - This is used in completion instructions (``{name}_source`` and - ``{name}_complete``). - """ - - source_template: t.ClassVar[str] - """Completion script template formatted by :meth:`source`. This must - be provided by subclasses. - """ - - def __init__( - self, - cli: BaseCommand, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - ) -> None: - self.cli = cli - self.ctx_args = ctx_args - self.prog_name = prog_name - self.complete_var = complete_var - - @property - def func_name(self) -> str: - """The name of the shell function defined by the completion - script. - """ - safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) - return f"_{safe_name}_completion" - - def source_vars(self) -> t.Dict[str, t.Any]: - """Vars for formatting :attr:`source_template`. - - By default this provides ``complete_func``, ``complete_var``, - and ``prog_name``. - """ - return { - "complete_func": self.func_name, - "complete_var": self.complete_var, - "prog_name": self.prog_name, - } - - def source(self) -> str: - """Produce the shell script that defines the completion - function. By default this ``%``-style formats - :attr:`source_template` with the dict returned by - :meth:`source_vars`. - """ - return self.source_template % self.source_vars() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - """Use the env vars defined by the shell script to return a - tuple of ``args, incomplete``. This must be implemented by - subclasses. - """ - raise NotImplementedError - - def get_completions( - self, args: t.List[str], incomplete: str - ) -> t.List[CompletionItem]: - """Determine the context and last complete command or parameter - from the complete args. Call that object's ``shell_complete`` - method to get the completions for the incomplete value. - - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) - obj, incomplete = _resolve_incomplete(ctx, args, incomplete) - return obj.shell_complete(ctx, incomplete) - - def format_completion(self, item: CompletionItem) -> str: - """Format a completion item into the form recognized by the - shell script. This must be implemented by subclasses. - - :param item: Completion item to format. - """ - raise NotImplementedError - - def complete(self) -> str: - """Produce the completion data to send back to the shell. - - By default this calls :meth:`get_completion_args`, gets the - completions, then calls :meth:`format_completion` for each - completion. - """ - args, incomplete = self.get_completion_args() - completions = self.get_completions(args, incomplete) - out = [self.format_completion(item) for item in completions] - return "\n".join(out) - - -class BashComplete(ShellComplete): - """Shell completion for Bash.""" - - name = "bash" - source_template = _SOURCE_BASH - - @staticmethod - def _check_version() -> None: - import shutil - import subprocess - - bash_exe = shutil.which("bash") - - if bash_exe is None: - match = None - else: - output = subprocess.run( - [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], - stdout=subprocess.PIPE, - ) - match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) - - if match is not None: - major, minor = match.groups() - - if major < "4" or major == "4" and minor < "4": - echo( - _( - "Shell completion is not supported for Bash" - " versions older than 4.4." - ), - err=True, - ) - else: - echo( - _("Couldn't detect Bash version, shell completion is not supported."), - err=True, - ) - - def source(self) -> str: - self._check_version() - return super().source() - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type},{item.value}" - - -class ZshComplete(ShellComplete): - """Shell completion for Zsh.""" - - name = "zsh" - source_template = _SOURCE_ZSH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" - - -class FishComplete(ShellComplete): - """Shell completion for Fish.""" - - name = "fish" - source_template = _SOURCE_FISH - - def get_completion_args(self) -> t.Tuple[t.List[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - args = cwords[1:] - - # Fish stores the partial word in both COMP_WORDS and - # COMP_CWORD, remove it from complete args. - if incomplete and args and args[-1] == incomplete: - args.pop() - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - if item.help: - return f"{item.type},{item.value}\t{item.help}" - - return f"{item.type},{item.value}" - - -ShellCompleteType = t.TypeVar("ShellCompleteType", bound=t.Type[ShellComplete]) - - -_available_shells: t.Dict[str, t.Type[ShellComplete]] = { - "bash": BashComplete, - "fish": FishComplete, - "zsh": ZshComplete, -} - - -def add_completion_class( - cls: ShellCompleteType, name: t.Optional[str] = None -) -> ShellCompleteType: - """Register a :class:`ShellComplete` subclass under the given name. - The name will be provided by the completion instruction environment - variable during completion. - - :param cls: The completion class that will handle completion for the - shell. - :param name: Name to register the class under. Defaults to the - class's ``name`` attribute. - """ - if name is None: - name = cls.name - - _available_shells[name] = cls - - return cls - - -def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: - """Look up a registered :class:`ShellComplete` subclass by the name - provided by the completion instruction environment variable. If the - name isn't registered, returns ``None``. - - :param shell: Name the class is registered under. - """ - return _available_shells.get(shell) - - -def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: - """Determine if the given parameter is an argument that can still - accept values. - - :param ctx: Invocation context for the command represented by the - parsed complete args. - :param param: Argument object being checked. - """ - if not isinstance(param, Argument): - return False - - assert param.name is not None - # Will be None if expose_value is False. - value = ctx.params.get(param.name) - return ( - param.nargs == -1 - or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE - or ( - param.nargs > 1 - and isinstance(value, (tuple, list)) - and len(value) < param.nargs - ) - ) - - -def _start_of_option(ctx: Context, value: str) -> bool: - """Check if the value looks like the start of an option.""" - if not value: - return False - - c = value[0] - return c in ctx._opt_prefixes - - -def _is_incomplete_option(ctx: Context, args: t.List[str], param: Parameter) -> bool: - """Determine if the given parameter is an option that needs a value. - - :param args: List of complete args before the incomplete value. - :param param: Option object being checked. - """ - if not isinstance(param, Option): - return False - - if param.is_flag or param.count: - return False - - last_option = None - - for index, arg in enumerate(reversed(args)): - if index + 1 > param.nargs: - break - - if _start_of_option(ctx, arg): - last_option = arg - - return last_option is not None and last_option in param.opts - - -def _resolve_context( - cli: BaseCommand, - ctx_args: t.MutableMapping[str, t.Any], - prog_name: str, - args: t.List[str], -) -> Context: - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param args: List of complete args before the incomplete value. - """ - ctx_args["resilient_parsing"] = True - ctx = cli.make_context(prog_name, args.copy(), **ctx_args) - args = ctx.protected_args + ctx.args - - while args: - command = ctx.command - - if isinstance(command, MultiCommand): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) - args = ctx.protected_args + ctx.args - else: - sub_ctx = ctx - - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - sub_ctx = cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx.protected_args, *sub_ctx.args] - else: - break - - return ctx - - -def _resolve_incomplete( - ctx: Context, args: t.List[str], incomplete: str -) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: - """Find the Click object that will handle the completion of the - incomplete value. Return the object and the incomplete value. - - :param ctx: Invocation context for the command represented by - the parsed complete args. - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - # Different shells treat an "=" between a long option name and - # value differently. Might keep the value joined, return the "=" - # as a separate item, or return the split name and value. Always - # split and discard the "=" to make completion easier. - if incomplete == "=": - incomplete = "" - elif "=" in incomplete and _start_of_option(ctx, incomplete): - name, _, incomplete = incomplete.partition("=") - args.append(name) - - # The "--" marker tells Click to stop treating values as options - # even if they start with the option character. If it hasn't been - # given and the incomplete arg looks like an option, the current - # command will provide option name completions. - if "--" not in args and _start_of_option(ctx, incomplete): - return ctx.command, incomplete - - params = ctx.command.get_params(ctx) - - # If the last complete arg is an option name with an incomplete - # value, the option will provide value completions. - for param in params: - if _is_incomplete_option(ctx, args, param): - return param, incomplete - - # It's not an option name or value. The first argument without a - # parsed value will provide value completions. - for param in params: - if _is_incomplete_argument(ctx, param): - return param, incomplete - - # There were no unparsed arguments, the command may be a group that - # will provide command name completions. - return ctx.command, incomplete diff --git a/port/lib/python3.11/site-packages/click/termui.py b/port/lib/python3.11/site-packages/click/termui.py deleted file mode 100644 index c084f19..0000000 --- a/port/lib/python3.11/site-packages/click/termui.py +++ /dev/null @@ -1,784 +0,0 @@ -import inspect -import io -import itertools -import sys -import typing as t -from gettext import gettext as _ - -from ._compat import isatty -from ._compat import strip_ansi -from .exceptions import Abort -from .exceptions import UsageError -from .globals import resolve_color_default -from .types import Choice -from .types import convert_type -from .types import ParamType -from .utils import echo -from .utils import LazyFile - -if t.TYPE_CHECKING: - from ._termui_impl import ProgressBar - -V = t.TypeVar("V") - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func: t.Callable[[str], str] = input - -_ansi_colors = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, - "reset": 39, - "bright_black": 90, - "bright_red": 91, - "bright_green": 92, - "bright_yellow": 93, - "bright_blue": 94, - "bright_magenta": 95, - "bright_cyan": 96, - "bright_white": 97, -} -_ansi_reset_all = "\033[0m" - - -def hidden_prompt_func(prompt: str) -> str: - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text: str, - suffix: str, - show_default: bool = False, - default: t.Optional[t.Any] = None, - show_choices: bool = True, - type: t.Optional[ParamType] = None, -) -> str: - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += f" ({', '.join(map(str, type.choices))})" - if default is not None and show_default: - prompt = f"{prompt} [{_format_default(default)}]" - return f"{prompt}{suffix}" - - -def _format_default(default: t.Any) -> t.Any: - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name - - return default - - -def prompt( - text: str, - default: t.Optional[t.Any] = None, - hide_input: bool = False, - confirmation_prompt: t.Union[bool, str] = False, - type: t.Optional[t.Union[ParamType, t.Any]] = None, - value_proc: t.Optional[t.Callable[[str], t.Any]] = None, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, - show_choices: bool = True, -) -> t.Any: - """Prompts a user for input. This is a convenience function that can - be used to prompt a user for input later. - - If the user aborts the input by sending an interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the text to show for the prompt. - :param default: the default value to use if no input happens. If this - is not given it will prompt until it's aborted. - :param hide_input: if this is set to true then the input value will - be hidden. - :param confirmation_prompt: Prompt a second time to confirm the - value. Can be set to a string instead of ``True`` to customize - the message. - :param type: the type to use to check the value against. - :param value_proc: if this parameter is provided it's a function that - is invoked instead of the type conversion to - convert a value. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - :param show_choices: Show or hide choices if the passed type is a Choice. - For example if type is a Choice of either day or week, - show_choices is true and text is "Group by" then the - prompt will be "Group by (day, week): ". - - .. versionadded:: 8.0 - ``confirmation_prompt`` can be a custom string. - - .. versionadded:: 7.0 - Added the ``show_choices`` parameter. - - .. versionadded:: 6.0 - Added unicode support for cmd.exe on Windows. - - .. versionadded:: 4.0 - Added the `err` parameter. - - """ - - def prompt_func(text: str) -> str: - f = hidden_prompt_func if hide_input else visible_prompt_func - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(text.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - return f(" ") - except (KeyboardInterrupt, EOFError): - # getpass doesn't print a newline if the user aborts input with ^C. - # Allegedly this behavior is inherited from getpass(3). - # A doc bug has been filed at https://bugs.python.org/issue24711 - if hide_input: - echo(None, err=err) - raise Abort() from None - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - if confirmation_prompt: - if confirmation_prompt is True: - confirmation_prompt = _("Repeat for confirmation") - - confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) - - while True: - while True: - value = prompt_func(prompt) - if value: - break - elif default is not None: - value = default - break - try: - result = value_proc(value) - except UsageError as e: - if hide_input: - echo(_("Error: The value you entered was invalid."), err=err) - else: - echo(_("Error: {e.message}").format(e=e), err=err) - continue - if not confirmation_prompt: - return result - while True: - value2 = prompt_func(confirmation_prompt) - is_empty = not value and not value2 - if value2 or is_empty: - break - if value == value2: - return result - echo(_("Error: The two entered values do not match."), err=err) - - -def confirm( - text: str, - default: t.Optional[bool] = False, - abort: bool = False, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, -) -> bool: - """Prompts for confirmation (yes/no question). - - If the user aborts the input by sending a interrupt signal this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the question to ask. - :param default: The default value to use when no input is given. If - ``None``, repeat until input is given. - :param abort: if this is set to `True` a negative answer aborts the - exception by raising :exc:`Abort`. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - - .. versionchanged:: 8.0 - Repeat until input is given if ``default`` is ``None``. - - .. versionadded:: 4.0 - Added the ``err`` parameter. - """ - prompt = _build_prompt( - text, - prompt_suffix, - show_default, - "y/n" if default is None else ("Y/n" if default else "y/N"), - ) - - while True: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - value = visible_prompt_func(" ").lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() from None - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif default is not None and value == "": - rv = default - else: - echo(_("Error: invalid input"), err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def echo_via_pager( - text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], - color: t.Optional[bool] = None, -) -> None: - """This function takes a text and shows it via an environment specific - pager on stdout. - - .. versionchanged:: 3.0 - Added the `color` flag. - - :param text_or_generator: the text to page, or alternatively, a - generator emitting the text to page. - :param color: controls if the pager supports ANSI colors or not. The - default is autodetection. - """ - color = resolve_color_default(color) - - if inspect.isgeneratorfunction(text_or_generator): - i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() - elif isinstance(text_or_generator, str): - i = [text_or_generator] - else: - i = iter(t.cast(t.Iterable[str], text_or_generator)) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, str) else str(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -def progressbar( - iterable: t.Optional[t.Iterable[V]] = None, - length: t.Optional[int] = None, - label: t.Optional[str] = None, - show_eta: bool = True, - show_percent: t.Optional[bool] = None, - show_pos: bool = False, - item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.Optional[t.TextIO] = None, - color: t.Optional[bool] = None, - update_min_steps: int = 1, -) -> "ProgressBar[V]": - """This function creates an iterable context manager that can be used - to iterate over something while showing a progress bar. It will - either iterate over the `iterable` or `length` items (that are counted - up). While iteration happens, this function will print a rendered - progress bar to the given `file` (defaults to stdout) and will attempt - to calculate remaining time and more. By default, this progress bar - will not be rendered if the file is not a terminal. - - The context manager creates the progress bar. When the context - manager is entered the progress bar is already created. With every - iteration over the progress bar, the iterable passed to the bar is - advanced and the bar is updated. When the context manager exits, - a newline is printed and the progress bar is finalized on screen. - - Note: The progress bar is currently designed for use cases where the - total progress can be expected to take at least several seconds. - Because of this, the ProgressBar class object won't display - progress that is considered too fast, and progress where the time - between steps is less than a second. - - No printing must happen or the progress bar will be unintentionally - destroyed. - - Example usage:: - - with progressbar(items) as bar: - for item in bar: - do_something_with(item) - - Alternatively, if no iterable is specified, one can manually update the - progress bar through the `update()` method instead of directly - iterating over the progress bar. The update method accepts the number - of steps to increment the bar with:: - - with progressbar(length=chunks.total_bytes) as bar: - for chunk in chunks: - process_chunk(chunk) - bar.update(chunks.bytes) - - The ``update()`` method also takes an optional value specifying the - ``current_item`` at the new position. This is useful when used - together with ``item_show_func`` to customize the output for each - manual step:: - - with click.progressbar( - length=total_size, - label='Unzipping archive', - item_show_func=lambda a: a.filename - ) as bar: - for archive in zip_file: - archive.extract() - bar.update(archive.size, archive) - - :param iterable: an iterable to iterate over. If not provided the length - is required. - :param length: the number of items to iterate over. By default the - progressbar will attempt to ask the iterator about its - length, which might or might not work. If an iterable is - also provided this parameter can be used to override the - length. If an iterable is not provided the progress bar - will iterate over a range of that length. - :param label: the label to show next to the progress bar. - :param show_eta: enables or disables the estimated time display. This is - automatically disabled if the length cannot be - determined. - :param show_percent: enables or disables the percentage display. The - default is `True` if the iterable has a length or - `False` if not. - :param show_pos: enables or disables the absolute position display. The - default is `False`. - :param item_show_func: A function called with the current item which - can return a string to show next to the progress bar. If the - function returns ``None`` nothing is shown. The current item can - be ``None``, such as when entering and exiting the bar. - :param fill_char: the character to use to show the filled part of the - progress bar. - :param empty_char: the character to use to show the non-filled part of - the progress bar. - :param bar_template: the format string to use as template for the bar. - The parameters in it are ``label`` for the label, - ``bar`` for the progress bar and ``info`` for the - info section. - :param info_sep: the separator between multiple info items (eta etc.) - :param width: the width of the progress bar in characters, 0 means full - terminal width - :param file: The file to write to. If this is not a terminal then - only the label is printed. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are included anywhere in the progress bar output - which is not the case by default. - :param update_min_steps: Render only when this many updates have - completed. This allows tuning for very fast iterators. - - .. versionchanged:: 8.0 - Output is shown even if execution time is less than 0.5 seconds. - - .. versionchanged:: 8.0 - ``item_show_func`` shows the current item, not the previous one. - - .. versionchanged:: 8.0 - Labels are echoed if the output is not a TTY. Reverts a change - in 7.0 that removed all output. - - .. versionadded:: 8.0 - Added the ``update_min_steps`` parameter. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. Added the ``update`` method to - the object. - - .. versionadded:: 2.0 - """ - from ._termui_impl import ProgressBar - - color = resolve_color_default(color) - return ProgressBar( - iterable=iterable, - length=length, - show_eta=show_eta, - show_percent=show_percent, - show_pos=show_pos, - item_show_func=item_show_func, - fill_char=fill_char, - empty_char=empty_char, - bar_template=bar_template, - info_sep=info_sep, - file=file, - label=label, - width=width, - color=color, - update_min_steps=update_min_steps, - ) - - -def clear() -> None: - """Clears the terminal screen. This will have the effect of clearing - the whole visible space of the terminal and moving the cursor to the - top left. This does not do anything if not connected to a terminal. - - .. versionadded:: 2.0 - """ - if not isatty(sys.stdout): - return - - # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor - echo("\033[2J\033[1;1H", nl=False) - - -def _interpret_color( - color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 -) -> str: - if isinstance(color, int): - return f"{38 + offset};5;{color:d}" - - if isinstance(color, (tuple, list)): - r, g, b = color - return f"{38 + offset};2;{r:d};{g:d};{b:d}" - - return str(_ansi_colors[color] + offset) - - -def style( - text: t.Any, - fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, - bold: t.Optional[bool] = None, - dim: t.Optional[bool] = None, - underline: t.Optional[bool] = None, - overline: t.Optional[bool] = None, - italic: t.Optional[bool] = None, - blink: t.Optional[bool] = None, - reverse: t.Optional[bool] = None, - strikethrough: t.Optional[bool] = None, - reset: bool = True, -) -> str: - """Styles a text with ANSI styles and returns the new string. By - default the styling is self contained which means that at the end - of the string a reset code is issued. This can be prevented by - passing ``reset=False``. - - Examples:: - - click.echo(click.style('Hello World!', fg='green')) - click.echo(click.style('ATTENTION!', blink=True)) - click.echo(click.style('Some things', reverse=True, fg='cyan')) - click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) - - Supported color names: - - * ``black`` (might be a gray) - * ``red`` - * ``green`` - * ``yellow`` (might be an orange) - * ``blue`` - * ``magenta`` - * ``cyan`` - * ``white`` (might be light gray) - * ``bright_black`` - * ``bright_red`` - * ``bright_green`` - * ``bright_yellow`` - * ``bright_blue`` - * ``bright_magenta`` - * ``bright_cyan`` - * ``bright_white`` - * ``reset`` (reset the color code only) - - If the terminal supports it, color may also be specified as: - - - An integer in the interval [0, 255]. The terminal must support - 8-bit/256-color mode. - - An RGB tuple of three integers in [0, 255]. The terminal must - support 24-bit/true-color mode. - - See https://en.wikipedia.org/wiki/ANSI_color and - https://gist.github.com/XVilka/8346728 for more information. - - :param text: the string to style with ansi codes. - :param fg: if provided this will become the foreground color. - :param bg: if provided this will become the background color. - :param bold: if provided this will enable or disable bold mode. - :param dim: if provided this will enable or disable dim mode. This is - badly supported. - :param underline: if provided this will enable or disable underline. - :param overline: if provided this will enable or disable overline. - :param italic: if provided this will enable or disable italic. - :param blink: if provided this will enable or disable blinking. - :param reverse: if provided this will enable or disable inverse - rendering (foreground becomes background and the - other way round). - :param strikethrough: if provided this will enable or disable - striking through text. - :param reset: by default a reset-all code is added at the end of the - string which means that styles do not carry over. This - can be disabled to compose styles. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. - - .. versionchanged:: 8.0 - Added support for 256 and RGB color codes. - - .. versionchanged:: 8.0 - Added the ``strikethrough``, ``italic``, and ``overline`` - parameters. - - .. versionchanged:: 7.0 - Added support for bright colors. - - .. versionadded:: 2.0 - """ - if not isinstance(text, str): - text = str(text) - - bits = [] - - if fg: - try: - bits.append(f"\033[{_interpret_color(fg)}m") - except KeyError: - raise TypeError(f"Unknown color {fg!r}") from None - - if bg: - try: - bits.append(f"\033[{_interpret_color(bg, 10)}m") - except KeyError: - raise TypeError(f"Unknown color {bg!r}") from None - - if bold is not None: - bits.append(f"\033[{1 if bold else 22}m") - if dim is not None: - bits.append(f"\033[{2 if dim else 22}m") - if underline is not None: - bits.append(f"\033[{4 if underline else 24}m") - if overline is not None: - bits.append(f"\033[{53 if overline else 55}m") - if italic is not None: - bits.append(f"\033[{3 if italic else 23}m") - if blink is not None: - bits.append(f"\033[{5 if blink else 25}m") - if reverse is not None: - bits.append(f"\033[{7 if reverse else 27}m") - if strikethrough is not None: - bits.append(f"\033[{9 if strikethrough else 29}m") - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text: str) -> str: - """Removes ANSI styling information from a string. Usually it's not - necessary to use this function as Click's echo function will - automatically remove styling if necessary. - - .. versionadded:: 2.0 - - :param text: the text to remove style information from. - """ - return strip_ansi(text) - - -def secho( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO[t.AnyStr]] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, - **styles: t.Any, -) -> None: - """This function combines :func:`echo` and :func:`style` into one - call. As such the following two calls are the same:: - - click.secho('Hello World!', fg='green') - click.echo(click.style('Hello World!', fg='green')) - - All keyword arguments are forwarded to the underlying functions - depending on which one they go with. - - Non-string types will be converted to :class:`str`. However, - :class:`bytes` are passed directly to :meth:`echo` without applying - style. If you want to style bytes that represent text, call - :meth:`bytes.decode` first. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. Bytes are - passed through without style applied. - - .. versionadded:: 2.0 - """ - if message is not None and not isinstance(message, (bytes, bytearray)): - message = style(message, **styles) - - return echo(message, file=file, nl=nl, err=err, color=color) - - -def edit( - text: t.Optional[t.AnyStr] = None, - editor: t.Optional[str] = None, - env: t.Optional[t.Mapping[str, str]] = None, - require_save: bool = True, - extension: str = ".txt", - filename: t.Optional[str] = None, -) -> t.Optional[t.AnyStr]: - r"""Edits the given text in the defined editor. If an editor is given - (should be the full path to the executable but the regular operating - system search path is used for finding the executable) it overrides - the detected editor. Optionally, some environment variables can be - used. If the editor is closed without changes, `None` is returned. In - case a file is edited directly the return value is always `None` and - `require_save` and `extension` are ignored. - - If the editor cannot be opened a :exc:`UsageError` is raised. - - Note for Windows: to simplify cross-platform usage, the newlines are - automatically converted from POSIX to Windows and vice versa. As such, - the message here will have ``\n`` as newline markers. - - :param text: the text to edit. - :param editor: optionally the editor to use. Defaults to automatic - detection. - :param env: environment variables to forward to the editor. - :param require_save: if this is true, then not saving in the editor - will make the return value become `None`. - :param extension: the extension to tell the editor about. This defaults - to `.txt` but changing this might change syntax - highlighting. - :param filename: if provided it will edit this file instead of the - provided text contents. It will not use a temporary - file as an indirection in that case. - """ - from ._termui_impl import Editor - - ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) - - if filename is None: - return ed.edit(text) - - ed.edit_file(filename) - return None - - -def launch(url: str, wait: bool = False, locate: bool = False) -> int: - """This function launches the given URL (or filename) in the default - viewer application for this file type. If this is an executable, it - might launch the executable in a new session. The return value is - the exit code of the launched application. Usually, ``0`` indicates - success. - - Examples:: - - click.launch('https://click.palletsprojects.com/') - click.launch('/my/downloaded/file', locate=True) - - .. versionadded:: 2.0 - - :param url: URL or filename of the thing to launch. - :param wait: Wait for the program to exit before returning. This - only works if the launched program blocks. In particular, - ``xdg-open`` on Linux does not block. - :param locate: if this is set to `True` then instead of launching the - application associated with the URL it will attempt to - launch a file manager with the file located. This - might have weird effects if the URL does not point to - the filesystem. - """ - from ._termui_impl import open_url - - return open_url(url, wait=wait, locate=locate) - - -# If this is provided, getchar() calls into this instead. This is used -# for unittesting purposes. -_getchar: t.Optional[t.Callable[[bool], str]] = None - - -def getchar(echo: bool = False) -> str: - """Fetches a single character from the terminal and returns it. This - will always return a unicode character and under certain rare - circumstances this might return more than one character. The - situations which more than one character is returned is when for - whatever reason multiple characters end up in the terminal buffer or - standard input was not actually a terminal. - - Note that this will always read from the terminal, even if something - is piped into the standard input. - - Note for Windows: in rare cases when typing non-ASCII characters, this - function might wait for a second character and then return both at once. - This is because certain Unicode characters look like special-key markers. - - .. versionadded:: 2.0 - - :param echo: if set to `True`, the character read will also show up on - the terminal. The default is to not show it. - """ - global _getchar - - if _getchar is None: - from ._termui_impl import getchar as f - - _getchar = f - - return _getchar(echo) - - -def raw_terminal() -> t.ContextManager[int]: - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info: t.Optional[str] = None, err: bool = False) -> None: - """This command stops execution and waits for the user to press any - key to continue. This is similar to the Windows batch "pause" - command. If the program is not run through a terminal, this command - will instead do nothing. - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param info: The message to print before pausing. Defaults to - ``"Press any key to continue..."``. - :param err: if set to message goes to ``stderr`` instead of - ``stdout``, the same as with echo. - """ - if not isatty(sys.stdin) or not isatty(sys.stdout): - return - - if info is None: - info = _("Press any key to continue...") - - try: - if info: - echo(info, nl=False, err=err) - try: - getchar() - except (KeyboardInterrupt, EOFError): - pass - finally: - if info: - echo(err=err) diff --git a/port/lib/python3.11/site-packages/click/testing.py b/port/lib/python3.11/site-packages/click/testing.py deleted file mode 100644 index 772b215..0000000 --- a/port/lib/python3.11/site-packages/click/testing.py +++ /dev/null @@ -1,483 +0,0 @@ -import contextlib -import io -import os -import shlex -import shutil -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import _compat -from . import formatting -from . import termui -from . import utils -from ._compat import _find_binary_reader - -if t.TYPE_CHECKING: - from .core import BaseCommand - - -class EchoingStdin: - def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: - self._input = input - self._output = output - self._paused = False - - def __getattr__(self, x: str) -> t.Any: - return getattr(self._input, x) - - def _echo(self, rv: bytes) -> bytes: - if not self._paused: - self._output.write(rv) - - return rv - - def read(self, n: int = -1) -> bytes: - return self._echo(self._input.read(n)) - - def read1(self, n: int = -1) -> bytes: - return self._echo(self._input.read1(n)) # type: ignore - - def readline(self, n: int = -1) -> bytes: - return self._echo(self._input.readline(n)) - - def readlines(self) -> t.List[bytes]: - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self) -> t.Iterator[bytes]: - return iter(self._echo(x) for x in self._input) - - def __repr__(self) -> str: - return repr(self._input) - - -@contextlib.contextmanager -def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: - if stream is None: - yield - else: - stream._paused = True - yield - stream._paused = False - - -class _NamedTextIOWrapper(io.TextIOWrapper): - def __init__( - self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any - ) -> None: - super().__init__(buffer, **kwargs) - self._name = name - self._mode = mode - - @property - def name(self) -> str: - return self._name - - @property - def mode(self) -> str: - return self._mode - - -def make_input_stream( - input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]], charset: str -) -> t.BinaryIO: - # Is already an input stream. - if hasattr(input, "read"): - rv = _find_binary_reader(t.cast(t.IO[t.Any], input)) - - if rv is not None: - return rv - - raise TypeError("Could not find binary reader for input stream.") - - if input is None: - input = b"" - elif isinstance(input, str): - input = input.encode(charset) - - return io.BytesIO(input) - - -class Result: - """Holds the captured result of an invoked CLI script.""" - - def __init__( - self, - runner: "CliRunner", - stdout_bytes: bytes, - stderr_bytes: t.Optional[bytes], - return_value: t.Any, - exit_code: int, - exception: t.Optional[BaseException], - exc_info: t.Optional[ - t.Tuple[t.Type[BaseException], BaseException, TracebackType] - ] = None, - ): - #: The runner that created the result - self.runner = runner - #: The standard output as bytes. - self.stdout_bytes = stdout_bytes - #: The standard error as bytes, or None if not available - self.stderr_bytes = stderr_bytes - #: The value returned from the invoked command. - #: - #: .. versionadded:: 8.0 - self.return_value = return_value - #: The exit code as integer. - self.exit_code = exit_code - #: The exception that happened if one did. - self.exception = exception - #: The traceback - self.exc_info = exc_info - - @property - def output(self) -> str: - """The (standard) output as unicode string.""" - return self.stdout - - @property - def stdout(self) -> str: - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self) -> str: - """The standard error as unicode string.""" - if self.stderr_bytes is None: - raise ValueError("stderr not separately captured") - return self.stderr_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - def __repr__(self) -> str: - exc_str = repr(self.exception) if self.exception else "okay" - return f"<{type(self).__name__} {exc_str}>" - - -class CliRunner: - """The CLI runner provides functionality to invoke a Click command line - script for unittesting purposes in a isolated environment. This only - works in single-threaded systems without any concurrency as it changes the - global interpreter state. - - :param charset: the character set for the input and output data. - :param env: a dictionary with environment variables for overriding. - :param echo_stdin: if this is set to `True`, then reading from stdin writes - to stdout. This is useful for showing examples in - some circumstances. Note that regular prompts - will automatically echo the input. - :param mix_stderr: if this is set to `False`, then stdout and stderr are - preserved as independent streams. This is useful for - Unix-philosophy apps that have predictable stdout and - noisy stderr, such that each may be measured - independently - """ - - def __init__( - self, - charset: str = "utf-8", - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - echo_stdin: bool = False, - mix_stderr: bool = True, - ) -> None: - self.charset = charset - self.env: t.Mapping[str, t.Optional[str]] = env or {} - self.echo_stdin = echo_stdin - self.mix_stderr = mix_stderr - - def get_default_prog_name(self, cli: "BaseCommand") -> str: - """Given a command object it will return the default program name - for it. The default is the `name` attribute or ``"root"`` if not - set. - """ - return cli.name or "root" - - def make_env( - self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None - ) -> t.Mapping[str, t.Optional[str]]: - """Returns the environment overrides for invoking a script.""" - rv = dict(self.env) - if overrides: - rv.update(overrides) - return rv - - @contextlib.contextmanager - def isolation( - self, - input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - color: bool = False, - ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: - """A context manager that sets up the isolation for invoking of a - command line tool. This sets up stdin with the given input data - and `os.environ` with the overrides from the given dictionary. - This also rebinds some internals in Click to be mocked (like the - prompt functionality). - - This is automatically done in the :meth:`invoke` method. - - :param input: the input stream to put into sys.stdin. - :param env: the environment overrides as dictionary. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - ``stderr`` is opened with ``errors="backslashreplace"`` - instead of the default ``"strict"``. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - """ - bytes_input = make_input_stream(input, self.charset) - echo_input = None - - old_stdin = sys.stdin - old_stdout = sys.stdout - old_stderr = sys.stderr - old_forced_width = formatting.FORCED_WIDTH - formatting.FORCED_WIDTH = 80 - - env = self.make_env(env) - - bytes_output = io.BytesIO() - - if self.echo_stdin: - bytes_input = echo_input = t.cast( - t.BinaryIO, EchoingStdin(bytes_input, bytes_output) - ) - - sys.stdin = text_input = _NamedTextIOWrapper( - bytes_input, encoding=self.charset, name="", mode="r" - ) - - if self.echo_stdin: - # Force unbuffered reads, otherwise TextIOWrapper reads a - # large chunk which is echoed early. - text_input._CHUNK_SIZE = 1 # type: ignore - - sys.stdout = _NamedTextIOWrapper( - bytes_output, encoding=self.charset, name="", mode="w" - ) - - bytes_error = None - if self.mix_stderr: - sys.stderr = sys.stdout - else: - bytes_error = io.BytesIO() - sys.stderr = _NamedTextIOWrapper( - bytes_error, - encoding=self.charset, - name="", - mode="w", - errors="backslashreplace", - ) - - @_pause_echo(echo_input) # type: ignore - def visible_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(prompt or "") - val = text_input.readline().rstrip("\r\n") - sys.stdout.write(f"{val}\n") - sys.stdout.flush() - return val - - @_pause_echo(echo_input) # type: ignore - def hidden_input(prompt: t.Optional[str] = None) -> str: - sys.stdout.write(f"{prompt or ''}\n") - sys.stdout.flush() - return text_input.readline().rstrip("\r\n") - - @_pause_echo(echo_input) # type: ignore - def _getchar(echo: bool) -> str: - char = sys.stdin.read(1) - - if echo: - sys.stdout.write(char) - - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi( - stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None - ) -> bool: - if color is None: - return not default_color - return not color - - old_visible_prompt_func = termui.visible_prompt_func - old_hidden_prompt_func = termui.hidden_prompt_func - old__getchar_func = termui._getchar - old_should_strip_ansi = utils.should_strip_ansi # type: ignore - old__compat_should_strip_ansi = _compat.should_strip_ansi - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - _compat.should_strip_ansi = should_strip_ansi - - old_env = {} - try: - for key, value in env.items(): - old_env[key] = os.environ.get(key) - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - yield (bytes_output, bytes_error) - finally: - for key, value in old_env.items(): - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - sys.stdout = old_stdout - sys.stderr = old_stderr - sys.stdin = old_stdin - termui.visible_prompt_func = old_visible_prompt_func - termui.hidden_prompt_func = old_hidden_prompt_func - termui._getchar = old__getchar_func - utils.should_strip_ansi = old_should_strip_ansi # type: ignore - _compat.should_strip_ansi = old__compat_should_strip_ansi - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli: "BaseCommand", - args: t.Optional[t.Union[str, t.Sequence[str]]] = None, - input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, - env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, - catch_exceptions: bool = True, - color: bool = False, - **extra: t.Any, - ) -> Result: - """Invokes a command in an isolated environment. The arguments are - forwarded directly to the command line script, the `extra` keyword - arguments are passed to the :meth:`~clickpkg.Command.main` function of - the command. - - This returns a :class:`Result` object. - - :param cli: the command to invoke - :param args: the arguments to invoke. It may be given as an iterable - or a string. When given as string it will be interpreted - as a Unix shell command. More details at - :func:`shlex.split`. - :param input: the input data for `sys.stdin`. - :param env: the environment overrides. - :param catch_exceptions: Whether to catch any other exceptions than - ``SystemExit``. - :param extra: the keyword arguments to pass to :meth:`main`. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionchanged:: 8.0 - The result object has the ``return_value`` attribute with - the value returned from the invoked command. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionchanged:: 3.0 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 3.0 - The result object has the ``exc_info`` attribute with the - traceback if available. - """ - exc_info = None - with self.isolation(input=input, env=env, color=color) as outstreams: - return_value = None - exception: t.Optional[BaseException] = None - exit_code = 0 - - if isinstance(args, str): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - return_value = cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) - - if e_code is None: - e_code = 0 - - if e_code != 0: - exception = e - - if not isinstance(e_code, int): - sys.stdout.write(str(e_code)) - sys.stdout.write("\n") - e_code = 1 - - exit_code = e_code - - except Exception as e: - if not catch_exceptions: - raise - exception = e - exit_code = 1 - exc_info = sys.exc_info() - finally: - sys.stdout.flush() - stdout = outstreams[0].getvalue() - if self.mix_stderr: - stderr = None - else: - stderr = outstreams[1].getvalue() # type: ignore - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - return_value=return_value, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, # type: ignore - ) - - @contextlib.contextmanager - def isolated_filesystem( - self, temp_dir: t.Optional[t.Union[str, "os.PathLike[str]"]] = None - ) -> t.Iterator[str]: - """A context manager that creates a temporary directory and - changes the current working directory to it. This isolates tests - that affect the contents of the CWD to prevent them from - interfering with each other. - - :param temp_dir: Create the temporary directory under this - directory. If given, the created directory is not removed - when exiting. - - .. versionchanged:: 8.0 - Added the ``temp_dir`` parameter. - """ - cwd = os.getcwd() - dt = tempfile.mkdtemp(dir=temp_dir) - os.chdir(dt) - - try: - yield dt - finally: - os.chdir(cwd) - - if temp_dir is None: - try: - shutil.rmtree(dt) - except OSError: - pass diff --git a/port/lib/python3.11/site-packages/click/types.py b/port/lib/python3.11/site-packages/click/types.py deleted file mode 100644 index a70fd58..0000000 --- a/port/lib/python3.11/site-packages/click/types.py +++ /dev/null @@ -1,1093 +0,0 @@ -import os -import stat -import sys -import typing as t -from datetime import datetime -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import _get_argv_encoding -from ._compat import open_stream -from .exceptions import BadParameter -from .utils import format_filename -from .utils import LazyFile -from .utils import safecall - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .core import Context - from .core import Parameter - from .shell_completion import CompletionItem - - -class ParamType: - """Represents the type of a parameter. Validates and converts values - from the command line or Python into the correct type. - - To implement a custom type, subclass and implement at least the - following: - - - The :attr:`name` class attribute must be set. - - Calling an instance of the type with ``None`` must return - ``None``. This is already implemented by default. - - :meth:`convert` must convert string values to the correct type. - - :meth:`convert` must accept values that are already the correct - type. - - It must be able to convert a value if the ``ctx`` and ``param`` - arguments are ``None``. This can occur when converting prompt - input. - """ - - is_composite: t.ClassVar[bool] = False - arity: t.ClassVar[int] = 1 - - #: the descriptive name of this type - name: str - - #: if a list of this type is expected and the value is pulled from a - #: string environment variable, this is what splits it up. `None` - #: means any whitespace. For all parameters the general rule is that - #: whitespace splits them up. The exception are paths and files which - #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on - #: Windows). - envvar_list_splitter: t.ClassVar[t.Optional[str]] = None - - def to_info_dict(self) -> t.Dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - # The class name without the "ParamType" suffix. - param_type = type(self).__name__.partition("ParamType")[0] - param_type = param_type.partition("ParameterType")[0] - - # Custom subclasses might not remember to set a name. - if hasattr(self, "name"): - name = self.name - else: - name = param_type - - return {"param_type": param_type, "name": name} - - def __call__( - self, - value: t.Any, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> t.Any: - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param: "Parameter") -> t.Optional[str]: - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param: "Parameter") -> t.Optional[str]: - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - """Convert the value to the correct type. This is not called if - the value is ``None`` (the missing value). - - This must accept string values from the command line, as well as - values that are already the correct type. It may also convert - other compatible types. - - The ``param`` and ``ctx`` arguments may be ``None`` in certain - situations, such as when converting prompt input. - - If the value cannot be converted, call :meth:`fail` with a - descriptive message. - - :param value: The value to convert. - :param param: The parameter that is using this type to convert - its value. May be ``None``. - :param ctx: The current context that arrived at this value. May - be ``None``. - """ - return value - - def split_envvar_value(self, rv: str) -> t.Sequence[str]: - """Given a value from an environment variable this splits it up - into small chunks depending on the defined envvar list splitter. - - If the splitter is set to `None`, which means that whitespace splits, - then leading and trailing whitespace is ignored. Otherwise, leading - and trailing splitters usually lead to empty items being included. - """ - return (rv or "").split(self.envvar_list_splitter) - - def fail( - self, - message: str, - param: t.Optional["Parameter"] = None, - ctx: t.Optional["Context"] = None, - ) -> "t.NoReturn": - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a list of - :class:`~click.shell_completion.CompletionItem` objects for the - incomplete value. Most types do not provide completions, but - some do, and this allows custom types to provide custom - completions as well. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - return [] - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self) -> int: # type: ignore - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: - self.name: str = func.__name__ - self.func = func - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["func"] = self.func - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self.func(value) - except ValueError: - try: - value = str(value) - except UnicodeError: - value = value.decode("utf-8", "replace") - - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - return value - - def __repr__(self) -> str: - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, bytes): - enc = _get_argv_encoding() - try: - value = value.decode(enc) - except UnicodeError: - fs_enc = sys.getfilesystemencoding() - if fs_enc != enc: - try: - value = value.decode(fs_enc) - except UnicodeError: - value = value.decode("utf-8", "replace") - else: - value = value.decode("utf-8", "replace") - return value - return str(value) - - def __repr__(self) -> str: - return "STRING" - - -class Choice(ParamType): - """The choice type allows a value to be checked against a fixed set - of supported values. All of these values have to be strings. - - You should only pass a list or tuple of choices. Other iterables - (like generators) may lead to surprising results. - - The resulting value will always be one of the originally passed choices - regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` - being specified. - - See :ref:`choice-opts` for an example. - - :param case_sensitive: Set to false to make choices case - insensitive. Defaults to true. - """ - - name = "choice" - - def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: - self.choices = choices - self.case_sensitive = case_sensitive - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["choices"] = self.choices - info_dict["case_sensitive"] = self.case_sensitive - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - choices_str = "|".join(self.choices) - - # Use curly braces to indicate a required argument. - if param.required and param.param_type_name == "argument": - return f"{{{choices_str}}}" - - # Use square braces to indicate an option or optional argument. - return f"[{choices_str}]" - - def get_missing_message(self, param: "Parameter") -> str: - return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - # Match through normalization and case sensitivity - # first do token_normalize_func, then lowercase - # preserve original `value` to produce an accurate message in - # `self.fail` - normed_value = value - normed_choices = {choice: choice for choice in self.choices} - - if ctx is not None and ctx.token_normalize_func is not None: - normed_value = ctx.token_normalize_func(value) - normed_choices = { - ctx.token_normalize_func(normed_choice): original - for normed_choice, original in normed_choices.items() - } - - if not self.case_sensitive: - normed_value = normed_value.casefold() - normed_choices = { - normed_choice.casefold(): original - for normed_choice, original in normed_choices.items() - } - - if normed_value in normed_choices: - return normed_choices[normed_value] - - choices_str = ", ".join(map(repr, self.choices)) - self.fail( - ngettext( - "{value!r} is not {choice}.", - "{value!r} is not one of {choices}.", - len(self.choices), - ).format(value=value, choice=choices_str, choices=choices_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return f"Choice({list(self.choices)})" - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Complete choices that start with the incomplete value. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - str_choices = map(str, self.choices) - - if self.case_sensitive: - matched = (c for c in str_choices if c.startswith(incomplete)) - else: - incomplete = incomplete.lower() - matched = (c for c in str_choices if c.lower().startswith(incomplete)) - - return [CompletionItem(c) for c in matched] - - -class DateTime(ParamType): - """The DateTime type converts date strings into `datetime` objects. - - The format strings which are checked are configurable, but default to some - common (non-timezone aware) ISO 8601 formats. - - When specifying *DateTime* formats, you should only pass a list or a tuple. - Other iterables, like generators, may lead to surprising results. - - The format strings are processed using ``datetime.strptime``, and this - consequently defines the format strings which are allowed. - - Parsing is tried using each format, in order, and the first format which - parses successfully is used. - - :param formats: A list or tuple of date format strings, in the order in - which they should be tried. Defaults to - ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, - ``'%Y-%m-%d %H:%M:%S'``. - """ - - name = "datetime" - - def __init__(self, formats: t.Optional[t.Sequence[str]] = None): - self.formats: t.Sequence[str] = formats or [ - "%Y-%m-%d", - "%Y-%m-%dT%H:%M:%S", - "%Y-%m-%d %H:%M:%S", - ] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["formats"] = self.formats - return info_dict - - def get_metavar(self, param: "Parameter") -> str: - return f"[{'|'.join(self.formats)}]" - - def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if isinstance(value, datetime): - return value - - for format in self.formats: - converted = self._try_to_convert_date(value, format) - - if converted is not None: - return converted - - formats_str = ", ".join(map(repr, self.formats)) - self.fail( - ngettext( - "{value!r} does not match the format {format}.", - "{value!r} does not match the formats {formats}.", - len(self.formats), - ).format(value=value, format=formats_str, formats=formats_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return "DateTime" - - -class _NumberParamTypeBase(ParamType): - _number_class: t.ClassVar[t.Type[t.Any]] - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - try: - return self._number_class(value) - except ValueError: - self.fail( - _("{value!r} is not a valid {number_type}.").format( - value=value, number_type=self.name - ), - param, - ctx, - ) - - -class _NumberRangeBase(_NumberParamTypeBase): - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - self.min = min - self.max = max - self.min_open = min_open - self.max_open = max_open - self.clamp = clamp - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - min=self.min, - max=self.max, - min_open=self.min_open, - max_open=self.max_open, - clamp=self.clamp, - ) - return info_dict - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import operator - - rv = super().convert(value, param, ctx) - lt_min: bool = self.min is not None and ( - operator.le if self.min_open else operator.lt - )(rv, self.min) - gt_max: bool = self.max is not None and ( - operator.ge if self.max_open else operator.gt - )(rv, self.max) - - if self.clamp: - if lt_min: - return self._clamp(self.min, 1, self.min_open) # type: ignore - - if gt_max: - return self._clamp(self.max, -1, self.max_open) # type: ignore - - if lt_min or gt_max: - self.fail( - _("{value} is not in the range {range}.").format( - value=rv, range=self._describe_range() - ), - param, - ctx, - ) - - return rv - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - """Find the valid value to clamp to bound in the given - direction. - - :param bound: The boundary value. - :param dir: 1 or -1 indicating the direction to move. - :param open: If true, the range does not include the bound. - """ - raise NotImplementedError - - def _describe_range(self) -> str: - """Describe the range for use in help text.""" - if self.min is None: - op = "<" if self.max_open else "<=" - return f"x{op}{self.max}" - - if self.max is None: - op = ">" if self.min_open else ">=" - return f"x{op}{self.min}" - - lop = "<" if self.min_open else "<=" - rop = "<" if self.max_open else "<=" - return f"{self.min}{lop}x{rop}{self.max}" - - def __repr__(self) -> str: - clamp = " clamped" if self.clamp else "" - return f"<{type(self).__name__} {self._describe_range()}{clamp}>" - - -class IntParamType(_NumberParamTypeBase): - name = "integer" - _number_class = int - - def __repr__(self) -> str: - return "INT" - - -class IntRange(_NumberRangeBase, IntParamType): - """Restrict an :data:`click.INT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "integer range" - - def _clamp( # type: ignore - self, bound: int, dir: "te.Literal[1, -1]", open: bool - ) -> int: - if not open: - return bound - - return bound + dir - - -class FloatParamType(_NumberParamTypeBase): - name = "float" - _number_class = float - - def __repr__(self) -> str: - return "FLOAT" - - -class FloatRange(_NumberRangeBase, FloatParamType): - """Restrict a :data:`click.FLOAT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. This is not supported if either - boundary is marked ``open``. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "float range" - - def __init__( - self, - min: t.Optional[float] = None, - max: t.Optional[float] = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - super().__init__( - min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp - ) - - if (min_open or max_open) and clamp: - raise TypeError("Clamping is not supported for open bounds.") - - def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: - if not open: - return bound - - # Could use Python 3.9's math.nextafter here, but clamping an - # open float range doesn't seem to be particularly useful. It's - # left up to the user to write a callback to do it if needed. - raise RuntimeError("Clamping is not supported for open bounds.") - - -class BoolParamType(ParamType): - name = "boolean" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - if value in {False, True}: - return bool(value) - - norm = value.strip().lower() - - if norm in {"1", "true", "t", "yes", "y", "on"}: - return True - - if norm in {"0", "false", "f", "no", "n", "off"}: - return False - - self.fail( - _("{value!r} is not a valid boolean.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - import uuid - - if isinstance(value, uuid.UUID): - return value - - value = value.strip() - - try: - return uuid.UUID(value) - except ValueError: - self.fail( - _("{value!r} is not a valid UUID.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "UUID" - - -class File(ParamType): - """Declares a parameter to be a file for reading or writing. The file - is automatically closed once the context tears down (after the command - finished working). - - Files can be opened for reading or writing. The special value ``-`` - indicates stdin or stdout depending on the mode. - - By default, the file is opened for reading text data, but it can also be - opened in binary mode or for writing. The encoding parameter can be used - to force a specific encoding. - - The `lazy` flag controls if the file should be opened immediately or upon - first IO. The default is to be non-lazy for standard input and output - streams as well as files opened for reading, `lazy` otherwise. When opening a - file lazily for reading, it is still opened temporarily for validation, but - will not be held open until first IO. lazy is mainly useful when opening - for writing to avoid creating the file until it is needed. - - Files can also be opened atomically in which case all writes go into a - separate file in the same folder and upon completion the file will - be moved over to the original location. This is useful if a file - regularly read by other users is modified. - - See :ref:`file-args` for more information. - - .. versionchanged:: 2.0 - Added the ``atomic`` parameter. - """ - - name = "filename" - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: t.Optional[bool] = None, - atomic: bool = False, - ) -> None: - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update(mode=self.mode, encoding=self.encoding) - return info_dict - - def resolve_lazy_flag(self, value: "t.Union[str, os.PathLike[str]]") -> bool: - if self.lazy is not None: - return self.lazy - if os.fspath(value) == "-": - return False - elif "w" in self.mode: - return True - return False - - def convert( - self, - value: t.Union[str, "os.PathLike[str]", t.IO[t.Any]], - param: t.Optional["Parameter"], - ctx: t.Optional["Context"], - ) -> t.IO[t.Any]: - if _is_file_like(value): - return value - - value = t.cast("t.Union[str, os.PathLike[str]]", value) - - try: - lazy = self.resolve_lazy_flag(value) - - if lazy: - lf = LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - if ctx is not None: - ctx.call_on_close(lf.close_intelligently) - - return t.cast(t.IO[t.Any], lf) - - f, should_close = open_stream( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - # If a context is provided, we automatically close the file - # at the end of the context execution (or flush out). If a - # context does not exist, it's the caller's responsibility to - # properly close the file. This for instance happens when the - # type is used with prompts. - if ctx is not None: - if should_close: - ctx.call_on_close(safecall(f.close)) - else: - ctx.call_on_close(safecall(f.flush)) - - return f - except OSError as e: - self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide file path completions. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - return [CompletionItem(incomplete, type="file")] - - -def _is_file_like(value: t.Any) -> "te.TypeGuard[t.IO[t.Any]]": - return hasattr(value, "read") or hasattr(value, "write") - - -class Path(ParamType): - """The ``Path`` type is similar to the :class:`File` type, but - returns the filename instead of an open file. Various checks can be - enabled to validate the type of file and permissions. - - :param exists: The file or directory needs to exist for the value to - be valid. If this is not set to ``True``, and the file does not - exist, then all further checks are silently skipped. - :param file_okay: Allow a file as a value. - :param dir_okay: Allow a directory as a value. - :param readable: if true, a readable check is performed. - :param writable: if true, a writable check is performed. - :param executable: if true, an executable check is performed. - :param resolve_path: Make the value absolute and resolve any - symlinks. A ``~`` is not expanded, as this is supposed to be - done by the shell only. - :param allow_dash: Allow a single dash as a value, which indicates - a standard stream (but does not open it). Use - :func:`~click.open_file` to handle opening this value. - :param path_type: Convert the incoming path value to this type. If - ``None``, keep Python's default, which is ``str``. Useful to - convert to :class:`pathlib.Path`. - - .. versionchanged:: 8.1 - Added the ``executable`` parameter. - - .. versionchanged:: 8.0 - Allow passing ``path_type=pathlib.Path``. - - .. versionchanged:: 6.0 - Added the ``allow_dash`` parameter. - """ - - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - exists: bool = False, - file_okay: bool = True, - dir_okay: bool = True, - writable: bool = False, - readable: bool = True, - resolve_path: bool = False, - allow_dash: bool = False, - path_type: t.Optional[t.Type[t.Any]] = None, - executable: bool = False, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.readable = readable - self.writable = writable - self.executable = executable - self.resolve_path = resolve_path - self.allow_dash = allow_dash - self.type = path_type - - if self.file_okay and not self.dir_okay: - self.name: str = _("file") - elif self.dir_okay and not self.file_okay: - self.name = _("directory") - else: - self.name = _("path") - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - exists=self.exists, - file_okay=self.file_okay, - dir_okay=self.dir_okay, - writable=self.writable, - readable=self.readable, - allow_dash=self.allow_dash, - ) - return info_dict - - def coerce_path_result( - self, value: "t.Union[str, os.PathLike[str]]" - ) -> "t.Union[str, bytes, os.PathLike[str]]": - if self.type is not None and not isinstance(value, self.type): - if self.type is str: - return os.fsdecode(value) - elif self.type is bytes: - return os.fsencode(value) - else: - return t.cast("os.PathLike[str]", self.type(value)) - - return value - - def convert( - self, - value: "t.Union[str, os.PathLike[str]]", - param: t.Optional["Parameter"], - ctx: t.Optional["Context"], - ) -> "t.Union[str, bytes, os.PathLike[str]]": - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - # os.path.realpath doesn't resolve symlinks on Windows - # until Python 3.8. Use pathlib for now. - import pathlib - - rv = os.fsdecode(pathlib.Path(rv).resolve()) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - _("{name} {filename!r} does not exist.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - _("{name} {filename!r} is a file.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - _("{name} {filename!r} is a directory.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.readable and not os.access(rv, os.R_OK): - self.fail( - _("{name} {filename!r} is not readable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.writable and not os.access(rv, os.W_OK): - self.fail( - _("{name} {filename!r} is not writable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.executable and not os.access(value, os.X_OK): - self.fail( - _("{name} {filename!r} is not executable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - def shell_complete( - self, ctx: "Context", param: "Parameter", incomplete: str - ) -> t.List["CompletionItem"]: - """Return a special completion marker that tells the completion - system to use the shell to provide path completions for only - directories or any paths. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - type = "dir" if self.dir_okay and not self.file_okay else "file" - return [CompletionItem(incomplete, type=type)] - - -class Tuple(CompositeParamType): - """The default behavior of Click is to apply a type on a value directly. - This works well in most cases, except for when `nargs` is set to a fixed - count and different types should be used for different items. In this - case the :class:`Tuple` type can be used. This type can only be used - if `nargs` is set to a fixed number. - - For more information see :ref:`tuple-type`. - - This can be selected by using a Python tuple literal as a type. - - :param types: a list of types that should be used for the tuple items. - """ - - def __init__(self, types: t.Sequence[t.Union[t.Type[t.Any], ParamType]]) -> None: - self.types: t.Sequence[ParamType] = [convert_type(ty) for ty in types] - - def to_info_dict(self) -> t.Dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["types"] = [t.to_info_dict() for t in self.types] - return info_dict - - @property - def name(self) -> str: # type: ignore - return f"<{' '.join(ty.name for ty in self.types)}>" - - @property - def arity(self) -> int: # type: ignore - return len(self.types) - - def convert( - self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] - ) -> t.Any: - len_type = len(self.types) - len_value = len(value) - - if len_value != len_type: - self.fail( - ngettext( - "{len_type} values are required, but {len_value} was given.", - "{len_type} values are required, but {len_value} were given.", - len_value, - ).format(len_type=len_type, len_value=len_value), - param=param, - ctx=ctx, - ) - - return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) - - -def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: - """Find the most appropriate :class:`ParamType` for the given Python - type. If the type isn't provided, it can be inferred from a default - value. - """ - guessed_type = False - - if ty is None and default is not None: - if isinstance(default, (tuple, list)): - # If the default is empty, ty will remain None and will - # return STRING. - if default: - item = default[0] - - # A tuple of tuples needs to detect the inner types. - # Can't call convert recursively because that would - # incorrectly unwind the tuple to a single type. - if isinstance(item, (tuple, list)): - ty = tuple(map(type, item)) - else: - ty = type(item) - else: - ty = type(default) - - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - - if isinstance(ty, ParamType): - return ty - - if ty is str or ty is None: - return STRING - - if ty is int: - return INT - - if ty is float: - return FLOAT - - if ty is bool: - return BOOL - - if guessed_type: - return STRING - - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - f"Attempted to use an uninstantiated parameter type ({ty})." - ) - except TypeError: - # ty is an instance (correct), so issubclass fails. - pass - - return FuncParamType(ty) - - -#: A dummy parameter type that just does nothing. From a user's -#: perspective this appears to just be the same as `STRING` but -#: internally no string conversion takes place if the input was bytes. -#: This is usually useful when working with file paths as they can -#: appear in bytes and unicode. -#: -#: For path related uses the :class:`Path` type is a better choice but -#: there are situations where an unprocessed type is useful which is why -#: it is is provided. -#: -#: .. versionadded:: 4.0 -UNPROCESSED = UnprocessedParamType() - -#: A unicode string parameter type which is the implicit default. This -#: can also be selected by using ``str`` as type. -STRING = StringParamType() - -#: An integer parameter. This can also be selected by using ``int`` as -#: type. -INT = IntParamType() - -#: A floating point value parameter. This can also be selected by using -#: ``float`` as type. -FLOAT = FloatParamType() - -#: A boolean parameter. This is the default for boolean flags. This can -#: also be selected by using ``bool`` as a type. -BOOL = BoolParamType() - -#: A UUID parameter. -UUID = UUIDParameterType() diff --git a/port/lib/python3.11/site-packages/click/utils.py b/port/lib/python3.11/site-packages/click/utils.py deleted file mode 100644 index 836c6f2..0000000 --- a/port/lib/python3.11/site-packages/click/utils.py +++ /dev/null @@ -1,624 +0,0 @@ -import os -import re -import sys -import typing as t -from functools import update_wrapper -from types import ModuleType -from types import TracebackType - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import _find_binary_writer -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import open_stream -from ._compat import should_strip_ansi -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import WIN -from .globals import resolve_color_default - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") - - -def _posixify(name: str) -> str: - return "-".join(name.split()).lower() - - -def safecall(func: "t.Callable[P, R]") -> "t.Callable[P, t.Optional[R]]": - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args: "P.args", **kwargs: "P.kwargs") -> t.Optional[R]: - try: - return func(*args, **kwargs) - except Exception: - pass - return None - - return update_wrapper(wrapper, func) - - -def make_str(value: t.Any) -> str: - """Converts a value into a valid string.""" - if isinstance(value, bytes): - try: - return value.decode(sys.getfilesystemencoding()) - except UnicodeError: - return value.decode("utf-8", "replace") - return str(value) - - -def make_default_short_help(help: str, max_length: int = 45) -> str: - """Returns a condensed version of help string.""" - # Consider only the first paragraph. - paragraph_end = help.find("\n\n") - - if paragraph_end != -1: - help = help[:paragraph_end] - - # Collapse newlines, tabs, and spaces. - words = help.split() - - if not words: - return "" - - # The first paragraph started with a "no rewrap" marker, ignore it. - if words[0] == "\b": - words = words[1:] - - total_length = 0 - last_index = len(words) - 1 - - for i, word in enumerate(words): - total_length += len(word) + (i > 0) - - if total_length > max_length: # too long, truncate - break - - if word[-1] == ".": # sentence end, truncate without "..." - return " ".join(words[: i + 1]) - - if total_length == max_length and i != last_index: - break # not at sentence end, truncate with "..." - else: - return " ".join(words) # no truncation needed - - # Account for the length of the suffix. - total_length += len("...") - - # remove words until the length is short enough - while i > 0: - total_length -= len(words[i]) + (i > 0) - - if total_length <= max_length: - break - - i -= 1 - - return " ".join(words[:i]) + "..." - - -class LazyFile: - """A lazy file works like a regular file but it does not fully open - the file but it does perform some basic checks early to see if the - filename parameter does make sense. This is useful for safely opening - files for writing. - """ - - def __init__( - self, - filename: t.Union[str, "os.PathLike[str]"], - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - atomic: bool = False, - ): - self.name: str = os.fspath(filename) - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - self._f: t.Optional[t.IO[t.Any]] - self.should_close: bool - - if self.name == "-": - self._f, self.should_close = open_stream(filename, mode, encoding, errors) - else: - if "r" in mode: - # Open and close the file in case we're opening it for - # reading so that we can catch at least some errors in - # some cases early. - open(filename, mode).close() - self._f = None - self.should_close = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.open(), name) - - def __repr__(self) -> str: - if self._f is not None: - return repr(self._f) - return f"" - - def open(self) -> t.IO[t.Any]: - """Opens the file if it's not yet open. This call might fail with - a :exc:`FileError`. Not handling this error will produce an error - that Click shows. - """ - if self._f is not None: - return self._f - try: - rv, self.should_close = open_stream( - self.name, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - except OSError as e: - from .exceptions import FileError - - raise FileError(self.name, hint=e.strerror) from e - self._f = rv - return rv - - def close(self) -> None: - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self) -> None: - """This function only closes the file if it was opened by the lazy - file wrapper. For instance this will never close stdin. - """ - if self.should_close: - self.close() - - def __enter__(self) -> "LazyFile": - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - self.close_intelligently() - - def __iter__(self) -> t.Iterator[t.AnyStr]: - self.open() - return iter(self._f) # type: ignore - - -class KeepOpenFile: - def __init__(self, file: t.IO[t.Any]) -> None: - self._file: t.IO[t.Any] = file - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._file, name) - - def __enter__(self) -> "KeepOpenFile": - return self - - def __exit__( - self, - exc_type: t.Optional[t.Type[BaseException]], - exc_value: t.Optional[BaseException], - tb: t.Optional[TracebackType], - ) -> None: - pass - - def __repr__(self) -> str: - return repr(self._file) - - def __iter__(self) -> t.Iterator[t.AnyStr]: - return iter(self._file) - - -def echo( - message: t.Optional[t.Any] = None, - file: t.Optional[t.IO[t.Any]] = None, - nl: bool = True, - err: bool = False, - color: t.Optional[bool] = None, -) -> None: - """Print a message and newline to stdout or a file. This should be - used instead of :func:`print` because it provides better support - for different data, files, and environments. - - Compared to :func:`print`, this does the following: - - - Ensures that the output encoding is not misconfigured on Linux. - - Supports Unicode in the Windows console. - - Supports writing to binary outputs, and supports writing bytes - to text outputs. - - Supports colors and styles on Windows. - - Removes ANSI color and style codes if the output does not look - like an interactive terminal. - - Always flushes the output. - - :param message: The string or bytes to output. Other objects are - converted to strings. - :param file: The file to write to. Defaults to ``stdout``. - :param err: Write to ``stderr`` instead of ``stdout``. - :param nl: Print a newline after the message. Enabled by default. - :param color: Force showing or hiding colors and other styles. By - default Click will remove color if the output does not look like - an interactive terminal. - - .. versionchanged:: 6.0 - Support Unicode output on the Windows console. Click does not - modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` - will still not support Unicode. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionadded:: 3.0 - Added the ``err`` parameter. - - .. versionchanged:: 2.0 - Support colors on Windows if colorama is installed. - """ - if file is None: - if err: - file = _default_text_stderr() - else: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - return - - # Convert non bytes/text into the native string type. - if message is not None and not isinstance(message, (str, bytes, bytearray)): - out: t.Optional[t.Union[str, bytes]] = str(message) - else: - out = message - - if nl: - out = out or "" - if isinstance(out, str): - out += "\n" - else: - out += b"\n" - - if not out: - file.flush() - return - - # If there is a message and the value looks like bytes, we manually - # need to find the binary stream and write the message in there. - # This is done separately so that most stream types will work as you - # would expect. Eg: you can write to StringIO for other cases. - if isinstance(out, (bytes, bytearray)): - binary_file = _find_binary_writer(file) - - if binary_file is not None: - file.flush() - binary_file.write(out) - binary_file.flush() - return - - # ANSI style code support. For no message or bytes, nothing happens. - # When outputting to a file instead of a terminal, strip codes. - else: - color = resolve_color_default(color) - - if should_strip_ansi(file, color): - out = strip_ansi(out) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file, color) # type: ignore - elif not color: - out = strip_ansi(out) - - file.write(out) # type: ignore - file.flush() - - -def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: - """Returns a system stream for byte processing. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - """ - opener = binary_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener() - - -def get_text_stream( - name: "te.Literal['stdin', 'stdout', 'stderr']", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", -) -> t.TextIO: - """Returns a system stream for text processing. This usually returns - a wrapped stream around a binary stream returned from - :func:`get_binary_stream` but it also can take shortcuts for already - correctly configured streams. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - :param encoding: overrides the detected default encoding. - :param errors: overrides the default error mode. - """ - opener = text_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener(encoding, errors) - - -def open_file( - filename: t.Union[str, "os.PathLike[str]"], - mode: str = "r", - encoding: t.Optional[str] = None, - errors: t.Optional[str] = "strict", - lazy: bool = False, - atomic: bool = False, -) -> t.IO[t.Any]: - """Open a file, with extra behavior to handle ``'-'`` to indicate - a standard stream, lazy open on write, and atomic write. Similar to - the behavior of the :class:`~click.File` param type. - - If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is - wrapped so that using it in a context manager will not close it. - This makes it possible to use the function without accidentally - closing a standard stream: - - .. code-block:: python - - with open_file(filename) as f: - ... - - :param filename: The name or Path of the file to open, or ``'-'`` for - ``stdin``/``stdout``. - :param mode: The mode in which to open the file. - :param encoding: The encoding to decode or encode a file opened in - text mode. - :param errors: The error handling mode. - :param lazy: Wait to open the file until it is accessed. For read - mode, the file is temporarily opened to raise access errors - early, then closed until it is read again. - :param atomic: Write to a temporary file and replace the given file - on close. - - .. versionadded:: 3.0 - """ - if lazy: - return t.cast( - t.IO[t.Any], LazyFile(filename, mode, encoding, errors, atomic=atomic) - ) - - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - - if not should_close: - f = t.cast(t.IO[t.Any], KeepOpenFile(f)) - - return f - - -def format_filename( - filename: "t.Union[str, bytes, os.PathLike[str], os.PathLike[bytes]]", - shorten: bool = False, -) -> str: - """Format a filename as a string for display. Ensures the filename can be - displayed by replacing any invalid bytes or surrogate escapes in the name - with the replacement character ``�``. - - Invalid bytes or surrogate escapes will raise an error when written to a - stream with ``errors="strict"``. This will typically happen with ``stdout`` - when the locale is something like ``en_GB.UTF-8``. - - Many scenarios *are* safe to write surrogates though, due to PEP 538 and - PEP 540, including: - - - Writing to ``stderr``, which uses ``errors="backslashreplace"``. - - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens - stdout and stderr with ``errors="surrogateescape"``. - - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. - - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. - Python opens stdout and stderr with ``errors="surrogateescape"``. - - :param filename: formats a filename for UI display. This will also convert - the filename into unicode without failing. - :param shorten: this optionally shortens the filename to strip of the - path that leads up to it. - """ - if shorten: - filename = os.path.basename(filename) - else: - filename = os.fspath(filename) - - if isinstance(filename, bytes): - filename = filename.decode(sys.getfilesystemencoding(), "replace") - else: - filename = filename.encode("utf-8", "surrogateescape").decode( - "utf-8", "replace" - ) - - return filename - - -def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: - r"""Returns the config folder for the application. The default behavior - is to return whatever is most appropriate for the operating system. - - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: - - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Windows (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Windows (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. - :param roaming: controls if the folder should be roaming or not on Windows. - Has no effect otherwise. - :param force_posix: if this is set to `True` then on any POSIX system the - folder will be stored in the home folder with a leading - dot instead of the XDG config home or darwin's - application support folder. - """ - if WIN: - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) - if force_posix: - return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name - ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), - ) - - -class PacifyFlushWrapper: - """This wrapper is used to catch and suppress BrokenPipeErrors resulting - from ``.flush()`` being called on broken pipe during the shutdown/final-GC - of the Python interpreter. Notably ``.flush()`` is always called on - ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any - other cleanup code, and the case where the underlying file is not a broken - pipe, all calls and attributes are proxied. - """ - - def __init__(self, wrapped: t.IO[t.Any]) -> None: - self.wrapped = wrapped - - def flush(self) -> None: - try: - self.wrapped.flush() - except OSError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr: str) -> t.Any: - return getattr(self.wrapped, attr) - - -def _detect_program_name( - path: t.Optional[str] = None, _main: t.Optional[ModuleType] = None -) -> str: - """Determine the command used to run the program, for use in help - text. If a file or entry point was executed, the file name is - returned. If ``python -m`` was used to execute a module or package, - ``python -m name`` is returned. - - This doesn't try to be too precise, the goal is to give a concise - name for help text. Files are only shown as their name without the - path. ``python`` is only shown for modules, and the full path to - ``sys.executable`` is not shown. - - :param path: The Python file being executed. Python puts this in - ``sys.argv[0]``, which is used by default. - :param _main: The ``__main__`` module. This should only be passed - during internal testing. - - .. versionadded:: 8.0 - Based on command args detection in the Werkzeug reloader. - - :meta private: - """ - if _main is None: - _main = sys.modules["__main__"] - - if not path: - path = sys.argv[0] - - # The value of __package__ indicates how Python was called. It may - # not exist if a setuptools script is installed as an egg. It may be - # set incorrectly for entry points created with pip on Windows. - # It is set to "" inside a Shiv or PEX zipapp. - if getattr(_main, "__package__", None) in {None, ""} or ( - os.name == "nt" - and _main.__package__ == "" - and not os.path.exists(path) - and os.path.exists(f"{path}.exe") - ): - # Executed a file, like "python app.py". - return os.path.basename(path) - - # Executed a module, like "python -m example". - # Rewritten by Python from "-m script" to "/path/to/script.py". - # Need to look at main module to determine how it was executed. - py_module = t.cast(str, _main.__package__) - name = os.path.splitext(os.path.basename(path))[0] - - # A submodule like "example.cli". - if name != "__main__": - py_module = f"{py_module}.{name}" - - return f"python -m {py_module.lstrip('.')}" - - -def _expand_args( - args: t.Iterable[str], - *, - user: bool = True, - env: bool = True, - glob_recursive: bool = True, -) -> t.List[str]: - """Simulate Unix shell expansion with Python functions. - - See :func:`glob.glob`, :func:`os.path.expanduser`, and - :func:`os.path.expandvars`. - - This is intended for use on Windows, where the shell does not do any - expansion. It may not exactly match what a Unix shell would do. - - :param args: List of command line arguments to expand. - :param user: Expand user home directory. - :param env: Expand environment variables. - :param glob_recursive: ``**`` matches directories recursively. - - .. versionchanged:: 8.1 - Invalid glob patterns are treated as empty expansions rather - than raising an error. - - .. versionadded:: 8.0 - - :meta private: - """ - from glob import glob - - out = [] - - for arg in args: - if user: - arg = os.path.expanduser(arg) - - if env: - arg = os.path.expandvars(arg) - - try: - matches = glob(arg, recursive=glob_recursive) - except re.error: - matches = [] - - if not matches: - out.append(arg) - else: - out.extend(matches) - - return out diff --git a/port/lib/python3.11/site-packages/distutils-precedence.pth b/port/lib/python3.11/site-packages/distutils-precedence.pth deleted file mode 100644 index 7f009fe..0000000 --- a/port/lib/python3.11/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/port/lib/python3.11/site-packages/dotenv/__init__.py b/port/lib/python3.11/site-packages/dotenv/__init__.py deleted file mode 100644 index 7f4c631..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/dotenv/__main__.py b/port/lib/python3.11/site-packages/dotenv/__main__.py deleted file mode 100644 index 3977f55..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/dotenv/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/dotenv/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5ae41d28231194636195b0159cf3c74433c87c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2023 zcmb_d&1)M+6rcTGX(ic>71yyHd$FZZx!6iDr8&5Tl7gX7wKUB|m-Sk+k~iKDWp-uP zVGTa`P>jK%ml#68^pG~Br~V~U5p-E77;?&O!8b#pZ&sF5+i_2wo&D|mn)haYGaCJp z&888wgQdS483Ca;R2j6)nQ-zu2+t5kn6Z$}R2iGCvJAp3<}A+UtGq2#1zW6&wp5jD zxhmVKY6|?k!C(Q4bskH*d^Mdyg9i^`*w3fR%Kb%`HO+KPU(*(vTm8&5 zy+pHr46uVjzTCOkLw>x&j~{;8*QLj$JQ)jwqe0AtFJ=S&IeNifCNMz%F@_7!d&e+DzphTeT&cj4 zuda>0Iv3n>4A%WF`NEEI;}!` zgA3kbtx3{};u_qThaxs(?>Msub!QuDqpdEDOLQgJqp6ba{9eFBLaxoH9b75xWpt4svTkHJGj4hzrEa5CVR@{pUTW1%1l=& z^prw}FOVCs!jhb6WEwuTV0NWHV0XCELX<%lMq!foOX2y2OjFZ`}?-n3#^038ok$fG~Zdy|_Og zb08mQ^6iKFU&jJTj`?q6>YBB=fgZe>>op$ B)AIlT diff --git a/port/lib/python3.11/site-packages/dotenv/__pycache__/__main__.cpython-311.pyc b/port/lib/python3.11/site-packages/dotenv/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 1d14af3f64436b2948fe52fbb2ff5450bd090db2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 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 W!0|};6n?xuqx6oF^p1cC;r{@RdzzmB diff --git a/port/lib/python3.11/site-packages/dotenv/__pycache__/variables.cpython-311.pyc b/port/lib/python3.11/site-packages/dotenv/__pycache__/variables.cpython-311.pyc deleted file mode 100644 index 418ab782432a74780d53da761c19ab66e1594f4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5521 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 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) - - os.execvpe(command[0], args=command, env=cmd_env) diff --git a/port/lib/python3.11/site-packages/dotenv/ipython.py b/port/lib/python3.11/site-packages/dotenv/ipython.py deleted file mode 100644 index 7df727c..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/dotenv/main.py b/port/lib/python3.11/site-packages/dotenv/main.py deleted file mode 100644 index 1848d60..0000000 --- a/port/lib/python3.11/site-packages/dotenv/main.py +++ /dev/null @@ -1,398 +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""" - 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/port/lib/python3.11/site-packages/dotenv/parser.py b/port/lib/python3.11/site-packages/dotenv/parser.py deleted file mode 100644 index 735f14a..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/dotenv/py.typed b/port/lib/python3.11/site-packages/dotenv/py.typed deleted file mode 100644 index 7632ecf..0000000 --- a/port/lib/python3.11/site-packages/dotenv/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561 diff --git a/port/lib/python3.11/site-packages/dotenv/variables.py b/port/lib/python3.11/site-packages/dotenv/variables.py deleted file mode 100644 index 667f2f2..0000000 --- a/port/lib/python3.11/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[^\}:]*) - (?::- - (?P[^\}]*) - )? - \} - """, - 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/port/lib/python3.11/site-packages/dotenv/version.py b/port/lib/python3.11/site-packages/dotenv/version.py deleted file mode 100644 index 6849410..0000000 --- a/port/lib/python3.11/site-packages/dotenv/version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "1.1.0" diff --git a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/INSTALLER b/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/LICENSE.txt b/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/LICENSE.txt deleted file mode 100644 index 9d227a0..0000000 --- a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/METADATA b/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/METADATA deleted file mode 100644 index c49ceb9..0000000 --- a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/METADATA +++ /dev/null @@ -1,81 +0,0 @@ -Metadata-Version: 2.3 -Name: Flask -Version: 3.1.0 -Summary: A simple framework for building complex web applications. -Maintainer-email: Pallets -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Flask -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Typing :: Typed -Requires-Dist: Werkzeug>=3.1 -Requires-Dist: Jinja2>=3.1.2 -Requires-Dist: itsdangerous>=2.2 -Requires-Dist: click>=8.1.3 -Requires-Dist: blinker>=1.9 -Requires-Dist: importlib-metadata>=3.6; python_version < '3.10' -Requires-Dist: asgiref>=3.2 ; extra == "async" -Requires-Dist: python-dotenv ; extra == "dotenv" -Project-URL: Changes, https://flask.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://flask.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/flask/ -Provides-Extra: async -Provides-Extra: dotenv - -# Flask - -Flask is a lightweight [WSGI][] web application framework. It is designed -to make getting started quick and easy, with the ability to scale up to -complex applications. It began as a simple wrapper around [Werkzeug][] -and [Jinja][], and has become one of the most popular Python web -application frameworks. - -Flask offers suggestions, but doesn't enforce any dependencies or -project layout. It is up to the developer to choose the tools and -libraries they want to use. There are many extensions provided by the -community that make adding new functionality easy. - -[WSGI]: https://wsgi.readthedocs.io/ -[Werkzeug]: https://werkzeug.palletsprojects.com/ -[Jinja]: https://jinja.palletsprojects.com/ - - -## A Simple Example - -```python -# save this as app.py -from flask import Flask - -app = Flask(__name__) - -@app.route("/") -def hello(): - return "Hello, World!" -``` - -``` -$ flask run - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) -``` - - -## Donate - -The Pallets organization develops and supports Flask and the libraries -it uses. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - diff --git a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/RECORD b/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/RECORD deleted file mode 100644 index 4175fde..0000000 --- a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/RECORD +++ /dev/null @@ -1,58 +0,0 @@ -../../../bin/flask,sha256=CLTwny8c06dA5_f2S8jdFv7HRBpSi4CeWnYVI66gG5M,227 -flask-3.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask-3.1.0.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask-3.1.0.dist-info/METADATA,sha256=Wvf66xwUclGRu89cNcvErpaMf1rMgcxeqIkTc4EmD90,2718 -flask-3.1.0.dist-info/RECORD,, -flask-3.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask-3.1.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 -flask-3.1.0.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 -flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 -flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -flask/__pycache__/__init__.cpython-311.pyc,, -flask/__pycache__/__main__.cpython-311.pyc,, -flask/__pycache__/app.cpython-311.pyc,, -flask/__pycache__/blueprints.cpython-311.pyc,, -flask/__pycache__/cli.cpython-311.pyc,, -flask/__pycache__/config.cpython-311.pyc,, -flask/__pycache__/ctx.cpython-311.pyc,, -flask/__pycache__/debughelpers.cpython-311.pyc,, -flask/__pycache__/globals.cpython-311.pyc,, -flask/__pycache__/helpers.cpython-311.pyc,, -flask/__pycache__/logging.cpython-311.pyc,, -flask/__pycache__/sessions.cpython-311.pyc,, -flask/__pycache__/signals.cpython-311.pyc,, -flask/__pycache__/templating.cpython-311.pyc,, -flask/__pycache__/testing.cpython-311.pyc,, -flask/__pycache__/typing.cpython-311.pyc,, -flask/__pycache__/views.cpython-311.pyc,, -flask/__pycache__/wrappers.cpython-311.pyc,, -flask/app.py,sha256=GE7QOE_N9THDjuzKx0gUI9aF4hLh0xwBDa7hLVsjy-o,61725 -flask/blueprints.py,sha256=p5QE2lY18GItbdr_RKRpZ8Do17g0PvQGIgZkSUDhX2k,4541 -flask/cli.py,sha256=XdmkBD74SnT0jrt2gqyHrE9oXGdWlcdTrJQR-i5aApY,37093 -flask/config.py,sha256=PiqF0DPam6HW0FH4CH1hpXTBe30NSzjPEOwrz1b6kt0,13219 -flask/ctx.py,sha256=4atDhJJ_cpV1VMq4qsfU4E_61M1oN93jlS2H9gjrl58,15120 -flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080 -flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 -flask/helpers.py,sha256=7njmzkFJvrPSQudsgONsgQzaGrGppeBINevKgWescPk,23521 -flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602 -flask/json/__pycache__/__init__.cpython-311.pyc,, -flask/json/__pycache__/provider.cpython-311.pyc,, -flask/json/__pycache__/tag.cpython-311.pyc,, -flask/json/provider.py,sha256=5imEzY5HjV2HoUVrQbJLqXCzMNpZXfD0Y1XqdLV2XBA,7672 -flask/json/tag.py,sha256=DhaNwuIOhdt2R74oOC9Y4Z8ZprxFYiRb5dUP5byyINw,9281 -flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377 -flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 -flask/sansio/__pycache__/app.cpython-311.pyc,, -flask/sansio/__pycache__/blueprints.cpython-311.pyc,, -flask/sansio/__pycache__/scaffold.cpython-311.pyc,, -flask/sansio/app.py,sha256=Wj9NVGtiR1jvkZ9gSFd91usUlM8H0g06aPVz2sMh4bw,38116 -flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637 -flask/sansio/scaffold.py,sha256=q6wM4Y4aYMGGN_Litsj3PYKpBS3Zvut0xhDmpBEHFdo,30387 -flask/sessions.py,sha256=pImSFQIDCPtV-XSI8ttAyTTbvtRMkhDeqJ8VPZZUaf0,15430 -flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 -flask/templating.py,sha256=2TcXLT85Asflm2W9WOSFxKCmYn5e49w_Jkg9-NaaJWo,7537 -flask/testing.py,sha256=5Dxg6VZ0ZPhjwG9ReUl4TrhvkjBYvgIzV949jkY0jIU,10100 -flask/typing.py,sha256=b7mMBIeAoOcAI_vFzzhfOm7KeZ_n868SIMw6xpX5KYQ,3166 -flask/views.py,sha256=xzJx6oJqGElThtEghZN7ZQGMw5TDFyuRxUkecwRuAoA,6962 -flask/wrappers.py,sha256=jUkv4mVek2Iq4hwxd4RvqrIMb69Bv0PElDgWLmd5ORo,9406 diff --git a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/REQUESTED b/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/WHEEL b/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/WHEEL deleted file mode 100644 index e3c6fee..0000000 --- a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.10.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/entry_points.txt b/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/entry_points.txt deleted file mode 100644 index eec6733..0000000 --- a/port/lib/python3.11/site-packages/flask-3.1.0.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -flask=flask.cli:main - diff --git a/port/lib/python3.11/site-packages/flask/__init__.py b/port/lib/python3.11/site-packages/flask/__init__.py deleted file mode 100644 index e86eb43..0000000 --- a/port/lib/python3.11/site-packages/flask/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -import typing as t - -from . import json as json -from .app import Flask as Flask -from .blueprints import Blueprint as Blueprint -from .config import Config as Config -from .ctx import after_this_request as after_this_request -from .ctx import copy_current_request_context as copy_current_request_context -from .ctx import has_app_context as has_app_context -from .ctx import has_request_context as has_request_context -from .globals import current_app as current_app -from .globals import g as g -from .globals import request as request -from .globals import session as session -from .helpers import abort as abort -from .helpers import flash as flash -from .helpers import get_flashed_messages as get_flashed_messages -from .helpers import get_template_attribute as get_template_attribute -from .helpers import make_response as make_response -from .helpers import redirect as redirect -from .helpers import send_file as send_file -from .helpers import send_from_directory as send_from_directory -from .helpers import stream_with_context as stream_with_context -from .helpers import url_for as url_for -from .json import jsonify as jsonify -from .signals import appcontext_popped as appcontext_popped -from .signals import appcontext_pushed as appcontext_pushed -from .signals import appcontext_tearing_down as appcontext_tearing_down -from .signals import before_render_template as before_render_template -from .signals import got_request_exception as got_request_exception -from .signals import message_flashed as message_flashed -from .signals import request_finished as request_finished -from .signals import request_started as request_started -from .signals import request_tearing_down as request_tearing_down -from .signals import template_rendered as template_rendered -from .templating import render_template as render_template -from .templating import render_template_string as render_template_string -from .templating import stream_template as stream_template -from .templating import stream_template_string as stream_template_string -from .wrappers import Request as Request -from .wrappers import Response as Response - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Flask 3.1. Use feature detection or" - " 'importlib.metadata.version(\"flask\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("flask") - - raise AttributeError(name) diff --git a/port/lib/python3.11/site-packages/flask/__main__.py b/port/lib/python3.11/site-packages/flask/__main__.py deleted file mode 100644 index 4e28416..0000000 --- a/port/lib/python3.11/site-packages/flask/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .cli import main - -main() diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 91daeefecef650c9afea0462c73c4b2f7d1d21fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3165 zcmZ{m&u`pB6vxN=%lo67&F|k$oS&Ob+TA88ML=l@rG*O>YC%YIv7Gg6;>JIgu{UWT zl@Q`kapAzB9D6E1${*uam9TuOggEpTRNznv!F!W+5@&<^^4*W$jA!1wc{Az{#bTbo z^Tp+VHr9ZC!Ac`c;4&=> zR)81ig5W9O3atp92419#f@gr2=#t=B;B)kx;5qZWRi#zI^T0J)6I=$qKraYh0A8lc zf-B~VwMth7F9Khr7lAM6wXak3H9c{gRF+?05mcnGpxL(LX`bQO?#&la5a>+ZaUC0e z(>F}b-2%wHYqnUE8@2~8nQM;SFgAdCwT8#I>TMdX%GqZv=3@JJ-D&Qs^%m#M_9DMp zcWjT{#rD#s=Biq=dCb*^uJ#DW+=XZm=nWrAIH!Cxk?b(2?a#H#n=~xH*^E zy4o;IZ0I|9;f|#qba42taC@9-mbznjo5xlmx45Y`91cBXOsvts&ONZEc23l$(`+*R zq_gF23g^(Vo*vU+7dBMg*}-KGt}_@IgSK_ti1xCeWnjZO%00VVXHDERMNO=(rmAo#JXNhWcX1Qo z_P{K|CR~BRt2he>`H}>3;r_j+^0+UL2iYkFTqJS$E8TB*F@`l+yXM@ z$1NabKW?XaW_%K}ApQ!i0a^3o7Le^%iZb7^Q^gpf7f=^-=kVQXk`(rFBySCnvAztauYN2{4|+vF(>C_7BK?_S2BDCss81rUzS*;UtV6WACO;E zl9r#7nXg{}Wa;N*Cg~ScmSp7T8S5Du>KA90r0NzVCTAz6rxxp{&M4~jE#@i zE2#X%VUwGmQks)$SHuA{7G!NP$e|yY85tRGFo<42MGqKQ8dw_HTG$%Eu!s$)6aWG6 BJ%IoK diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/app.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/app.cpython-311.pyc deleted file mode 100644 index fd7ccd7c2a1e079c123a8a2426ca1a1ce3b6978d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65068 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 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/blueprints.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/blueprints.cpython-311.pyc deleted file mode 100644 index 9bc34a7f36f3d6b7f6f24e2577ee698d7eecc238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5351 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 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/ctx.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/ctx.cpython-311.pyc deleted file mode 100644 index c03bfe9d49c1d8412823b6db8003921a21aaa5f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20895 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 O8SH$K@SXzLk^X<*-Oh;s diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/globals.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/globals.cpython-311.pyc deleted file mode 100644 index 65f207b755bec46eebd2356f0df04106fb93f904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2217 zcmb_c&uN&*UXVC(OGQsqmHOVUP3+>_x_UeNX6F0ey!qbj{FKXO z2t422`ltR|ijbGs={?EF(O&Kp0_~O&m?vH1uP3Opn7iZYP|io(#tlcFIZX zX^rsslMvq=##NOwk zX4K8jWSOd&d?VrtKjb2O>Jof62e~xu;G>#@4v!!9rhH zyOs-xbQiJr_t!#hTW*~SUwIbeRBTeS(Xg#rm>8`^K`WWe`j+KU)oQ?uZMUeyO&9uG zrlKw3Q&TDKG!$o43F>>CZu)Kww`SUwYDGAgbH-UlZE;%jrR1*aU#dda1@(lz!vSr1 z?^BN}>NlwA_M>_UWtx`S!ifsJMmNi=3l+M?kM?u=C?HI5O=$7~04dJ`Ya6nJ9&gCeSCP;@lsNEnAj!ffF zw!1^*1zKI=U$^(i5V2)cs@}f-PoYscr~wFicYS@8c2}xU*rw;(YKTn2r3%gso(GUA z(*+|&FXDq`R?uIdn@$!*YeSjZz!wuJ45j1S3reW#te* z%r0xV0_$uzUR~xec-}Djer`xIkKre=nZo&y0XqyC(>Pqfrie`mnxDyQXvv$~RoF$f z*=$xd?zu}9<)y4 zQhU%kiMjTm4Z~b%CkCvOxY!=F<5Vi2*v}r1lS|hR7oQnN^Gna?m-f?bvJ}}7S?ZMN z!Q)OM`{dzqJa#7bCxPZKZ1&T~B&Nkq8kmA^iU2_e!VeD)?*XNRloC=(F<5Fir8sx+ z8B*2`uK}fqlp<1!v3+eQWu%w*wVTft+c)nXEv`IYT-ndI$x38LWTi8E^$BF2KRgF9 z=P>3R#+*Anjl%4~hd?+eKf}xmNGTwtaQbG;m!4!!C}pISky1X5@>T$O8IIAv10{a` diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/helpers.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/helpers.cpython-311.pyc deleted file mode 100644 index 248c4406c9cb73a14889a1661d5f312cc01c36da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26533 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 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/logging.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/logging.cpython-311.pyc deleted file mode 100644 index ee439ebd51867342f1f952f8a9855ddebb4dc583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3447 zcmZ`*>u(#!5#QtcO^JG>HiUQ+=tV^)8@Oo!MsOdFBpXp}19lUHML?c-OY)@S9lLuJ zO;t|$K|tNWK=Yx2jle1VDQ(d&`Pe^$G6$Gv^b z%+Act{O0}=k4Ff!-)?+gxfUkmpEwydzdKN#{Tl`kh(>;$!x7C!cU20MSpZQ1g1 zZAOb9`|=47VV=F@aGk|JQ-BWsZp%-xsmIg9+4x)XrG_h7Vv=ui2D;8_({S31=D9`E zb6+D{T5+PPXy|05!#uKMl~m&k`1q6m(lJ;fjwK7%dz?uk!rVFZ; zZ2f?(Q^TrI+oHu{Q&jYflqHJAb!veW-qZ!74fq#}q9roI)_|Z`%tWLV5ZkgEv}BoO zz0%+eXPjD1ljcf>Dnzab!YjI2$=s64T~$rZU>t-aTTN}zrfS-7x|D{;*j3PMXo72z z)E?sg`O>|$Ll?W+|g zTz#@bed;YIbyg>ixq{gwUV*MnzMUnZWS=Ph%ooY|`@eg5x0}4!30?d$nz*0q_~tm0 zIsuf)`18b2_Kuu8zFo^QN~1^xQjAU+-+zX|?>!I55qS)wvu!flKlB`tyULNmFWIA* zCgh%{tZ2${=t$YaypioKGRZla$J~SY3-lu?LNUWIA7u@m^7$pr3mM}({NzfNmG-G# z#$V`2OLlSw%6-W~k(**pqB51D0>}sya%4G;A z*rEnIUv%Fhbb9d<8XV{2HvCN5;7p%UoMWh8KvfS= z)i&veNPOmLZ1G8K@g%m~jV-q~dx_ch_Gx6gPlEnezKABqRsQ_l?i-u1aFW>SLLc4g zMzVfUa+4e(Ug?cPm$R4y*H%Uhd=)H(yA&T zB5Eux-lt2e(!r*RQw+GJ)taR>44CC`%!Gi%P7Cl0AbAj!KNA*keaf?c!44FYu|#}P zK90zXL|iyh9uLYt2p?+`MGBEjwn@nfu}1})KsrwDit`{lG~^tA z+oN(#$Rv*fQZSg+e}IwO4AGj=EyQ1}VUTcc<{`3=upaUmz`aaO#x$l4s?lxW8_=TL z-CW+qn!>2Sg#pIrRNLmcA_&j8^`RiiH(bn@CueX4^Hl=CyH&{l0oMoPR2tiDREmf# z%v5&`rma&kFkqmF41!^S%W0~uzNm?BZT{j{+rV9x#s~_ZBgp=uwu0g=a+%f$x`wsU zl@H$e9~@ezs-{s@>OCyNBV?Ma!dPcrx^lxT<%$E-P%@V6vjwIIF14$Gqr0lmOUPbR zL0zna>4*~?FgjsK{+&S;K|eZv=_i@bP6#aAK{Ryy(ter1P6U*`>VmVA)L2<<81@jG z(jNXQM3MvtfyIJS7Y*Vi_~5Zw!F2^+hpim^MHxD%e&(p?GxXB)-~>ueP^N zgOTGFR>YNu^N$wfpchK~G5KNg)8M1{NoctnTJD6Fzl<(CeCH&(*o`hC&1*pOG<5Ds z=-j8-lh9f>wAKl&okpkIzm%B|`eDR#_`-(5Bh}$=LGCl9d5x#-p$Rz zm8+Xq-oAEy+ldI(6uOleLW}$|a6KKLhynf@%8J3AY{|>C8F#{?p>!!vpiY?cZXF42 zxHxv1{{+?$mxLeszE@F{9(lDh`J9qOTmE_^(w4s-Np*(LDOu`FKBr`%Gx?l)eaAnA zYfxyw99#e4h-vZ@jQ}eBNDsc}fA;pX}Di%<4xg-PB5FHFuJFvzvOe xo$Qh1Q?l@cEcASH?d`5_t}}oA#CN0XyYY?Jqj>&9pzF&nGN%Ce|DR5}>AyL4hs^*0 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/sessions.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/sessions.cpython-311.pyc deleted file mode 100644 index 4bcac966e3dbb928132a3510a3c096c194368931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18635 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 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/signals.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/signals.cpython-311.pyc deleted file mode 100644 index 4287f8a9adc7986c6cfdf062bc1829f8f357a8ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1358 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 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/testing.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/testing.cpython-311.pyc deleted file mode 100644 index 3d11934ca696326d2569d2fefa030a0768173bec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14600 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 N11kM|n<|D2{|j|c`U?O6 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/typing.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/typing.cpython-311.pyc deleted file mode 100644 index 2d303874f0a4a7296fd7d08484c0554db985087d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3676 zcmb7FOK%!k7OtW$4`XA%fQ^Y`lf+Kib^`53l8zs794DQJyE|#y>DI6qt4v)8PMM;s ziXqM{CJQgT$btpZuwcO=>R~ilcrlAC=11I-?xIwyNVA&F2&uDbX{0^{rYJ~=(omp# z&*S^PbI!f+H;>27!0XQ||4;vMfMNb)Y+A3r=7Rl2b1=+b8G#X4kvU)!ENiT7qAkH; zZXdP6;a5N&2=sa*GT#dC|>^pEL+$;kb{jChafd{Y$4}#6xvW>PDMx?K` zfjCP{%GMF(Z%6g8d)oGtv%O9XS=9i?ARcIYaR3hpPAgZ6YkLzxYp&qxQX919fiGlg z1XSGNZDV%e4_oo^5U3f#!yTxGW#mH(L|JqSeJOjJArZD2eKie&TX4MT|JlYc|A0^P zm54yZnbywQk;GVsCT{<%85K#hIMSh|+so~bx1&t~j5Wu)PE7RTO2gT+MnasaBW+Y? z@(7l5V$HCw6Vcv0;A!_E{Bg~_*?VPw9H&Fmxh~Z6z0ZF~-UY}rZ~ z4Job%DwcUwlG}Csz>9gT+tqwd#Cm_T1x=f48~>EY*(BBnPCL`IbD6BF2U>mD!k{wS z^f-5*tRHw;b{h4&9_5U7^P=vDMn95o15r+fA{CCT{fjI5~LzEIQGZAL;Ssp@C9pJGwmkg_U%u0EEfBvuqjHgP?-c?I8n zp2Q8Ax^D;bvLF?*Wn1FmZ5ds1qAQPvLxTh_H0RckbK(SzcatUESO*K#Q((0 z@j{^xe=NyrN)j_tJO`_|nAwZx4%Mepb|E%57gsVWzLMjU&-gS};wd=f&*IH<9LpX4 z>RLIFguIAv%GUstg^%(-IO}zeWm%0mPdcA>%n)fk?>Ka{R%bYNUPCd``DiFkIv)+q zk?VEjWRr-lYK1mArcavl3$g^o7gA^XvT<79EJboF?jqEQX@5090jN6kf^qEOxI zw2!>!`uw(+o_d7w`d+1r$?{^AtK6vK+QvzscK@|RhOg4WYcKnO$mf4m(2&OfFp!tY z;5bDSr+CHf@+=8WQSU{HF4gTe`}BJb`D`x->VwQkxRlnAALJchDUT8N6h#-Cn*ec- zQFQinQx=JPhN4*wwDloFn`6XAm_U7)@kfemsjnPAi4fn)zkMszxAM~SE*L63EGwl) zgz;-Y0_vd1qUZQ8RS)rAp(xfiu&?`T-_qz3@h(xc43n|1zUR0wzz6FtW_+UZW3v#s zxOn`WqHy_KWv04S^S?QBvO}kr$kY;zEEBZ+p0kZZQUv-j8mU0bjke0r<|Q&dM+5W3 zJ5SL<+q_)$sQQpj#A)EmCZB<~0C1B47X`S; znM%Zr8;uiYScA57n_xCCsu!wib()S`hK_5Y;ZmX+s0y`(6ZW6>+7i8ZjYO}%4U*_8 z4c&y>p-n_9FEqR3C{g5&c8h#zzZ$G2Yjba|R`=<-IXXN~(89?MK{sF^Q4lj$4>IA= z))8P!_TvHx&l2w}MVDJm0$Z7_^pnZ!H2f9uenrs@qaK*)=|OOxUZ%!XA;C+;dx@ei inoUuP>!nQ+U7*25;$5WZs*!pfQjP0lyyZo>_rC#EZ8jnR diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/views.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/views.cpython-311.pyc deleted file mode 100644 index 3f7062e5f58621dc8ce48721a143982f2fd95d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7454 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 diff --git a/port/lib/python3.11/site-packages/flask/__pycache__/wrappers.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/__pycache__/wrappers.cpython-311.pyc deleted file mode 100644 index 648c8cd525f218f1c844d1178d738b6d3a12c64b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10845 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 timedelta | None: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class Flask(App): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - default_config = ImmutableDict( - { - "DEBUG": None, - "TESTING": False, - "PROPAGATE_EXCEPTIONS": None, - "SECRET_KEY": None, - "SECRET_KEY_FALLBACKS": None, - "PERMANENT_SESSION_LIFETIME": timedelta(days=31), - "USE_X_SENDFILE": False, - "TRUSTED_HOSTS": None, - "SERVER_NAME": None, - "APPLICATION_ROOT": "/", - "SESSION_COOKIE_NAME": "session", - "SESSION_COOKIE_DOMAIN": None, - "SESSION_COOKIE_PATH": None, - "SESSION_COOKIE_HTTPONLY": True, - "SESSION_COOKIE_SECURE": False, - "SESSION_COOKIE_PARTITIONED": False, - "SESSION_COOKIE_SAMESITE": None, - "SESSION_REFRESH_EACH_REQUEST": True, - "MAX_CONTENT_LENGTH": None, - "MAX_FORM_MEMORY_SIZE": 500_000, - "MAX_FORM_PARTS": 1_000, - "SEND_FILE_MAX_AGE_DEFAULT": None, - "TRAP_BAD_REQUEST_ERRORS": None, - "TRAP_HTTP_EXCEPTIONS": False, - "EXPLAIN_TEMPLATE_LOADING": False, - "PREFERRED_URL_SCHEME": "http", - "TEMPLATES_AUTO_RELOAD": None, - "MAX_COOKIE_SIZE": 4093, - "PROVIDE_AUTOMATIC_OPTIONS": True, - } - ) - - #: The class that is used for request objects. See :class:`~flask.Request` - #: for more information. - request_class: type[Request] = Request - - #: The class that is used for response objects. See - #: :class:`~flask.Response` for more information. - response_class: type[Response] = Response - - #: the session interface to use. By default an instance of - #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. - #: - #: .. versionadded:: 0.8 - session_interface: SessionInterface = SecureCookieSessionInterface() - - def __init__( - self, - import_name: str, - static_url_path: str | None = None, - static_folder: str | os.PathLike[str] | None = "static", - static_host: str | None = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: str | os.PathLike[str] | None = "templates", - instance_path: str | None = None, - instance_relative_config: bool = False, - root_path: str | None = None, - ): - super().__init__( - import_name=import_name, - static_url_path=static_url_path, - static_folder=static_folder, - static_host=static_host, - host_matching=host_matching, - subdomain_matching=subdomain_matching, - template_folder=template_folder, - instance_path=instance_path, - instance_relative_config=instance_relative_config, - root_path=root_path, - ) - - #: The Click command group for registering CLI commands for this - #: object. The commands are available from the ``flask`` command - #: once the application has been discovered and blueprints have - #: been registered. - self.cli = cli.AppGroup() - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - # Add a static route using the provided static_url_path, static_host, - # and static_folder if there is a configured static_folder. - # Note we do this without checking if static_folder exists. - # For one, it might be created while the server is running (e.g. during - # development). Also, Google App Engine stores static files somewhere - if self.has_static_folder: - assert ( - bool(static_host) == host_matching - ), "Invalid static_host/host_matching combination" - # Use a weakref to avoid creating a reference cycle between the app - # and the view function (see #3761). - self_ref = weakref.ref(self) - self.add_url_rule( - f"{self.static_url_path}/", - endpoint="static", - host=static_host, - view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 - ) - - def get_send_file_max_age(self, filename: str | None) -> int | None: - """Used by :func:`send_file` to determine the ``max_age`` cache - value for a given file path if it wasn't passed. - - By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from - the configuration of :data:`~flask.current_app`. This defaults - to ``None``, which tells the browser to use conditional requests - instead of a timed cache, which is usually preferable. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionchanged:: 2.0 - The default configuration is ``None`` instead of 12 hours. - - .. versionadded:: 0.9 - """ - value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] - - if value is None: - return None - - if isinstance(value, timedelta): - return int(value.total_seconds()) - - return value # type: ignore[no-any-return] - - def send_static_file(self, filename: str) -> Response: - """The view function used to serve files from - :attr:`static_folder`. A route is automatically registered for - this view at :attr:`static_url_path` if :attr:`static_folder` is - set. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionadded:: 0.5 - - """ - if not self.has_static_folder: - raise RuntimeError("'static_folder' must be set to serve static_files.") - - # send_file only knows to call get_send_file_max_age on the app, - # call it here so it works for blueprints too. - max_age = self.get_send_file_max_age(filename) - return send_from_directory( - t.cast(str, self.static_folder), filename, max_age=max_age - ) - - def open_resource( - self, resource: str, mode: str = "rb", encoding: str | None = None - ) -> t.IO[t.AnyStr]: - """Open a resource file relative to :attr:`root_path` for reading. - - For example, if the file ``schema.sql`` is next to the file - ``app.py`` where the ``Flask`` app is defined, it can be opened - with: - - .. code-block:: python - - with app.open_resource("schema.sql") as f: - conn.executescript(f.read()) - - :param resource: Path to the resource relative to :attr:`root_path`. - :param mode: Open the file in this mode. Only reading is supported, - valid values are ``"r"`` (or ``"rt"``) and ``"rb"``. - :param encoding: Open the file with this encoding when opening in text - mode. This is ignored when opening in binary mode. - - .. versionchanged:: 3.1 - Added the ``encoding`` parameter. - """ - if mode not in {"r", "rt", "rb"}: - raise ValueError("Resources can only be opened for reading.") - - path = os.path.join(self.root_path, resource) - - if mode == "rb": - return open(path, mode) # pyright: ignore - - return open(path, mode, encoding=encoding) - - def open_instance_resource( - self, resource: str, mode: str = "rb", encoding: str | None = "utf-8" - ) -> t.IO[t.AnyStr]: - """Open a resource file relative to the application's instance folder - :attr:`instance_path`. Unlike :meth:`open_resource`, files in the - instance folder can be opened for writing. - - :param resource: Path to the resource relative to :attr:`instance_path`. - :param mode: Open the file in this mode. - :param encoding: Open the file with this encoding when opening in text - mode. This is ignored when opening in binary mode. - - .. versionchanged:: 3.1 - Added the ``encoding`` parameter. - """ - path = os.path.join(self.instance_path, resource) - - if "b" in mode: - return open(path, mode) - - return open(path, mode, encoding=encoding) - - def create_jinja_environment(self) -> Environment: - """Create the Jinja environment based on :attr:`jinja_options` - and the various Jinja-related methods of the app. Changing - :attr:`jinja_options` after this will have no effect. Also adds - Flask-related globals and filters to the environment. - - .. versionchanged:: 0.11 - ``Environment.auto_reload`` set in accordance with - ``TEMPLATES_AUTO_RELOAD`` configuration option. - - .. versionadded:: 0.5 - """ - options = dict(self.jinja_options) - - if "autoescape" not in options: - options["autoescape"] = self.select_jinja_autoescape - - if "auto_reload" not in options: - auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] - - if auto_reload is None: - auto_reload = self.debug - - options["auto_reload"] = auto_reload - - rv = self.jinja_environment(self, **options) - rv.globals.update( - url_for=self.url_for, - get_flashed_messages=get_flashed_messages, - config=self.config, - # request, session and g are normally added with the - # context processor for efficiency reasons but for imported - # templates we also want the proxies in there. - request=request, - session=session, - g=g, - ) - rv.policies["json.dumps_function"] = self.json.dumps - return rv - - def create_url_adapter(self, request: Request | None) -> MapAdapter | None: - """Creates a URL adapter for the given request. The URL adapter - is created at a point where the request context is not yet set - up so the request is passed explicitly. - - .. versionchanged:: 3.1 - If :data:`SERVER_NAME` is set, it does not restrict requests to - only that domain, for both ``subdomain_matching`` and - ``host_matching``. - - .. versionchanged:: 1.0 - :data:`SERVER_NAME` no longer implicitly enables subdomain - matching. Use :attr:`subdomain_matching` instead. - - .. versionchanged:: 0.9 - This can be called outside a request when the URL adapter is created - for an application context. - - .. versionadded:: 0.6 - """ - if request is not None: - if (trusted_hosts := self.config["TRUSTED_HOSTS"]) is not None: - request.trusted_hosts = trusted_hosts - - # Check trusted_hosts here until bind_to_environ does. - request.host = get_host(request.environ, request.trusted_hosts) # pyright: ignore - subdomain = None - server_name = self.config["SERVER_NAME"] - - if self.url_map.host_matching: - # Don't pass SERVER_NAME, otherwise it's used and the actual - # host is ignored, which breaks host matching. - server_name = None - elif not self.subdomain_matching: - # Werkzeug doesn't implement subdomain matching yet. Until then, - # disable it by forcing the current subdomain to the default, or - # the empty string. - subdomain = self.url_map.default_subdomain or "" - - return self.url_map.bind_to_environ( - request.environ, server_name=server_name, subdomain=subdomain - ) - - # Need at least SERVER_NAME to match/build outside a request. - if self.config["SERVER_NAME"] is not None: - return self.url_map.bind( - self.config["SERVER_NAME"], - script_name=self.config["APPLICATION_ROOT"], - url_scheme=self.config["PREFERRED_URL_SCHEME"], - ) - - return None - - def raise_routing_exception(self, request: Request) -> t.NoReturn: - """Intercept routing exceptions and possibly do something else. - - In debug mode, intercept a routing redirect and replace it with - an error if the body will be discarded. - - With modern Werkzeug this shouldn't occur, since it now uses a - 308 status which tells the browser to resend the method and - body. - - .. versionchanged:: 2.1 - Don't intercept 307 and 308 redirects. - - :meta private: - :internal: - """ - if ( - not self.debug - or not isinstance(request.routing_exception, RequestRedirect) - or request.routing_exception.code in {307, 308} - or request.method in {"GET", "HEAD", "OPTIONS"} - ): - raise request.routing_exception # type: ignore[misc] - - from .debughelpers import FormDataRoutingRedirect - - raise FormDataRoutingRedirect(request) - - def update_template_context(self, context: dict[str, t.Any]) -> None: - """Update the template context with some commonly used variables. - This injects request, session, config and g into the template - context as well as everything template context processors want - to inject. Note that the as of Flask 0.6, the original values - in the context will not be overridden if a context processor - decides to return a value with the same key. - - :param context: the context as a dictionary that is updated in place - to add extra variables. - """ - names: t.Iterable[str | None] = (None,) - - # A template may be rendered outside a request context. - if request: - names = chain(names, reversed(request.blueprints)) - - # The values passed to render_template take precedence. Keep a - # copy to re-apply after all context functions. - orig_ctx = context.copy() - - for name in names: - if name in self.template_context_processors: - for func in self.template_context_processors[name]: - context.update(self.ensure_sync(func)()) - - context.update(orig_ctx) - - def make_shell_context(self) -> dict[str, t.Any]: - """Returns the shell context for an interactive shell for this - application. This runs all the registered shell context - processors. - - .. versionadded:: 0.11 - """ - rv = {"app": self, "g": g} - for processor in self.shell_context_processors: - rv.update(processor()) - return rv - - def run( - self, - host: str | None = None, - port: int | None = None, - debug: bool | None = None, - load_dotenv: bool = True, - **options: t.Any, - ) -> None: - """Runs the application on a local development server. - - Do not use ``run()`` in a production setting. It is not intended to - meet security and performance requirements for a production server. - Instead, see :doc:`/deploying/index` for WSGI server recommendations. - - If the :attr:`debug` flag is set the server will automatically reload - for code changes and show a debugger in case an exception happened. - - If you want to run the application in debug mode, but disable the - code execution on the interactive debugger, you can pass - ``use_evalex=False`` as parameter. This will keep the debugger's - traceback screen active, but disable code execution. - - It is not recommended to use this function for development with - automatic reloading as this is badly supported. Instead you should - be using the :command:`flask` command line script's ``run`` support. - - .. admonition:: Keep in Mind - - Flask will suppress any server error with a generic error page - unless it is in debug mode. As such to enable just the - interactive debugger without the code reloading, you have to - invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. - Setting ``use_debugger`` to ``True`` without being in debug mode - won't catch any exceptions because there won't be any to - catch. - - :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to - have the server available externally as well. Defaults to - ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable - if present. - :param port: the port of the webserver. Defaults to ``5000`` or the - port defined in the ``SERVER_NAME`` config variable if present. - :param debug: if given, enable or disable debug mode. See - :attr:`debug`. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param options: the options to be forwarded to the underlying Werkzeug - server. See :func:`werkzeug.serving.run_simple` for more - information. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment - variables from :file:`.env` and :file:`.flaskenv` files. - - The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. - - Threaded mode is enabled by default. - - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` - variable. - """ - # Ignore this call so that it doesn't start another server if - # the 'flask run' command is used. - if os.environ.get("FLASK_RUN_FROM_CLI") == "true": - if not is_running_from_reloader(): - click.secho( - " * Ignoring a call to 'app.run()' that would block" - " the current 'flask' CLI command.\n" - " Only call 'app.run()' in an 'if __name__ ==" - ' "__main__"\' guard.', - fg="red", - ) - - return - - if get_load_dotenv(load_dotenv): - cli.load_dotenv() - - # if set, env var overrides existing value - if "FLASK_DEBUG" in os.environ: - self.debug = get_debug_flag() - - # debug passed to method overrides all other sources - if debug is not None: - self.debug = bool(debug) - - server_name = self.config.get("SERVER_NAME") - sn_host = sn_port = None - - if server_name: - sn_host, _, sn_port = server_name.partition(":") - - if not host: - if sn_host: - host = sn_host - else: - host = "127.0.0.1" - - if port or port == 0: - port = int(port) - elif sn_port: - port = int(sn_port) - else: - port = 5000 - - options.setdefault("use_reloader", self.debug) - options.setdefault("use_debugger", self.debug) - options.setdefault("threaded", True) - - cli.show_server_banner(self.debug, self.name) - - from werkzeug.serving import run_simple - - try: - run_simple(t.cast(str, host), port, self, **options) - finally: - # reset the first request information if the development server - # reset normally. This makes it possible to restart the server - # without reloader and that stuff from an interactive shell. - self._got_first_request = False - - def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: - """Creates a test client for this application. For information - about unit testing head over to :doc:`/testing`. - - Note that if you are testing for assertions or exceptions in your - application code, you must set ``app.testing = True`` in order for the - exceptions to propagate to the test client. Otherwise, the exception - will be handled by the application (not visible to the test client) and - the only indication of an AssertionError or other exception will be a - 500 status code response to the test client. See the :attr:`testing` - attribute. For example:: - - app.testing = True - client = app.test_client() - - The test client can be used in a ``with`` block to defer the closing down - of the context until the end of the ``with`` block. This is useful if - you want to access the context locals for testing:: - - with app.test_client() as c: - rv = c.get('/?vodka=42') - assert request.args['vodka'] == '42' - - Additionally, you may pass optional keyword arguments that will then - be passed to the application's :attr:`test_client_class` constructor. - For example:: - - from flask.testing import FlaskClient - - class CustomClient(FlaskClient): - def __init__(self, *args, **kwargs): - self._authentication = kwargs.pop("authentication") - super(CustomClient,self).__init__( *args, **kwargs) - - app.test_client_class = CustomClient - client = app.test_client(authentication='Basic ....') - - See :class:`~flask.testing.FlaskClient` for more information. - - .. versionchanged:: 0.4 - added support for ``with`` block usage for the client. - - .. versionadded:: 0.7 - The `use_cookies` parameter was added as well as the ability - to override the client to be used by setting the - :attr:`test_client_class` attribute. - - .. versionchanged:: 0.11 - Added `**kwargs` to support passing additional keyword arguments to - the constructor of :attr:`test_client_class`. - """ - cls = self.test_client_class - if cls is None: - from .testing import FlaskClient as cls - return cls( # type: ignore - self, self.response_class, use_cookies=use_cookies, **kwargs - ) - - def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: - """Create a CLI runner for testing CLI commands. - See :ref:`testing-cli`. - - Returns an instance of :attr:`test_cli_runner_class`, by default - :class:`~flask.testing.FlaskCliRunner`. The Flask app object is - passed as the first argument. - - .. versionadded:: 1.0 - """ - cls = self.test_cli_runner_class - - if cls is None: - from .testing import FlaskCliRunner as cls - - return cls(self, **kwargs) # type: ignore - - def handle_http_exception( - self, e: HTTPException - ) -> HTTPException | ft.ResponseReturnValue: - """Handles an HTTP exception. By default this will invoke the - registered error handlers and fall back to returning the - exception as response. - - .. versionchanged:: 1.0.3 - ``RoutingException``, used internally for actions such as - slash redirects during routing, is not passed to error - handlers. - - .. versionchanged:: 1.0 - Exceptions are looked up by code *and* by MRO, so - ``HTTPException`` subclasses can be handled with a catch-all - handler for the base ``HTTPException``. - - .. versionadded:: 0.3 - """ - # Proxy exceptions don't have error codes. We want to always return - # those unchanged as errors - if e.code is None: - return e - - # RoutingExceptions are used internally to trigger routing - # actions, such as slash redirects raising RequestRedirect. They - # are not raised or handled in user code. - if isinstance(e, RoutingException): - return e - - handler = self._find_error_handler(e, request.blueprints) - if handler is None: - return e - return self.ensure_sync(handler)(e) # type: ignore[no-any-return] - - def handle_user_exception( - self, e: Exception - ) -> HTTPException | ft.ResponseReturnValue: - """This method is called whenever an exception occurs that - should be handled. A special case is :class:`~werkzeug - .exceptions.HTTPException` which is forwarded to the - :meth:`handle_http_exception` method. This function will either - return a response value or reraise the exception with the same - traceback. - - .. versionchanged:: 1.0 - Key errors raised from request data like ``form`` show the - bad key in debug mode rather than a generic bad request - message. - - .. versionadded:: 0.7 - """ - if isinstance(e, BadRequestKeyError) and ( - self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] - ): - e.show_exception = True - - if isinstance(e, HTTPException) and not self.trap_http_exception(e): - return self.handle_http_exception(e) - - handler = self._find_error_handler(e, request.blueprints) - - if handler is None: - raise - - return self.ensure_sync(handler)(e) # type: ignore[no-any-return] - - def handle_exception(self, e: Exception) -> Response: - """Handle an exception that did not have an error handler - associated with it, or that was raised from an error handler. - This always causes a 500 ``InternalServerError``. - - Always sends the :data:`got_request_exception` signal. - - If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug - mode, the error will be re-raised so that the debugger can - display it. Otherwise, the original exception is logged, and - an :exc:`~werkzeug.exceptions.InternalServerError` is returned. - - If an error handler is registered for ``InternalServerError`` or - ``500``, it will be used. For consistency, the handler will - always receive the ``InternalServerError``. The original - unhandled exception is available as ``e.original_exception``. - - .. versionchanged:: 1.1.0 - Always passes the ``InternalServerError`` instance to the - handler, setting ``original_exception`` to the unhandled - error. - - .. versionchanged:: 1.1.0 - ``after_request`` functions and other finalization is done - even for the default 500 response when there is no handler. - - .. versionadded:: 0.3 - """ - exc_info = sys.exc_info() - got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) - propagate = self.config["PROPAGATE_EXCEPTIONS"] - - if propagate is None: - propagate = self.testing or self.debug - - if propagate: - # Re-raise if called with an active exception, otherwise - # raise the passed in exception. - if exc_info[1] is e: - raise - - raise e - - self.log_exception(exc_info) - server_error: InternalServerError | ft.ResponseReturnValue - server_error = InternalServerError(original_exception=e) - handler = self._find_error_handler(server_error, request.blueprints) - - if handler is not None: - server_error = self.ensure_sync(handler)(server_error) - - return self.finalize_request(server_error, from_error_handler=True) - - def log_exception( - self, - exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), - ) -> None: - """Logs an exception. This is called by :meth:`handle_exception` - if debugging is disabled and right before the handler is called. - The default implementation logs the exception as error on the - :attr:`logger`. - - .. versionadded:: 0.8 - """ - self.logger.error( - f"Exception on {request.path} [{request.method}]", exc_info=exc_info - ) - - def dispatch_request(self) -> ft.ResponseReturnValue: - """Does the request dispatching. Matches the URL and returns the - return value of the view or error handler. This does not have to - be a response object. In order to convert the return value to a - proper response object, call :func:`make_response`. - - .. versionchanged:: 0.7 - This no longer does the exception handling, this code was - moved to the new :meth:`full_dispatch_request`. - """ - req = request_ctx.request - if req.routing_exception is not None: - self.raise_routing_exception(req) - rule: Rule = req.url_rule # type: ignore[assignment] - # if we provide automatic options for this URL and the - # request came with the OPTIONS method, reply automatically - if ( - getattr(rule, "provide_automatic_options", False) - and req.method == "OPTIONS" - ): - return self.make_default_options_response() - # otherwise dispatch to the handler for that endpoint - view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] - return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] - - def full_dispatch_request(self) -> Response: - """Dispatches the request and on top of that performs request - pre and postprocessing as well as HTTP exception catching and - error handling. - - .. versionadded:: 0.7 - """ - self._got_first_request = True - - try: - request_started.send(self, _async_wrapper=self.ensure_sync) - rv = self.preprocess_request() - if rv is None: - rv = self.dispatch_request() - except Exception as e: - rv = self.handle_user_exception(e) - return self.finalize_request(rv) - - def finalize_request( - self, - rv: ft.ResponseReturnValue | HTTPException, - from_error_handler: bool = False, - ) -> Response: - """Given the return value from a view function this finalizes - the request by converting it into a response and invoking the - postprocessing functions. This is invoked for both normal - request dispatching as well as error handlers. - - Because this means that it might be called as a result of a - failure a special safe mode is available which can be enabled - with the `from_error_handler` flag. If enabled, failures in - response processing will be logged and otherwise ignored. - - :internal: - """ - response = self.make_response(rv) - try: - response = self.process_response(response) - request_finished.send( - self, _async_wrapper=self.ensure_sync, response=response - ) - except Exception: - if not from_error_handler: - raise - self.logger.exception( - "Request finalizing failed with an error while handling an error" - ) - return response - - def make_default_options_response(self) -> Response: - """This method is called to create the default ``OPTIONS`` response. - This can be changed through subclassing to change the default - behavior of ``OPTIONS`` responses. - - .. versionadded:: 0.7 - """ - adapter = request_ctx.url_adapter - methods = adapter.allowed_methods() # type: ignore[union-attr] - rv = self.response_class() - rv.allow.update(methods) - return rv - - def ensure_sync(self, func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Ensure that the function is synchronous for WSGI workers. - Plain ``def`` functions are returned as-is. ``async def`` - functions are wrapped to run and wait for the response. - - Override this method to change how the app runs async views. - - .. versionadded:: 2.0 - """ - if iscoroutinefunction(func): - return self.async_to_sync(func) - - return func - - def async_to_sync( - self, func: t.Callable[..., t.Coroutine[t.Any, t.Any, t.Any]] - ) -> t.Callable[..., t.Any]: - """Return a sync function that will run the coroutine function. - - .. code-block:: python - - result = app.async_to_sync(func)(*args, **kwargs) - - Override this method to change how the app converts async code - to be synchronously callable. - - .. versionadded:: 2.0 - """ - try: - from asgiref.sync import async_to_sync as asgiref_async_to_sync - except ImportError: - raise RuntimeError( - "Install Flask with the 'async' extra in order to use async views." - ) from None - - return asgiref_async_to_sync(func) - - def url_for( - self, - /, - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, - ) -> str: - """Generate a URL to the given endpoint with the given values. - - This is called by :func:`flask.url_for`, and can be called - directly as well. - - An *endpoint* is the name of a URL rule, usually added with - :meth:`@app.route() `, and usually the same name as the - view function. A route defined in a :class:`~flask.Blueprint` - will prepend the blueprint's name separated by a ``.`` to the - endpoint. - - In some cases, such as email messages, you want URLs to include - the scheme and domain, like ``https://example.com/hello``. When - not in an active request, URLs will be external by default, but - this requires setting :data:`SERVER_NAME` so Flask knows what - domain to use. :data:`APPLICATION_ROOT` and - :data:`PREFERRED_URL_SCHEME` should also be configured as - needed. This config is only used when not in an active request. - - Functions can be decorated with :meth:`url_defaults` to modify - keyword arguments before the URL is built. - - If building fails for some reason, such as an unknown endpoint - or incorrect values, the app's :meth:`handle_url_build_error` - method is called. If that returns a string, that is returned, - otherwise a :exc:`~werkzeug.routing.BuildError` is raised. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it - is external. - :param _external: If given, prefer the URL to be internal - (False) or require it to be external (True). External URLs - include the scheme and domain. When not in an active - request, URLs are external by default. - :param values: Values to use for the variable parts of the URL - rule. Unknown keys are appended as query string arguments, - like ``?a=b&c=d``. - - .. versionadded:: 2.2 - Moved from ``flask.url_for``, which calls this method. - """ - req_ctx = _cv_request.get(None) - - if req_ctx is not None: - url_adapter = req_ctx.url_adapter - blueprint_name = req_ctx.request.blueprint - - # If the endpoint starts with "." and the request matches a - # blueprint, the endpoint is relative to the blueprint. - if endpoint[:1] == ".": - if blueprint_name is not None: - endpoint = f"{blueprint_name}{endpoint}" - else: - endpoint = endpoint[1:] - - # When in a request, generate a URL without scheme and - # domain by default, unless a scheme is given. - if _external is None: - _external = _scheme is not None - else: - app_ctx = _cv_app.get(None) - - # If called by helpers.url_for, an app context is active, - # use its url_adapter. Otherwise, app.url_for was called - # directly, build an adapter. - if app_ctx is not None: - url_adapter = app_ctx.url_adapter - else: - url_adapter = self.create_url_adapter(None) - - if url_adapter is None: - raise RuntimeError( - "Unable to build URLs outside an active request" - " without 'SERVER_NAME' configured. Also configure" - " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" - " needed." - ) - - # When outside a request, generate a URL with scheme and - # domain by default. - if _external is None: - _external = True - - # It is an error to set _scheme when _external=False, in order - # to avoid accidental insecure URLs. - if _scheme is not None and not _external: - raise ValueError("When specifying '_scheme', '_external' must be True.") - - self.inject_url_defaults(endpoint, values) - - try: - rv = url_adapter.build( # type: ignore[union-attr] - endpoint, - values, - method=_method, - url_scheme=_scheme, - force_external=_external, - ) - except BuildError as error: - values.update( - _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external - ) - return self.handle_url_build_error(error, endpoint, values) - - if _anchor is not None: - _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") - rv = f"{rv}#{_anchor}" - - return rv - - def make_response(self, rv: ft.ResponseReturnValue) -> Response: - """Convert the return value from a view function to an instance of - :attr:`response_class`. - - :param rv: the return value from the view function. The view function - must return a response. Returning ``None``, or the view ending - without returning, is not allowed. The following types are allowed - for ``view_rv``: - - ``str`` - A response object is created with the string encoded to UTF-8 - as the body. - - ``bytes`` - A response object is created with the bytes as the body. - - ``dict`` - A dictionary that will be jsonify'd before being returned. - - ``list`` - A list that will be jsonify'd before being returned. - - ``generator`` or ``iterator`` - A generator that returns ``str`` or ``bytes`` to be - streamed as the response. - - ``tuple`` - Either ``(body, status, headers)``, ``(body, status)``, or - ``(body, headers)``, where ``body`` is any of the other types - allowed here, ``status`` is a string or an integer, and - ``headers`` is a dictionary or a list of ``(key, value)`` - tuples. If ``body`` is a :attr:`response_class` instance, - ``status`` overwrites the exiting value and ``headers`` are - extended. - - :attr:`response_class` - The object is returned unchanged. - - other :class:`~werkzeug.wrappers.Response` class - The object is coerced to :attr:`response_class`. - - :func:`callable` - The function is called as a WSGI application. The result is - used to create a response object. - - .. versionchanged:: 2.2 - A generator will be converted to a streaming response. - A list will be converted to a JSON response. - - .. versionchanged:: 1.1 - A dict will be converted to a JSON response. - - .. versionchanged:: 0.9 - Previously a tuple was interpreted as the arguments for the - response object. - """ - - status: int | None = None - headers: HeadersValue | None = None - - # unpack tuple returns - if isinstance(rv, tuple): - len_rv = len(rv) - - # a 3-tuple is unpacked directly - if len_rv == 3: - rv, status, headers = rv # type: ignore[misc] - # decide if a 2-tuple has status or headers - elif len_rv == 2: - if isinstance(rv[1], (Headers, dict, tuple, list)): - rv, headers = rv # pyright: ignore - else: - rv, status = rv # type: ignore[assignment,misc] - # other sized tuples are not allowed - else: - raise TypeError( - "The view function did not return a valid response tuple." - " The tuple must have the form (body, status, headers)," - " (body, status), or (body, headers)." - ) - - # the body must not be None - if rv is None: - raise TypeError( - f"The view function for {request.endpoint!r} did not" - " return a valid response. The function either returned" - " None or ended without a return statement." - ) - - # make sure the body is an instance of the response class - if not isinstance(rv, self.response_class): - if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, cabc.Iterator): - # let the response class set the status and headers instead of - # waiting to do it manually, so that the class can handle any - # special logic - rv = self.response_class( - rv, - status=status, - headers=headers, # type: ignore[arg-type] - ) - status = headers = None - elif isinstance(rv, (dict, list)): - rv = self.json.response(rv) - elif isinstance(rv, BaseResponse) or callable(rv): - # evaluate a WSGI callable, or coerce a different response - # class to the correct type - try: - rv = self.response_class.force_type( - rv, # type: ignore[arg-type] - request.environ, - ) - except TypeError as e: - raise TypeError( - f"{e}\nThe view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it" - f" was a {type(rv).__name__}." - ).with_traceback(sys.exc_info()[2]) from None - else: - raise TypeError( - "The view function did not return a valid" - " response. The return type must be a string," - " dict, list, tuple with headers or status," - " Response instance, or WSGI callable, but it was a" - f" {type(rv).__name__}." - ) - - rv = t.cast(Response, rv) - # prefer the status if it was provided - if status is not None: - if isinstance(status, (str, bytes, bytearray)): - rv.status = status - else: - rv.status_code = status - - # extend existing headers with provided headers - if headers: - rv.headers.update(headers) - - return rv - - def preprocess_request(self) -> ft.ResponseReturnValue | None: - """Called before the request is dispatched. Calls - :attr:`url_value_preprocessors` registered with the app and the - current blueprint (if any). Then calls :attr:`before_request_funcs` - registered with the app and the blueprint. - - If any :meth:`before_request` handler returns a non-None value, the - value is handled as if it was the return value from the view, and - further request handling is stopped. - """ - names = (None, *reversed(request.blueprints)) - - for name in names: - if name in self.url_value_preprocessors: - for url_func in self.url_value_preprocessors[name]: - url_func(request.endpoint, request.view_args) - - for name in names: - if name in self.before_request_funcs: - for before_func in self.before_request_funcs[name]: - rv = self.ensure_sync(before_func)() - - if rv is not None: - return rv # type: ignore[no-any-return] - - return None - - def process_response(self, response: Response) -> Response: - """Can be overridden in order to modify the response object - before it's sent to the WSGI server. By default this will - call all the :meth:`after_request` decorated functions. - - .. versionchanged:: 0.5 - As of Flask 0.5 the functions registered for after request - execution are called in reverse order of registration. - - :param response: a :attr:`response_class` object. - :return: a new response object or the same, has to be an - instance of :attr:`response_class`. - """ - ctx = request_ctx._get_current_object() # type: ignore[attr-defined] - - for func in ctx._after_request_functions: - response = self.ensure_sync(func)(response) - - for name in chain(request.blueprints, (None,)): - if name in self.after_request_funcs: - for func in reversed(self.after_request_funcs[name]): - response = self.ensure_sync(func)(response) - - if not self.session_interface.is_null_session(ctx.session): - self.session_interface.save_session(self, ctx.session, response) - - return response - - def do_teardown_request( - self, - exc: BaseException | None = _sentinel, # type: ignore[assignment] - ) -> None: - """Called after the request is dispatched and the response is - returned, right before the request context is popped. - - This calls all functions decorated with - :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` - if a blueprint handled the request. Finally, the - :data:`request_tearing_down` signal is sent. - - This is called by - :meth:`RequestContext.pop() `, - which may be delayed during testing to maintain access to - resources. - - :param exc: An unhandled exception raised while dispatching the - request. Detected from the current exception information if - not passed. Passed to each teardown function. - - .. versionchanged:: 0.9 - Added the ``exc`` argument. - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for name in chain(request.blueprints, (None,)): - if name in self.teardown_request_funcs: - for func in reversed(self.teardown_request_funcs[name]): - self.ensure_sync(func)(exc) - - request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def do_teardown_appcontext( - self, - exc: BaseException | None = _sentinel, # type: ignore[assignment] - ) -> None: - """Called right before the application context is popped. - - When handling a request, the application context is popped - after the request context. See :meth:`do_teardown_request`. - - This calls all functions decorated with - :meth:`teardown_appcontext`. Then the - :data:`appcontext_tearing_down` signal is sent. - - This is called by - :meth:`AppContext.pop() `. - - .. versionadded:: 0.9 - """ - if exc is _sentinel: - exc = sys.exc_info()[1] - - for func in reversed(self.teardown_appcontext_funcs): - self.ensure_sync(func)(exc) - - appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) - - def app_context(self) -> AppContext: - """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` - block to push the context, which will make :data:`current_app` - point at this application. - - An application context is automatically pushed by - :meth:`RequestContext.push() ` - when handling a request, and when running a CLI command. Use - this to manually create a context outside of these situations. - - :: - - with app.app_context(): - init_db() - - See :doc:`/appcontext`. - - .. versionadded:: 0.9 - """ - return AppContext(self) - - def request_context(self, environ: WSGIEnvironment) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` representing a - WSGI environment. Use a ``with`` block to push the context, - which will make :data:`request` point at this request. - - See :doc:`/reqcontext`. - - Typically you should not call this from your own code. A request - context is automatically pushed by the :meth:`wsgi_app` when - handling a request. Use :meth:`test_request_context` to create - an environment and context instead of this method. - - :param environ: a WSGI environment - """ - return RequestContext(self, environ) - - def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: - """Create a :class:`~flask.ctx.RequestContext` for a WSGI - environment created from the given values. This is mostly useful - during testing, where you may want to run a function that uses - request data without dispatching a full request. - - See :doc:`/reqcontext`. - - Use a ``with`` block to push the context, which will make - :data:`request` point at the request for the created - environment. :: - - with app.test_request_context(...): - generate_report() - - When using the shell, it may be easier to push and pop the - context manually to avoid indentation. :: - - ctx = app.test_request_context(...) - ctx.push() - ... - ctx.pop() - - Takes the same arguments as Werkzeug's - :class:`~werkzeug.test.EnvironBuilder`, with some defaults from - the application. See the linked Werkzeug docs for most of the - available arguments. Flask-specific behavior is listed here. - - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to - :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param data: The request body, either as a string or a dict of - form keys and values. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - from .testing import EnvironBuilder - - builder = EnvironBuilder(self, *args, **kwargs) - - try: - return self.request_context(builder.get_environ()) - finally: - builder.close() - - def wsgi_app( - self, environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - """The actual WSGI application. This is not implemented in - :meth:`__call__` so that middlewares can be applied without - losing a reference to the app object. Instead of doing this:: - - app = MyMiddleware(app) - - It's a better idea to do this instead:: - - app.wsgi_app = MyMiddleware(app.wsgi_app) - - Then you still have the original application object around and - can continue to call methods on it. - - .. versionchanged:: 0.7 - Teardown events for the request and app contexts are called - even if an unhandled error occurs. Other events may not be - called depending on when an error occurs during dispatch. - See :ref:`callbacks-and-errors`. - - :param environ: A WSGI environment. - :param start_response: A callable accepting a status code, - a list of headers, and an optional exception context to - start the response. - """ - ctx = self.request_context(environ) - error: BaseException | None = None - try: - try: - ctx.push() - response = self.full_dispatch_request() - except Exception as e: - error = e - response = self.handle_exception(e) - except: # noqa: B001 - error = sys.exc_info()[1] - raise - return response(environ, start_response) - finally: - if "werkzeug.debug.preserve_context" in environ: - environ["werkzeug.debug.preserve_context"](_cv_app.get()) - environ["werkzeug.debug.preserve_context"](_cv_request.get()) - - if error is not None and self.should_ignore_error(error): - error = None - - ctx.pop(error) - - def __call__( - self, environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - """The WSGI server calls the Flask application object as the - WSGI application. This calls :meth:`wsgi_app`, which can be - wrapped to apply middleware. - """ - return self.wsgi_app(environ, start_response) diff --git a/port/lib/python3.11/site-packages/flask/blueprints.py b/port/lib/python3.11/site-packages/flask/blueprints.py deleted file mode 100644 index b6d4e43..0000000 --- a/port/lib/python3.11/site-packages/flask/blueprints.py +++ /dev/null @@ -1,128 +0,0 @@ -from __future__ import annotations - -import os -import typing as t -from datetime import timedelta - -from .cli import AppGroup -from .globals import current_app -from .helpers import send_from_directory -from .sansio.blueprints import Blueprint as SansioBlueprint -from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa -from .sansio.scaffold import _sentinel - -if t.TYPE_CHECKING: # pragma: no cover - from .wrappers import Response - - -class Blueprint(SansioBlueprint): - def __init__( - self, - name: str, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - url_prefix: str | None = None, - subdomain: str | None = None, - url_defaults: dict[str, t.Any] | None = None, - root_path: str | None = None, - cli_group: str | None = _sentinel, # type: ignore - ) -> None: - super().__init__( - name, - import_name, - static_folder, - static_url_path, - template_folder, - url_prefix, - subdomain, - url_defaults, - root_path, - cli_group, - ) - - #: The Click command group for registering CLI commands for this - #: object. The commands are available from the ``flask`` command - #: once the application has been discovered and blueprints have - #: been registered. - self.cli = AppGroup() - - # Set the name of the Click group in case someone wants to add - # the app's commands to another CLI tool. - self.cli.name = self.name - - def get_send_file_max_age(self, filename: str | None) -> int | None: - """Used by :func:`send_file` to determine the ``max_age`` cache - value for a given file path if it wasn't passed. - - By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from - the configuration of :data:`~flask.current_app`. This defaults - to ``None``, which tells the browser to use conditional requests - instead of a timed cache, which is usually preferable. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionchanged:: 2.0 - The default configuration is ``None`` instead of 12 hours. - - .. versionadded:: 0.9 - """ - value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] - - if value is None: - return None - - if isinstance(value, timedelta): - return int(value.total_seconds()) - - return value # type: ignore[no-any-return] - - def send_static_file(self, filename: str) -> Response: - """The view function used to serve files from - :attr:`static_folder`. A route is automatically registered for - this view at :attr:`static_url_path` if :attr:`static_folder` is - set. - - Note this is a duplicate of the same method in the Flask - class. - - .. versionadded:: 0.5 - - """ - if not self.has_static_folder: - raise RuntimeError("'static_folder' must be set to serve static_files.") - - # send_file only knows to call get_send_file_max_age on the app, - # call it here so it works for blueprints too. - max_age = self.get_send_file_max_age(filename) - return send_from_directory( - t.cast(str, self.static_folder), filename, max_age=max_age - ) - - def open_resource( - self, resource: str, mode: str = "rb", encoding: str | None = "utf-8" - ) -> t.IO[t.AnyStr]: - """Open a resource file relative to :attr:`root_path` for reading. The - blueprint-relative equivalent of the app's :meth:`~.Flask.open_resource` - method. - - :param resource: Path to the resource relative to :attr:`root_path`. - :param mode: Open the file in this mode. Only reading is supported, - valid values are ``"r"`` (or ``"rt"``) and ``"rb"``. - :param encoding: Open the file with this encoding when opening in text - mode. This is ignored when opening in binary mode. - - .. versionchanged:: 3.1 - Added the ``encoding`` parameter. - """ - if mode not in {"r", "rt", "rb"}: - raise ValueError("Resources can only be opened for reading.") - - path = os.path.join(self.root_path, resource) - - if mode == "rb": - return open(path, mode) # pyright: ignore - - return open(path, mode, encoding=encoding) diff --git a/port/lib/python3.11/site-packages/flask/cli.py b/port/lib/python3.11/site-packages/flask/cli.py deleted file mode 100644 index dd03f3c..0000000 --- a/port/lib/python3.11/site-packages/flask/cli.py +++ /dev/null @@ -1,1133 +0,0 @@ -from __future__ import annotations - -import ast -import collections.abc as cabc -import importlib.metadata -import inspect -import os -import platform -import re -import sys -import traceback -import typing as t -from functools import update_wrapper -from operator import itemgetter -from types import ModuleType - -import click -from click.core import ParameterSource -from werkzeug import run_simple -from werkzeug.serving import is_running_from_reloader -from werkzeug.utils import import_string - -from .globals import current_app -from .helpers import get_debug_flag -from .helpers import get_load_dotenv - -if t.TYPE_CHECKING: - import ssl - - from _typeshed.wsgi import StartResponse - from _typeshed.wsgi import WSGIApplication - from _typeshed.wsgi import WSGIEnvironment - - from .app import Flask - - -class NoAppException(click.UsageError): - """Raised if an application cannot be found or loaded.""" - - -def find_best_app(module: ModuleType) -> Flask: - """Given a module instance this tries to find the best possible - application in the module or raises an exception. - """ - from . import Flask - - # Search for the most common names first. - for attr_name in ("app", "application"): - app = getattr(module, attr_name, None) - - if isinstance(app, Flask): - return app - - # Otherwise find the only object that is a Flask instance. - matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] - - if len(matches) == 1: - return matches[0] - elif len(matches) > 1: - raise NoAppException( - "Detected multiple Flask applications in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify the correct one." - ) - - # Search for app factory functions. - for attr_name in ("create_app", "make_app"): - app_factory = getattr(module, attr_name, None) - - if inspect.isfunction(app_factory): - try: - app = app_factory() - - if isinstance(app, Flask): - return app - except TypeError as e: - if not _called_with_wrong_args(app_factory): - raise - - raise NoAppException( - f"Detected factory '{attr_name}' in module '{module.__name__}'," - " but could not call it without arguments. Use" - f" '{module.__name__}:{attr_name}(args)'" - " to specify arguments." - ) from e - - raise NoAppException( - "Failed to find Flask application or factory in module" - f" '{module.__name__}'. Use '{module.__name__}:name'" - " to specify one." - ) - - -def _called_with_wrong_args(f: t.Callable[..., Flask]) -> bool: - """Check whether calling a function raised a ``TypeError`` because - the call failed or because something in the factory raised the - error. - - :param f: The function that was called. - :return: ``True`` if the call failed. - """ - tb = sys.exc_info()[2] - - try: - while tb is not None: - if tb.tb_frame.f_code is f.__code__: - # In the function, it was called successfully. - return False - - tb = tb.tb_next - - # Didn't reach the function. - return True - finally: - # Delete tb to break a circular reference. - # https://docs.python.org/2/library/sys.html#sys.exc_info - del tb - - -def find_app_by_string(module: ModuleType, app_name: str) -> Flask: - """Check if the given string is a variable name or a function. Call - a function to get the app instance, or return the variable directly. - """ - from . import Flask - - # Parse app_name as a single expression to determine if it's a valid - # attribute name or function call. - try: - expr = ast.parse(app_name.strip(), mode="eval").body - except SyntaxError: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) from None - - if isinstance(expr, ast.Name): - name = expr.id - args = [] - kwargs = {} - elif isinstance(expr, ast.Call): - # Ensure the function name is an attribute name only. - if not isinstance(expr.func, ast.Name): - raise NoAppException( - f"Function reference must be a simple name: {app_name!r}." - ) - - name = expr.func.id - - # Parse the positional and keyword arguments as literals. - try: - args = [ast.literal_eval(arg) for arg in expr.args] - kwargs = { - kw.arg: ast.literal_eval(kw.value) - for kw in expr.keywords - if kw.arg is not None - } - except ValueError: - # literal_eval gives cryptic error messages, show a generic - # message with the full expression instead. - raise NoAppException( - f"Failed to parse arguments as literal values: {app_name!r}." - ) from None - else: - raise NoAppException( - f"Failed to parse {app_name!r} as an attribute name or function call." - ) - - try: - attr = getattr(module, name) - except AttributeError as e: - raise NoAppException( - f"Failed to find attribute {name!r} in {module.__name__!r}." - ) from e - - # If the attribute is a function, call it with any args and kwargs - # to get the real application. - if inspect.isfunction(attr): - try: - app = attr(*args, **kwargs) - except TypeError as e: - if not _called_with_wrong_args(attr): - raise - - raise NoAppException( - f"The factory {app_name!r} in module" - f" {module.__name__!r} could not be called with the" - " specified arguments." - ) from e - else: - app = attr - - if isinstance(app, Flask): - return app - - raise NoAppException( - "A valid Flask application was not obtained from" - f" '{module.__name__}:{app_name}'." - ) - - -def prepare_import(path: str) -> str: - """Given a filename this will try to calculate the python path, add it - to the search path and return the actual module name that is expected. - """ - path = os.path.realpath(path) - - fname, ext = os.path.splitext(path) - if ext == ".py": - path = fname - - if os.path.basename(path) == "__init__": - path = os.path.dirname(path) - - module_name = [] - - # move up until outside package structure (no __init__.py) - while True: - path, name = os.path.split(path) - module_name.append(name) - - if not os.path.exists(os.path.join(path, "__init__.py")): - break - - if sys.path[0] != path: - sys.path.insert(0, path) - - return ".".join(module_name[::-1]) - - -@t.overload -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: t.Literal[True] = True -) -> Flask: ... - - -@t.overload -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: t.Literal[False] = ... -) -> Flask | None: ... - - -def locate_app( - module_name: str, app_name: str | None, raise_if_not_found: bool = True -) -> Flask | None: - try: - __import__(module_name) - except ImportError: - # Reraise the ImportError if it occurred within the imported module. - # Determine this by checking whether the trace has a depth > 1. - if sys.exc_info()[2].tb_next: # type: ignore[union-attr] - raise NoAppException( - f"While importing {module_name!r}, an ImportError was" - f" raised:\n\n{traceback.format_exc()}" - ) from None - elif raise_if_not_found: - raise NoAppException(f"Could not import {module_name!r}.") from None - else: - return None - - module = sys.modules[module_name] - - if app_name is None: - return find_best_app(module) - else: - return find_app_by_string(module, app_name) - - -def get_version(ctx: click.Context, param: click.Parameter, value: t.Any) -> None: - if not value or ctx.resilient_parsing: - return - - flask_version = importlib.metadata.version("flask") - werkzeug_version = importlib.metadata.version("werkzeug") - - click.echo( - f"Python {platform.python_version()}\n" - f"Flask {flask_version}\n" - f"Werkzeug {werkzeug_version}", - color=ctx.color, - ) - ctx.exit() - - -version_option = click.Option( - ["--version"], - help="Show the Flask version.", - expose_value=False, - callback=get_version, - is_flag=True, - is_eager=True, -) - - -class ScriptInfo: - """Helper object to deal with Flask applications. This is usually not - necessary to interface with as it's used internally in the dispatching - to click. In future versions of Flask this object will most likely play - a bigger role. Typically it's created automatically by the - :class:`FlaskGroup` but you can also manually create it and pass it - onwards as click object. - - .. versionchanged:: 3.1 - Added the ``load_dotenv_defaults`` parameter and attribute. - """ - - def __init__( - self, - app_import_path: str | None = None, - create_app: t.Callable[..., Flask] | None = None, - set_debug_flag: bool = True, - load_dotenv_defaults: bool = True, - ) -> None: - #: Optionally the import path for the Flask application. - self.app_import_path = app_import_path - #: Optionally a function that is passed the script info to create - #: the instance of the application. - self.create_app = create_app - #: A dictionary with arbitrary data that can be associated with - #: this script info. - self.data: dict[t.Any, t.Any] = {} - self.set_debug_flag = set_debug_flag - - self.load_dotenv_defaults = get_load_dotenv(load_dotenv_defaults) - """Whether default ``.flaskenv`` and ``.env`` files should be loaded. - - ``ScriptInfo`` doesn't load anything, this is for reference when doing - the load elsewhere during processing. - - .. versionadded:: 3.1 - """ - - self._loaded_app: Flask | None = None - - def load_app(self) -> Flask: - """Loads the Flask app (if not yet loaded) and returns it. Calling - this multiple times will just result in the already loaded app to - be returned. - """ - if self._loaded_app is not None: - return self._loaded_app - app: Flask | None = None - if self.create_app is not None: - app = self.create_app() - else: - if self.app_import_path: - path, name = ( - re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] - )[:2] - import_name = prepare_import(path) - app = locate_app(import_name, name) - else: - for path in ("wsgi.py", "app.py"): - import_name = prepare_import(path) - app = locate_app(import_name, None, raise_if_not_found=False) - - if app is not None: - break - - if app is None: - raise NoAppException( - "Could not locate a Flask application. Use the" - " 'flask --app' option, 'FLASK_APP' environment" - " variable, or a 'wsgi.py' or 'app.py' file in the" - " current directory." - ) - - if self.set_debug_flag: - # Update the app's debug flag through the descriptor so that - # other values repopulate as well. - app.debug = get_debug_flag() - - self._loaded_app = app - return app - - -pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def with_appcontext(f: F) -> F: - """Wraps a callback so that it's guaranteed to be executed with the - script's application context. - - Custom commands (and their options) registered under ``app.cli`` or - ``blueprint.cli`` will always have an app context available, this - decorator is not required in that case. - - .. versionchanged:: 2.2 - The app context is active for subcommands as well as the - decorated callback. The app context is always available to - ``app.cli`` command and parameter callbacks. - """ - - @click.pass_context - def decorator(ctx: click.Context, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - if not current_app: - app = ctx.ensure_object(ScriptInfo).load_app() - ctx.with_resource(app.app_context()) - - return ctx.invoke(f, *args, **kwargs) - - return update_wrapper(decorator, f) # type: ignore[return-value] - - -class AppGroup(click.Group): - """This works similar to a regular click :class:`~click.Group` but it - changes the behavior of the :meth:`command` decorator so that it - automatically wraps the functions in :func:`with_appcontext`. - - Not to be confused with :class:`FlaskGroup`. - """ - - def command( # type: ignore[override] - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], click.Command]: - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` - unless it's disabled by passing ``with_appcontext=False``. - """ - wrap_for_ctx = kwargs.pop("with_appcontext", True) - - def decorator(f: t.Callable[..., t.Any]) -> click.Command: - if wrap_for_ctx: - f = with_appcontext(f) - return super(AppGroup, self).command(*args, **kwargs)(f) # type: ignore[no-any-return] - - return decorator - - def group( # type: ignore[override] - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], click.Group]: - """This works exactly like the method of the same name on a regular - :class:`click.Group` but it defaults the group class to - :class:`AppGroup`. - """ - kwargs.setdefault("cls", AppGroup) - return super().group(*args, **kwargs) # type: ignore[no-any-return] - - -def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: - if value is None: - return None - - info = ctx.ensure_object(ScriptInfo) - info.app_import_path = value - return value - - -# This option is eager so the app will be available if --help is given. -# --help is also eager, so --app must be before it in the param list. -# no_args_is_help bypasses eager processing, so this option must be -# processed manually in that case to ensure FLASK_APP gets picked up. -_app_option = click.Option( - ["-A", "--app"], - metavar="IMPORT", - help=( - "The Flask application or factory function to load, in the form 'module:name'." - " Module can be a dotted import or file path. Name is not required if it is" - " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" - " pass arguments." - ), - is_eager=True, - expose_value=False, - callback=_set_app, -) - - -def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: - # If the flag isn't provided, it will default to False. Don't use - # that, let debug be set by env in that case. - source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] - - if source is not None and source in ( - ParameterSource.DEFAULT, - ParameterSource.DEFAULT_MAP, - ): - return None - - # Set with env var instead of ScriptInfo.load so that it can be - # accessed early during a factory function. - os.environ["FLASK_DEBUG"] = "1" if value else "0" - return value - - -_debug_option = click.Option( - ["--debug/--no-debug"], - help="Set debug mode.", - expose_value=False, - callback=_set_debug, -) - - -def _env_file_callback( - ctx: click.Context, param: click.Option, value: str | None -) -> str | None: - try: - import dotenv # noqa: F401 - except ImportError: - # Only show an error if a value was passed, otherwise we still want to - # call load_dotenv and show a message without exiting. - if value is not None: - raise click.BadParameter( - "python-dotenv must be installed to load an env file.", - ctx=ctx, - param=param, - ) from None - - # Load if a value was passed, or we want to load default files, or both. - if value is not None or ctx.obj.load_dotenv_defaults: - load_dotenv(value, load_defaults=ctx.obj.load_dotenv_defaults) - - return value - - -# This option is eager so env vars are loaded as early as possible to be -# used by other options. -_env_file_option = click.Option( - ["-e", "--env-file"], - type=click.Path(exists=True, dir_okay=False), - help=( - "Load environment variables from this file, taking precedence over" - " those set by '.env' and '.flaskenv'. Variables set directly in the" - " environment take highest precedence. python-dotenv must be installed." - ), - is_eager=True, - expose_value=False, - callback=_env_file_callback, -) - - -class FlaskGroup(AppGroup): - """Special subclass of the :class:`AppGroup` group that supports - loading more commands from the configured Flask app. Normally a - developer does not have to interface with this class but there are - some very advanced use cases for which it makes sense to create an - instance of this. see :ref:`custom-scripts`. - - :param add_default_commands: if this is True then the default run and - shell commands will be added. - :param add_version_option: adds the ``--version`` option. - :param create_app: an optional callback that is passed the script info and - returns the loaded app. - :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` - files to set environment variables. Will also change the working - directory to the directory containing the first file found. - :param set_debug_flag: Set the app's debug flag. - - .. versionchanged:: 3.1 - ``-e path`` takes precedence over default ``.env`` and ``.flaskenv`` files. - - .. versionchanged:: 2.2 - Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. - - .. versionchanged:: 2.2 - An app context is pushed when running ``app.cli`` commands, so - ``@with_appcontext`` is no longer required for those commands. - - .. versionchanged:: 1.0 - If installed, python-dotenv will be used to load environment variables - from :file:`.env` and :file:`.flaskenv` files. - """ - - def __init__( - self, - add_default_commands: bool = True, - create_app: t.Callable[..., Flask] | None = None, - add_version_option: bool = True, - load_dotenv: bool = True, - set_debug_flag: bool = True, - **extra: t.Any, - ) -> None: - params: list[click.Parameter] = list(extra.pop("params", None) or ()) - # Processing is done with option callbacks instead of a group - # callback. This allows users to make a custom group callback - # without losing the behavior. --env-file must come first so - # that it is eagerly evaluated before --app. - params.extend((_env_file_option, _app_option, _debug_option)) - - if add_version_option: - params.append(version_option) - - if "context_settings" not in extra: - extra["context_settings"] = {} - - extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") - - super().__init__(params=params, **extra) - - self.create_app = create_app - self.load_dotenv = load_dotenv - self.set_debug_flag = set_debug_flag - - if add_default_commands: - self.add_command(run_command) - self.add_command(shell_command) - self.add_command(routes_command) - - self._loaded_plugin_commands = False - - def _load_plugin_commands(self) -> None: - if self._loaded_plugin_commands: - return - - if sys.version_info >= (3, 10): - from importlib import metadata - else: - # Use a backport on Python < 3.10. We technically have - # importlib.metadata on 3.8+, but the API changed in 3.10, - # so use the backport for consistency. - import importlib_metadata as metadata # pyright: ignore - - for ep in metadata.entry_points(group="flask.commands"): - self.add_command(ep.load(), ep.name) - - self._loaded_plugin_commands = True - - def get_command(self, ctx: click.Context, name: str) -> click.Command | None: - self._load_plugin_commands() - # Look up built-in and plugin commands, which should be - # available even if the app fails to load. - rv = super().get_command(ctx, name) - - if rv is not None: - return rv - - info = ctx.ensure_object(ScriptInfo) - - # Look up commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - app = info.load_app() - except NoAppException as e: - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - return None - - # Push an app context for the loaded app unless it is already - # active somehow. This makes the context available to parameter - # and command callbacks without needing @with_appcontext. - if not current_app or current_app._get_current_object() is not app: # type: ignore[attr-defined] - ctx.with_resource(app.app_context()) - - return app.cli.get_command(ctx, name) - - def list_commands(self, ctx: click.Context) -> list[str]: - self._load_plugin_commands() - # Start with the built-in and plugin commands. - rv = set(super().list_commands(ctx)) - info = ctx.ensure_object(ScriptInfo) - - # Add commands provided by the app, showing an error and - # continuing if the app couldn't be loaded. - try: - rv.update(info.load_app().cli.list_commands(ctx)) - except NoAppException as e: - # When an app couldn't be loaded, show the error message - # without the traceback. - click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") - except Exception: - # When any other errors occurred during loading, show the - # full traceback. - click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") - - return sorted(rv) - - def make_context( - self, - info_name: str | None, - args: list[str], - parent: click.Context | None = None, - **extra: t.Any, - ) -> click.Context: - # Set a flag to tell app.run to become a no-op. If app.run was - # not in a __name__ == __main__ guard, it would start the server - # when importing, blocking whatever command is being called. - os.environ["FLASK_RUN_FROM_CLI"] = "true" - - if "obj" not in extra and "obj" not in self.context_settings: - extra["obj"] = ScriptInfo( - create_app=self.create_app, - set_debug_flag=self.set_debug_flag, - load_dotenv_defaults=self.load_dotenv, - ) - - return super().make_context(info_name, args, parent=parent, **extra) - - def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help: - # Attempt to load --env-file and --app early in case they - # were given as env vars. Otherwise no_args_is_help will not - # see commands from app.cli. - _env_file_option.handle_parse_result(ctx, {}, []) - _app_option.handle_parse_result(ctx, {}, []) - - return super().parse_args(ctx, args) - - -def _path_is_ancestor(path: str, other: str) -> bool: - """Take ``other`` and remove the length of ``path`` from it. Then join it - to ``path``. If it is the original value, ``path`` is an ancestor of - ``other``.""" - return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other - - -def load_dotenv( - path: str | os.PathLike[str] | None = None, load_defaults: bool = True -) -> bool: - """Load "dotenv" files to set environment variables. A given path takes - precedence over ``.env``, which takes precedence over ``.flaskenv``. After - loading and combining these files, values are only set if the key is not - already set in ``os.environ``. - - This is a no-op if `python-dotenv`_ is not installed. - - .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme - - :param path: Load the file at this location. - :param load_defaults: Search for and load the default ``.flaskenv`` and - ``.env`` files. - :return: ``True`` if at least one env var was loaded. - - .. versionchanged:: 3.1 - Added the ``load_defaults`` parameter. A given path takes precedence - over default files. - - .. versionchanged:: 2.0 - The current directory is not changed to the location of the - loaded file. - - .. versionchanged:: 2.0 - When loading the env files, set the default encoding to UTF-8. - - .. versionchanged:: 1.1.0 - Returns ``False`` when python-dotenv is not installed, or when - the given path isn't a file. - - .. versionadded:: 1.0 - """ - try: - import dotenv - except ImportError: - if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): - click.secho( - " * Tip: There are .env files present. Install python-dotenv" - " to use them.", - fg="yellow", - err=True, - ) - - return False - - data: dict[str, str | None] = {} - - if load_defaults: - for default_name in (".flaskenv", ".env"): - if not (default_path := dotenv.find_dotenv(default_name, usecwd=True)): - continue - - data |= dotenv.dotenv_values(default_path, encoding="utf-8") - - if path is not None and os.path.isfile(path): - data |= dotenv.dotenv_values(path, encoding="utf-8") - - for key, value in data.items(): - if key in os.environ or value is None: - continue - - os.environ[key] = value - - return bool(data) # True if at least one env var was loaded. - - -def show_server_banner(debug: bool, app_import_path: str | None) -> None: - """Show extra startup messages the first time the server is run, - ignoring the reloader. - """ - if is_running_from_reloader(): - return - - if app_import_path is not None: - click.echo(f" * Serving Flask app '{app_import_path}'") - - if debug is not None: - click.echo(f" * Debug mode: {'on' if debug else 'off'}") - - -class CertParamType(click.ParamType): - """Click option type for the ``--cert`` option. Allows either an - existing file, the string ``'adhoc'``, or an import for a - :class:`~ssl.SSLContext` object. - """ - - name = "path" - - def __init__(self) -> None: - self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) - - def convert( - self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None - ) -> t.Any: - try: - import ssl - except ImportError: - raise click.BadParameter( - 'Using "--cert" requires Python to be compiled with SSL support.', - ctx, - param, - ) from None - - try: - return self.path_type(value, param, ctx) - except click.BadParameter: - value = click.STRING(value, param, ctx).lower() - - if value == "adhoc": - try: - import cryptography # noqa: F401 - except ImportError: - raise click.BadParameter( - "Using ad-hoc certificates requires the cryptography library.", - ctx, - param, - ) from None - - return value - - obj = import_string(value, silent=True) - - if isinstance(obj, ssl.SSLContext): - return obj - - raise - - -def _validate_key(ctx: click.Context, param: click.Parameter, value: t.Any) -> t.Any: - """The ``--key`` option must be specified when ``--cert`` is a file. - Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. - """ - cert = ctx.params.get("cert") - is_adhoc = cert == "adhoc" - - try: - import ssl - except ImportError: - is_context = False - else: - is_context = isinstance(cert, ssl.SSLContext) - - if value is not None: - if is_adhoc: - raise click.BadParameter( - 'When "--cert" is "adhoc", "--key" is not used.', ctx, param - ) - - if is_context: - raise click.BadParameter( - 'When "--cert" is an SSLContext object, "--key" is not used.', - ctx, - param, - ) - - if not cert: - raise click.BadParameter('"--cert" must also be specified.', ctx, param) - - ctx.params["cert"] = cert, value - - else: - if cert and not (is_adhoc or is_context): - raise click.BadParameter('Required when using "--cert".', ctx, param) - - return value - - -class SeparatedPathType(click.Path): - """Click option type that accepts a list of values separated by the - OS's path separator (``:``, ``;`` on Windows). Each value is - validated as a :class:`click.Path` type. - """ - - def convert( - self, value: t.Any, param: click.Parameter | None, ctx: click.Context | None - ) -> t.Any: - items = self.split_envvar_value(value) - # can't call no-arg super() inside list comprehension until Python 3.12 - super_convert = super().convert - return [super_convert(item, param, ctx) for item in items] - - -@click.command("run", short_help="Run a development server.") -@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") -@click.option("--port", "-p", default=5000, help="The port to bind to.") -@click.option( - "--cert", - type=CertParamType(), - help="Specify a certificate file to use HTTPS.", - is_eager=True, -) -@click.option( - "--key", - type=click.Path(exists=True, dir_okay=False, resolve_path=True), - callback=_validate_key, - expose_value=False, - help="The key file to use when specifying a certificate.", -) -@click.option( - "--reload/--no-reload", - default=None, - help="Enable or disable the reloader. By default the reloader " - "is active if debug is enabled.", -) -@click.option( - "--debugger/--no-debugger", - default=None, - help="Enable or disable the debugger. By default the debugger " - "is active if debug is enabled.", -) -@click.option( - "--with-threads/--without-threads", - default=True, - help="Enable or disable multithreading.", -) -@click.option( - "--extra-files", - default=None, - type=SeparatedPathType(), - help=( - "Extra files that trigger a reload on change. Multiple paths" - f" are separated by {os.path.pathsep!r}." - ), -) -@click.option( - "--exclude-patterns", - default=None, - type=SeparatedPathType(), - help=( - "Files matching these fnmatch patterns will not trigger a reload" - " on change. Multiple patterns are separated by" - f" {os.path.pathsep!r}." - ), -) -@pass_script_info -def run_command( - info: ScriptInfo, - host: str, - port: int, - reload: bool, - debugger: bool, - with_threads: bool, - cert: ssl.SSLContext | tuple[str, str | None] | t.Literal["adhoc"] | None, - extra_files: list[str] | None, - exclude_patterns: list[str] | None, -) -> None: - """Run a local development server. - - This server is for development purposes only. It does not provide - the stability, security, or performance of production WSGI servers. - - The reloader and debugger are enabled by default with the '--debug' - option. - """ - try: - app: WSGIApplication = info.load_app() # pyright: ignore - except Exception as e: - if is_running_from_reloader(): - # When reloading, print out the error immediately, but raise - # it later so the debugger or server can handle it. - traceback.print_exc() - err = e - - def app( - environ: WSGIEnvironment, start_response: StartResponse - ) -> cabc.Iterable[bytes]: - raise err from None - - else: - # When not reloading, raise the error immediately so the - # command fails. - raise e from None - - debug = get_debug_flag() - - if reload is None: - reload = debug - - if debugger is None: - debugger = debug - - show_server_banner(debug, info.app_import_path) - - run_simple( - host, - port, - app, - use_reloader=reload, - use_debugger=debugger, - threaded=with_threads, - ssl_context=cert, - extra_files=extra_files, - exclude_patterns=exclude_patterns, - ) - - -run_command.params.insert(0, _debug_option) - - -@click.command("shell", short_help="Run a shell in the app context.") -@with_appcontext -def shell_command() -> None: - """Run an interactive Python shell in the context of a given - Flask application. The application will populate the default - namespace of this shell according to its configuration. - - This is useful for executing small snippets of management code - without having to manually configure the application. - """ - import code - - banner = ( - f"Python {sys.version} on {sys.platform}\n" - f"App: {current_app.import_name}\n" - f"Instance: {current_app.instance_path}" - ) - ctx: dict[str, t.Any] = {} - - # Support the regular Python interpreter startup script if someone - # is using it. - startup = os.environ.get("PYTHONSTARTUP") - if startup and os.path.isfile(startup): - with open(startup) as f: - eval(compile(f.read(), startup, "exec"), ctx) - - ctx.update(current_app.make_shell_context()) - - # Site, customize, or startup script can set a hook to call when - # entering interactive mode. The default one sets up readline with - # tab and history completion. - interactive_hook = getattr(sys, "__interactivehook__", None) - - if interactive_hook is not None: - try: - import readline - from rlcompleter import Completer - except ImportError: - pass - else: - # rlcompleter uses __main__.__dict__ by default, which is - # flask.__main__. Use the shell context instead. - readline.set_completer(Completer(ctx).complete) - - interactive_hook() - - code.interact(banner=banner, local=ctx) - - -@click.command("routes", short_help="Show the routes for the app.") -@click.option( - "--sort", - "-s", - type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), - default="endpoint", - help=( - "Method to sort routes by. 'match' is the order that Flask will match routes" - " when dispatching a request." - ), -) -@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") -@with_appcontext -def routes_command(sort: str, all_methods: bool) -> None: - """Show all registered routes with endpoints and methods.""" - rules = list(current_app.url_map.iter_rules()) - - if not rules: - click.echo("No routes were registered.") - return - - ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} - host_matching = current_app.url_map.host_matching - has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) - rows = [] - - for rule in rules: - row = [ - rule.endpoint, - ", ".join(sorted((rule.methods or set()) - ignored_methods)), - ] - - if has_domain: - row.append((rule.host if host_matching else rule.subdomain) or "") - - row.append(rule.rule) - rows.append(row) - - headers = ["Endpoint", "Methods"] - sorts = ["endpoint", "methods"] - - if has_domain: - headers.append("Host" if host_matching else "Subdomain") - sorts.append("domain") - - headers.append("Rule") - sorts.append("rule") - - try: - rows.sort(key=itemgetter(sorts.index(sort))) - except ValueError: - pass - - rows.insert(0, headers) - widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] - rows.insert(1, ["-" * w for w in widths]) - template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) - - for row in rows: - click.echo(template.format(*row)) - - -cli = FlaskGroup( - name="flask", - help="""\ -A general utility script for Flask applications. - -An application to load must be given with the '--app' option, -'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file -in the current directory. -""", -) - - -def main() -> None: - cli.main() - - -if __name__ == "__main__": - main() diff --git a/port/lib/python3.11/site-packages/flask/config.py b/port/lib/python3.11/site-packages/flask/config.py deleted file mode 100644 index 34ef1a5..0000000 --- a/port/lib/python3.11/site-packages/flask/config.py +++ /dev/null @@ -1,367 +0,0 @@ -from __future__ import annotations - -import errno -import json -import os -import types -import typing as t - -from werkzeug.utils import import_string - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .sansio.app import App - - -T = t.TypeVar("T") - - -class ConfigAttribute(t.Generic[T]): - """Makes an attribute forward to the config""" - - def __init__( - self, name: str, get_converter: t.Callable[[t.Any], T] | None = None - ) -> None: - self.__name__ = name - self.get_converter = get_converter - - @t.overload - def __get__(self, obj: None, owner: None) -> te.Self: ... - - @t.overload - def __get__(self, obj: App, owner: type[App]) -> T: ... - - def __get__(self, obj: App | None, owner: type[App] | None = None) -> T | te.Self: - if obj is None: - return self - - rv = obj.config[self.__name__] - - if self.get_converter is not None: - rv = self.get_converter(rv) - - return rv # type: ignore[no-any-return] - - def __set__(self, obj: App, value: t.Any) -> None: - obj.config[self.__name__] = value - - -class Config(dict): # type: ignore[type-arg] - """Works exactly like a dict but provides ways to fill it from files - or special dictionaries. There are two common patterns to populate the - config. - - Either you can fill the config from a config file:: - - app.config.from_pyfile('yourconfig.cfg') - - Or alternatively you can define the configuration options in the - module that calls :meth:`from_object` or provide an import path to - a module that should be loaded. It is also possible to tell it to - use the same module and with that provide the configuration values - just before the call:: - - DEBUG = True - SECRET_KEY = 'development key' - app.config.from_object(__name__) - - In both cases (loading from any Python file or loading from modules), - only uppercase keys are added to the config. This makes it possible to use - lowercase values in the config file for temporary values that are not added - to the config or to define the config keys in the same file that implements - the application. - - Probably the most interesting way to load configurations is from an - environment variable pointing to a file:: - - app.config.from_envvar('YOURAPPLICATION_SETTINGS') - - In this case before launching the application you have to set this - environment variable to the file you want to use. On Linux and OS X - use the export statement:: - - export YOURAPPLICATION_SETTINGS='/path/to/config/file' - - On windows use `set` instead. - - :param root_path: path to which files are read relative from. When the - config object is created by the application, this is - the application's :attr:`~flask.Flask.root_path`. - :param defaults: an optional dictionary of default values - """ - - def __init__( - self, - root_path: str | os.PathLike[str], - defaults: dict[str, t.Any] | None = None, - ) -> None: - super().__init__(defaults or {}) - self.root_path = root_path - - def from_envvar(self, variable_name: str, silent: bool = False) -> bool: - """Loads a configuration from an environment variable pointing to - a configuration file. This is basically just a shortcut with nicer - error messages for this line of code:: - - app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) - - :param variable_name: name of the environment variable - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - """ - rv = os.environ.get(variable_name) - if not rv: - if silent: - return False - raise RuntimeError( - f"The environment variable {variable_name!r} is not set" - " and as such configuration could not be loaded. Set" - " this variable and make it point to a configuration" - " file" - ) - return self.from_pyfile(rv, silent=silent) - - def from_prefixed_env( - self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads - ) -> bool: - """Load any environment variables that start with ``FLASK_``, - dropping the prefix from the env key for the config key. Values - are passed through a loading function to attempt to convert them - to more specific types than strings. - - Keys are loaded in :func:`sorted` order. - - The default loading function attempts to parse values as any - valid JSON type, including dicts and lists. - - Specific items in nested dicts can be set by separating the - keys with double underscores (``__``). If an intermediate key - doesn't exist, it will be initialized to an empty dict. - - :param prefix: Load env vars that start with this prefix, - separated with an underscore (``_``). - :param loads: Pass each string value to this function and use - the returned value as the config value. If any error is - raised it is ignored and the value remains a string. The - default is :func:`json.loads`. - - .. versionadded:: 2.1 - """ - prefix = f"{prefix}_" - - for key in sorted(os.environ): - if not key.startswith(prefix): - continue - - value = os.environ[key] - key = key.removeprefix(prefix) - - try: - value = loads(value) - except Exception: - # Keep the value as a string if loading failed. - pass - - if "__" not in key: - # A non-nested key, set directly. - self[key] = value - continue - - # Traverse nested dictionaries with keys separated by "__". - current = self - *parts, tail = key.split("__") - - for part in parts: - # If an intermediate dict does not exist, create it. - if part not in current: - current[part] = {} - - current = current[part] - - current[tail] = value - - return True - - def from_pyfile( - self, filename: str | os.PathLike[str], silent: bool = False - ) -> bool: - """Updates the values in the config from a Python file. This function - behaves as if the file was imported as module with the - :meth:`from_object` function. - - :param filename: the filename of the config. This can either be an - absolute filename or a filename relative to the - root path. - :param silent: set to ``True`` if you want silent failure for missing - files. - :return: ``True`` if the file was loaded successfully. - - .. versionadded:: 0.7 - `silent` parameter. - """ - filename = os.path.join(self.root_path, filename) - d = types.ModuleType("config") - d.__file__ = filename - try: - with open(filename, mode="rb") as config_file: - exec(compile(config_file.read(), filename, "exec"), d.__dict__) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): - return False - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - self.from_object(d) - return True - - def from_object(self, obj: object | str) -> None: - """Updates the values from the given object. An object can be of one - of the following two types: - - - a string: in this case the object with that name will be imported - - an actual object reference: that object is used directly - - Objects are usually either modules or classes. :meth:`from_object` - loads only the uppercase attributes of the module/class. A ``dict`` - object will not work with :meth:`from_object` because the keys of a - ``dict`` are not attributes of the ``dict`` class. - - Example of module-based configuration:: - - app.config.from_object('yourapplication.default_config') - from yourapplication import default_config - app.config.from_object(default_config) - - Nothing is done to the object before loading. If the object is a - class and has ``@property`` attributes, it needs to be - instantiated before being passed to this method. - - You should not use this function to load the actual configuration but - rather configuration defaults. The actual config should be loaded - with :meth:`from_pyfile` and ideally from a location not within the - package because the package might be installed system wide. - - See :ref:`config-dev-prod` for an example of class-based configuration - using :meth:`from_object`. - - :param obj: an import name or object - """ - if isinstance(obj, str): - obj = import_string(obj) - for key in dir(obj): - if key.isupper(): - self[key] = getattr(obj, key) - - def from_file( - self, - filename: str | os.PathLike[str], - load: t.Callable[[t.IO[t.Any]], t.Mapping[str, t.Any]], - silent: bool = False, - text: bool = True, - ) -> bool: - """Update the values in the config from a file that is loaded - using the ``load`` parameter. The loaded data is passed to the - :meth:`from_mapping` method. - - .. code-block:: python - - import json - app.config.from_file("config.json", load=json.load) - - import tomllib - app.config.from_file("config.toml", load=tomllib.load, text=False) - - :param filename: The path to the data file. This can be an - absolute path or relative to the config root path. - :param load: A callable that takes a file handle and returns a - mapping of loaded data from the file. - :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` - implements a ``read`` method. - :param silent: Ignore the file if it doesn't exist. - :param text: Open the file in text or binary mode. - :return: ``True`` if the file was loaded successfully. - - .. versionchanged:: 2.3 - The ``text`` parameter was added. - - .. versionadded:: 2.0 - """ - filename = os.path.join(self.root_path, filename) - - try: - with open(filename, "r" if text else "rb") as f: - obj = load(f) - except OSError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR): - return False - - e.strerror = f"Unable to load configuration file ({e.strerror})" - raise - - return self.from_mapping(obj) - - def from_mapping( - self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any - ) -> bool: - """Updates the config like :meth:`update` ignoring items with - non-upper keys. - - :return: Always returns ``True``. - - .. versionadded:: 0.11 - """ - mappings: dict[str, t.Any] = {} - if mapping is not None: - mappings.update(mapping) - mappings.update(kwargs) - for key, value in mappings.items(): - if key.isupper(): - self[key] = value - return True - - def get_namespace( - self, namespace: str, lowercase: bool = True, trim_namespace: bool = True - ) -> dict[str, t.Any]: - """Returns a dictionary containing a subset of configuration options - that match the specified namespace/prefix. Example usage:: - - app.config['IMAGE_STORE_TYPE'] = 'fs' - app.config['IMAGE_STORE_PATH'] = '/var/app/images' - app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' - image_store_config = app.config.get_namespace('IMAGE_STORE_') - - The resulting dictionary `image_store_config` would look like:: - - { - 'type': 'fs', - 'path': '/var/app/images', - 'base_url': 'http://img.website.com' - } - - This is often useful when configuration options map directly to - keyword arguments in functions or class constructors. - - :param namespace: a configuration namespace - :param lowercase: a flag indicating if the keys of the resulting - dictionary should be lowercase - :param trim_namespace: a flag indicating if the keys of the resulting - dictionary should not include the namespace - - .. versionadded:: 0.11 - """ - rv = {} - for k, v in self.items(): - if not k.startswith(namespace): - continue - if trim_namespace: - key = k[len(namespace) :] - else: - key = k - if lowercase: - key = key.lower() - rv[key] = v - return rv - - def __repr__(self) -> str: - return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/port/lib/python3.11/site-packages/flask/ctx.py b/port/lib/python3.11/site-packages/flask/ctx.py deleted file mode 100644 index 9b164d3..0000000 --- a/port/lib/python3.11/site-packages/flask/ctx.py +++ /dev/null @@ -1,449 +0,0 @@ -from __future__ import annotations - -import contextvars -import sys -import typing as t -from functools import update_wrapper -from types import TracebackType - -from werkzeug.exceptions import HTTPException - -from . import typing as ft -from .globals import _cv_app -from .globals import _cv_request -from .signals import appcontext_popped -from .signals import appcontext_pushed - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIEnvironment - - from .app import Flask - from .sessions import SessionMixin - from .wrappers import Request - - -# a singleton sentinel value for parameter defaults -_sentinel = object() - - -class _AppCtxGlobals: - """A plain object. Used as a namespace for storing data during an - application context. - - Creating an app context automatically creates this object, which is - made available as the :data:`g` proxy. - - .. describe:: 'key' in g - - Check whether an attribute is present. - - .. versionadded:: 0.10 - - .. describe:: iter(g) - - Return an iterator over the attribute names. - - .. versionadded:: 0.10 - """ - - # Define attr methods to let mypy know this is a namespace object - # that has arbitrary attributes. - - def __getattr__(self, name: str) -> t.Any: - try: - return self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def __setattr__(self, name: str, value: t.Any) -> None: - self.__dict__[name] = value - - def __delattr__(self, name: str) -> None: - try: - del self.__dict__[name] - except KeyError: - raise AttributeError(name) from None - - def get(self, name: str, default: t.Any | None = None) -> t.Any: - """Get an attribute by name, or a default value. Like - :meth:`dict.get`. - - :param name: Name of attribute to get. - :param default: Value to return if the attribute is not present. - - .. versionadded:: 0.10 - """ - return self.__dict__.get(name, default) - - def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: - """Get and remove an attribute by name. Like :meth:`dict.pop`. - - :param name: Name of attribute to pop. - :param default: Value to return if the attribute is not present, - instead of raising a ``KeyError``. - - .. versionadded:: 0.11 - """ - if default is _sentinel: - return self.__dict__.pop(name) - else: - return self.__dict__.pop(name, default) - - def setdefault(self, name: str, default: t.Any = None) -> t.Any: - """Get the value of an attribute if it is present, otherwise - set and return a default value. Like :meth:`dict.setdefault`. - - :param name: Name of attribute to get. - :param default: Value to set and return if the attribute is not - present. - - .. versionadded:: 0.11 - """ - return self.__dict__.setdefault(name, default) - - def __contains__(self, item: str) -> bool: - return item in self.__dict__ - - def __iter__(self) -> t.Iterator[str]: - return iter(self.__dict__) - - def __repr__(self) -> str: - ctx = _cv_app.get(None) - if ctx is not None: - return f"" - return object.__repr__(self) - - -def after_this_request( - f: ft.AfterRequestCallable[t.Any], -) -> ft.AfterRequestCallable[t.Any]: - """Executes a function after this request. This is useful to modify - response objects. The function is passed the response object and has - to return the same or a new one. - - Example:: - - @app.route('/') - def index(): - @after_this_request - def add_header(response): - response.headers['X-Foo'] = 'Parachute' - return response - return 'Hello World!' - - This is more useful if a function other than the view function wants to - modify a response. For instance think of a decorator that wants to add - some headers without converting the return value into a response object. - - .. versionadded:: 0.9 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'after_this_request' can only be used when a request" - " context is active, such as in a view function." - ) - - ctx._after_request_functions.append(f) - return f - - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -def copy_current_request_context(f: F) -> F: - """A helper function that decorates a function to retain the current - request context. This is useful when working with greenlets. The moment - the function is decorated a copy of the request context is created and - then pushed when the function is called. The current session is also - included in the copied request context. - - Example:: - - import gevent - from flask import copy_current_request_context - - @app.route('/') - def index(): - @copy_current_request_context - def do_some_work(): - # do some work here, it can access flask.request or - # flask.session like you would otherwise in the view function. - ... - gevent.spawn(do_some_work) - return 'Regular response' - - .. versionadded:: 0.10 - """ - ctx = _cv_request.get(None) - - if ctx is None: - raise RuntimeError( - "'copy_current_request_context' can only be used when a" - " request context is active, such as in a view function." - ) - - ctx = ctx.copy() - - def wrapper(*args: t.Any, **kwargs: t.Any) -> t.Any: - with ctx: # type: ignore[union-attr] - return ctx.app.ensure_sync(f)(*args, **kwargs) # type: ignore[union-attr] - - return update_wrapper(wrapper, f) # type: ignore[return-value] - - -def has_request_context() -> bool: - """If you have code that wants to test if a request context is there or - not this function can be used. For instance, you may want to take advantage - of request information if the request object is available, but fail - silently if it is unavailable. - - :: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and has_request_context(): - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - Alternatively you can also just test any of the context bound objects - (such as :class:`request` or :class:`g`) for truthness:: - - class User(db.Model): - - def __init__(self, username, remote_addr=None): - self.username = username - if remote_addr is None and request: - remote_addr = request.remote_addr - self.remote_addr = remote_addr - - .. versionadded:: 0.7 - """ - return _cv_request.get(None) is not None - - -def has_app_context() -> bool: - """Works like :func:`has_request_context` but for the application - context. You can also just do a boolean check on the - :data:`current_app` object instead. - - .. versionadded:: 0.9 - """ - return _cv_app.get(None) is not None - - -class AppContext: - """The app context contains application-specific information. An app - context is created and pushed at the beginning of each request if - one is not already active. An app context is also pushed when - running CLI commands. - """ - - def __init__(self, app: Flask) -> None: - self.app = app - self.url_adapter = app.create_url_adapter(None) - self.g: _AppCtxGlobals = app.app_ctx_globals_class() - self._cv_tokens: list[contextvars.Token[AppContext]] = [] - - def push(self) -> None: - """Binds the app context to the current context.""" - self._cv_tokens.append(_cv_app.set(self)) - appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the app context.""" - try: - if len(self._cv_tokens) == 1: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_appcontext(exc) - finally: - ctx = _cv_app.get() - _cv_app.reset(self._cv_tokens.pop()) - - if ctx is not self: - raise AssertionError( - f"Popped wrong app context. ({ctx!r} instead of {self!r})" - ) - - appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) - - def __enter__(self) -> AppContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - -class RequestContext: - """The request context contains per-request information. The Flask - app creates and pushes it at the beginning of the request, then pops - it at the end of the request. It will create the URL adapter and - request object for the WSGI environment provided. - - Do not attempt to use this class directly, instead use - :meth:`~flask.Flask.test_request_context` and - :meth:`~flask.Flask.request_context` to create this object. - - When the request context is popped, it will evaluate all the - functions registered on the application for teardown execution - (:meth:`~flask.Flask.teardown_request`). - - The request context is automatically popped at the end of the - request. When using the interactive debugger, the context will be - restored so ``request`` is still accessible. Similarly, the test - client can preserve the context after the request ends. However, - teardown functions may already have closed some resources such as - database connections. - """ - - def __init__( - self, - app: Flask, - environ: WSGIEnvironment, - request: Request | None = None, - session: SessionMixin | None = None, - ) -> None: - self.app = app - if request is None: - request = app.request_class(environ) - request.json_module = app.json - self.request: Request = request - self.url_adapter = None - try: - self.url_adapter = app.create_url_adapter(self.request) - except HTTPException as e: - self.request.routing_exception = e - self.flashes: list[tuple[str, str]] | None = None - self.session: SessionMixin | None = session - # Functions that should be executed after the request on the response - # object. These will be called before the regular "after_request" - # functions. - self._after_request_functions: list[ft.AfterRequestCallable[t.Any]] = [] - - self._cv_tokens: list[ - tuple[contextvars.Token[RequestContext], AppContext | None] - ] = [] - - def copy(self) -> RequestContext: - """Creates a copy of this request context with the same request object. - This can be used to move a request context to a different greenlet. - Because the actual request object is the same this cannot be used to - move a request context to a different thread unless access to the - request object is locked. - - .. versionadded:: 0.10 - - .. versionchanged:: 1.1 - The current session object is used instead of reloading the original - data. This prevents `flask.session` pointing to an out-of-date object. - """ - return self.__class__( - self.app, - environ=self.request.environ, - request=self.request, - session=self.session, - ) - - def match_request(self) -> None: - """Can be overridden by a subclass to hook into the matching - of the request. - """ - try: - result = self.url_adapter.match(return_rule=True) # type: ignore - self.request.url_rule, self.request.view_args = result # type: ignore - except HTTPException as e: - self.request.routing_exception = e - - def push(self) -> None: - # Before we push the request context we have to ensure that there - # is an application context. - app_ctx = _cv_app.get(None) - - if app_ctx is None or app_ctx.app is not self.app: - app_ctx = self.app.app_context() - app_ctx.push() - else: - app_ctx = None - - self._cv_tokens.append((_cv_request.set(self), app_ctx)) - - # Open the session at the moment that the request context is available. - # This allows a custom open_session method to use the request context. - # Only open a new session if this is the first time the request was - # pushed, otherwise stream_with_context loses the session. - if self.session is None: - session_interface = self.app.session_interface - self.session = session_interface.open_session(self.app, self.request) - - if self.session is None: - self.session = session_interface.make_null_session(self.app) - - # Match the request URL after loading the session, so that the - # session is available in custom URL converters. - if self.url_adapter is not None: - self.match_request() - - def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore - """Pops the request context and unbinds it by doing that. This will - also trigger the execution of functions registered by the - :meth:`~flask.Flask.teardown_request` decorator. - - .. versionchanged:: 0.9 - Added the `exc` argument. - """ - clear_request = len(self._cv_tokens) == 1 - - try: - if clear_request: - if exc is _sentinel: - exc = sys.exc_info()[1] - self.app.do_teardown_request(exc) - - request_close = getattr(self.request, "close", None) - if request_close is not None: - request_close() - finally: - ctx = _cv_request.get() - token, app_ctx = self._cv_tokens.pop() - _cv_request.reset(token) - - # get rid of circular dependencies at the end of the request - # so that we don't require the GC to be active. - if clear_request: - ctx.request.environ["werkzeug.request"] = None - - if app_ctx is not None: - app_ctx.pop(exc) - - if ctx is not self: - raise AssertionError( - f"Popped wrong request context. ({ctx!r} instead of {self!r})" - ) - - def __enter__(self) -> RequestContext: - self.push() - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.pop(exc_value) - - def __repr__(self) -> str: - return ( - f"<{type(self).__name__} {self.request.url!r}" - f" [{self.request.method}] of {self.app.name}>" - ) diff --git a/port/lib/python3.11/site-packages/flask/debughelpers.py b/port/lib/python3.11/site-packages/flask/debughelpers.py deleted file mode 100644 index 2c8c4c4..0000000 --- a/port/lib/python3.11/site-packages/flask/debughelpers.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import annotations - -import typing as t - -from jinja2.loaders import BaseLoader -from werkzeug.routing import RequestRedirect - -from .blueprints import Blueprint -from .globals import request_ctx -from .sansio.app import App - -if t.TYPE_CHECKING: - from .sansio.scaffold import Scaffold - from .wrappers import Request - - -class UnexpectedUnicodeError(AssertionError, UnicodeError): - """Raised in places where we want some better error reporting for - unexpected unicode or binary data. - """ - - -class DebugFilesKeyError(KeyError, AssertionError): - """Raised from request.files during debugging. The idea is that it can - provide a better error message than just a generic KeyError/BadRequest. - """ - - def __init__(self, request: Request, key: str) -> None: - form_matches = request.form.getlist(key) - buf = [ - f"You tried to access the file {key!r} in the request.files" - " dictionary but it does not exist. The mimetype for the" - f" request is {request.mimetype!r} instead of" - " 'multipart/form-data' which means that no file contents" - " were transmitted. To fix this error you should provide" - ' enctype="multipart/form-data" in your form.' - ] - if form_matches: - names = ", ".join(repr(x) for x in form_matches) - buf.append( - "\n\nThe browser instead transmitted some file names. " - f"This was submitted: {names}" - ) - self.msg = "".join(buf) - - def __str__(self) -> str: - return self.msg - - -class FormDataRoutingRedirect(AssertionError): - """This exception is raised in debug mode if a routing redirect - would cause the browser to drop the method or body. This happens - when method is not GET, HEAD or OPTIONS and the status code is not - 307 or 308. - """ - - def __init__(self, request: Request) -> None: - exc = request.routing_exception - assert isinstance(exc, RequestRedirect) - buf = [ - f"A request was sent to '{request.url}', but routing issued" - f" a redirect to the canonical URL '{exc.new_url}'." - ] - - if f"{request.base_url}/" == exc.new_url.partition("?")[0]: - buf.append( - " The URL was defined with a trailing slash. Flask" - " will redirect to the URL with a trailing slash if it" - " was accessed without one." - ) - - buf.append( - " Send requests to the canonical URL, or use 307 or 308 for" - " routing redirects. Otherwise, browsers will drop form" - " data.\n\n" - "This exception is only raised in debug mode." - ) - super().__init__("".join(buf)) - - -def attach_enctype_error_multidict(request: Request) -> None: - """Patch ``request.files.__getitem__`` to raise a descriptive error - about ``enctype=multipart/form-data``. - - :param request: The request to patch. - :meta private: - """ - oldcls = request.files.__class__ - - class newcls(oldcls): # type: ignore[valid-type, misc] - def __getitem__(self, key: str) -> t.Any: - try: - return super().__getitem__(key) - except KeyError as e: - if key not in request.form: - raise - - raise DebugFilesKeyError(request, key).with_traceback( - e.__traceback__ - ) from None - - newcls.__name__ = oldcls.__name__ - newcls.__module__ = oldcls.__module__ - request.files.__class__ = newcls - - -def _dump_loader_info(loader: BaseLoader) -> t.Iterator[str]: - yield f"class: {type(loader).__module__}.{type(loader).__name__}" - for key, value in sorted(loader.__dict__.items()): - if key.startswith("_"): - continue - if isinstance(value, (tuple, list)): - if not all(isinstance(x, str) for x in value): - continue - yield f"{key}:" - for item in value: - yield f" - {item}" - continue - elif not isinstance(value, (str, int, float, bool)): - continue - yield f"{key}: {value!r}" - - -def explain_template_loading_attempts( - app: App, - template: str, - attempts: list[ - tuple[ - BaseLoader, - Scaffold, - tuple[str, str | None, t.Callable[[], bool] | None] | None, - ] - ], -) -> None: - """This should help developers understand what failed""" - info = [f"Locating template {template!r}:"] - total_found = 0 - blueprint = None - if request_ctx and request_ctx.request.blueprint is not None: - blueprint = request_ctx.request.blueprint - - for idx, (loader, srcobj, triple) in enumerate(attempts): - if isinstance(srcobj, App): - src_info = f"application {srcobj.import_name!r}" - elif isinstance(srcobj, Blueprint): - src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" - else: - src_info = repr(srcobj) - - info.append(f"{idx + 1:5}: trying loader of {src_info}") - - for line in _dump_loader_info(loader): - info.append(f" {line}") - - if triple is None: - detail = "no match" - else: - detail = f"found ({triple[1] or ''!r})" - total_found += 1 - info.append(f" -> {detail}") - - seems_fishy = False - if total_found == 0: - info.append("Error: the template could not be found.") - seems_fishy = True - elif total_found > 1: - info.append("Warning: multiple loaders returned a match for the template.") - seems_fishy = True - - if blueprint is not None and seems_fishy: - info.append( - " The template was looked up from an endpoint that belongs" - f" to the blueprint {blueprint!r}." - ) - info.append(" Maybe you did not place a template in the right folder?") - info.append(" See https://flask.palletsprojects.com/blueprints/#templates") - - app.logger.info("\n".join(info)) diff --git a/port/lib/python3.11/site-packages/flask/globals.py b/port/lib/python3.11/site-packages/flask/globals.py deleted file mode 100644 index e2c410c..0000000 --- a/port/lib/python3.11/site-packages/flask/globals.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -import typing as t -from contextvars import ContextVar - -from werkzeug.local import LocalProxy - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .ctx import _AppCtxGlobals - from .ctx import AppContext - from .ctx import RequestContext - from .sessions import SessionMixin - from .wrappers import Request - - -_no_app_msg = """\ -Working outside of application context. - -This typically means that you attempted to use functionality that needed -the current application. To solve this, set up an application context -with app.app_context(). See the documentation for more information.\ -""" -_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") -app_ctx: AppContext = LocalProxy( # type: ignore[assignment] - _cv_app, unbound_message=_no_app_msg -) -current_app: Flask = LocalProxy( # type: ignore[assignment] - _cv_app, "app", unbound_message=_no_app_msg -) -g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] - _cv_app, "g", unbound_message=_no_app_msg -) - -_no_req_msg = """\ -Working outside of request context. - -This typically means that you attempted to use functionality that needed -an active HTTP request. Consult the documentation on testing for -information about how to avoid this problem.\ -""" -_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") -request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] - _cv_request, unbound_message=_no_req_msg -) -request: Request = LocalProxy( # type: ignore[assignment] - _cv_request, "request", unbound_message=_no_req_msg -) -session: SessionMixin = LocalProxy( # type: ignore[assignment] - _cv_request, "session", unbound_message=_no_req_msg -) diff --git a/port/lib/python3.11/site-packages/flask/helpers.py b/port/lib/python3.11/site-packages/flask/helpers.py deleted file mode 100644 index a6b7e15..0000000 --- a/port/lib/python3.11/site-packages/flask/helpers.py +++ /dev/null @@ -1,634 +0,0 @@ -from __future__ import annotations - -import importlib.util -import os -import sys -import typing as t -from datetime import datetime -from functools import cache -from functools import update_wrapper - -import werkzeug.utils -from werkzeug.exceptions import abort as _wz_abort -from werkzeug.utils import redirect as _wz_redirect -from werkzeug.wrappers import Response as BaseResponse - -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .globals import request_ctx -from .globals import session -from .signals import message_flashed - -if t.TYPE_CHECKING: # pragma: no cover - from .wrappers import Response - - -def get_debug_flag() -> bool: - """Get whether debug mode should be enabled for the app, indicated by the - :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. - """ - val = os.environ.get("FLASK_DEBUG") - return bool(val and val.lower() not in {"0", "false", "no"}) - - -def get_load_dotenv(default: bool = True) -> bool: - """Get whether the user has disabled loading default dotenv files by - setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load - the files. - - :param default: What to return if the env var isn't set. - """ - val = os.environ.get("FLASK_SKIP_DOTENV") - - if not val: - return default - - return val.lower() in ("0", "false", "no") - - -@t.overload -def stream_with_context( - generator_or_function: t.Iterator[t.AnyStr], -) -> t.Iterator[t.AnyStr]: ... - - -@t.overload -def stream_with_context( - generator_or_function: t.Callable[..., t.Iterator[t.AnyStr]], -) -> t.Callable[[t.Iterator[t.AnyStr]], t.Iterator[t.AnyStr]]: ... - - -def stream_with_context( - generator_or_function: t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]], -) -> t.Iterator[t.AnyStr] | t.Callable[[t.Iterator[t.AnyStr]], t.Iterator[t.AnyStr]]: - """Request contexts disappear when the response is started on the server. - This is done for efficiency reasons and to make it less likely to encounter - memory leaks with badly written WSGI middlewares. The downside is that if - you are using streamed responses, the generator cannot access request bound - information any more. - - This function however can help you keep the context around for longer:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - @stream_with_context - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(generate()) - - Alternatively it can also be used around a specific generator:: - - from flask import stream_with_context, request, Response - - @app.route('/stream') - def streamed_response(): - def generate(): - yield 'Hello ' - yield request.args['name'] - yield '!' - return Response(stream_with_context(generate())) - - .. versionadded:: 0.9 - """ - try: - gen = iter(generator_or_function) # type: ignore[arg-type] - except TypeError: - - def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: - gen = generator_or_function(*args, **kwargs) # type: ignore[operator] - return stream_with_context(gen) - - return update_wrapper(decorator, generator_or_function) # type: ignore[arg-type] - - def generator() -> t.Iterator[t.AnyStr | None]: - ctx = _cv_request.get(None) - if ctx is None: - raise RuntimeError( - "'stream_with_context' can only be used when a request" - " context is active, such as in a view function." - ) - with ctx: - # Dummy sentinel. Has to be inside the context block or we're - # not actually keeping the context around. - yield None - - # The try/finally is here so that if someone passes a WSGI level - # iterator in we're still running the cleanup logic. Generators - # don't need that because they are closed on their destruction - # automatically. - try: - yield from gen - finally: - if hasattr(gen, "close"): - gen.close() - - # The trick is to start the generator. Then the code execution runs until - # the first dummy None is yielded at which point the context was already - # pushed. This item is discarded. Then when the iteration continues the - # real generator is executed. - wrapped_g = generator() - next(wrapped_g) - return wrapped_g # type: ignore[return-value] - - -def make_response(*args: t.Any) -> Response: - """Sometimes it is necessary to set additional headers in a view. Because - views do not have to return response objects but can return a value that - is converted into a response object by Flask itself, it becomes tricky to - add headers to it. This function can be called instead of using a return - and you will get a response object which you can use to attach headers. - - If view looked like this and you want to add a new header:: - - def index(): - return render_template('index.html', foo=42) - - You can now do something like this:: - - def index(): - response = make_response(render_template('index.html', foo=42)) - response.headers['X-Parachutes'] = 'parachutes are cool' - return response - - This function accepts the very same arguments you can return from a - view function. This for example creates a response with a 404 error - code:: - - response = make_response(render_template('not_found.html'), 404) - - The other use case of this function is to force the return value of a - view function into a response which is helpful with view - decorators:: - - response = make_response(view_function()) - response.headers['X-Parachutes'] = 'parachutes are cool' - - Internally this function does the following things: - - - if no arguments are passed, it creates a new response argument - - if one argument is passed, :meth:`flask.Flask.make_response` - is invoked with it. - - if more than one argument is passed, the arguments are passed - to the :meth:`flask.Flask.make_response` function as tuple. - - .. versionadded:: 0.6 - """ - if not args: - return current_app.response_class() - if len(args) == 1: - args = args[0] - return current_app.make_response(args) - - -def url_for( - endpoint: str, - *, - _anchor: str | None = None, - _method: str | None = None, - _scheme: str | None = None, - _external: bool | None = None, - **values: t.Any, -) -> str: - """Generate a URL to the given endpoint with the given values. - - This requires an active request or application context, and calls - :meth:`current_app.url_for() `. See that method - for full documentation. - - :param endpoint: The endpoint name associated with the URL to - generate. If this starts with a ``.``, the current blueprint - name (if any) will be used. - :param _anchor: If given, append this as ``#anchor`` to the URL. - :param _method: If given, generate the URL associated with this - method for the endpoint. - :param _scheme: If given, the URL will have this scheme if it is - external. - :param _external: If given, prefer the URL to be internal (False) or - require it to be external (True). External URLs include the - scheme and domain. When not in an active request, URLs are - external by default. - :param values: Values to use for the variable parts of the URL rule. - Unknown keys are appended as query string arguments, like - ``?a=b&c=d``. - - .. versionchanged:: 2.2 - Calls ``current_app.url_for``, allowing an app to override the - behavior. - - .. versionchanged:: 0.10 - The ``_scheme`` parameter was added. - - .. versionchanged:: 0.9 - The ``_anchor`` and ``_method`` parameters were added. - - .. versionchanged:: 0.9 - Calls ``app.handle_url_build_error`` on build errors. - """ - return current_app.url_for( - endpoint, - _anchor=_anchor, - _method=_method, - _scheme=_scheme, - _external=_external, - **values, - ) - - -def redirect( - location: str, code: int = 302, Response: type[BaseResponse] | None = None -) -> BaseResponse: - """Create a redirect response object. - - If :data:`~flask.current_app` is available, it will use its - :meth:`~flask.Flask.redirect` method, otherwise it will use - :func:`werkzeug.utils.redirect`. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - :param Response: The response class to use. Not used when - ``current_app`` is active, which uses ``app.response_class``. - - .. versionadded:: 2.2 - Calls ``current_app.redirect`` if available instead of always - using Werkzeug's default ``redirect``. - """ - if current_app: - return current_app.redirect(location, code=code) - - return _wz_redirect(location, code=code, Response=Response) - - -def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given - status code. - - If :data:`~flask.current_app` is available, it will call its - :attr:`~flask.Flask.aborter` object, otherwise it will use - :func:`werkzeug.exceptions.abort`. - - :param code: The status code for the exception, which must be - registered in ``app.aborter``. - :param args: Passed to the exception. - :param kwargs: Passed to the exception. - - .. versionadded:: 2.2 - Calls ``current_app.aborter`` if available instead of always - using Werkzeug's default ``abort``. - """ - if current_app: - current_app.aborter(code, *args, **kwargs) - - _wz_abort(code, *args, **kwargs) - - -def get_template_attribute(template_name: str, attribute: str) -> t.Any: - """Loads a macro (or variable) a template exports. This can be used to - invoke a macro from within Python code. If you for example have a - template named :file:`_cider.html` with the following contents: - - .. sourcecode:: html+jinja - - {% macro hello(name) %}Hello {{ name }}!{% endmacro %} - - You can access this from Python code like this:: - - hello = get_template_attribute('_cider.html', 'hello') - return hello('World') - - .. versionadded:: 0.2 - - :param template_name: the name of the template - :param attribute: the name of the variable of macro to access - """ - return getattr(current_app.jinja_env.get_template(template_name).module, attribute) - - -def flash(message: str, category: str = "message") -> None: - """Flashes a message to the next request. In order to remove the - flashed message from the session and to display it to the user, - the template has to call :func:`get_flashed_messages`. - - .. versionchanged:: 0.3 - `category` parameter added. - - :param message: the message to be flashed. - :param category: the category for the message. The following values - are recommended: ``'message'`` for any kind of message, - ``'error'`` for errors, ``'info'`` for information - messages and ``'warning'`` for warnings. However any - kind of string can be used as category. - """ - # Original implementation: - # - # session.setdefault('_flashes', []).append((category, message)) - # - # This assumed that changes made to mutable structures in the session are - # always in sync with the session object, which is not true for session - # implementations that use external storage for keeping their keys/values. - flashes = session.get("_flashes", []) - flashes.append((category, message)) - session["_flashes"] = flashes - app = current_app._get_current_object() # type: ignore - message_flashed.send( - app, - _async_wrapper=app.ensure_sync, - message=message, - category=category, - ) - - -def get_flashed_messages( - with_categories: bool = False, category_filter: t.Iterable[str] = () -) -> list[str] | list[tuple[str, str]]: - """Pulls all flashed messages from the session and returns them. - Further calls in the same request to the function will return - the same messages. By default just the messages are returned, - but when `with_categories` is set to ``True``, the return value will - be a list of tuples in the form ``(category, message)`` instead. - - Filter the flashed messages to one or more categories by providing those - categories in `category_filter`. This allows rendering categories in - separate html blocks. The `with_categories` and `category_filter` - arguments are distinct: - - * `with_categories` controls whether categories are returned with message - text (``True`` gives a tuple, where ``False`` gives just the message text). - * `category_filter` filters the messages down to only those matching the - provided categories. - - See :doc:`/patterns/flashing` for examples. - - .. versionchanged:: 0.3 - `with_categories` parameter added. - - .. versionchanged:: 0.9 - `category_filter` parameter added. - - :param with_categories: set to ``True`` to also receive categories. - :param category_filter: filter of categories to limit return values. Only - categories in the list will be returned. - """ - flashes = request_ctx.flashes - if flashes is None: - flashes = session.pop("_flashes") if "_flashes" in session else [] - request_ctx.flashes = flashes - if category_filter: - flashes = list(filter(lambda f: f[0] in category_filter, flashes)) - if not with_categories: - return [x[1] for x in flashes] - return flashes - - -def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: - if kwargs.get("max_age") is None: - kwargs["max_age"] = current_app.get_send_file_max_age - - kwargs.update( - environ=request.environ, - use_x_sendfile=current_app.config["USE_X_SENDFILE"], - response_class=current_app.response_class, - _root_path=current_app.root_path, # type: ignore - ) - return kwargs - - -def send_file( - path_or_file: os.PathLike[t.AnyStr] | str | t.BinaryIO, - mimetype: str | None = None, - as_attachment: bool = False, - download_name: str | None = None, - conditional: bool = True, - etag: bool | str = True, - last_modified: datetime | int | float | None = None, - max_age: None | (int | t.Callable[[str | None], int | None]) = None, -) -> Response: - """Send the contents of a file to the client. - - The first argument can be a file path or a file-like object. Paths - are preferred in most cases because Werkzeug can manage the file and - get extra information from the path. Passing a file-like object - requires that the file is opened in binary mode, and is mostly - useful when building a file in memory with :class:`io.BytesIO`. - - Never pass file paths provided by a user. The path is assumed to be - trusted, so a user could craft a path to access a file you didn't - intend. Use :func:`send_from_directory` to safely serve - user-requested paths from within a directory. - - If the WSGI server sets a ``file_wrapper`` in ``environ``, it is - used, otherwise Werkzeug's built-in wrapper is used. Alternatively, - if the HTTP server supports ``X-Sendfile``, configuring Flask with - ``USE_X_SENDFILE = True`` will tell the server to send the given - path, which is much more efficient than reading it in Python. - - :param path_or_file: The path to the file to send, relative to the - current working directory if a relative path is given. - Alternatively, a file-like object opened in binary mode. Make - sure the file pointer is seeked to the start of the data. - :param mimetype: The MIME type to send for the file. If not - provided, it will try to detect it from the file name. - :param as_attachment: Indicate to a browser that it should offer to - save the file instead of displaying it. - :param download_name: The default name browsers will use when saving - the file. Defaults to the passed file name. - :param conditional: Enable conditional and range responses based on - request headers. Requires passing a file path and ``environ``. - :param etag: Calculate an ETag for the file, which requires passing - a file path. Can also be a string to use instead. - :param last_modified: The last modified time to send for the file, - in seconds. If not provided, it will try to detect it from the - file path. - :param max_age: How long the client should cache the file, in - seconds. If set, ``Cache-Control`` will be ``public``, otherwise - it will be ``no-cache`` to prefer conditional caching. - - .. versionchanged:: 2.0 - ``download_name`` replaces the ``attachment_filename`` - parameter. If ``as_attachment=False``, it is passed with - ``Content-Disposition: inline`` instead. - - .. versionchanged:: 2.0 - ``max_age`` replaces the ``cache_timeout`` parameter. - ``conditional`` is enabled and ``max_age`` is not set by - default. - - .. versionchanged:: 2.0 - ``etag`` replaces the ``add_etags`` parameter. It can be a - string to use instead of generating one. - - .. versionchanged:: 2.0 - Passing a file-like object that inherits from - :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather - than sending an empty file. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionchanged:: 1.1 - ``filename`` may be a :class:`~os.PathLike` object. - - .. versionchanged:: 1.1 - Passing a :class:`~io.BytesIO` object supports range requests. - - .. versionchanged:: 1.0.3 - Filenames are encoded with ASCII instead of Latin-1 for broader - compatibility with WSGI servers. - - .. versionchanged:: 1.0 - UTF-8 filenames as specified in :rfc:`2231` are supported. - - .. versionchanged:: 0.12 - The filename is no longer automatically inferred from file - objects. If you want to use automatic MIME and etag support, - pass a filename via ``filename_or_fp`` or - ``attachment_filename``. - - .. versionchanged:: 0.12 - ``attachment_filename`` is preferred over ``filename`` for MIME - detection. - - .. versionchanged:: 0.9 - ``cache_timeout`` defaults to - :meth:`Flask.get_send_file_max_age`. - - .. versionchanged:: 0.7 - MIME guessing and etag support for file-like objects was - removed because it was unreliable. Pass a filename if you are - able to, otherwise attach an etag yourself. - - .. versionchanged:: 0.5 - The ``add_etags``, ``cache_timeout`` and ``conditional`` - parameters were added. The default behavior is to add etags. - - .. versionadded:: 0.2 - """ - return werkzeug.utils.send_file( # type: ignore[return-value] - **_prepare_send_file_kwargs( - path_or_file=path_or_file, - environ=request.environ, - mimetype=mimetype, - as_attachment=as_attachment, - download_name=download_name, - conditional=conditional, - etag=etag, - last_modified=last_modified, - max_age=max_age, - ) - ) - - -def send_from_directory( - directory: os.PathLike[str] | str, - path: os.PathLike[str] | str, - **kwargs: t.Any, -) -> Response: - """Send a file from within a directory using :func:`send_file`. - - .. code-block:: python - - @app.route("/uploads/") - def download_file(name): - return send_from_directory( - app.config['UPLOAD_FOLDER'], name, as_attachment=True - ) - - This is a secure way to serve files from a folder, such as static - files or uploads. Uses :func:`~werkzeug.security.safe_join` to - ensure the path coming from the client is not maliciously crafted to - point outside the specified directory. - - If the final path does not point to an existing regular file, - raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. - - :param directory: The directory that ``path`` must be located under, - relative to the current application's root path. This *must not* - be a value provided by the client, otherwise it becomes insecure. - :param path: The path to the file to send, relative to - ``directory``. - :param kwargs: Arguments to pass to :func:`send_file`. - - .. versionchanged:: 2.0 - ``path`` replaces the ``filename`` parameter. - - .. versionadded:: 2.0 - Moved the implementation to Werkzeug. This is now a wrapper to - pass some Flask-specific arguments. - - .. versionadded:: 0.5 - """ - return werkzeug.utils.send_from_directory( # type: ignore[return-value] - directory, path, **_prepare_send_file_kwargs(**kwargs) - ) - - -def get_root_path(import_name: str) -> str: - """Find the root path of a package, or the path that contains a - module. If it cannot be found, returns the current working - directory. - - Not to be confused with the value returned by :func:`find_package`. - - :meta private: - """ - # Module already imported and has a file attribute. Use that first. - mod = sys.modules.get(import_name) - - if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: - return os.path.dirname(os.path.abspath(mod.__file__)) - - # Next attempt: check the loader. - try: - spec = importlib.util.find_spec(import_name) - - if spec is None: - raise ValueError - except (ImportError, ValueError): - loader = None - else: - loader = spec.loader - - # Loader does not exist or we're referring to an unloaded main - # module or a main module without path (interactive sessions), go - # with the current working directory. - if loader is None: - return os.getcwd() - - if hasattr(loader, "get_filename"): - filepath = loader.get_filename(import_name) # pyright: ignore - else: - # Fall back to imports. - __import__(import_name) - mod = sys.modules[import_name] - filepath = getattr(mod, "__file__", None) - - # If we don't have a file path it might be because it is a - # namespace package. In this case pick the root path from the - # first module that is contained in the package. - if filepath is None: - raise RuntimeError( - "No root path can be found for the provided module" - f" {import_name!r}. This can happen because the module" - " came from an import hook that does not provide file" - " name information or because it's a namespace package." - " In this case the root path needs to be explicitly" - " provided." - ) - - # filepath is import_name.py for a module, or __init__.py for a package. - return os.path.dirname(os.path.abspath(filepath)) # type: ignore[no-any-return] - - -@cache -def _split_blueprint_path(name: str) -> list[str]: - out: list[str] = [name] - - if "." in name: - out.extend(_split_blueprint_path(name.rpartition(".")[0])) - - return out diff --git a/port/lib/python3.11/site-packages/flask/json/__init__.py b/port/lib/python3.11/site-packages/flask/json/__init__.py deleted file mode 100644 index c0941d0..0000000 --- a/port/lib/python3.11/site-packages/flask/json/__init__.py +++ /dev/null @@ -1,170 +0,0 @@ -from __future__ import annotations - -import json as _json -import typing as t - -from ..globals import current_app -from .provider import _default - -if t.TYPE_CHECKING: # pragma: no cover - from ..wrappers import Response - - -def dumps(obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dumps() ` - method, otherwise it will use :func:`json.dumps`. - - :param obj: The data to serialize. - :param kwargs: Arguments passed to the ``dumps`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dumps``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.dumps(obj, **kwargs) - - kwargs.setdefault("default", _default) - return _json.dumps(obj, **kwargs) - - -def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.dump() ` - method, otherwise it will use :func:`json.dump`. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: Arguments passed to the ``dump`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.dump``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - Writing to a binary file, and the ``encoding`` argument, will be - removed in Flask 2.1. - """ - if current_app: - current_app.json.dump(obj, fp, **kwargs) - else: - kwargs.setdefault("default", _default) - _json.dump(obj, fp, **kwargs) - - -def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.loads() ` - method, otherwise it will use :func:`json.loads`. - - :param s: Text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``loads`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.loads``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The data must be a - string or UTF-8 bytes. - - .. versionchanged:: 1.0.3 - ``app`` can be passed directly, rather than requiring an app - context for configuration. - """ - if current_app: - return current_app.json.loads(s, **kwargs) - - return _json.loads(s, **kwargs) - - -def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - If :data:`~flask.current_app` is available, it will use its - :meth:`app.json.load() ` - method, otherwise it will use :func:`json.load`. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: Arguments passed to the ``load`` implementation. - - .. versionchanged:: 2.3 - The ``app`` parameter was removed. - - .. versionchanged:: 2.2 - Calls ``current_app.json.load``, allowing an app to override - the behavior. - - .. versionchanged:: 2.2 - The ``app`` parameter will be removed in Flask 2.3. - - .. versionchanged:: 2.0 - ``encoding`` will be removed in Flask 2.1. The file must be text - mode, or binary mode with UTF-8 bytes. - """ - if current_app: - return current_app.json.load(fp, **kwargs) - - return _json.load(fp, **kwargs) - - -def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. A dict or list returned from a view will be converted to a - JSON response automatically without needing to call this. - - This requires an active request or application context, and calls - :meth:`app.json.response() `. - - In debug mode, the output is formatted with indentation to make it - easier to read. This may also be controlled by the provider. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - - .. versionchanged:: 2.2 - Calls ``current_app.json.response``, allowing an app to override - the behavior. - - .. versionchanged:: 2.0.2 - :class:`decimal.Decimal` is supported by converting to a string. - - .. versionchanged:: 0.11 - Added support for serializing top-level arrays. This was a - security risk in ancient browsers. See :ref:`security-json`. - - .. versionadded:: 0.2 - """ - return current_app.json.response(*args, **kwargs) # type: ignore[return-value] diff --git a/port/lib/python3.11/site-packages/flask/json/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/json/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f3a720c8e74c506d75eb5bbedad30f0d4f8867ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6869 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 diff --git a/port/lib/python3.11/site-packages/flask/json/__pycache__/provider.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/json/__pycache__/provider.cpython-311.pyc deleted file mode 100644 index d7d94d4f7dea6518f3c38d1e50d20f49026412af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9984 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 diff --git a/port/lib/python3.11/site-packages/flask/json/__pycache__/tag.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/json/__pycache__/tag.cpython-311.pyc deleted file mode 100644 index 24ae990dce1b311b0af89edcd0fddd959f4d7b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16577 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 to an instance of the class. - - :param app: An application instance. This will be stored as a - :class:`weakref.proxy` on the :attr:`_app` attribute. - - .. versionadded:: 2.2 - """ - - def __init__(self, app: App) -> None: - self._app: App = weakref.proxy(app) - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON. - - :param obj: The data to serialize. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: - """Serialize data as JSON and write to a file. - - :param obj: The data to serialize. - :param fp: A file opened for writing text. Should use the UTF-8 - encoding to be valid JSON. - :param kwargs: May be passed to the underlying JSON library. - """ - fp.write(self.dumps(obj, **kwargs)) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON. - - :param s: Text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - raise NotImplementedError - - def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON read from a file. - - :param fp: A file opened for reading text or UTF-8 bytes. - :param kwargs: May be passed to the underlying JSON library. - """ - return self.loads(fp.read(), **kwargs) - - def _prepare_response_obj( - self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] - ) -> t.Any: - if args and kwargs: - raise TypeError("app.json.response() takes either args or kwargs, not both") - - if not args and not kwargs: - return None - - if len(args) == 1: - return args[0] - - return args or kwargs - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with the ``application/json`` - mimetype. - - The :func:`~flask.json.jsonify` function calls this method for - the current application. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - return self._app.response_class(self.dumps(obj), mimetype="application/json") - - -def _default(o: t.Any) -> t.Any: - if isinstance(o, date): - return http_date(o) - - if isinstance(o, (decimal.Decimal, uuid.UUID)): - return str(o) - - if dataclasses and dataclasses.is_dataclass(o): - return dataclasses.asdict(o) # type: ignore[arg-type] - - if hasattr(o, "__html__"): - return str(o.__html__()) - - raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") - - -class DefaultJSONProvider(JSONProvider): - """Provide JSON operations using Python's built-in :mod:`json` - library. Serializes the following additional data types: - - - :class:`datetime.datetime` and :class:`datetime.date` are - serialized to :rfc:`822` strings. This is the same as the HTTP - date format. - - :class:`uuid.UUID` is serialized to a string. - - :class:`dataclasses.dataclass` is passed to - :func:`dataclasses.asdict`. - - :class:`~markupsafe.Markup` (or any object with a ``__html__`` - method) will call the ``__html__`` method to get a string. - """ - - default: t.Callable[[t.Any], t.Any] = staticmethod(_default) # type: ignore[assignment] - """Apply this function to any object that :meth:`json.dumps` does - not know how to serialize. It should return a valid JSON type or - raise a ``TypeError``. - """ - - ensure_ascii = True - """Replace non-ASCII characters with escape sequences. This may be - more compatible with some clients, but can be disabled for better - performance and size. - """ - - sort_keys = True - """Sort the keys in any serialized dicts. This may be useful for - some caching situations, but can be disabled for better performance. - When enabled, keys must all be strings, they are not converted - before sorting. - """ - - compact: bool | None = None - """If ``True``, or ``None`` out of debug mode, the :meth:`response` - output will not add indentation, newlines, or spaces. If ``False``, - or ``None`` in debug mode, it will use a non-compact representation. - """ - - mimetype = "application/json" - """The mimetype set in :meth:`response`.""" - - def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: - """Serialize data as JSON to a string. - - Keyword arguments are passed to :func:`json.dumps`. Sets some - parameter defaults from the :attr:`default`, - :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. - - :param obj: The data to serialize. - :param kwargs: Passed to :func:`json.dumps`. - """ - kwargs.setdefault("default", self.default) - kwargs.setdefault("ensure_ascii", self.ensure_ascii) - kwargs.setdefault("sort_keys", self.sort_keys) - return json.dumps(obj, **kwargs) - - def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: - """Deserialize data as JSON from a string or bytes. - - :param s: Text or UTF-8 bytes. - :param kwargs: Passed to :func:`json.loads`. - """ - return json.loads(s, **kwargs) - - def response(self, *args: t.Any, **kwargs: t.Any) -> Response: - """Serialize the given arguments as JSON, and return a - :class:`~flask.Response` object with it. The response mimetype - will be "application/json" and can be changed with - :attr:`mimetype`. - - If :attr:`compact` is ``False`` or debug mode is enabled, the - output will be formatted to be easier to read. - - Either positional or keyword arguments can be given, not both. - If no arguments are given, ``None`` is serialized. - - :param args: A single value to serialize, or multiple values to - treat as a list to serialize. - :param kwargs: Treat as a dict to serialize. - """ - obj = self._prepare_response_obj(args, kwargs) - dump_args: dict[str, t.Any] = {} - - if (self.compact is None and self._app.debug) or self.compact is False: - dump_args.setdefault("indent", 2) - else: - dump_args.setdefault("separators", (",", ":")) - - return self._app.response_class( - f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype - ) diff --git a/port/lib/python3.11/site-packages/flask/json/tag.py b/port/lib/python3.11/site-packages/flask/json/tag.py deleted file mode 100644 index 8dc3629..0000000 --- a/port/lib/python3.11/site-packages/flask/json/tag.py +++ /dev/null @@ -1,327 +0,0 @@ -""" -Tagged JSON -~~~~~~~~~~~ - -A compact representation for lossless serialization of non-standard JSON -types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this -to serialize the session data, but it may be useful in other places. It -can be extended to support other types. - -.. autoclass:: TaggedJSONSerializer - :members: - -.. autoclass:: JSONTag - :members: - -Let's see an example that adds support for -:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so -to handle this we will dump the items as a list of ``[key, value]`` -pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to -identify the type. The session serializer processes dicts first, so -insert the new tag at the front of the order since ``OrderedDict`` must -be processed before ``dict``. - -.. code-block:: python - - from flask.json.tag import JSONTag - - class TagOrderedDict(JSONTag): - __slots__ = ('serializer',) - key = ' od' - - def check(self, value): - return isinstance(value, OrderedDict) - - def to_json(self, value): - return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] - - def to_python(self, value): - return OrderedDict(value) - - app.session_interface.serializer.register(TagOrderedDict, index=0) -""" - -from __future__ import annotations - -import typing as t -from base64 import b64decode -from base64 import b64encode -from datetime import datetime -from uuid import UUID - -from markupsafe import Markup -from werkzeug.http import http_date -from werkzeug.http import parse_date - -from ..json import dumps -from ..json import loads - - -class JSONTag: - """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" - - __slots__ = ("serializer",) - - #: The tag to mark the serialized object with. If empty, this tag is - #: only used as an intermediate step during tagging. - key: str = "" - - def __init__(self, serializer: TaggedJSONSerializer) -> None: - """Create a tagger for the given serializer.""" - self.serializer = serializer - - def check(self, value: t.Any) -> bool: - """Check if the given value should be tagged by this tag.""" - raise NotImplementedError - - def to_json(self, value: t.Any) -> t.Any: - """Convert the Python object to an object that is a valid JSON type. - The tag will be added later.""" - raise NotImplementedError - - def to_python(self, value: t.Any) -> t.Any: - """Convert the JSON representation back to the correct type. The tag - will already be removed.""" - raise NotImplementedError - - def tag(self, value: t.Any) -> dict[str, t.Any]: - """Convert the value to a valid JSON type and add the tag structure - around it.""" - return {self.key: self.to_json(value)} - - -class TagDict(JSONTag): - """Tag for 1-item dicts whose only key matches a registered tag. - - Internally, the dict key is suffixed with `__`, and the suffix is removed - when deserializing. - """ - - __slots__ = () - key = " di" - - def check(self, value: t.Any) -> bool: - return ( - isinstance(value, dict) - and len(value) == 1 - and next(iter(value)) in self.serializer.tags - ) - - def to_json(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {f"{key}__": self.serializer.tag(value[key])} - - def to_python(self, value: t.Any) -> t.Any: - key = next(iter(value)) - return {key[:-2]: value[key]} - - -class PassDict(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, dict) - - def to_json(self, value: t.Any) -> t.Any: - # JSON objects may only have string keys, so don't bother tagging the - # key here. - return {k: self.serializer.tag(v) for k, v in value.items()} - - tag = to_json - - -class TagTuple(JSONTag): - __slots__ = () - key = " t" - - def check(self, value: t.Any) -> bool: - return isinstance(value, tuple) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - def to_python(self, value: t.Any) -> t.Any: - return tuple(value) - - -class PassList(JSONTag): - __slots__ = () - - def check(self, value: t.Any) -> bool: - return isinstance(value, list) - - def to_json(self, value: t.Any) -> t.Any: - return [self.serializer.tag(item) for item in value] - - tag = to_json - - -class TagBytes(JSONTag): - __slots__ = () - key = " b" - - def check(self, value: t.Any) -> bool: - return isinstance(value, bytes) - - def to_json(self, value: t.Any) -> t.Any: - return b64encode(value).decode("ascii") - - def to_python(self, value: t.Any) -> t.Any: - return b64decode(value) - - -class TagMarkup(JSONTag): - """Serialize anything matching the :class:`~markupsafe.Markup` API by - having a ``__html__`` method to the result of that method. Always - deserializes to an instance of :class:`~markupsafe.Markup`.""" - - __slots__ = () - key = " m" - - def check(self, value: t.Any) -> bool: - return callable(getattr(value, "__html__", None)) - - def to_json(self, value: t.Any) -> t.Any: - return str(value.__html__()) - - def to_python(self, value: t.Any) -> t.Any: - return Markup(value) - - -class TagUUID(JSONTag): - __slots__ = () - key = " u" - - def check(self, value: t.Any) -> bool: - return isinstance(value, UUID) - - def to_json(self, value: t.Any) -> t.Any: - return value.hex - - def to_python(self, value: t.Any) -> t.Any: - return UUID(value) - - -class TagDateTime(JSONTag): - __slots__ = () - key = " d" - - def check(self, value: t.Any) -> bool: - return isinstance(value, datetime) - - def to_json(self, value: t.Any) -> t.Any: - return http_date(value) - - def to_python(self, value: t.Any) -> t.Any: - return parse_date(value) - - -class TaggedJSONSerializer: - """Serializer that uses a tag system to compactly represent objects that - are not JSON types. Passed as the intermediate serializer to - :class:`itsdangerous.Serializer`. - - The following extra types are supported: - - * :class:`dict` - * :class:`tuple` - * :class:`bytes` - * :class:`~markupsafe.Markup` - * :class:`~uuid.UUID` - * :class:`~datetime.datetime` - """ - - __slots__ = ("tags", "order") - - #: Tag classes to bind when creating the serializer. Other tags can be - #: added later using :meth:`~register`. - default_tags = [ - TagDict, - PassDict, - TagTuple, - PassList, - TagBytes, - TagMarkup, - TagUUID, - TagDateTime, - ] - - def __init__(self) -> None: - self.tags: dict[str, JSONTag] = {} - self.order: list[JSONTag] = [] - - for cls in self.default_tags: - self.register(cls) - - def register( - self, - tag_class: type[JSONTag], - force: bool = False, - index: int | None = None, - ) -> None: - """Register a new tag with this serializer. - - :param tag_class: tag class to register. Will be instantiated with this - serializer instance. - :param force: overwrite an existing tag. If false (default), a - :exc:`KeyError` is raised. - :param index: index to insert the new tag in the tag order. Useful when - the new tag is a special case of an existing tag. If ``None`` - (default), the tag is appended to the end of the order. - - :raise KeyError: if the tag key is already registered and ``force`` is - not true. - """ - tag = tag_class(self) - key = tag.key - - if key: - if not force and key in self.tags: - raise KeyError(f"Tag '{key}' is already registered.") - - self.tags[key] = tag - - if index is None: - self.order.append(tag) - else: - self.order.insert(index, tag) - - def tag(self, value: t.Any) -> t.Any: - """Convert a value to a tagged representation if necessary.""" - for tag in self.order: - if tag.check(value): - return tag.tag(value) - - return value - - def untag(self, value: dict[str, t.Any]) -> t.Any: - """Convert a tagged representation back to the original type.""" - if len(value) != 1: - return value - - key = next(iter(value)) - - if key not in self.tags: - return value - - return self.tags[key].to_python(value[key]) - - def _untag_scan(self, value: t.Any) -> t.Any: - if isinstance(value, dict): - # untag each item recursively - value = {k: self._untag_scan(v) for k, v in value.items()} - # untag the dict itself - value = self.untag(value) - elif isinstance(value, list): - # untag each item recursively - value = [self._untag_scan(item) for item in value] - - return value - - def dumps(self, value: t.Any) -> str: - """Tag the value and dump it to a compact JSON string.""" - return dumps(self.tag(value), separators=(",", ":")) - - def loads(self, value: str) -> t.Any: - """Load data from a JSON string and deserialized any tagged objects.""" - return self._untag_scan(loads(value)) diff --git a/port/lib/python3.11/site-packages/flask/logging.py b/port/lib/python3.11/site-packages/flask/logging.py deleted file mode 100644 index 0cb8f43..0000000 --- a/port/lib/python3.11/site-packages/flask/logging.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -import logging -import sys -import typing as t - -from werkzeug.local import LocalProxy - -from .globals import request - -if t.TYPE_CHECKING: # pragma: no cover - from .sansio.app import App - - -@LocalProxy -def wsgi_errors_stream() -> t.TextIO: - """Find the most appropriate error stream for the application. If a request - is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. - - If you configure your own :class:`logging.StreamHandler`, you may want to - use this for the stream. If you are using file or dict configuration and - can't import this directly, you can refer to it as - ``ext://flask.logging.wsgi_errors_stream``. - """ - if request: - return request.environ["wsgi.errors"] # type: ignore[no-any-return] - - return sys.stderr - - -def has_level_handler(logger: logging.Logger) -> bool: - """Check if there is a handler in the logging chain that will handle the - given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. - """ - level = logger.getEffectiveLevel() - current = logger - - while current: - if any(handler.level <= level for handler in current.handlers): - return True - - if not current.propagate: - break - - current = current.parent # type: ignore - - return False - - -#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format -#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. -default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore -default_handler.setFormatter( - logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") -) - - -def create_logger(app: App) -> logging.Logger: - """Get the Flask app's logger and configure it if needed. - - The logger name will be the same as - :attr:`app.import_name `. - - When :attr:`~flask.Flask.debug` is enabled, set the logger level to - :data:`logging.DEBUG` if it is not set. - - If there is no handler for the logger's effective level, add a - :class:`~logging.StreamHandler` for - :func:`~flask.logging.wsgi_errors_stream` with a basic format. - """ - logger = logging.getLogger(app.name) - - if app.debug and not logger.level: - logger.setLevel(logging.DEBUG) - - if not has_level_handler(logger): - logger.addHandler(default_handler) - - return logger diff --git a/port/lib/python3.11/site-packages/flask/py.typed b/port/lib/python3.11/site-packages/flask/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/flask/sansio/README.md b/port/lib/python3.11/site-packages/flask/sansio/README.md deleted file mode 100644 index 623ac19..0000000 --- a/port/lib/python3.11/site-packages/flask/sansio/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Sansio - -This folder contains code that can be used by alternative Flask -implementations, for example Quart. The code therefore cannot do any -IO, nor be part of a likely IO path. Finally this code cannot use the -Flask globals. diff --git a/port/lib/python3.11/site-packages/flask/sansio/__pycache__/app.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/sansio/__pycache__/app.cpython-311.pyc deleted file mode 100644 index 6a5ba3aa1068ce51cf43c5093c1f8b03f72ebce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35436 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 diff --git a/port/lib/python3.11/site-packages/flask/sansio/__pycache__/blueprints.cpython-311.pyc b/port/lib/python3.11/site-packages/flask/sansio/__pycache__/blueprints.cpython-311.pyc deleted file mode 100644 index 1b0f29938eea79389968d57328f4d7c9494cd2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32545 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 H672s6ty~kA diff --git a/port/lib/python3.11/site-packages/flask/sansio/app.py b/port/lib/python3.11/site-packages/flask/sansio/app.py deleted file mode 100644 index 3620171..0000000 --- a/port/lib/python3.11/site-packages/flask/sansio/app.py +++ /dev/null @@ -1,964 +0,0 @@ -from __future__ import annotations - -import logging -import os -import sys -import typing as t -from datetime import timedelta -from itertools import chain - -from werkzeug.exceptions import Aborter -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import BadRequestKeyError -from werkzeug.routing import BuildError -from werkzeug.routing import Map -from werkzeug.routing import Rule -from werkzeug.sansio.response import Response -from werkzeug.utils import cached_property -from werkzeug.utils import redirect as _wz_redirect - -from .. import typing as ft -from ..config import Config -from ..config import ConfigAttribute -from ..ctx import _AppCtxGlobals -from ..helpers import _split_blueprint_path -from ..helpers import get_debug_flag -from ..json.provider import DefaultJSONProvider -from ..json.provider import JSONProvider -from ..logging import create_logger -from ..templating import DispatchingJinjaLoader -from ..templating import Environment -from .scaffold import _endpoint_from_view_func -from .scaffold import find_package -from .scaffold import Scaffold -from .scaffold import setupmethod - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.wrappers import Response as BaseResponse - - from ..testing import FlaskClient - from ..testing import FlaskCliRunner - from .blueprints import Blueprint - -T_shell_context_processor = t.TypeVar( - "T_shell_context_processor", bound=ft.ShellContextProcessorCallable -) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) - - -def _make_timedelta(value: timedelta | int | None) -> timedelta | None: - if value is None or isinstance(value, timedelta): - return value - - return timedelta(seconds=value) - - -class App(Scaffold): - """The flask object implements a WSGI application and acts as the central - object. It is passed the name of the module or package of the - application. Once it is created it will act as a central registry for - the view functions, the URL rules, template configuration and much more. - - The name of the package is used to resolve resources from inside the - package or the folder the module is contained in depending on if the - package parameter resolves to an actual python package (a folder with - an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). - - For more information about resource loading, see :func:`open_resource`. - - Usually you create a :class:`Flask` instance in your main module or - in the :file:`__init__.py` file of your package like this:: - - from flask import Flask - app = Flask(__name__) - - .. admonition:: About the First Parameter - - The idea of the first parameter is to give Flask an idea of what - belongs to your application. This name is used to find resources - on the filesystem, can be used by extensions to improve debugging - information and a lot more. - - So it's important what you provide there. If you are using a single - module, `__name__` is always the correct value. If you however are - using a package, it's usually recommended to hardcode the name of - your package there. - - For example if your application is defined in :file:`yourapplication/app.py` - you should create it with one of the two versions below:: - - app = Flask('yourapplication') - app = Flask(__name__.split('.')[0]) - - Why is that? The application will work even with `__name__`, thanks - to how resources are looked up. However it will make debugging more - painful. Certain extensions can make assumptions based on the - import name of your application. For example the Flask-SQLAlchemy - extension will look for the code in your application that triggered - an SQL query in debug mode. If the import name is not properly set - up, that debugging information is lost. (For example it would only - pick up SQL queries in `yourapplication.app` and not - `yourapplication.views.frontend`) - - .. versionadded:: 0.7 - The `static_url_path`, `static_folder`, and `template_folder` - parameters were added. - - .. versionadded:: 0.8 - The `instance_path` and `instance_relative_config` parameters were - added. - - .. versionadded:: 0.11 - The `root_path` parameter was added. - - .. versionadded:: 1.0 - The ``host_matching`` and ``static_host`` parameters were added. - - .. versionadded:: 1.0 - The ``subdomain_matching`` parameter was added. Subdomain - matching needs to be enabled manually now. Setting - :data:`SERVER_NAME` does not implicitly enable it. - - :param import_name: the name of the application package - :param static_url_path: can be used to specify a different path for the - static files on the web. Defaults to the name - of the `static_folder` folder. - :param static_folder: The folder with static files that is served at - ``static_url_path``. Relative to the application ``root_path`` - or an absolute path. Defaults to ``'static'``. - :param static_host: the host to use when adding the static route. - Defaults to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. - :param host_matching: set ``url_map.host_matching`` attribute. - Defaults to False. - :param subdomain_matching: consider the subdomain relative to - :data:`SERVER_NAME` when matching routes. Defaults to False. - :param template_folder: the folder that contains the templates that should - be used by the application. Defaults to - ``'templates'`` folder in the root path of the - application. - :param instance_path: An alternative instance path for the application. - By default the folder ``'instance'`` next to the - package or module is assumed to be the instance - path. - :param instance_relative_config: if set to ``True`` relative filenames - for loading the config are assumed to - be relative to the instance path instead - of the application root. - :param root_path: The path to the root of the application files. - This should only be set manually when it can't be detected - automatically, such as for namespace packages. - """ - - #: The class of the object assigned to :attr:`aborter`, created by - #: :meth:`create_aborter`. That object is called by - #: :func:`flask.abort` to raise HTTP errors, and can be - #: called directly as well. - #: - #: Defaults to :class:`werkzeug.exceptions.Aborter`. - #: - #: .. versionadded:: 2.2 - aborter_class = Aborter - - #: The class that is used for the Jinja environment. - #: - #: .. versionadded:: 0.11 - jinja_environment = Environment - - #: The class that is used for the :data:`~flask.g` instance. - #: - #: Example use cases for a custom class: - #: - #: 1. Store arbitrary attributes on flask.g. - #: 2. Add a property for lazy per-request database connectors. - #: 3. Return None instead of AttributeError on unexpected attributes. - #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. - #: - #: In Flask 0.9 this property was called `request_globals_class` but it - #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the - #: flask.g object is now application context scoped. - #: - #: .. versionadded:: 0.10 - app_ctx_globals_class = _AppCtxGlobals - - #: The class that is used for the ``config`` attribute of this app. - #: Defaults to :class:`~flask.Config`. - #: - #: Example use cases for a custom class: - #: - #: 1. Default values for certain config options. - #: 2. Access to config values through attributes in addition to keys. - #: - #: .. versionadded:: 0.11 - config_class = Config - - #: The testing flag. Set this to ``True`` to enable the test mode of - #: Flask extensions (and in the future probably also Flask itself). - #: For example this might activate test helpers that have an - #: additional runtime cost which should not be enabled by default. - #: - #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the - #: default it's implicitly enabled. - #: - #: This attribute can also be configured from the config with the - #: ``TESTING`` configuration key. Defaults to ``False``. - testing = ConfigAttribute[bool]("TESTING") - - #: If a secret key is set, cryptographic components can use this to - #: sign cookies and other things. Set this to a complex random value - #: when you want to use the secure cookie for instance. - #: - #: This attribute can also be configured from the config with the - #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. - secret_key = ConfigAttribute[t.Union[str, bytes, None]]("SECRET_KEY") - - #: A :class:`~datetime.timedelta` which is used to set the expiration - #: date of a permanent session. The default is 31 days which makes a - #: permanent session survive for roughly one month. - #: - #: This attribute can also be configured from the config with the - #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to - #: ``timedelta(days=31)`` - permanent_session_lifetime = ConfigAttribute[timedelta]( - "PERMANENT_SESSION_LIFETIME", - get_converter=_make_timedelta, # type: ignore[arg-type] - ) - - json_provider_class: type[JSONProvider] = DefaultJSONProvider - """A subclass of :class:`~flask.json.provider.JSONProvider`. An - instance is created and assigned to :attr:`app.json` when creating - the app. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses - Python's built-in :mod:`json` library. A different provider can use - a different JSON library. - - .. versionadded:: 2.2 - """ - - #: Options that are passed to the Jinja environment in - #: :meth:`create_jinja_environment`. Changing these options after - #: the environment is created (accessing :attr:`jinja_env`) will - #: have no effect. - #: - #: .. versionchanged:: 1.1.0 - #: This is a ``dict`` instead of an ``ImmutableDict`` to allow - #: easier configuration. - #: - jinja_options: dict[str, t.Any] = {} - - #: The rule object to use for URL rules created. This is used by - #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. - #: - #: .. versionadded:: 0.7 - url_rule_class = Rule - - #: The map object to use for storing the URL rules and routing - #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. - #: - #: .. versionadded:: 1.1.0 - url_map_class = Map - - #: The :meth:`test_client` method creates an instance of this test - #: client class. Defaults to :class:`~flask.testing.FlaskClient`. - #: - #: .. versionadded:: 0.7 - test_client_class: type[FlaskClient] | None = None - - #: The :class:`~click.testing.CliRunner` subclass, by default - #: :class:`~flask.testing.FlaskCliRunner` that is used by - #: :meth:`test_cli_runner`. Its ``__init__`` method should take a - #: Flask app object as the first argument. - #: - #: .. versionadded:: 1.0 - test_cli_runner_class: type[FlaskCliRunner] | None = None - - default_config: dict[str, t.Any] - response_class: type[Response] - - def __init__( - self, - import_name: str, - static_url_path: str | None = None, - static_folder: str | os.PathLike[str] | None = "static", - static_host: str | None = None, - host_matching: bool = False, - subdomain_matching: bool = False, - template_folder: str | os.PathLike[str] | None = "templates", - instance_path: str | None = None, - instance_relative_config: bool = False, - root_path: str | None = None, - ) -> None: - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if instance_path is None: - instance_path = self.auto_find_instance_path() - elif not os.path.isabs(instance_path): - raise ValueError( - "If an instance path is provided it must be absolute." - " A relative path was given instead." - ) - - #: Holds the path to the instance folder. - #: - #: .. versionadded:: 0.8 - self.instance_path = instance_path - - #: The configuration dictionary as :class:`Config`. This behaves - #: exactly like a regular dictionary but supports additional methods - #: to load a config from files. - self.config = self.make_config(instance_relative_config) - - #: An instance of :attr:`aborter_class` created by - #: :meth:`make_aborter`. This is called by :func:`flask.abort` - #: to raise HTTP errors, and can be called directly as well. - #: - #: .. versionadded:: 2.2 - #: Moved from ``flask.abort``, which calls this object. - self.aborter = self.make_aborter() - - self.json: JSONProvider = self.json_provider_class(self) - """Provides access to JSON methods. Functions in ``flask.json`` - will call methods on this provider when the application context - is active. Used for handling JSON requests and responses. - - An instance of :attr:`json_provider_class`. Can be customized by - changing that attribute on a subclass, or by assigning to this - attribute afterwards. - - The default, :class:`~flask.json.provider.DefaultJSONProvider`, - uses Python's built-in :mod:`json` library. A different provider - can use a different JSON library. - - .. versionadded:: 2.2 - """ - - #: A list of functions that are called by - #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a - #: :exc:`~werkzeug.routing.BuildError`. Each function is called - #: with ``error``, ``endpoint`` and ``values``. If a function - #: returns ``None`` or raises a ``BuildError``, it is skipped. - #: Otherwise, its return value is returned by ``url_for``. - #: - #: .. versionadded:: 0.9 - self.url_build_error_handlers: list[ - t.Callable[[Exception, str, dict[str, t.Any]], str] - ] = [] - - #: A list of functions that are called when the application context - #: is destroyed. Since the application context is also torn down - #: if the request ends this is the place to store code that disconnects - #: from databases. - #: - #: .. versionadded:: 0.9 - self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] - - #: A list of shell context processor functions that should be run - #: when a shell context is created. - #: - #: .. versionadded:: 0.11 - self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] - - #: Maps registered blueprint names to blueprint objects. The - #: dict retains the order the blueprints were registered in. - #: Blueprints can be registered multiple times, this dict does - #: not track how often they were attached. - #: - #: .. versionadded:: 0.7 - self.blueprints: dict[str, Blueprint] = {} - - #: a place where extensions can store application specific state. For - #: example this is where an extension could store database engines and - #: similar things. - #: - #: The key must match the name of the extension module. For example in - #: case of a "Flask-Foo" extension in `flask_foo`, the key would be - #: ``'foo'``. - #: - #: .. versionadded:: 0.7 - self.extensions: dict[str, t.Any] = {} - - #: The :class:`~werkzeug.routing.Map` for this instance. You can use - #: this to change the routing converters after the class was created - #: but before any routes are connected. Example:: - #: - #: from werkzeug.routing import BaseConverter - #: - #: class ListConverter(BaseConverter): - #: def to_python(self, value): - #: return value.split(',') - #: def to_url(self, values): - #: return ','.join(super(ListConverter, self).to_url(value) - #: for value in values) - #: - #: app = Flask(__name__) - #: app.url_map.converters['list'] = ListConverter - self.url_map = self.url_map_class(host_matching=host_matching) - - self.subdomain_matching = subdomain_matching - - # tracks internally if the application already handled at least one - # request. - self._got_first_request = False - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_first_request: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called" - " on the application. It has already handled its first" - " request, any changes will not be applied" - " consistently.\n" - "Make sure all imports, decorators, functions, etc." - " needed to set up the application are done before" - " running it." - ) - - @cached_property - def name(self) -> str: # type: ignore - """The name of the application. This is usually the import name - with the difference that it's guessed from the run file if the - import name is main. This name is used as a display name when - Flask needs the name of the application. It can be set and overridden - to change the value. - - .. versionadded:: 0.8 - """ - if self.import_name == "__main__": - fn: str | None = getattr(sys.modules["__main__"], "__file__", None) - if fn is None: - return "__main__" - return os.path.splitext(os.path.basename(fn))[0] - return self.import_name - - @cached_property - def logger(self) -> logging.Logger: - """A standard Python :class:`~logging.Logger` for the app, with - the same name as :attr:`name`. - - In debug mode, the logger's :attr:`~logging.Logger.level` will - be set to :data:`~logging.DEBUG`. - - If there are no handlers configured, a default handler will be - added. See :doc:`/logging` for more information. - - .. versionchanged:: 1.1.0 - The logger takes the same name as :attr:`name` rather than - hard-coding ``"flask.app"``. - - .. versionchanged:: 1.0.0 - Behavior was simplified. The logger is always named - ``"flask.app"``. The level is only set during configuration, - it doesn't check ``app.debug`` each time. Only one format is - used, not different ones depending on ``app.debug``. No - handlers are removed, and a handler is only added if no - handlers are already configured. - - .. versionadded:: 0.3 - """ - return create_logger(self) - - @cached_property - def jinja_env(self) -> Environment: - """The Jinja environment used to load templates. - - The environment is created the first time this property is - accessed. Changing :attr:`jinja_options` after that will have no - effect. - """ - return self.create_jinja_environment() - - def create_jinja_environment(self) -> Environment: - raise NotImplementedError() - - def make_config(self, instance_relative: bool = False) -> Config: - """Used to create the config attribute by the Flask constructor. - The `instance_relative` parameter is passed in from the constructor - of Flask (there named `instance_relative_config`) and indicates if - the config should be relative to the instance path or the root path - of the application. - - .. versionadded:: 0.8 - """ - root_path = self.root_path - if instance_relative: - root_path = self.instance_path - defaults = dict(self.default_config) - defaults["DEBUG"] = get_debug_flag() - return self.config_class(root_path, defaults) - - def make_aborter(self) -> Aborter: - """Create the object to assign to :attr:`aborter`. That object - is called by :func:`flask.abort` to raise HTTP errors, and can - be called directly as well. - - By default, this creates an instance of :attr:`aborter_class`, - which defaults to :class:`werkzeug.exceptions.Aborter`. - - .. versionadded:: 2.2 - """ - return self.aborter_class() - - def auto_find_instance_path(self) -> str: - """Tries to locate the instance path if it was not provided to the - constructor of the application class. It will basically calculate - the path to a folder named ``instance`` next to your main file or - the package. - - .. versionadded:: 0.8 - """ - prefix, package_path = find_package(self.import_name) - if prefix is None: - return os.path.join(package_path, "instance") - return os.path.join(prefix, "var", f"{self.name}-instance") - - def create_global_jinja_loader(self) -> DispatchingJinjaLoader: - """Creates the loader for the Jinja2 environment. Can be used to - override just the loader and keeping the rest unchanged. It's - discouraged to override this function. Instead one should override - the :meth:`jinja_loader` function instead. - - The global loader dispatches between the loaders of the application - and the individual blueprints. - - .. versionadded:: 0.7 - """ - return DispatchingJinjaLoader(self) - - def select_jinja_autoescape(self, filename: str) -> bool: - """Returns ``True`` if autoescaping should be active for the given - template name. If no template name is given, returns `True`. - - .. versionchanged:: 2.2 - Autoescaping is now enabled by default for ``.svg`` files. - - .. versionadded:: 0.5 - """ - if filename is None: - return True - return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) - - @property - def debug(self) -> bool: - """Whether debug mode is enabled. When using ``flask run`` to start the - development server, an interactive debugger will be shown for unhandled - exceptions, and the server will be reloaded when code changes. This maps to the - :data:`DEBUG` config key. It may not behave as expected if set late. - - **Do not enable debug mode when deploying in production.** - - Default: ``False`` - """ - return self.config["DEBUG"] # type: ignore[no-any-return] - - @debug.setter - def debug(self, value: bool) -> None: - self.config["DEBUG"] = value - - if self.config["TEMPLATES_AUTO_RELOAD"] is None: - self.jinja_env.auto_reload = value - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on the application. Keyword - arguments passed to this method will override the defaults set on the - blueprint. - - Calls the blueprint's :meth:`~flask.Blueprint.register` method after - recording the blueprint in the application's :attr:`blueprints`. - - :param blueprint: The blueprint to register. - :param url_prefix: Blueprint routes will be prefixed with this. - :param subdomain: Blueprint routes will match on this subdomain. - :param url_defaults: Blueprint routes will use these default values for - view arguments. - :param options: Additional keyword arguments are passed to - :class:`~flask.blueprints.BlueprintSetupState`. They can be - accessed in :meth:`~flask.Blueprint.record` callbacks. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 0.7 - """ - blueprint.register(self, options) - - def iter_blueprints(self) -> t.ValuesView[Blueprint]: - """Iterates over all blueprints by the order they were registered. - - .. versionadded:: 0.11 - """ - return self.blueprints.values() - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - options["endpoint"] = endpoint - methods = options.pop("methods", None) - - # if the methods are not given and the view_func object knows its - # methods we can use that instead. If neither exists, we go with - # a tuple of only ``GET`` as default. - if methods is None: - methods = getattr(view_func, "methods", None) or ("GET",) - if isinstance(methods, str): - raise TypeError( - "Allowed methods must be a list of strings, for" - ' example: @app.route(..., methods=["POST"])' - ) - methods = {item.upper() for item in methods} - - # Methods that should always be added - required_methods: set[str] = set(getattr(view_func, "required_methods", ())) - - # starting with Flask 0.8 the view_func object can disable and - # force-enable the automatic options handling. - if provide_automatic_options is None: - provide_automatic_options = getattr( - view_func, "provide_automatic_options", None - ) - - if provide_automatic_options is None: - if "OPTIONS" not in methods and self.config["PROVIDE_AUTOMATIC_OPTIONS"]: - provide_automatic_options = True - required_methods.add("OPTIONS") - else: - provide_automatic_options = False - - # Add the required methods now. - methods |= required_methods - - rule_obj = self.url_rule_class(rule, methods=methods, **options) - rule_obj.provide_automatic_options = provide_automatic_options # type: ignore[attr-defined] - - self.url_map.add(rule_obj) - if view_func is not None: - old_func = self.view_functions.get(endpoint) - if old_func is not None and old_func != view_func: - raise AssertionError( - "View function mapping is overwriting an existing" - f" endpoint function: {endpoint}" - ) - self.view_functions[endpoint] = view_func - - @setupmethod - def template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """A decorator that is used to register custom template filter. - You can specify a name for the filter, otherwise the function - name will be used. Example:: - - @app.template_filter() - def reverse(s): - return s[::-1] - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a custom template filter. Works exactly like the - :meth:`template_filter` decorator. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - self.jinja_env.filters[name or f.__name__] = f - - @setupmethod - def template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """A decorator that is used to register custom template test. - You can specify a name for the test, otherwise the function - name will be used. Example:: - - @app.template_test() - def is_prime(n): - if n == 2: - return True - for i in range(2, int(math.ceil(math.sqrt(n))) + 1): - if n % i == 0: - return False - return True - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a custom template test. Works exactly like the - :meth:`template_test` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - self.jinja_env.tests[name or f.__name__] = f - - @setupmethod - def template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """A decorator that is used to register a custom template global function. - You can specify a name for the global function, otherwise the function - name will be used. Example:: - - @app.template_global() - def double(n): - return 2 * n - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a custom template global function. Works exactly like the - :meth:`template_global` decorator. - - .. versionadded:: 0.10 - - :param name: the optional name of the global function, otherwise the - function name will be used. - """ - self.jinja_env.globals[name or f.__name__] = f - - @setupmethod - def teardown_appcontext(self, f: T_teardown) -> T_teardown: - """Registers a function to be called when the application - context is popped. The application context is typically popped - after the request context for each request, at the end of CLI - commands, or after a manually pushed context ends. - - .. code-block:: python - - with app.app_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the app context is - made inactive. Since a request context typically also manages an - application context it would also be called when you pop a - request context. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - .. versionadded:: 0.9 - """ - self.teardown_appcontext_funcs.append(f) - return f - - @setupmethod - def shell_context_processor( - self, f: T_shell_context_processor - ) -> T_shell_context_processor: - """Registers a shell context processor function. - - .. versionadded:: 0.11 - """ - self.shell_context_processors.append(f) - return f - - def _find_error_handler( - self, e: Exception, blueprints: list[str] - ) -> ft.ErrorHandlerCallable | None: - """Return a registered error handler for an exception in this order: - blueprint handler for a specific code, app handler for a specific code, - blueprint handler for an exception class, app handler for an exception - class, or ``None`` if a suitable handler is not found. - """ - exc_class, code = self._get_exc_class_and_code(type(e)) - names = (*blueprints, None) - - for c in (code, None) if code is not None else (None,): - for name in names: - handler_map = self.error_handler_spec[name][c] - - if not handler_map: - continue - - for cls in exc_class.__mro__: - handler = handler_map.get(cls) - - if handler is not None: - return handler - return None - - def trap_http_exception(self, e: Exception) -> bool: - """Checks if an HTTP exception should be trapped or not. By default - this will return ``False`` for all exceptions except for a bad request - key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It - also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. - - This is called for all HTTP exceptions raised by a view function. - If it returns ``True`` for any exception the error handler for this - exception is not called and it shows up as regular exception in the - traceback. This is helpful for debugging implicitly raised HTTP - exceptions. - - .. versionchanged:: 1.0 - Bad request errors are not trapped by default in debug mode. - - .. versionadded:: 0.8 - """ - if self.config["TRAP_HTTP_EXCEPTIONS"]: - return True - - trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] - - # if unset, trap key errors in debug mode - if ( - trap_bad_request is None - and self.debug - and isinstance(e, BadRequestKeyError) - ): - return True - - if trap_bad_request: - return isinstance(e, BadRequest) - - return False - - def should_ignore_error(self, error: BaseException | None) -> bool: - """This is called to figure out if an error should be ignored - or not as far as the teardown system is concerned. If this - function returns ``True`` then the teardown handlers will not be - passed the error. - - .. versionadded:: 0.10 - """ - return False - - def redirect(self, location: str, code: int = 302) -> BaseResponse: - """Create a redirect response object. - - This is called by :func:`flask.redirect`, and can be called - directly as well. - - :param location: The URL to redirect to. - :param code: The status code for the redirect. - - .. versionadded:: 2.2 - Moved from ``flask.redirect``, which calls this method. - """ - return _wz_redirect( - location, - code=code, - Response=self.response_class, # type: ignore[arg-type] - ) - - def inject_url_defaults(self, endpoint: str, values: dict[str, t.Any]) -> None: - """Injects the URL defaults for the given endpoint directly into - the values dictionary passed. This is used internally and - automatically called on URL building. - - .. versionadded:: 0.7 - """ - names: t.Iterable[str | None] = (None,) - - # url_for may be called outside a request context, parse the - # passed endpoint instead of using request.blueprints. - if "." in endpoint: - names = chain( - names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) - ) - - for name in names: - if name in self.url_default_functions: - for func in self.url_default_functions[name]: - func(endpoint, values) - - def handle_url_build_error( - self, error: BuildError, endpoint: str, values: dict[str, t.Any] - ) -> str: - """Called by :meth:`.url_for` if a - :exc:`~werkzeug.routing.BuildError` was raised. If this returns - a value, it will be returned by ``url_for``, otherwise the error - will be re-raised. - - Each function in :attr:`url_build_error_handlers` is called with - ``error``, ``endpoint`` and ``values``. If a function returns - ``None`` or raises a ``BuildError``, it is skipped. Otherwise, - its return value is returned by ``url_for``. - - :param error: The active ``BuildError`` being handled. - :param endpoint: The endpoint being built. - :param values: The keyword arguments passed to ``url_for``. - """ - for handler in self.url_build_error_handlers: - try: - rv = handler(error, endpoint, values) - except BuildError as e: - # make error available outside except block - error = e - else: - if rv is not None: - return rv - - # Re-raise if called with an active exception, otherwise raise - # the passed in exception. - if error is sys.exc_info()[1]: - raise - - raise error diff --git a/port/lib/python3.11/site-packages/flask/sansio/blueprints.py b/port/lib/python3.11/site-packages/flask/sansio/blueprints.py deleted file mode 100644 index 4f912cc..0000000 --- a/port/lib/python3.11/site-packages/flask/sansio/blueprints.py +++ /dev/null @@ -1,632 +0,0 @@ -from __future__ import annotations - -import os -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from .. import typing as ft -from .scaffold import _endpoint_from_view_func -from .scaffold import _sentinel -from .scaffold import Scaffold -from .scaffold import setupmethod - -if t.TYPE_CHECKING: # pragma: no cover - from .app import App - -DeferredSetupFunction = t.Callable[["BlueprintSetupState"], None] -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) -T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) -T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) - - -class BlueprintSetupState: - """Temporary holder object for registering a blueprint with the - application. An instance of this class is created by the - :meth:`~flask.Blueprint.make_setup_state` method and later passed - to all register callback functions. - """ - - def __init__( - self, - blueprint: Blueprint, - app: App, - options: t.Any, - first_registration: bool, - ) -> None: - #: a reference to the current application - self.app = app - - #: a reference to the blueprint that created this setup state. - self.blueprint = blueprint - - #: a dictionary with all options that were passed to the - #: :meth:`~flask.Flask.register_blueprint` method. - self.options = options - - #: as blueprints can be registered multiple times with the - #: application and not everything wants to be registered - #: multiple times on it, this attribute can be used to figure - #: out if the blueprint was registered in the past already. - self.first_registration = first_registration - - subdomain = self.options.get("subdomain") - if subdomain is None: - subdomain = self.blueprint.subdomain - - #: The subdomain that the blueprint should be active for, ``None`` - #: otherwise. - self.subdomain = subdomain - - url_prefix = self.options.get("url_prefix") - if url_prefix is None: - url_prefix = self.blueprint.url_prefix - #: The prefix that should be used for all URLs defined on the - #: blueprint. - self.url_prefix = url_prefix - - self.name = self.options.get("name", blueprint.name) - self.name_prefix = self.options.get("name_prefix", "") - - #: A dictionary with URL defaults that is added to each and every - #: URL that was defined with the blueprint. - self.url_defaults = dict(self.blueprint.url_values_defaults) - self.url_defaults.update(self.options.get("url_defaults", ())) - - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - **options: t.Any, - ) -> None: - """A helper method to register a rule (and optionally a view function) - to the application. The endpoint is automatically prefixed with the - blueprint's name. - """ - if self.url_prefix is not None: - if rule: - rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) - else: - rule = self.url_prefix - options.setdefault("subdomain", self.subdomain) - if endpoint is None: - endpoint = _endpoint_from_view_func(view_func) # type: ignore - defaults = self.url_defaults - if "defaults" in options: - defaults = dict(defaults, **options.pop("defaults")) - - self.app.add_url_rule( - rule, - f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), - view_func, - defaults=defaults, - **options, - ) - - -class Blueprint(Scaffold): - """Represents a blueprint, a collection of routes and other - app-related functions that can be registered on a real application - later. - - A blueprint is an object that allows defining application functions - without requiring an application object ahead of time. It uses the - same decorators as :class:`~flask.Flask`, but defers the need for an - application by recording them for later registration. - - Decorating a function with a blueprint creates a deferred function - that is called with :class:`~flask.blueprints.BlueprintSetupState` - when the blueprint is registered on an application. - - See :doc:`/blueprints` for more information. - - :param name: The name of the blueprint. Will be prepended to each - endpoint name. - :param import_name: The name of the blueprint package, usually - ``__name__``. This helps locate the ``root_path`` for the - blueprint. - :param static_folder: A folder with static files that should be - served by the blueprint's static route. The path is relative to - the blueprint's root path. Blueprint static files are disabled - by default. - :param static_url_path: The url to serve static files from. - Defaults to ``static_folder``. If the blueprint does not have - a ``url_prefix``, the app's static route will take precedence, - and the blueprint's static files won't be accessible. - :param template_folder: A folder with templates that should be added - to the app's template search path. The path is relative to the - blueprint's root path. Blueprint templates are disabled by - default. Blueprint templates have a lower precedence than those - in the app's templates folder. - :param url_prefix: A path to prepend to all of the blueprint's URLs, - to make them distinct from the rest of the app's routes. - :param subdomain: A subdomain that blueprint routes will match on by - default. - :param url_defaults: A dict of default values that blueprint routes - will receive by default. - :param root_path: By default, the blueprint will automatically set - this based on ``import_name``. In certain situations this - automatic detection can fail, so the path can be specified - manually instead. - - .. versionchanged:: 1.1.0 - Blueprints have a ``cli`` group to register nested CLI commands. - The ``cli_group`` parameter controls the name of the group under - the ``flask`` command. - - .. versionadded:: 0.7 - """ - - _got_registered_once = False - - def __init__( - self, - name: str, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - url_prefix: str | None = None, - subdomain: str | None = None, - url_defaults: dict[str, t.Any] | None = None, - root_path: str | None = None, - cli_group: str | None = _sentinel, # type: ignore[assignment] - ): - super().__init__( - import_name=import_name, - static_folder=static_folder, - static_url_path=static_url_path, - template_folder=template_folder, - root_path=root_path, - ) - - if not name: - raise ValueError("'name' may not be empty.") - - if "." in name: - raise ValueError("'name' may not contain a dot '.' character.") - - self.name = name - self.url_prefix = url_prefix - self.subdomain = subdomain - self.deferred_functions: list[DeferredSetupFunction] = [] - - if url_defaults is None: - url_defaults = {} - - self.url_values_defaults = url_defaults - self.cli_group = cli_group - self._blueprints: list[tuple[Blueprint, dict[str, t.Any]]] = [] - - def _check_setup_finished(self, f_name: str) -> None: - if self._got_registered_once: - raise AssertionError( - f"The setup method '{f_name}' can no longer be called on the blueprint" - f" '{self.name}'. It has already been registered at least once, any" - " changes will not be applied consistently.\n" - "Make sure all imports, decorators, functions, etc. needed to set up" - " the blueprint are done before registering it." - ) - - @setupmethod - def record(self, func: DeferredSetupFunction) -> None: - """Registers a function that is called when the blueprint is - registered on the application. This function is called with the - state as argument as returned by the :meth:`make_setup_state` - method. - """ - self.deferred_functions.append(func) - - @setupmethod - def record_once(self, func: DeferredSetupFunction) -> None: - """Works like :meth:`record` but wraps the function in another - function that will ensure the function is only called once. If the - blueprint is registered a second time on the application, the - function passed is not called. - """ - - def wrapper(state: BlueprintSetupState) -> None: - if state.first_registration: - func(state) - - self.record(update_wrapper(wrapper, func)) - - def make_setup_state( - self, app: App, options: dict[str, t.Any], first_registration: bool = False - ) -> BlueprintSetupState: - """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` - object that is later passed to the register callback functions. - Subclasses can override this to return a subclass of the setup state. - """ - return BlueprintSetupState(self, app, options, first_registration) - - @setupmethod - def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: - """Register a :class:`~flask.Blueprint` on this blueprint. Keyword - arguments passed to this method will override the defaults set - on the blueprint. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - - .. versionadded:: 2.0 - """ - if blueprint is self: - raise ValueError("Cannot register a blueprint on itself") - self._blueprints.append((blueprint, options)) - - def register(self, app: App, options: dict[str, t.Any]) -> None: - """Called by :meth:`Flask.register_blueprint` to register all - views and callbacks registered on the blueprint with the - application. Creates a :class:`.BlueprintSetupState` and calls - each :meth:`record` callback with it. - - :param app: The application this blueprint is being registered - with. - :param options: Keyword arguments forwarded from - :meth:`~Flask.register_blueprint`. - - .. versionchanged:: 2.3 - Nested blueprints now correctly apply subdomains. - - .. versionchanged:: 2.1 - Registering the same blueprint with the same name multiple - times is an error. - - .. versionchanged:: 2.0.1 - Nested blueprints are registered with their dotted name. - This allows different blueprints with the same name to be - nested at different locations. - - .. versionchanged:: 2.0.1 - The ``name`` option can be used to change the (pre-dotted) - name the blueprint is registered with. This allows the same - blueprint to be registered multiple times with unique names - for ``url_for``. - """ - name_prefix = options.get("name_prefix", "") - self_name = options.get("name", self.name) - name = f"{name_prefix}.{self_name}".lstrip(".") - - if name in app.blueprints: - bp_desc = "this" if app.blueprints[name] is self else "a different" - existing_at = f" '{name}'" if self_name != name else "" - - raise ValueError( - f"The name '{self_name}' is already registered for" - f" {bp_desc} blueprint{existing_at}. Use 'name=' to" - f" provide a unique name." - ) - - first_bp_registration = not any(bp is self for bp in app.blueprints.values()) - first_name_registration = name not in app.blueprints - - app.blueprints[name] = self - self._got_registered_once = True - state = self.make_setup_state(app, options, first_bp_registration) - - if self.has_static_folder: - state.add_url_rule( - f"{self.static_url_path}/", - view_func=self.send_static_file, # type: ignore[attr-defined] - endpoint="static", - ) - - # Merge blueprint data into parent. - if first_bp_registration or first_name_registration: - self._merge_blueprint_funcs(app, name) - - for deferred in self.deferred_functions: - deferred(state) - - cli_resolved_group = options.get("cli_group", self.cli_group) - - if self.cli.commands: - if cli_resolved_group is None: - app.cli.commands.update(self.cli.commands) - elif cli_resolved_group is _sentinel: - self.cli.name = name - app.cli.add_command(self.cli) - else: - self.cli.name = cli_resolved_group - app.cli.add_command(self.cli) - - for blueprint, bp_options in self._blueprints: - bp_options = bp_options.copy() - bp_url_prefix = bp_options.get("url_prefix") - bp_subdomain = bp_options.get("subdomain") - - if bp_subdomain is None: - bp_subdomain = blueprint.subdomain - - if state.subdomain is not None and bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain + "." + state.subdomain - elif bp_subdomain is not None: - bp_options["subdomain"] = bp_subdomain - elif state.subdomain is not None: - bp_options["subdomain"] = state.subdomain - - if bp_url_prefix is None: - bp_url_prefix = blueprint.url_prefix - - if state.url_prefix is not None and bp_url_prefix is not None: - bp_options["url_prefix"] = ( - state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") - ) - elif bp_url_prefix is not None: - bp_options["url_prefix"] = bp_url_prefix - elif state.url_prefix is not None: - bp_options["url_prefix"] = state.url_prefix - - bp_options["name_prefix"] = name - blueprint.register(app, bp_options) - - def _merge_blueprint_funcs(self, app: App, name: str) -> None: - def extend( - bp_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], - parent_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], - ) -> None: - for key, values in bp_dict.items(): - key = name if key is None else f"{name}.{key}" - parent_dict[key].extend(values) - - for key, value in self.error_handler_spec.items(): - key = name if key is None else f"{name}.{key}" - value = defaultdict( - dict, - { - code: {exc_class: func for exc_class, func in code_values.items()} - for code, code_values in value.items() - }, - ) - app.error_handler_spec[key] = value - - for endpoint, func in self.view_functions.items(): - app.view_functions[endpoint] = func - - extend(self.before_request_funcs, app.before_request_funcs) - extend(self.after_request_funcs, app.after_request_funcs) - extend( - self.teardown_request_funcs, - app.teardown_request_funcs, - ) - extend(self.url_default_functions, app.url_default_functions) - extend(self.url_value_preprocessors, app.url_value_preprocessors) - extend(self.template_context_processors, app.template_context_processors) - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for - full documentation. - - The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, - used with :func:`url_for`, is prefixed with the blueprint's name. - """ - if endpoint and "." in endpoint: - raise ValueError("'endpoint' may not contain a dot '.' character.") - - if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: - raise ValueError("'view_func' name may not contain a dot '.' character.") - - self.record( - lambda s: s.add_url_rule( - rule, - endpoint, - view_func, - provide_automatic_options=provide_automatic_options, - **options, - ) - ) - - @setupmethod - def app_template_filter( - self, name: str | None = None - ) -> t.Callable[[T_template_filter], T_template_filter]: - """Register a template filter, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def decorator(f: T_template_filter) -> T_template_filter: - self.add_app_template_filter(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_filter( - self, f: ft.TemplateFilterCallable, name: str | None = None - ) -> None: - """Register a template filter, available in any template rendered by the - application. Works like the :meth:`app_template_filter` decorator. Equivalent to - :meth:`.Flask.add_template_filter`. - - :param name: the optional name of the filter, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.filters[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_test( - self, name: str | None = None - ) -> t.Callable[[T_template_test], T_template_test]: - """Register a template test, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def decorator(f: T_template_test) -> T_template_test: - self.add_app_template_test(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_test( - self, f: ft.TemplateTestCallable, name: str | None = None - ) -> None: - """Register a template test, available in any template rendered by the - application. Works like the :meth:`app_template_test` decorator. Equivalent to - :meth:`.Flask.add_template_test`. - - .. versionadded:: 0.10 - - :param name: the optional name of the test, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.tests[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def app_template_global( - self, name: str | None = None - ) -> t.Callable[[T_template_global], T_template_global]: - """Register a template global, available in any template rendered by the - application. Equivalent to :meth:`.Flask.template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def decorator(f: T_template_global) -> T_template_global: - self.add_app_template_global(f, name=name) - return f - - return decorator - - @setupmethod - def add_app_template_global( - self, f: ft.TemplateGlobalCallable, name: str | None = None - ) -> None: - """Register a template global, available in any template rendered by the - application. Works like the :meth:`app_template_global` decorator. Equivalent to - :meth:`.Flask.add_template_global`. - - .. versionadded:: 0.10 - - :param name: the optional name of the global, otherwise the - function name will be used. - """ - - def register_template(state: BlueprintSetupState) -> None: - state.app.jinja_env.globals[name or f.__name__] = f - - self.record_once(register_template) - - @setupmethod - def before_app_request(self, f: T_before_request) -> T_before_request: - """Like :meth:`before_request`, but before every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.before_request`. - """ - self.record_once( - lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def after_app_request(self, f: T_after_request) -> T_after_request: - """Like :meth:`after_request`, but after every request, not only those handled - by the blueprint. Equivalent to :meth:`.Flask.after_request`. - """ - self.record_once( - lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def teardown_app_request(self, f: T_teardown) -> T_teardown: - """Like :meth:`teardown_request`, but after every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. - """ - self.record_once( - lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_context_processor( - self, f: T_template_context_processor - ) -> T_template_context_processor: - """Like :meth:`context_processor`, but for templates rendered by every view, not - only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. - """ - self.record_once( - lambda s: s.app.template_context_processors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_errorhandler( - self, code: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Like :meth:`errorhandler`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.errorhandler`. - """ - - def decorator(f: T_error_handler) -> T_error_handler: - def from_blueprint(state: BlueprintSetupState) -> None: - state.app.errorhandler(code)(f) - - self.record_once(from_blueprint) - return f - - return decorator - - @setupmethod - def app_url_value_preprocessor( - self, f: T_url_value_preprocessor - ) -> T_url_value_preprocessor: - """Like :meth:`url_value_preprocessor`, but for every request, not only those - handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. - """ - self.record_once( - lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) - ) - return f - - @setupmethod - def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Like :meth:`url_defaults`, but for every request, not only those handled by - the blueprint. Equivalent to :meth:`.Flask.url_defaults`. - """ - self.record_once( - lambda s: s.app.url_default_functions.setdefault(None, []).append(f) - ) - return f diff --git a/port/lib/python3.11/site-packages/flask/sansio/scaffold.py b/port/lib/python3.11/site-packages/flask/sansio/scaffold.py deleted file mode 100644 index 3a839f5..0000000 --- a/port/lib/python3.11/site-packages/flask/sansio/scaffold.py +++ /dev/null @@ -1,792 +0,0 @@ -from __future__ import annotations - -import importlib.util -import os -import pathlib -import sys -import typing as t -from collections import defaultdict -from functools import update_wrapper - -from jinja2 import BaseLoader -from jinja2 import FileSystemLoader -from werkzeug.exceptions import default_exceptions -from werkzeug.exceptions import HTTPException -from werkzeug.utils import cached_property - -from .. import typing as ft -from ..helpers import get_root_path -from ..templating import _default_template_ctx_processor - -if t.TYPE_CHECKING: # pragma: no cover - from click import Group - -# a singleton sentinel value for parameter defaults -_sentinel = object() - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable[t.Any]) -T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) -T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) -T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) -T_template_context_processor = t.TypeVar( - "T_template_context_processor", bound=ft.TemplateContextProcessorCallable -) -T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) -T_url_value_preprocessor = t.TypeVar( - "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable -) -T_route = t.TypeVar("T_route", bound=ft.RouteCallable) - - -def setupmethod(f: F) -> F: - f_name = f.__name__ - - def wrapper_func(self: Scaffold, *args: t.Any, **kwargs: t.Any) -> t.Any: - self._check_setup_finished(f_name) - return f(self, *args, **kwargs) - - return t.cast(F, update_wrapper(wrapper_func, f)) - - -class Scaffold: - """Common behavior shared between :class:`~flask.Flask` and - :class:`~flask.blueprints.Blueprint`. - - :param import_name: The import name of the module where this object - is defined. Usually :attr:`__name__` should be used. - :param static_folder: Path to a folder of static files to serve. - If this is set, a static route will be added. - :param static_url_path: URL prefix for the static route. - :param template_folder: Path to a folder containing template files. - for rendering. If this is set, a Jinja loader will be added. - :param root_path: The path that static, template, and resource files - are relative to. Typically not set, it is discovered based on - the ``import_name``. - - .. versionadded:: 2.0 - """ - - cli: Group - name: str - _static_folder: str | None = None - _static_url_path: str | None = None - - def __init__( - self, - import_name: str, - static_folder: str | os.PathLike[str] | None = None, - static_url_path: str | None = None, - template_folder: str | os.PathLike[str] | None = None, - root_path: str | None = None, - ): - #: The name of the package or module that this object belongs - #: to. Do not change this once it is set by the constructor. - self.import_name = import_name - - self.static_folder = static_folder # type: ignore - self.static_url_path = static_url_path - - #: The path to the templates folder, relative to - #: :attr:`root_path`, to add to the template loader. ``None`` if - #: templates should not be added. - self.template_folder = template_folder - - if root_path is None: - root_path = get_root_path(self.import_name) - - #: Absolute path to the package on the filesystem. Used to look - #: up resources contained in the package. - self.root_path = root_path - - #: A dictionary mapping endpoint names to view functions. - #: - #: To register a view function, use the :meth:`route` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.view_functions: dict[str, ft.RouteCallable] = {} - - #: A data structure of registered error handlers, in the format - #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is - #: the name of a blueprint the handlers are active for, or - #: ``None`` for all requests. The ``code`` key is the HTTP - #: status code for ``HTTPException``, or ``None`` for - #: other exceptions. The innermost dictionary maps exception - #: classes to handler functions. - #: - #: To register an error handler, use the :meth:`errorhandler` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.error_handler_spec: dict[ - ft.AppOrBlueprintKey, - dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], - ] = defaultdict(lambda: defaultdict(dict)) - - #: A data structure of functions to call at the beginning of - #: each request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`before_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.before_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request, in the format ``{scope: [functions]}``. The - #: ``scope`` key is the name of a blueprint the functions are - #: active for, or ``None`` for all requests. - #: - #: To register a function, use the :meth:`after_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.after_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.AfterRequestCallable[t.Any]] - ] = defaultdict(list) - - #: A data structure of functions to call at the end of each - #: request even if an exception is raised, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`teardown_request` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.teardown_request_funcs: dict[ - ft.AppOrBlueprintKey, list[ft.TeardownCallable] - ] = defaultdict(list) - - #: A data structure of functions to call to pass extra context - #: values when rendering templates, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`context_processor` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.template_context_processors: dict[ - ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] - ] = defaultdict(list, {None: [_default_template_ctx_processor]}) - - #: A data structure of functions to call to modify the keyword - #: arguments passed to the view function, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the - #: :meth:`url_value_preprocessor` decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_value_preprocessors: dict[ - ft.AppOrBlueprintKey, - list[ft.URLValuePreprocessorCallable], - ] = defaultdict(list) - - #: A data structure of functions to call to modify the keyword - #: arguments when generating URLs, in the format - #: ``{scope: [functions]}``. The ``scope`` key is the name of a - #: blueprint the functions are active for, or ``None`` for all - #: requests. - #: - #: To register a function, use the :meth:`url_defaults` - #: decorator. - #: - #: This data structure is internal. It should not be modified - #: directly and its format may change at any time. - self.url_default_functions: dict[ - ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] - ] = defaultdict(list) - - def __repr__(self) -> str: - return f"<{type(self).__name__} {self.name!r}>" - - def _check_setup_finished(self, f_name: str) -> None: - raise NotImplementedError - - @property - def static_folder(self) -> str | None: - """The absolute path to the configured static folder. ``None`` - if no static folder is set. - """ - if self._static_folder is not None: - return os.path.join(self.root_path, self._static_folder) - else: - return None - - @static_folder.setter - def static_folder(self, value: str | os.PathLike[str] | None) -> None: - if value is not None: - value = os.fspath(value).rstrip(r"\/") - - self._static_folder = value - - @property - def has_static_folder(self) -> bool: - """``True`` if :attr:`static_folder` is set. - - .. versionadded:: 0.5 - """ - return self.static_folder is not None - - @property - def static_url_path(self) -> str | None: - """The URL prefix that the static route will be accessible from. - - If it was not configured during init, it is derived from - :attr:`static_folder`. - """ - if self._static_url_path is not None: - return self._static_url_path - - if self.static_folder is not None: - basename = os.path.basename(self.static_folder) - return f"/{basename}".rstrip("/") - - return None - - @static_url_path.setter - def static_url_path(self, value: str | None) -> None: - if value is not None: - value = value.rstrip("/") - - self._static_url_path = value - - @cached_property - def jinja_loader(self) -> BaseLoader | None: - """The Jinja loader for this object's templates. By default this - is a class :class:`jinja2.loaders.FileSystemLoader` to - :attr:`template_folder` if it is set. - - .. versionadded:: 0.5 - """ - if self.template_folder is not None: - return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) - else: - return None - - def _method_route( - self, - method: str, - rule: str, - options: dict[str, t.Any], - ) -> t.Callable[[T_route], T_route]: - if "methods" in options: - raise TypeError("Use the 'route' decorator to use the 'methods' argument.") - - return self.route(rule, methods=[method], **options) - - @setupmethod - def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["GET"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("GET", rule, options) - - @setupmethod - def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["POST"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("POST", rule, options) - - @setupmethod - def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PUT"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PUT", rule, options) - - @setupmethod - def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["DELETE"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("DELETE", rule, options) - - @setupmethod - def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Shortcut for :meth:`route` with ``methods=["PATCH"]``. - - .. versionadded:: 2.0 - """ - return self._method_route("PATCH", rule, options) - - @setupmethod - def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: - """Decorate a view function to register it with the given URL - rule and options. Calls :meth:`add_url_rule`, which has more - details about the implementation. - - .. code-block:: python - - @app.route("/") - def index(): - return "Hello, World!" - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and - ``OPTIONS`` are added automatically. - - :param rule: The URL rule string. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - - def decorator(f: T_route) -> T_route: - endpoint = options.pop("endpoint", None) - self.add_url_rule(rule, endpoint, f, **options) - return f - - return decorator - - @setupmethod - def add_url_rule( - self, - rule: str, - endpoint: str | None = None, - view_func: ft.RouteCallable | None = None, - provide_automatic_options: bool | None = None, - **options: t.Any, - ) -> None: - """Register a rule for routing incoming requests and building - URLs. The :meth:`route` decorator is a shortcut to call this - with the ``view_func`` argument. These are equivalent: - - .. code-block:: python - - @app.route("/") - def index(): - ... - - .. code-block:: python - - def index(): - ... - - app.add_url_rule("/", view_func=index) - - See :ref:`url-route-registrations`. - - The endpoint name for the route defaults to the name of the view - function if the ``endpoint`` parameter isn't passed. An error - will be raised if a function has already been registered for the - endpoint. - - The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is - always added automatically, and ``OPTIONS`` is added - automatically by default. - - ``view_func`` does not necessarily need to be passed, but if the - rule should participate in routing an endpoint name must be - associated with a view function at some point with the - :meth:`endpoint` decorator. - - .. code-block:: python - - app.add_url_rule("/", endpoint="index") - - @app.endpoint("index") - def index(): - ... - - If ``view_func`` has a ``required_methods`` attribute, those - methods are added to the passed and automatic methods. If it - has a ``provide_automatic_methods`` attribute, it is used as the - default if the parameter is not passed. - - :param rule: The URL rule string. - :param endpoint: The endpoint name to associate with the rule - and view function. Used when routing and building URLs. - Defaults to ``view_func.__name__``. - :param view_func: The view function to associate with the - endpoint name. - :param provide_automatic_options: Add the ``OPTIONS`` method and - respond to ``OPTIONS`` requests automatically. - :param options: Extra options passed to the - :class:`~werkzeug.routing.Rule` object. - """ - raise NotImplementedError - - @setupmethod - def endpoint(self, endpoint: str) -> t.Callable[[F], F]: - """Decorate a view function to register it for the given - endpoint. Used if a rule is added without a ``view_func`` with - :meth:`add_url_rule`. - - .. code-block:: python - - app.add_url_rule("/ex", endpoint="example") - - @app.endpoint("example") - def example(): - ... - - :param endpoint: The endpoint name to associate with the view - function. - """ - - def decorator(f: F) -> F: - self.view_functions[endpoint] = f - return f - - return decorator - - @setupmethod - def before_request(self, f: T_before_request) -> T_before_request: - """Register a function to run before each request. - - For example, this can be used to open a database connection, or - to load the logged in user from the session. - - .. code-block:: python - - @app.before_request - def load_user(): - if "user_id" in session: - g.user = db.session.get(session["user_id"]) - - The function will be called without any arguments. If it returns - a non-``None`` value, the value is handled as if it was the - return value from the view, and further request handling is - stopped. - - This is available on both app and blueprint objects. When used on an app, this - executes before every request. When used on a blueprint, this executes before - every request that the blueprint handles. To register with a blueprint and - execute before every request, use :meth:`.Blueprint.before_app_request`. - """ - self.before_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def after_request(self, f: T_after_request) -> T_after_request: - """Register a function to run after each request to this object. - - The function is called with the response object, and must return - a response object. This allows the functions to modify or - replace the response before it is sent. - - If a function raises an exception, any remaining - ``after_request`` functions will not be called. Therefore, this - should not be used for actions that must execute, such as to - close resources. Use :meth:`teardown_request` for that. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.after_app_request`. - """ - self.after_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def teardown_request(self, f: T_teardown) -> T_teardown: - """Register a function to be called when the request context is - popped. Typically this happens at the end of each request, but - contexts may be pushed manually as well during testing. - - .. code-block:: python - - with app.test_request_context(): - ... - - When the ``with`` block exits (or ``ctx.pop()`` is called), the - teardown functions are called just before the request context is - made inactive. - - When a teardown function was called because of an unhandled - exception it will be passed an error object. If an - :meth:`errorhandler` is registered, it will handle the exception - and the teardown will not receive it. - - Teardown functions must avoid raising exceptions. If they - execute code that might fail they must surround that code with a - ``try``/``except`` block and log any errors. - - The return values of teardown functions are ignored. - - This is available on both app and blueprint objects. When used on an app, this - executes after every request. When used on a blueprint, this executes after - every request that the blueprint handles. To register with a blueprint and - execute after every request, use :meth:`.Blueprint.teardown_app_request`. - """ - self.teardown_request_funcs.setdefault(None, []).append(f) - return f - - @setupmethod - def context_processor( - self, - f: T_template_context_processor, - ) -> T_template_context_processor: - """Registers a template context processor function. These functions run before - rendering a template. The keys of the returned dict are added as variables - available in the template. - - This is available on both app and blueprint objects. When used on an app, this - is called for every rendered template. When used on a blueprint, this is called - for templates rendered from the blueprint's views. To register with a blueprint - and affect every template, use :meth:`.Blueprint.app_context_processor`. - """ - self.template_context_processors[None].append(f) - return f - - @setupmethod - def url_value_preprocessor( - self, - f: T_url_value_preprocessor, - ) -> T_url_value_preprocessor: - """Register a URL value preprocessor function for all view - functions in the application. These functions will be called before the - :meth:`before_request` functions. - - The function can modify the values captured from the matched url before - they are passed to the view. For example, this can be used to pop a - common language code value and place it in ``g`` rather than pass it to - every view. - - The function is passed the endpoint name and values dict. The return - value is ignored. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_value_preprocessor`. - """ - self.url_value_preprocessors[None].append(f) - return f - - @setupmethod - def url_defaults(self, f: T_url_defaults) -> T_url_defaults: - """Callback function for URL defaults for all view functions of the - application. It's called with the endpoint and values and should - update the values passed in place. - - This is available on both app and blueprint objects. When used on an app, this - is called for every request. When used on a blueprint, this is called for - requests that the blueprint handles. To register with a blueprint and affect - every request, use :meth:`.Blueprint.app_url_defaults`. - """ - self.url_default_functions[None].append(f) - return f - - @setupmethod - def errorhandler( - self, code_or_exception: type[Exception] | int - ) -> t.Callable[[T_error_handler], T_error_handler]: - """Register a function to handle errors by code or exception class. - - A decorator that is used to register a function given an - error code. Example:: - - @app.errorhandler(404) - def page_not_found(error): - return 'This page does not exist', 404 - - You can also register handlers for arbitrary exceptions:: - - @app.errorhandler(DatabaseError) - def special_exception_handler(error): - return 'Database connection failed', 500 - - This is available on both app and blueprint objects. When used on an app, this - can handle errors from every request. When used on a blueprint, this can handle - errors from requests that the blueprint handles. To register with a blueprint - and affect every request, use :meth:`.Blueprint.app_errorhandler`. - - .. versionadded:: 0.7 - Use :meth:`register_error_handler` instead of modifying - :attr:`error_handler_spec` directly, for application wide error - handlers. - - .. versionadded:: 0.7 - One can now additionally also register custom exception types - that do not necessarily have to be a subclass of the - :class:`~werkzeug.exceptions.HTTPException` class. - - :param code_or_exception: the code as integer for the handler, or - an arbitrary exception - """ - - def decorator(f: T_error_handler) -> T_error_handler: - self.register_error_handler(code_or_exception, f) - return f - - return decorator - - @setupmethod - def register_error_handler( - self, - code_or_exception: type[Exception] | int, - f: ft.ErrorHandlerCallable, - ) -> None: - """Alternative error attach function to the :meth:`errorhandler` - decorator that is more straightforward to use for non decorator - usage. - - .. versionadded:: 0.7 - """ - exc_class, code = self._get_exc_class_and_code(code_or_exception) - self.error_handler_spec[None][code][exc_class] = f - - @staticmethod - def _get_exc_class_and_code( - exc_class_or_code: type[Exception] | int, - ) -> tuple[type[Exception], int | None]: - """Get the exception class being handled. For HTTP status codes - or ``HTTPException`` subclasses, return both the exception and - status code. - - :param exc_class_or_code: Any exception class, or an HTTP status - code as an integer. - """ - exc_class: type[Exception] - - if isinstance(exc_class_or_code, int): - try: - exc_class = default_exceptions[exc_class_or_code] - except KeyError: - raise ValueError( - f"'{exc_class_or_code}' is not a recognized HTTP" - " error code. Use a subclass of HTTPException with" - " that code instead." - ) from None - else: - exc_class = exc_class_or_code - - if isinstance(exc_class, Exception): - raise TypeError( - f"{exc_class!r} is an instance, not a class. Handlers" - " can only be registered for Exception classes or HTTP" - " error codes." - ) - - if not issubclass(exc_class, Exception): - raise ValueError( - f"'{exc_class.__name__}' is not a subclass of Exception." - " Handlers can only be registered for Exception classes" - " or HTTP error codes." - ) - - if issubclass(exc_class, HTTPException): - return exc_class, exc_class.code - else: - return exc_class, None - - -def _endpoint_from_view_func(view_func: ft.RouteCallable) -> str: - """Internal helper that returns the default endpoint for a given - function. This always is the function name. - """ - assert view_func is not None, "expected view func if endpoint is not provided." - return view_func.__name__ - - -def _find_package_path(import_name: str) -> str: - """Find the path that contains the package or module.""" - root_mod_name, _, _ = import_name.partition(".") - - try: - root_spec = importlib.util.find_spec(root_mod_name) - - if root_spec is None: - raise ValueError("not found") - except (ImportError, ValueError): - # ImportError: the machinery told us it does not exist - # ValueError: - # - the module name was invalid - # - the module name is __main__ - # - we raised `ValueError` due to `root_spec` being `None` - return os.getcwd() - - if root_spec.submodule_search_locations: - if root_spec.origin is None or root_spec.origin == "namespace": - # namespace package - package_spec = importlib.util.find_spec(import_name) - - if package_spec is not None and package_spec.submodule_search_locations: - # Pick the path in the namespace that contains the submodule. - package_path = pathlib.Path( - os.path.commonpath(package_spec.submodule_search_locations) - ) - search_location = next( - location - for location in root_spec.submodule_search_locations - if package_path.is_relative_to(location) - ) - else: - # Pick the first path. - search_location = root_spec.submodule_search_locations[0] - - return os.path.dirname(search_location) - else: - # package with __init__.py - return os.path.dirname(os.path.dirname(root_spec.origin)) - else: - # module - return os.path.dirname(root_spec.origin) # type: ignore[type-var, return-value] - - -def find_package(import_name: str) -> tuple[str | None, str]: - """Find the prefix that a package is installed under, and the path - that it would be imported from. - - The prefix is the directory containing the standard directory - hierarchy (lib, bin, etc.). If the package is not installed to the - system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), - ``None`` is returned. - - The path is the entry in :attr:`sys.path` that contains the package - for import. If the package is not installed, it's assumed that the - package was imported from the current working directory. - """ - package_path = _find_package_path(import_name) - py_prefix = os.path.abspath(sys.prefix) - - # installed to the system - if pathlib.PurePath(package_path).is_relative_to(py_prefix): - return py_prefix, package_path - - site_parent, site_folder = os.path.split(package_path) - - # installed to a virtualenv - if site_folder.lower() == "site-packages": - parent, folder = os.path.split(site_parent) - - # Windows (prefix/lib/site-packages) - if folder.lower() == "lib": - return parent, package_path - - # Unix (prefix/lib/pythonX.Y/site-packages) - if os.path.basename(parent).lower() == "lib": - return os.path.dirname(parent), package_path - - # something else (prefix/site-packages) - return site_parent, package_path - - # not installed - return None, package_path diff --git a/port/lib/python3.11/site-packages/flask/sessions.py b/port/lib/python3.11/site-packages/flask/sessions.py deleted file mode 100644 index 375de06..0000000 --- a/port/lib/python3.11/site-packages/flask/sessions.py +++ /dev/null @@ -1,398 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import hashlib -import typing as t -from collections.abc import MutableMapping -from datetime import datetime -from datetime import timezone - -from itsdangerous import BadSignature -from itsdangerous import URLSafeTimedSerializer -from werkzeug.datastructures import CallbackDict - -from .json.tag import TaggedJSONSerializer - -if t.TYPE_CHECKING: # pragma: no cover - import typing_extensions as te - - from .app import Flask - from .wrappers import Request - from .wrappers import Response - - -class SessionMixin(MutableMapping[str, t.Any]): - """Expands a basic dictionary with session attributes.""" - - @property - def permanent(self) -> bool: - """This reflects the ``'_permanent'`` key in the dict.""" - return self.get("_permanent", False) - - @permanent.setter - def permanent(self, value: bool) -> None: - self["_permanent"] = bool(value) - - #: Some implementations can detect whether a session is newly - #: created, but that is not guaranteed. Use with caution. The mixin - # default is hard-coded ``False``. - new = False - - #: Some implementations can detect changes to the session and set - #: this when that happens. The mixin default is hard coded to - #: ``True``. - modified = True - - #: Some implementations can detect when session data is read or - #: written and set this when that happens. The mixin default is hard - #: coded to ``True``. - accessed = True - - -class SecureCookieSession(CallbackDict[str, t.Any], SessionMixin): - """Base class for sessions based on signed cookies. - - This session backend will set the :attr:`modified` and - :attr:`accessed` attributes. It cannot reliably track whether a - session is new (vs. empty), so :attr:`new` remains hard coded to - ``False``. - """ - - #: When data is changed, this is set to ``True``. Only the session - #: dictionary itself is tracked; if the session contains mutable - #: data (for example a nested dict) then this must be set to - #: ``True`` manually when modifying that data. The session cookie - #: will only be written to the response if this is ``True``. - modified = False - - #: When data is read or written, this is set to ``True``. Used by - # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` - #: header, which allows caching proxies to cache different pages for - #: different users. - accessed = False - - def __init__( - self, - initial: c.Mapping[str, t.Any] | c.Iterable[tuple[str, t.Any]] | None = None, - ) -> None: - def on_update(self: te.Self) -> None: - self.modified = True - self.accessed = True - - super().__init__(initial, on_update) - - def __getitem__(self, key: str) -> t.Any: - self.accessed = True - return super().__getitem__(key) - - def get(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().get(key, default) - - def setdefault(self, key: str, default: t.Any = None) -> t.Any: - self.accessed = True - return super().setdefault(key, default) - - -class NullSession(SecureCookieSession): - """Class used to generate nicer error messages if sessions are not - available. Will still allow read-only access to the empty session - but fail on setting. - """ - - def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: - raise RuntimeError( - "The session is unavailable because no secret " - "key was set. Set the secret_key on the " - "application to something unique and secret." - ) - - __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 - del _fail - - -class SessionInterface: - """The basic interface you have to implement in order to replace the - default session interface which uses werkzeug's securecookie - implementation. The only methods you have to implement are - :meth:`open_session` and :meth:`save_session`, the others have - useful defaults which you don't need to change. - - The session object returned by the :meth:`open_session` method has to - provide a dictionary like interface plus the properties and methods - from the :class:`SessionMixin`. We recommend just subclassing a dict - and adding that mixin:: - - class Session(dict, SessionMixin): - pass - - If :meth:`open_session` returns ``None`` Flask will call into - :meth:`make_null_session` to create a session that acts as replacement - if the session support cannot work because some requirement is not - fulfilled. The default :class:`NullSession` class that is created - will complain that the secret key was not set. - - To replace the session interface on an application all you have to do - is to assign :attr:`flask.Flask.session_interface`:: - - app = Flask(__name__) - app.session_interface = MySessionInterface() - - Multiple requests with the same session may be sent and handled - concurrently. When implementing a new session interface, consider - whether reads or writes to the backing store must be synchronized. - There is no guarantee on the order in which the session for each - request is opened or saved, it will occur in the order that requests - begin and end processing. - - .. versionadded:: 0.8 - """ - - #: :meth:`make_null_session` will look here for the class that should - #: be created when a null session is requested. Likewise the - #: :meth:`is_null_session` method will perform a typecheck against - #: this type. - null_session_class = NullSession - - #: A flag that indicates if the session interface is pickle based. - #: This can be used by Flask extensions to make a decision in regards - #: to how to deal with the session object. - #: - #: .. versionadded:: 0.10 - pickle_based = False - - def make_null_session(self, app: Flask) -> NullSession: - """Creates a null session which acts as a replacement object if the - real session support could not be loaded due to a configuration - error. This mainly aids the user experience because the job of the - null session is to still support lookup without complaining but - modifications are answered with a helpful error message of what - failed. - - This creates an instance of :attr:`null_session_class` by default. - """ - return self.null_session_class() - - def is_null_session(self, obj: object) -> bool: - """Checks if a given object is a null session. Null sessions are - not asked to be saved. - - This checks if the object is an instance of :attr:`null_session_class` - by default. - """ - return isinstance(obj, self.null_session_class) - - def get_cookie_name(self, app: Flask) -> str: - """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" - return app.config["SESSION_COOKIE_NAME"] # type: ignore[no-any-return] - - def get_cookie_domain(self, app: Flask) -> str | None: - """The value of the ``Domain`` parameter on the session cookie. If not set, - browsers will only send the cookie to the exact domain it was set from. - Otherwise, they will send it to any subdomain of the given value as well. - - Uses the :data:`SESSION_COOKIE_DOMAIN` config. - - .. versionchanged:: 2.3 - Not set by default, does not fall back to ``SERVER_NAME``. - """ - return app.config["SESSION_COOKIE_DOMAIN"] # type: ignore[no-any-return] - - def get_cookie_path(self, app: Flask) -> str: - """Returns the path for which the cookie should be valid. The - default implementation uses the value from the ``SESSION_COOKIE_PATH`` - config var if it's set, and falls back to ``APPLICATION_ROOT`` or - uses ``/`` if it's ``None``. - """ - return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] # type: ignore[no-any-return] - - def get_cookie_httponly(self, app: Flask) -> bool: - """Returns True if the session cookie should be httponly. This - currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` - config var. - """ - return app.config["SESSION_COOKIE_HTTPONLY"] # type: ignore[no-any-return] - - def get_cookie_secure(self, app: Flask) -> bool: - """Returns True if the cookie should be secure. This currently - just returns the value of the ``SESSION_COOKIE_SECURE`` setting. - """ - return app.config["SESSION_COOKIE_SECURE"] # type: ignore[no-any-return] - - def get_cookie_samesite(self, app: Flask) -> str | None: - """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the - ``SameSite`` attribute. This currently just returns the value of - the :data:`SESSION_COOKIE_SAMESITE` setting. - """ - return app.config["SESSION_COOKIE_SAMESITE"] # type: ignore[no-any-return] - - def get_cookie_partitioned(self, app: Flask) -> bool: - """Returns True if the cookie should be partitioned. By default, uses - the value of :data:`SESSION_COOKIE_PARTITIONED`. - - .. versionadded:: 3.1 - """ - return app.config["SESSION_COOKIE_PARTITIONED"] # type: ignore[no-any-return] - - def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: - """A helper method that returns an expiration date for the session - or ``None`` if the session is linked to the browser session. The - default implementation returns now + the permanent session - lifetime configured on the application. - """ - if session.permanent: - return datetime.now(timezone.utc) + app.permanent_session_lifetime - return None - - def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: - """Used by session backends to determine if a ``Set-Cookie`` header - should be set for this session cookie for this response. If the session - has been modified, the cookie is set. If the session is permanent and - the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is - always set. - - This check is usually skipped if the session was deleted. - - .. versionadded:: 0.11 - """ - - return session.modified or ( - session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] - ) - - def open_session(self, app: Flask, request: Request) -> SessionMixin | None: - """This is called at the beginning of each request, after - pushing the request context, before matching the URL. - - This must return an object which implements a dictionary-like - interface as well as the :class:`SessionMixin` interface. - - This will return ``None`` to indicate that loading failed in - some way that is not immediately an error. The request - context will fall back to using :meth:`make_null_session` - in this case. - """ - raise NotImplementedError() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - """This is called at the end of each request, after generating - a response, before removing the request context. It is skipped - if :meth:`is_null_session` returns ``True``. - """ - raise NotImplementedError() - - -session_json_serializer = TaggedJSONSerializer() - - -def _lazy_sha1(string: bytes = b"") -> t.Any: - """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include - SHA-1, in which case the import and use as a default would fail before the - developer can configure something else. - """ - return hashlib.sha1(string) - - -class SecureCookieSessionInterface(SessionInterface): - """The default session interface that stores sessions in signed cookies - through the :mod:`itsdangerous` module. - """ - - #: the salt that should be applied on top of the secret key for the - #: signing of cookie based sessions. - salt = "cookie-session" - #: the hash function to use for the signature. The default is sha1 - digest_method = staticmethod(_lazy_sha1) - #: the name of the itsdangerous supported key derivation. The default - #: is hmac. - key_derivation = "hmac" - #: A python serializer for the payload. The default is a compact - #: JSON derived serializer with support for some extra Python types - #: such as datetime objects or tuples. - serializer = session_json_serializer - session_class = SecureCookieSession - - def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: - if not app.secret_key: - return None - - keys: list[str | bytes] = [app.secret_key] - - if fallbacks := app.config["SECRET_KEY_FALLBACKS"]: - keys.extend(fallbacks) - - return URLSafeTimedSerializer( - keys, # type: ignore[arg-type] - salt=self.salt, - serializer=self.serializer, - signer_kwargs={ - "key_derivation": self.key_derivation, - "digest_method": self.digest_method, - }, - ) - - def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: - s = self.get_signing_serializer(app) - if s is None: - return None - val = request.cookies.get(self.get_cookie_name(app)) - if not val: - return self.session_class() - max_age = int(app.permanent_session_lifetime.total_seconds()) - try: - data = s.loads(val, max_age=max_age) - return self.session_class(data) - except BadSignature: - return self.session_class() - - def save_session( - self, app: Flask, session: SessionMixin, response: Response - ) -> None: - name = self.get_cookie_name(app) - domain = self.get_cookie_domain(app) - path = self.get_cookie_path(app) - secure = self.get_cookie_secure(app) - partitioned = self.get_cookie_partitioned(app) - samesite = self.get_cookie_samesite(app) - httponly = self.get_cookie_httponly(app) - - # Add a "Vary: Cookie" header if the session was accessed at all. - if session.accessed: - response.vary.add("Cookie") - - # If the session is modified to be empty, remove the cookie. - # If the session is empty, return without setting the cookie. - if not session: - if session.modified: - response.delete_cookie( - name, - domain=domain, - path=path, - secure=secure, - partitioned=partitioned, - samesite=samesite, - httponly=httponly, - ) - response.vary.add("Cookie") - - return - - if not self.should_set_cookie(app, session): - return - - expires = self.get_expiration_time(app, session) - val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore[union-attr] - response.set_cookie( - name, - val, - expires=expires, - httponly=httponly, - domain=domain, - path=path, - secure=secure, - partitioned=partitioned, - samesite=samesite, - ) - response.vary.add("Cookie") diff --git a/port/lib/python3.11/site-packages/flask/signals.py b/port/lib/python3.11/site-packages/flask/signals.py deleted file mode 100644 index 444fda9..0000000 --- a/port/lib/python3.11/site-packages/flask/signals.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from blinker import Namespace - -# This namespace is only for signals provided by Flask itself. -_signals = Namespace() - -template_rendered = _signals.signal("template-rendered") -before_render_template = _signals.signal("before-render-template") -request_started = _signals.signal("request-started") -request_finished = _signals.signal("request-finished") -request_tearing_down = _signals.signal("request-tearing-down") -got_request_exception = _signals.signal("got-request-exception") -appcontext_tearing_down = _signals.signal("appcontext-tearing-down") -appcontext_pushed = _signals.signal("appcontext-pushed") -appcontext_popped = _signals.signal("appcontext-popped") -message_flashed = _signals.signal("message-flashed") diff --git a/port/lib/python3.11/site-packages/flask/templating.py b/port/lib/python3.11/site-packages/flask/templating.py deleted file mode 100644 index 618a3b3..0000000 --- a/port/lib/python3.11/site-packages/flask/templating.py +++ /dev/null @@ -1,219 +0,0 @@ -from __future__ import annotations - -import typing as t - -from jinja2 import BaseLoader -from jinja2 import Environment as BaseEnvironment -from jinja2 import Template -from jinja2 import TemplateNotFound - -from .globals import _cv_app -from .globals import _cv_request -from .globals import current_app -from .globals import request -from .helpers import stream_with_context -from .signals import before_render_template -from .signals import template_rendered - -if t.TYPE_CHECKING: # pragma: no cover - from .app import Flask - from .sansio.app import App - from .sansio.scaffold import Scaffold - - -def _default_template_ctx_processor() -> dict[str, t.Any]: - """Default template context processor. Injects `request`, - `session` and `g`. - """ - appctx = _cv_app.get(None) - reqctx = _cv_request.get(None) - rv: dict[str, t.Any] = {} - if appctx is not None: - rv["g"] = appctx.g - if reqctx is not None: - rv["request"] = reqctx.request - rv["session"] = reqctx.session - return rv - - -class Environment(BaseEnvironment): - """Works like a regular Jinja2 environment but has some additional - knowledge of how Flask's blueprint works so that it can prepend the - name of the blueprint to referenced templates if necessary. - """ - - def __init__(self, app: App, **options: t.Any) -> None: - if "loader" not in options: - options["loader"] = app.create_global_jinja_loader() - BaseEnvironment.__init__(self, **options) - self.app = app - - -class DispatchingJinjaLoader(BaseLoader): - """A loader that looks for templates in the application and all - the blueprint folders. - """ - - def __init__(self, app: App) -> None: - self.app = app - - def get_source( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: - return self._get_source_explained(environment, template) - return self._get_source_fast(environment, template) - - def _get_source_explained( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - attempts = [] - rv: tuple[str, str | None, t.Callable[[], bool] | None] | None - trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None - - for srcobj, loader in self._iter_loaders(template): - try: - rv = loader.get_source(environment, template) - if trv is None: - trv = rv - except TemplateNotFound: - rv = None - attempts.append((loader, srcobj, rv)) - - from .debughelpers import explain_template_loading_attempts - - explain_template_loading_attempts(self.app, template, attempts) - - if trv is not None: - return trv - raise TemplateNotFound(template) - - def _get_source_fast( - self, environment: BaseEnvironment, template: str - ) -> tuple[str, str | None, t.Callable[[], bool] | None]: - for _srcobj, loader in self._iter_loaders(template): - try: - return loader.get_source(environment, template) - except TemplateNotFound: - continue - raise TemplateNotFound(template) - - def _iter_loaders(self, template: str) -> t.Iterator[tuple[Scaffold, BaseLoader]]: - loader = self.app.jinja_loader - if loader is not None: - yield self.app, loader - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - yield blueprint, loader - - def list_templates(self) -> list[str]: - result = set() - loader = self.app.jinja_loader - if loader is not None: - result.update(loader.list_templates()) - - for blueprint in self.app.iter_blueprints(): - loader = blueprint.jinja_loader - if loader is not None: - for template in loader.list_templates(): - result.add(template) - - return list(result) - - -def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - rv = template.render(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - return rv - - -def render_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> str: - """Render a template by name with the given context. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _render(app, template, context) - - -def render_template_string(source: str, **context: t.Any) -> str: - """Render a template from the given source string with the given - context. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _render(app, template, context) - - -def _stream( - app: Flask, template: Template, context: dict[str, t.Any] -) -> t.Iterator[str]: - app.update_template_context(context) - before_render_template.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - def generate() -> t.Iterator[str]: - yield from template.generate(context) - template_rendered.send( - app, _async_wrapper=app.ensure_sync, template=template, context=context - ) - - rv = generate() - - # If a request context is active, keep it while generating. - if request: - rv = stream_with_context(rv) - - return rv - - -def stream_template( - template_name_or_list: str | Template | list[str | Template], - **context: t.Any, -) -> t.Iterator[str]: - """Render a template by name with the given context as a stream. - This returns an iterator of strings, which can be used as a - streaming response from a view. - - :param template_name_or_list: The name of the template to render. If - a list is given, the first name to exist will be rendered. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.get_or_select_template(template_name_or_list) - return _stream(app, template, context) - - -def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: - """Render a template from the given source string with the given - context as a stream. This returns an iterator of strings, which can - be used as a streaming response from a view. - - :param source: The source code of the template to render. - :param context: The variables to make available in the template. - - .. versionadded:: 2.2 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - template = app.jinja_env.from_string(source) - return _stream(app, template, context) diff --git a/port/lib/python3.11/site-packages/flask/testing.py b/port/lib/python3.11/site-packages/flask/testing.py deleted file mode 100644 index 602b773..0000000 --- a/port/lib/python3.11/site-packages/flask/testing.py +++ /dev/null @@ -1,297 +0,0 @@ -from __future__ import annotations - -import importlib.metadata -import typing as t -from contextlib import contextmanager -from contextlib import ExitStack -from copy import copy -from types import TracebackType -from urllib.parse import urlsplit - -import werkzeug.test -from click.testing import CliRunner -from werkzeug.test import Client -from werkzeug.wrappers import Request as BaseRequest - -from .cli import ScriptInfo -from .sessions import SessionMixin - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIEnvironment - from werkzeug.test import TestResponse - - from .app import Flask - - -class EnvironBuilder(werkzeug.test.EnvironBuilder): - """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the - application. - - :param app: The Flask application to configure the environment from. - :param path: URL path being requested. - :param base_url: Base URL where the app is being served, which - ``path`` is relative to. If not given, built from - :data:`PREFERRED_URL_SCHEME`, ``subdomain``, - :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. - :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. - :param url_scheme: Scheme to use instead of - :data:`PREFERRED_URL_SCHEME`. - :param json: If given, this is serialized as JSON and passed as - ``data``. Also defaults ``content_type`` to - ``application/json``. - :param args: other positional arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - :param kwargs: other keyword arguments passed to - :class:`~werkzeug.test.EnvironBuilder`. - """ - - def __init__( - self, - app: Flask, - path: str = "/", - base_url: str | None = None, - subdomain: str | None = None, - url_scheme: str | None = None, - *args: t.Any, - **kwargs: t.Any, - ) -> None: - assert not (base_url or subdomain or url_scheme) or ( - base_url is not None - ) != bool( - subdomain or url_scheme - ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' - - if base_url is None: - http_host = app.config.get("SERVER_NAME") or "localhost" - app_root = app.config["APPLICATION_ROOT"] - - if subdomain: - http_host = f"{subdomain}.{http_host}" - - if url_scheme is None: - url_scheme = app.config["PREFERRED_URL_SCHEME"] - - url = urlsplit(path) - base_url = ( - f"{url.scheme or url_scheme}://{url.netloc or http_host}" - f"/{app_root.lstrip('/')}" - ) - path = url.path - - if url.query: - path = f"{path}?{url.query}" - - self.app = app - super().__init__(path, base_url, *args, **kwargs) - - def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore - """Serialize ``obj`` to a JSON-formatted string. - - The serialization will be configured according to the config associated - with this EnvironBuilder's ``app``. - """ - return self.app.json.dumps(obj, **kwargs) - - -_werkzeug_version = "" - - -def _get_werkzeug_version() -> str: - global _werkzeug_version - - if not _werkzeug_version: - _werkzeug_version = importlib.metadata.version("werkzeug") - - return _werkzeug_version - - -class FlaskClient(Client): - """Works like a regular Werkzeug test client but has knowledge about - Flask's contexts to defer the cleanup of the request context until - the end of a ``with`` block. For general information about how to - use this class refer to :class:`werkzeug.test.Client`. - - .. versionchanged:: 0.12 - `app.test_client()` includes preset default environment, which can be - set after instantiation of the `app.test_client()` object in - `client.environ_base`. - - Basic usage is outlined in the :doc:`/testing` chapter. - """ - - application: Flask - - def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - super().__init__(*args, **kwargs) - self.preserve_context = False - self._new_contexts: list[t.ContextManager[t.Any]] = [] - self._context_stack = ExitStack() - self.environ_base = { - "REMOTE_ADDR": "127.0.0.1", - "HTTP_USER_AGENT": f"Werkzeug/{_get_werkzeug_version()}", - } - - @contextmanager - def session_transaction( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Iterator[SessionMixin]: - """When used in combination with a ``with`` statement this opens a - session transaction. This can be used to modify the session that - the test client uses. Once the ``with`` block is left the session is - stored back. - - :: - - with client.session_transaction() as session: - session['value'] = 42 - - Internally this is implemented by going through a temporary test - request context and since session handling could depend on - request variables this function accepts the same arguments as - :meth:`~flask.Flask.test_request_context` which are directly - passed through. - """ - if self._cookies is None: - raise TypeError( - "Cookies are disabled. Create a client with 'use_cookies=True'." - ) - - app = self.application - ctx = app.test_request_context(*args, **kwargs) - self._add_cookies_to_wsgi(ctx.request.environ) - - with ctx: - sess = app.session_interface.open_session(app, ctx.request) - - if sess is None: - raise RuntimeError("Session backend did not open a session.") - - yield sess - resp = app.response_class() - - if app.session_interface.is_null_session(sess): - return - - with ctx: - app.session_interface.save_session(app, sess, resp) - - self._update_cookies_from_response( - ctx.request.host.partition(":")[0], - ctx.request.path, - resp.headers.getlist("Set-Cookie"), - ) - - def _copy_environ(self, other: WSGIEnvironment) -> WSGIEnvironment: - out = {**self.environ_base, **other} - - if self.preserve_context: - out["werkzeug.debug.preserve_context"] = self._new_contexts.append - - return out - - def _request_from_builder_args( - self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] - ) -> BaseRequest: - kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) - builder = EnvironBuilder(self.application, *args, **kwargs) - - try: - return builder.get_request() - finally: - builder.close() - - def open( - self, - *args: t.Any, - buffered: bool = False, - follow_redirects: bool = False, - **kwargs: t.Any, - ) -> TestResponse: - if args and isinstance( - args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) - ): - if isinstance(args[0], werkzeug.test.EnvironBuilder): - builder = copy(args[0]) - builder.environ_base = self._copy_environ(builder.environ_base or {}) # type: ignore[arg-type] - request = builder.get_request() - elif isinstance(args[0], dict): - request = EnvironBuilder.from_environ( - args[0], app=self.application, environ_base=self._copy_environ({}) - ).get_request() - else: - # isinstance(args[0], BaseRequest) - request = copy(args[0]) - request.environ = self._copy_environ(request.environ) - else: - # request is None - request = self._request_from_builder_args(args, kwargs) - - # Pop any previously preserved contexts. This prevents contexts - # from being preserved across redirects or multiple requests - # within a single block. - self._context_stack.close() - - response = super().open( - request, - buffered=buffered, - follow_redirects=follow_redirects, - ) - response.json_module = self.application.json # type: ignore[assignment] - - # Re-push contexts that were preserved during the request. - while self._new_contexts: - cm = self._new_contexts.pop() - self._context_stack.enter_context(cm) - - return response - - def __enter__(self) -> FlaskClient: - if self.preserve_context: - raise RuntimeError("Cannot nest client invocations") - self.preserve_context = True - return self - - def __exit__( - self, - exc_type: type | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.preserve_context = False - self._context_stack.close() - - -class FlaskCliRunner(CliRunner): - """A :class:`~click.testing.CliRunner` for testing a Flask app's - CLI commands. Typically created using - :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. - """ - - def __init__(self, app: Flask, **kwargs: t.Any) -> None: - self.app = app - super().__init__(**kwargs) - - def invoke( # type: ignore - self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any - ) -> t.Any: - """Invokes a CLI command in an isolated environment. See - :meth:`CliRunner.invoke ` for - full method documentation. See :ref:`testing-cli` for examples. - - If the ``obj`` argument is not given, passes an instance of - :class:`~flask.cli.ScriptInfo` that knows how to load the Flask - app being tested. - - :param cli: Command object to invoke. Default is the app's - :attr:`~flask.app.Flask.cli` group. - :param args: List of strings to invoke the command with. - - :return: a :class:`~click.testing.Result` object. - """ - if cli is None: - cli = self.app.cli - - if "obj" not in kwargs: - kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) - - return super().invoke(cli, args, **kwargs) diff --git a/port/lib/python3.11/site-packages/flask/typing.py b/port/lib/python3.11/site-packages/flask/typing.py deleted file mode 100644 index e7234e9..0000000 --- a/port/lib/python3.11/site-packages/flask/typing.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import annotations - -import typing as t - -if t.TYPE_CHECKING: # pragma: no cover - from _typeshed.wsgi import WSGIApplication # noqa: F401 - from werkzeug.datastructures import Headers # noqa: F401 - from werkzeug.sansio.response import Response # noqa: F401 - -# The possible types that are directly convertible or are a Response object. -ResponseValue = t.Union[ - "Response", - str, - bytes, - list[t.Any], - # Only dict is actually accepted, but Mapping allows for TypedDict. - t.Mapping[str, t.Any], - t.Iterator[str], - t.Iterator[bytes], -] - -# the possible types for an individual HTTP header -# This should be a Union, but mypy doesn't pass unless it's a TypeVar. -HeaderValue = t.Union[str, list[str], tuple[str, ...]] - -# the possible types for HTTP headers -HeadersValue = t.Union[ - "Headers", - t.Mapping[str, HeaderValue], - t.Sequence[tuple[str, HeaderValue]], -] - -# The possible types returned by a route function. -ResponseReturnValue = t.Union[ - ResponseValue, - tuple[ResponseValue, HeadersValue], - tuple[ResponseValue, int], - tuple[ResponseValue, int, HeadersValue], - "WSGIApplication", -] - -# Allow any subclass of werkzeug.Response, such as the one from Flask, -# as a callback argument. Using werkzeug.Response directly makes a -# callback annotated with flask.Response fail type checking. -ResponseClass = t.TypeVar("ResponseClass", bound="Response") - -AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named -AfterRequestCallable = t.Union[ - t.Callable[[ResponseClass], ResponseClass], - t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], -] -BeforeFirstRequestCallable = t.Union[ - t.Callable[[], None], t.Callable[[], t.Awaitable[None]] -] -BeforeRequestCallable = t.Union[ - t.Callable[[], t.Optional[ResponseReturnValue]], - t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], -] -ShellContextProcessorCallable = t.Callable[[], dict[str, t.Any]] -TeardownCallable = t.Union[ - t.Callable[[t.Optional[BaseException]], None], - t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], -] -TemplateContextProcessorCallable = t.Union[ - t.Callable[[], dict[str, t.Any]], - t.Callable[[], t.Awaitable[dict[str, t.Any]]], -] -TemplateFilterCallable = t.Callable[..., t.Any] -TemplateGlobalCallable = t.Callable[..., t.Any] -TemplateTestCallable = t.Callable[..., bool] -URLDefaultCallable = t.Callable[[str, dict[str, t.Any]], None] -URLValuePreprocessorCallable = t.Callable[ - [t.Optional[str], t.Optional[dict[str, t.Any]]], None -] - -# This should take Exception, but that either breaks typing the argument -# with a specific exception, or decorating multiple times with different -# exceptions (and using a union type on the argument). -# https://github.com/pallets/flask/issues/4095 -# https://github.com/pallets/flask/issues/4295 -# https://github.com/pallets/flask/issues/4297 -ErrorHandlerCallable = t.Union[ - t.Callable[[t.Any], ResponseReturnValue], - t.Callable[[t.Any], t.Awaitable[ResponseReturnValue]], -] - -RouteCallable = t.Union[ - t.Callable[..., ResponseReturnValue], - t.Callable[..., t.Awaitable[ResponseReturnValue]], -] diff --git a/port/lib/python3.11/site-packages/flask/views.py b/port/lib/python3.11/site-packages/flask/views.py deleted file mode 100644 index 53fe976..0000000 --- a/port/lib/python3.11/site-packages/flask/views.py +++ /dev/null @@ -1,191 +0,0 @@ -from __future__ import annotations - -import typing as t - -from . import typing as ft -from .globals import current_app -from .globals import request - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -http_method_funcs = frozenset( - ["get", "post", "head", "options", "delete", "put", "trace", "patch"] -) - - -class View: - """Subclass this class and override :meth:`dispatch_request` to - create a generic class-based view. Call :meth:`as_view` to create a - view function that creates an instance of the class with the given - arguments and calls its ``dispatch_request`` method with any URL - variables. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class Hello(View): - init_every_request = False - - def dispatch_request(self, name): - return f"Hello, {name}!" - - app.add_url_rule( - "/hello/", view_func=Hello.as_view("hello") - ) - - Set :attr:`methods` on the class to change what methods the view - accepts. - - Set :attr:`decorators` on the class to apply a list of decorators to - the generated view function. Decorators applied to the class itself - will not be applied to the generated view function! - - Set :attr:`init_every_request` to ``False`` for efficiency, unless - you need to store request-global data on ``self``. - """ - - #: The methods this view is registered for. Uses the same default - #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and - #: ``add_url_rule`` by default. - methods: t.ClassVar[t.Collection[str] | None] = None - - #: Control whether the ``OPTIONS`` method is handled automatically. - #: Uses the same default (``True``) as ``route`` and - #: ``add_url_rule`` by default. - provide_automatic_options: t.ClassVar[bool | None] = None - - #: A list of decorators to apply, in order, to the generated view - #: function. Remember that ``@decorator`` syntax is applied bottom - #: to top, so the first decorator in the list would be the bottom - #: decorator. - #: - #: .. versionadded:: 0.8 - decorators: t.ClassVar[list[t.Callable[..., t.Any]]] = [] - - #: Create a new instance of this view class for every request by - #: default. If a view subclass sets this to ``False``, the same - #: instance is used for every request. - #: - #: A single instance is more efficient, especially if complex setup - #: is done during init. However, storing data on ``self`` is no - #: longer safe across requests, and :data:`~flask.g` should be used - #: instead. - #: - #: .. versionadded:: 2.2 - init_every_request: t.ClassVar[bool] = True - - def dispatch_request(self) -> ft.ResponseReturnValue: - """The actual view function behavior. Subclasses must override - this and return a valid response. Any variables from the URL - rule are passed as keyword arguments. - """ - raise NotImplementedError() - - @classmethod - def as_view( - cls, name: str, *class_args: t.Any, **class_kwargs: t.Any - ) -> ft.RouteCallable: - """Convert the class into a view function that can be registered - for a route. - - By default, the generated view will create a new instance of the - view class for every request and call its - :meth:`dispatch_request` method. If the view class sets - :attr:`init_every_request` to ``False``, the same instance will - be used for every request. - - Except for ``name``, all other arguments passed to this method - are forwarded to the view class ``__init__`` method. - - .. versionchanged:: 2.2 - Added the ``init_every_request`` class attribute. - """ - if cls.init_every_request: - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - self = view.view_class( # type: ignore[attr-defined] - *class_args, **class_kwargs - ) - return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] - - else: - self = cls(*class_args, **class_kwargs) # pyright: ignore - - def view(**kwargs: t.Any) -> ft.ResponseReturnValue: - return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] - - if cls.decorators: - view.__name__ = name - view.__module__ = cls.__module__ - for decorator in cls.decorators: - view = decorator(view) - - # We attach the view class to the view function for two reasons: - # first of all it allows us to easily figure out what class-based - # view this thing came from, secondly it's also used for instantiating - # the view class so you can actually replace it with something else - # for testing purposes and debugging. - view.view_class = cls # type: ignore - view.__name__ = name - view.__doc__ = cls.__doc__ - view.__module__ = cls.__module__ - view.methods = cls.methods # type: ignore - view.provide_automatic_options = cls.provide_automatic_options # type: ignore - return view - - -class MethodView(View): - """Dispatches request methods to the corresponding instance methods. - For example, if you implement a ``get`` method, it will be used to - handle ``GET`` requests. - - This can be useful for defining a REST API. - - :attr:`methods` is automatically set based on the methods defined on - the class. - - See :doc:`views` for a detailed guide. - - .. code-block:: python - - class CounterAPI(MethodView): - def get(self): - return str(session.get("counter", 0)) - - def post(self): - session["counter"] = session.get("counter", 0) + 1 - return redirect(url_for("counter")) - - app.add_url_rule( - "/counter", view_func=CounterAPI.as_view("counter") - ) - """ - - def __init_subclass__(cls, **kwargs: t.Any) -> None: - super().__init_subclass__(**kwargs) - - if "methods" not in cls.__dict__: - methods = set() - - for base in cls.__bases__: - if getattr(base, "methods", None): - methods.update(base.methods) # type: ignore[attr-defined] - - for key in http_method_funcs: - if hasattr(cls, key): - methods.add(key.upper()) - - if methods: - cls.methods = methods - - def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: - meth = getattr(self, request.method.lower(), None) - - # If the request method is HEAD and we don't have a handler for it - # retry with GET. - if meth is None and request.method == "HEAD": - meth = getattr(self, "get", None) - - assert meth is not None, f"Unimplemented method {request.method!r}" - return current_app.ensure_sync(meth)(**kwargs) # type: ignore[no-any-return] diff --git a/port/lib/python3.11/site-packages/flask/wrappers.py b/port/lib/python3.11/site-packages/flask/wrappers.py deleted file mode 100644 index bab6102..0000000 --- a/port/lib/python3.11/site-packages/flask/wrappers.py +++ /dev/null @@ -1,257 +0,0 @@ -from __future__ import annotations - -import typing as t - -from werkzeug.exceptions import BadRequest -from werkzeug.exceptions import HTTPException -from werkzeug.wrappers import Request as RequestBase -from werkzeug.wrappers import Response as ResponseBase - -from . import json -from .globals import current_app -from .helpers import _split_blueprint_path - -if t.TYPE_CHECKING: # pragma: no cover - from werkzeug.routing import Rule - - -class Request(RequestBase): - """The request object used by default in Flask. Remembers the - matched endpoint and view arguments. - - It is what ends up as :class:`~flask.request`. If you want to replace - the request object used you can subclass this and set - :attr:`~flask.Flask.request_class` to your subclass. - - The request object is a :class:`~werkzeug.wrappers.Request` subclass and - provides all of the attributes Werkzeug defines plus a few Flask - specific ones. - """ - - json_module: t.Any = json - - #: The internal URL rule that matched the request. This can be - #: useful to inspect which methods are allowed for the URL from - #: a before/after handler (``request.url_rule.methods``) etc. - #: Though if the request's method was invalid for the URL rule, - #: the valid list is available in ``routing_exception.valid_methods`` - #: instead (an attribute of the Werkzeug exception - #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) - #: because the request was never internally bound. - #: - #: .. versionadded:: 0.6 - url_rule: Rule | None = None - - #: A dict of view arguments that matched the request. If an exception - #: happened when matching, this will be ``None``. - view_args: dict[str, t.Any] | None = None - - #: If matching the URL failed, this is the exception that will be - #: raised / was raised as part of the request handling. This is - #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or - #: something similar. - routing_exception: HTTPException | None = None - - _max_content_length: int | None = None - _max_form_memory_size: int | None = None - _max_form_parts: int | None = None - - @property - def max_content_length(self) -> int | None: - """The maximum number of bytes that will be read during this request. If - this limit is exceeded, a 413 :exc:`~werkzeug.exceptions.RequestEntityTooLarge` - error is raised. If it is set to ``None``, no limit is enforced at the - Flask application level. However, if it is ``None`` and the request has - no ``Content-Length`` header and the WSGI server does not indicate that - it terminates the stream, then no data is read to avoid an infinite - stream. - - Each request defaults to the :data:`MAX_CONTENT_LENGTH` config, which - defaults to ``None``. It can be set on a specific ``request`` to apply - the limit to that specific view. This should be set appropriately based - on an application's or view's specific needs. - - .. versionchanged:: 3.1 - This can be set per-request. - - .. versionchanged:: 0.6 - This is configurable through Flask config. - """ - if self._max_content_length is not None: - return self._max_content_length - - if not current_app: - return super().max_content_length - - return current_app.config["MAX_CONTENT_LENGTH"] # type: ignore[no-any-return] - - @max_content_length.setter - def max_content_length(self, value: int | None) -> None: - self._max_content_length = value - - @property - def max_form_memory_size(self) -> int | None: - """The maximum size in bytes any non-file form field may be in a - ``multipart/form-data`` body. If this limit is exceeded, a 413 - :exc:`~werkzeug.exceptions.RequestEntityTooLarge` error is raised. If it - is set to ``None``, no limit is enforced at the Flask application level. - - Each request defaults to the :data:`MAX_FORM_MEMORY_SIZE` config, which - defaults to ``500_000``. It can be set on a specific ``request`` to - apply the limit to that specific view. This should be set appropriately - based on an application's or view's specific needs. - - .. versionchanged:: 3.1 - This is configurable through Flask config. - """ - if self._max_form_memory_size is not None: - return self._max_form_memory_size - - if not current_app: - return super().max_form_memory_size - - return current_app.config["MAX_FORM_MEMORY_SIZE"] # type: ignore[no-any-return] - - @max_form_memory_size.setter - def max_form_memory_size(self, value: int | None) -> None: - self._max_form_memory_size = value - - @property # type: ignore[override] - def max_form_parts(self) -> int | None: - """The maximum number of fields that may be present in a - ``multipart/form-data`` body. If this limit is exceeded, a 413 - :exc:`~werkzeug.exceptions.RequestEntityTooLarge` error is raised. If it - is set to ``None``, no limit is enforced at the Flask application level. - - Each request defaults to the :data:`MAX_FORM_PARTS` config, which - defaults to ``1_000``. It can be set on a specific ``request`` to apply - the limit to that specific view. This should be set appropriately based - on an application's or view's specific needs. - - .. versionchanged:: 3.1 - This is configurable through Flask config. - """ - if self._max_form_parts is not None: - return self._max_form_parts - - if not current_app: - return super().max_form_parts - - return current_app.config["MAX_FORM_PARTS"] # type: ignore[no-any-return] - - @max_form_parts.setter - def max_form_parts(self, value: int | None) -> None: - self._max_form_parts = value - - @property - def endpoint(self) -> str | None: - """The endpoint that matched the request URL. - - This will be ``None`` if matching failed or has not been - performed yet. - - This in combination with :attr:`view_args` can be used to - reconstruct the same URL or a modified URL. - """ - if self.url_rule is not None: - return self.url_rule.endpoint # type: ignore[no-any-return] - - return None - - @property - def blueprint(self) -> str | None: - """The registered name of the current blueprint. - - This will be ``None`` if the endpoint is not part of a - blueprint, or if URL matching failed or has not been performed - yet. - - This does not necessarily match the name the blueprint was - created with. It may have been nested, or registered with a - different name. - """ - endpoint = self.endpoint - - if endpoint is not None and "." in endpoint: - return endpoint.rpartition(".")[0] - - return None - - @property - def blueprints(self) -> list[str]: - """The registered names of the current blueprint upwards through - parent blueprints. - - This will be an empty list if there is no current blueprint, or - if URL matching failed. - - .. versionadded:: 2.0.1 - """ - name = self.blueprint - - if name is None: - return [] - - return _split_blueprint_path(name) - - def _load_form_data(self) -> None: - super()._load_form_data() - - # In debug mode we're replacing the files multidict with an ad-hoc - # subclass that raises a different error for key errors. - if ( - current_app - and current_app.debug - and self.mimetype != "multipart/form-data" - and not self.files - ): - from .debughelpers import attach_enctype_error_multidict - - attach_enctype_error_multidict(self) - - def on_json_loading_failed(self, e: ValueError | None) -> t.Any: - try: - return super().on_json_loading_failed(e) - except BadRequest as ebr: - if current_app and current_app.debug: - raise - - raise BadRequest() from ebr - - -class Response(ResponseBase): - """The response object that is used by default in Flask. Works like the - response object from Werkzeug but is set to have an HTML mimetype by - default. Quite often you don't have to create this object yourself because - :meth:`~flask.Flask.make_response` will take care of that for you. - - If you want to replace the response object used you can subclass this and - set :attr:`~flask.Flask.response_class` to your subclass. - - .. versionchanged:: 1.0 - JSON support is added to the response, like the request. This is useful - when testing to get the test client response data as JSON. - - .. versionchanged:: 1.0 - - Added :attr:`max_cookie_size`. - """ - - default_mimetype: str | None = "text/html" - - json_module = json - - autocorrect_location_header = False - - @property - def max_cookie_size(self) -> int: # type: ignore - """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. - - See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in - Werkzeug's docs. - """ - if current_app: - return current_app.config["MAX_COOKIE_SIZE"] # type: ignore[no-any-return] - - # return Werkzeug's default when not in an app context - return super().max_cookie_size diff --git a/port/lib/python3.11/site-packages/flask_login/__about__.py b/port/lib/python3.11/site-packages/flask_login/__about__.py deleted file mode 100644 index 1918d54..0000000 --- a/port/lib/python3.11/site-packages/flask_login/__about__.py +++ /dev/null @@ -1,10 +0,0 @@ -__title__ = "Flask-Login" -__description__ = "User session management for Flask" -__url__ = "https://github.com/maxcountryman/flask-login" -__version_info__ = ("0", "6", "3") -__version__ = ".".join(__version_info__) -__author__ = "Matthew Frazier" -__author_email__ = "leafstormrush@gmail.com" -__maintainer__ = "Max Countryman" -__license__ = "MIT" -__copyright__ = "(c) 2011 by Matthew Frazier" diff --git a/port/lib/python3.11/site-packages/flask_login/__init__.py b/port/lib/python3.11/site-packages/flask_login/__init__.py deleted file mode 100644 index fbe9c3e..0000000 --- a/port/lib/python3.11/site-packages/flask_login/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -from .__about__ import __version__ -from .config import AUTH_HEADER_NAME -from .config import COOKIE_DURATION -from .config import COOKIE_HTTPONLY -from .config import COOKIE_NAME -from .config import COOKIE_SECURE -from .config import ID_ATTRIBUTE -from .config import LOGIN_MESSAGE -from .config import LOGIN_MESSAGE_CATEGORY -from .config import REFRESH_MESSAGE -from .config import REFRESH_MESSAGE_CATEGORY -from .login_manager import LoginManager -from .mixins import AnonymousUserMixin -from .mixins import UserMixin -from .signals import session_protected -from .signals import user_accessed -from .signals import user_loaded_from_cookie -from .signals import user_loaded_from_request -from .signals import user_logged_in -from .signals import user_logged_out -from .signals import user_login_confirmed -from .signals import user_needs_refresh -from .signals import user_unauthorized -from .test_client import FlaskLoginClient -from .utils import confirm_login -from .utils import current_user -from .utils import decode_cookie -from .utils import encode_cookie -from .utils import fresh_login_required -from .utils import login_fresh -from .utils import login_remembered -from .utils import login_required -from .utils import login_url -from .utils import login_user -from .utils import logout_user -from .utils import make_next_param -from .utils import set_login_view - -__all__ = [ - "__version__", - "AUTH_HEADER_NAME", - "COOKIE_DURATION", - "COOKIE_HTTPONLY", - "COOKIE_NAME", - "COOKIE_SECURE", - "ID_ATTRIBUTE", - "LOGIN_MESSAGE", - "LOGIN_MESSAGE_CATEGORY", - "REFRESH_MESSAGE", - "REFRESH_MESSAGE_CATEGORY", - "LoginManager", - "AnonymousUserMixin", - "UserMixin", - "session_protected", - "user_accessed", - "user_loaded_from_cookie", - "user_loaded_from_request", - "user_logged_in", - "user_logged_out", - "user_login_confirmed", - "user_needs_refresh", - "user_unauthorized", - "FlaskLoginClient", - "confirm_login", - "current_user", - "decode_cookie", - "encode_cookie", - "fresh_login_required", - "login_fresh", - "login_remembered", - "login_required", - "login_url", - "login_user", - "logout_user", - "make_next_param", - "set_login_view", -] - - -def __getattr__(name): - if name == "user_loaded_from_header": - import warnings - from .signals import _user_loaded_from_header - - warnings.warn( - "'user_loaded_from_header' is deprecated and will be" - " removed in Flask-Login 0.7. Use" - " 'user_loaded_from_request' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _user_loaded_from_header - - raise AttributeError(name) diff --git a/port/lib/python3.11/site-packages/flask_login/__pycache__/__about__.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_login/__pycache__/__about__.cpython-311.pyc deleted file mode 100644 index 5e6c5f04c3377ca9959ae524c905833572fd675a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmZ9JL5tHs6vvZIciW~m?OJ3JL9$-l!nU(@QAAV(VL`DXxL$G@r%qByh z#UMr}KFbox=c)uum%vB^`&MP{Rpy<_++Uc(yfa2phGga*aFkQR^R0-WsgR7vJQLxg zAVxIO#M~L96Zi2SW@U|^9Ol<{{Jwi@Z!~fzbN4^g^M0#pLMW+>2!vG!LQI6uX)4u8 zlu?H;g&d~yMdN!)R!W_jsq(JU|DE;^-s zx2TuB8>dFMbT;3I@50lqo8O$B@6JxqD%;l!yX@`i$<6J;DV?4&yMv;wAKp{A-wSor AxBvhE diff --git a/port/lib/python3.11/site-packages/flask_login/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_login/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3876b670bc5414e929077b78e21f128ad9ecfe90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3091 zcmbu9%WoS+9LHxJ$ItkYxAWdS9k)$PRSFj#GKt$nu!YMX3BGoVJLAHz+FBQt0yE_+L8|Ct? z-JPvZaiDfoyHldw+$*l_mvEH6&2^4xK6$Zz$0}D% zh)+7qZRc^Kv(wxn?}1CqgDAZyA(Svm1SN`sFC34f^r0kBk|-&ZG)h0p0LmcB5Xvyh z2+Al*24xIo9AyG!5@iZy8f6AWMwvyKLzzceKv_gtLdk+uu=>t_m^v=x`R5>y$bEQe zkHqWCb6P+n26-T9JzCI^%)oveI}?VlF-IB#6UfIIyD!;Y*?y9`+Fu8Ngc6q^|mg7QxtIyh* z#T-|y92x9{8M#m+a;kDmx2jGf?C4cXH5`5!R?rBdzcH}hP6wX9Pg;SEWWja0eo%8+ zk#n2pdKy7XH5p&U)ni`=cT|?;7hCxgmFG`SPxH5I?jG8PZs(7I@`iqpKR$!Xw63jQ zy_$D)m#rK_Qt%!*`9mzy)-BE}@Equ_qO2aD;X_SSW3DTb)dKe(M&~xf{NTVBR`e@%+{;!_Ga-dBkV`EoWaB7@^x9 z`nDZTp<7Jn&UfzEv`2i_ZC#ybI_VLgb=zm(urN!vTlf0N&EQfz&?M*bFx)IjNol4@ JIz`;|e*vs9N6P>J diff --git a/port/lib/python3.11/site-packages/flask_login/__pycache__/config.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_login/__pycache__/config.cpython-311.pyc deleted file mode 100644 index 4d7246f90c64fc5745da59059932239604fef9cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 909 zcmZuvNpI6Y6dosO;w(i|5TJLC7FjFQ5MI-$)_!Gcsl? zK2^>LC~px#gtL*u=^TehOpnD7YCCTCNy+qS@`zAP~cW6^KK#PghyW0S9QO52j?Fnn&S) zx}nuIL;C-qWS@qHMVKH1)$^@WGqgN+JqaDMcmyO|`Z{Duqvz9Lz*fF{A8HfAle z`76~3XxDQ|z*0&}YbZ^%T4X$d;?bY_(N(kThN5gYu+fxvF)K`sTBj{Xd?rjCD&FX{ z|KfE`Ybnj0{i^^KqSc0mnXsd5HJS!ks=S3+>6&S5$Qs^K+7Q>qn{BMtuZZP;9Dk{~ zM$M2lt=)Luf&4|eqt%T%mTS0u*>g^XTF|SpjrUcS$9s6Ur9ob;uGCbv)KRf9V{9rA zgZH%0=qwuf`3vcl=}X7Q$5PAl!=7hbo-_navaJJYcme}(AFZyfNr4s8heNY_2-6It zo^1w)229>^CAi(5)n6T+obyi{j~v-_-Cu#!(aQ|p!7+(*9QOm=9bey*Br4n+WkD=1 zzp1`o94}P9EmXcQR7M5x&6h?(1l_!_regl_h4a?^F)BsiGXQzCTp6P>n8ora2Vx1( f;)G8XV-qwx04POeZjbVl3@YClqovF3i_qX7IGhjx diff --git a/port/lib/python3.11/site-packages/flask_login/__pycache__/login_manager.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_login/__pycache__/login_manager.cpython-311.pyc deleted file mode 100644 index 9a36468902bb5d0f590f1f5c9f4c37f9ba18306c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22982 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 diff --git a/port/lib/python3.11/site-packages/flask_login/__pycache__/signals.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_login/__pycache__/signals.cpython-311.pyc deleted file mode 100644 index e7d24d129850aaf38b22e7eb01d4d082f7ede10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1834 zcmZ`(-D}%c6u)x(AeODmC4v@WFSFGWN)x)(32b}WNC%}9@}er%wIeJ`-jy6v zlTkDF(2c>sFCKlVpE5@F$4EmDK~IIThrYRFeJKofu0PVmnXaXybARV|&pr3tbNn06 za|p(h&;G3sqX_*)C$q6IRnBY%p#f5m!f2?;>@f@qAj}+t`DDgLdjT96&Q_eGR8a!Q zu>J(z$=D0}G8g8UAzx;2jv4l4hUS?W=9r7V z%-9^0R~COjdvS$-h>G#o^g4=+7u}Vc*lfvF+>L5Ry^fWVs&~1mYP79xS~Fw?;2JTS zrK({xRD2mbz+flcYZrM0f7`~U)lGmSRflDIO(jjNc#CaaZd(TiQM*{_@;b(fSt7Vb zuzBFIa@TEwt$)xt{kyo4a|5WKY9&W=C~&=C}8BLFHQ1tp*$4SmNP zF~f^1sBt`$1uHnyp*(|sgpR?}$$9ZI$O^x=KSUNZ#%vs+%PIYyDTa5wY}>>{nw(yu zS&}9hAvB_HXU)gFCa9*M;1>d@RlRO{L8^J_&!+)Et{+cK zUQY6f*o*I27E$-x7XE?|gA@Z^P>1p%^k2lJ`w7Ckuf#){h@DPH{Kgb}@|3RkahlyBb_P1V9BsJn(-$EH}Lr-U5BDZx_LWz8(No_aA!s$)xrT_uU6V1rw9 zr$-=q=rj_u6NNt`1v^qWWwXx{^!JKQ{=)ynj{*UH<82u6tEbuAD2Aff-=J`m`-h4V z6>sAxS+Lo)zq#D68HZbOxfMIOat4mkZZYBU<9N!`NC+(skCmoVFFaAa_%u(nYa~_o z5*O#tI{#A{ll~z*b(p)7=IJGRnVBP1m)^HdYK&g&A1^(I#!V#6nus4`vrh76og|%i z(m0X7Ba((7ND{<5_S2@Jv^9L62r#8>V}?ME78r&(MK|or&#PGG`PPs3e!kaZM=VM& z4_5oD!@QF!xv5ew4$!syKKdXEQxlcn~}yG~})&1}-OVV+qX Kp{rt?rvCtaeADs( diff --git a/port/lib/python3.11/site-packages/flask_login/__pycache__/test_client.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_login/__pycache__/test_client.cpython-311.pyc deleted file mode 100644 index 1f6f66f07de9077d2d8d30fd875b1d5272a379eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1470 zcma(RO=}ZD^v!-GX=+TOR1_3ftqn_UmLi_Cq80R@sGtYUWn8nHbnSLG?rco05j+T1 z@uLdT9-~NA`YZGoSSc9xB!~xZk$NbC;G0R>+G@eKJ8$01`=0k^UZ+w?K)5pWtE@@@ zU-)7f)DE$jM`9W*u!sv|q(BHra0)ExE?BZnW@Ugm9Bn8_mU01f^&4O6B)2jc?8t}-y$M*{i_<-{Z$p7tfcm5$PeO^H{X{{TgmF?((V`q>gsC%r+40);Cd{OU za9k4%Ewovv6@@1)95F*})bndh8}Vye=xeTD)*Mf(GCN>Gt;!s)jDmJseLxu2?D5d{ znB#kSAyg!tF!>b2k;buj0C%60X{bvLT>cFfCNhf&&MhYix8)6GB}-l>t4I*894Npn zI+$B=a&5(Coj4f5EAki%QkR3%b!hydwW6?2{}9|(>vBU`<*!m}J=Il9IfBf(f|SZB zYyte%MoVz#0_=l9U`kCImoGyNDxBe~*NB9&DuD4n3x@tly-Xe+ZBuL=zV(_>~aL^_I_$c@<4kNFggZaa88^(psMTu5c|QnCzU%l#1u4UIt{Rn_ z;fU`Y%nuG4%n9v*idh^r%QiDgysz7d7`*e)H1F|zbqTBlUj#VSFL6eWv$A zLT~gTYX6_R(=Cv@a?Nbdr>y=ltIucq7qa~=kW#rfVRK*Z_2HL?Uktq(no_0;^BJwV zrw^%1PdB$zln`P9edh{4I9lD?kXl+=+K|^~$QY7{i*3P7-|gBp9GBn6mErFA`^^Ng z9^=*Z%rP6Qo1}Eix2i6uH&J@MYPuaxoKnj#QYy|gN_7fYv|X1{odiAnDESpV7HmTt z@Fz+(l&Y)AEA_}d!APupO1iFIN|Uu1Uos+ u!}ysv(oW}Sup5^=K6V;WOD2RgVgHAehF@`{N%h;p{gd6=WFz diff --git a/port/lib/python3.11/site-packages/flask_login/__pycache__/utils.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_login/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 48dc2e153c4268fd94fe34b878da6c1c0d1b7cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18838 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, - HTTP ``OPTIONS`` requests are exempt from login checks. - - :param func: The view function to decorate. - :type func: function - """ - - @wraps(func) - def decorated_view(*args, **kwargs): - if request.method in EXEMPT_METHODS or current_app.config.get("LOGIN_DISABLED"): - pass - elif not current_user.is_authenticated: - return current_app.login_manager.unauthorized() - - # flask 1.x compatibility - # current_app.ensure_sync is only available in Flask >= 2.0 - if callable(getattr(current_app, "ensure_sync", None)): - return current_app.ensure_sync(func)(*args, **kwargs) - return func(*args, **kwargs) - - return decorated_view - - -def fresh_login_required(func): - """ - If you decorate a view with this, it will ensure that the current user's - login is fresh - i.e. their session was not restored from a 'remember me' - cookie. Sensitive operations, like changing a password or e-mail, should - be protected with this, to impede the efforts of cookie thieves. - - If the user is not authenticated, :meth:`LoginManager.unauthorized` is - called as normal. If they are authenticated, but their session is not - fresh, it will call :meth:`LoginManager.needs_refresh` instead. (In that - case, you will need to provide a :attr:`LoginManager.refresh_view`.) - - Behaves identically to the :func:`login_required` decorator with respect - to configuration variables. - - .. Note :: - - Per `W3 guidelines for CORS preflight requests - `_, - HTTP ``OPTIONS`` requests are exempt from login checks. - - :param func: The view function to decorate. - :type func: function - """ - - @wraps(func) - def decorated_view(*args, **kwargs): - if request.method in EXEMPT_METHODS or current_app.config.get("LOGIN_DISABLED"): - pass - elif not current_user.is_authenticated: - return current_app.login_manager.unauthorized() - elif not login_fresh(): - return current_app.login_manager.needs_refresh() - try: - # current_app.ensure_sync available in Flask >= 2.0 - return current_app.ensure_sync(func)(*args, **kwargs) - except AttributeError: # pragma: no cover - return func(*args, **kwargs) - - return decorated_view - - -def set_login_view(login_view, blueprint=None): - """ - Sets the login view for the app or blueprint. If a blueprint is passed, - the login view is set for this blueprint on ``blueprint_login_views``. - - :param login_view: The user object to log in. - :type login_view: str - :param blueprint: The blueprint which this login view should be set on. - Defaults to ``None``. - :type blueprint: object - """ - - num_login_views = len(current_app.login_manager.blueprint_login_views) - if blueprint is not None or num_login_views != 0: - (current_app.login_manager.blueprint_login_views[blueprint.name]) = login_view - - if ( - current_app.login_manager.login_view is not None - and None not in current_app.login_manager.blueprint_login_views - ): - ( - current_app.login_manager.blueprint_login_views[None] - ) = current_app.login_manager.login_view - - current_app.login_manager.login_view = None - else: - current_app.login_manager.login_view = login_view - - -def _get_user(): - if has_request_context(): - if "_login_user" not in g: - current_app.login_manager._load_user() - - return g._login_user - - return None - - -def _cookie_digest(payload, key=None): - key = _secret_key(key) - - return hmac.new(key, payload.encode("utf-8"), sha512).hexdigest() - - -def _get_remote_addr(): - address = request.headers.get("X-Forwarded-For", request.remote_addr) - if address is not None: - # An 'X-Forwarded-For' header includes a comma separated list of the - # addresses, the first address being the actual remote address. - address = address.encode("utf-8").split(b",")[0].strip() - return address - - -def _create_identifier(): - user_agent = request.headers.get("User-Agent") - if user_agent is not None: - user_agent = user_agent.encode("utf-8") - base = f"{_get_remote_addr()}|{user_agent}" - if str is bytes: - base = str(base, "utf-8", errors="replace") # pragma: no cover - h = sha512() - h.update(base.encode("utf8")) - return h.hexdigest() - - -def _user_context_processor(): - return dict(current_user=_get_user()) - - -def _secret_key(key=None): - if key is None: - key = current_app.config["SECRET_KEY"] - - if isinstance(key, str): # pragma: no cover - key = key.encode("latin1") # ensure bytes - - return key diff --git a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/INSTALLER b/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/LICENSE.txt b/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/LICENSE.txt deleted file mode 100644 index a5f1b46..0000000 --- a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/METADATA b/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/METADATA deleted file mode 100644 index a453f18..0000000 --- a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/METADATA +++ /dev/null @@ -1,68 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-Mail -Version: 0.10.0 -Summary: Flask extension for sending email -Author: Dan Jacob -Maintainer-email: Pallets Ecosystem -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Classifier: Development Status :: 4 - Beta -Classifier: Framework :: Flask -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Requires-Dist: flask -Requires-Dist: blinker -Project-URL: Changes, https://flask-mail.readthedocs.io/en/latest/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://flask-mail.readthedocs.io -Project-URL: Source, https://github.com/pallets-eco/flask-mail/ - -# Flask-Mail - -Flask-Mail is an extension for [Flask] that makes it easy to send emails from -your application. It simplifies the process of integrating email functionality, -allowing you to focus on building great features for your application. - -[flask]: https://flask.palletsprojects.com - - -## Pallets Community Ecosystem - -> [!IMPORTANT]\ -> This project is part of the Pallets Community Ecosystem. Pallets is the open -> source organization that maintains Flask; Pallets-Eco enables community -> maintenance of related projects. If you are interested in helping maintain -> this project, please reach out on [the Pallets Discord server][discord]. - -[discord]: https://discord.gg/pallets - - -## A Simple Example - -```python -from flask import Flask -from flask_mail import Mail, Message - -app = Flask(__name__) -app.config['MAIL_SERVER'] = 'your_mail_server' -app.config['MAIL_PORT'] = 587 -app.config['MAIL_USE_TLS'] = True -app.config['MAIL_USE_SSL'] = False -app.config['MAIL_USERNAME'] = 'your_username' -app.config['MAIL_PASSWORD'] = 'your_password' -app.config['MAIL_DEFAULT_SENDER'] = 'your_email@example.com' - -mail = Mail(app) - -@app.route('/') -def send_email(): - msg = Message( - 'Hello', - recipients=['recipient@example.com'], - body='This is a test email sent from Flask-Mail!' - ) - mail.send(msg) - return 'Email sent succesfully!' -``` - diff --git a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/RECORD b/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/RECORD deleted file mode 100644 index def715b..0000000 --- a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/RECORD +++ /dev/null @@ -1,9 +0,0 @@ -flask_mail-0.10.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask_mail-0.10.0.dist-info/LICENSE.txt,sha256=NjGx7g1yxwNiJgUwLiQ9Fbx4Mtmlg13y-FTw0pk5y8M,1493 -flask_mail-0.10.0.dist-info/METADATA,sha256=NeD-q9ct7BhNLCuIpeQbrlh53eUhfhGTgv7hUbFOvAg,2070 -flask_mail-0.10.0.dist-info/RECORD,, -flask_mail-0.10.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask_mail-0.10.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -flask_mail/__init__.py,sha256=9kmcIKZe6ZnajZLUmexrX13kSuRv6pWwofztlU__ZlA,20841 -flask_mail/__pycache__/__init__.cpython-311.pyc,, -flask_mail/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/REQUESTED b/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/WHEEL b/port/lib/python3.11/site-packages/flask_mail-0.10.0.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/port/lib/python3.11/site-packages/flask_mail-0.10.0.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/port/lib/python3.11/site-packages/flask_mail/__init__.py b/port/lib/python3.11/site-packages/flask_mail/__init__.py deleted file mode 100644 index 697ce0f..0000000 --- a/port/lib/python3.11/site-packages/flask_mail/__init__.py +++ /dev/null @@ -1,660 +0,0 @@ -from __future__ import annotations - -import collections.abc as c -import re -import smtplib -import time -import typing as t -import unicodedata -import warnings -from contextlib import contextmanager -from email import charset -from email import policy -from email.encoders import encode_base64 -from email.header import Header -from email.mime.base import MIMEBase -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.utils import formataddr -from email.utils import formatdate -from email.utils import make_msgid -from email.utils import parseaddr -from mimetypes import guess_type -from types import TracebackType - -import blinker -from flask import current_app -from flask import Flask - -if t.TYPE_CHECKING: - import typing_extensions as te - -charset.add_charset("utf-8", charset.SHORTEST, None, "utf-8") - - -class FlaskMailUnicodeDecodeError(UnicodeDecodeError): - def __init__(self, obj: t.Any, *args: t.Any) -> None: - self.obj = obj - super().__init__(*args) - - def __str__(self) -> str: - original = super().__str__() - return f"{original}. You passed in {self.obj!r} ({type(self.obj)})" - - -def force_text(s: t.Any, encoding: str = "utf-8", errors: str = "strict") -> str: - """ - Similar to smart_text, except that lazy instances are resolved to - strings, rather than kept as lazy objects. - """ - if isinstance(s, str): - return s - - try: - if isinstance(s, bytes): - out = str(s, encoding, errors) - else: - out = str(s) - except UnicodeDecodeError as e: - if not isinstance(s, Exception): - raise FlaskMailUnicodeDecodeError(s, *e.args) from e - - out = " ".join([force_text(arg, encoding, errors) for arg in s.args]) - - return out - - -def sanitize_subject(subject: str, encoding: str = "utf-8") -> str: - try: - subject.encode("ascii") - except UnicodeEncodeError: - try: - subject = Header(subject, encoding).encode() - except UnicodeEncodeError: - subject = Header(subject, "utf-8").encode() - - return subject - - -def sanitize_address(addr: str | tuple[str, str], encoding: str = "utf-8") -> str: - if isinstance(addr, str): - addr = parseaddr(force_text(addr)) - - nm, addr = addr - - try: - nm = Header(nm, encoding).encode() - except UnicodeEncodeError: - nm = Header(nm, "utf-8").encode() - - try: - addr.encode("ascii") - except UnicodeEncodeError: # IDN - if "@" in addr: - localpart, domain = addr.split("@", 1) - localpart = str(Header(localpart, encoding)) - domain = domain.encode("idna").decode("ascii") - addr = "@".join([localpart, domain]) - else: - addr = Header(addr, encoding).encode() - - return formataddr((nm, addr)) - - -def sanitize_addresses( - addresses: c.Iterable[str | tuple[str, str]], encoding: str = "utf-8" -) -> list[str]: - return [sanitize_address(e, encoding) for e in addresses] - - -def _has_newline(line: str) -> bool: - """Used by has_bad_header to check for \\r or \\n""" - return "\n" in line or "\r" in line - - -class Connection: - """Handles connection to host.""" - - def __init__(self, mail: Mail) -> None: - self.mail = mail - self.host: smtplib.SMTP | smtplib.SMTP_SSL | None = None - self.num_emails: int = 0 - - def __enter__(self) -> te.Self: - if self.mail.suppress: - self.host = None - else: - self.host = self.configure_host() - - self.num_emails = 0 - return self - - def __exit__( - self, exc_type: type[BaseException], exc_value: BaseException, tb: TracebackType - ) -> None: - if self.host is not None: - self.host.quit() - - def configure_host(self) -> smtplib.SMTP | smtplib.SMTP_SSL: - host: smtplib.SMTP | smtplib.SMTP_SSL - - if self.mail.use_ssl: - host = smtplib.SMTP_SSL(self.mail.server, self.mail.port) - else: - host = smtplib.SMTP(self.mail.server, self.mail.port) - - host.set_debuglevel(int(self.mail.debug)) - - if self.mail.use_tls: - host.starttls() - - if self.mail.username and self.mail.password: - host.login(self.mail.username, self.mail.password) - - return host - - def send( - self, message: Message, envelope_from: str | tuple[str, str] | None = None - ) -> None: - """Verifies and sends message. - - :param message: Message instance. - :param envelope_from: Email address to be used in MAIL FROM command. - """ - assert message.send_to, "No recipients have been added" - assert message.sender, ( - "The message does not specify a sender and a default sender " - "has not been configured" - ) - - if message.has_bad_headers(): - raise BadHeaderError - - if message.date is None: - message.date = time.time() - - if self.host is not None: - self.host.sendmail( - sanitize_address(envelope_from or message.sender), - list(sanitize_addresses(message.send_to)), - message.as_bytes(), - message.mail_options, - message.rcpt_options, - ) - - app = current_app._get_current_object() # type: ignore[attr-defined] - email_dispatched.send(app, message=message) - self.num_emails += 1 - - if self.num_emails == self.mail.max_emails: - self.num_emails = 0 - - if self.host: - self.host.quit() - self.host = self.configure_host() - - def send_message(self, *args: t.Any, **kwargs: t.Any) -> None: - """Shortcut for send(msg). - - Takes same arguments as Message constructor. - - :versionadded: 0.3.5 - """ - self.send(Message(*args, **kwargs)) - - -class BadHeaderError(Exception): - pass - - -class Attachment: - """Encapsulates file attachment information. - - :param filename: filename of attachment - :param content_type: file mimetype - :param data: the raw file data - :param disposition: content-disposition (if any) - - .. versionchanged:: 0.10.0 - The `data` argument is required. - - .. versionadded: 0.3.5 - """ - - def __init__( - self, - filename: str | None = None, - content_type: str | None = None, - data: str | bytes | None = None, - disposition: str | None = None, - headers: dict[str, str] | None = None, - ): - if data is None: - raise ValueError("The 'data' argument is required.") - - self.data: str | bytes = data - - if content_type is None and filename is not None: - content_type = guess_type(filename)[0] - - if content_type is None: - if isinstance(data, str): - content_type = "text/plain" - else: - content_type = "application/octet-stream" - - self.filename: str | None = filename - self.content_type: str = content_type - self.disposition: str = disposition or "attachment" - - if headers is None: - headers = {} - - self.headers: dict[str, str] = headers - - -class Message: - """Encapsulates an email message. - - :param subject: email subject header - :param recipients: list of email addresses - :param body: plain text message - :param html: HTML message - :param alts: A dict or an iterable to go through dict() that contains multipart - alternatives - :param sender: email sender address, or **MAIL_DEFAULT_SENDER** by default - :param cc: CC list - :param bcc: BCC list - :param attachments: list of Attachment instances - :param reply_to: reply-to address - :param date: send date - :param charset: message character set - :param extra_headers: A dictionary of additional headers for the message - :param mail_options: A list of ESMTP options to be used in MAIL FROM command - :param rcpt_options: A list of ESMTP options to be used in RCPT commands - """ - - def __init__( - self, - subject: str = "", - recipients: list[str | tuple[str, str]] | None = None, - body: str | None = None, - html: str | None = None, - alts: dict[str, str] | c.Iterable[tuple[str, str]] | None = None, - sender: str | tuple[str, str] | None = None, - cc: list[str | tuple[str, str]] | None = None, - bcc: list[str | tuple[str, str]] | None = None, - attachments: list[Attachment] | None = None, - reply_to: str | tuple[str, str] | None = None, - date: float | None = None, - charset: str | None = None, - extra_headers: dict[str, str] | None = None, - mail_options: list[str] | None = None, - rcpt_options: list[str] | None = None, - ): - sender = sender or current_app.extensions["mail"].default_sender - - if isinstance(sender, tuple): - sender = f"{sender[0]} <{sender[1]}>" - - self.recipients: list[str | tuple[str, str]] = recipients or [] - self.subject: str = subject - self.sender: str | tuple[str, str] = sender # pyright: ignore - self.reply_to: str | tuple[str, str] | None = reply_to - self.cc: list[str | tuple[str, str]] = cc or [] - self.bcc: list[str | tuple[str, str]] = bcc or [] - self.body: str | None = body - self.alts: dict[str, str] = dict(alts or {}) - self.html: str | None = html - self.date: float | None = date - self.msgId: str = make_msgid() - self.charset: str | None = charset - self.extra_headers: dict[str, str] | None = extra_headers - self.mail_options: list[str] = mail_options or [] - self.rcpt_options: list[str] = rcpt_options or [] - self.attachments: list[Attachment] = attachments or [] - - @property - def send_to(self) -> set[str | tuple[str, str]]: - out = set(self.recipients) - - if self.bcc: - out.update(self.bcc) - - if self.cc: - out.update(self.cc) - - return out - - @property - def html(self) -> str | None: # pyright: ignore - return self.alts.get("html") - - @html.setter - def html(self, value: str | None) -> None: # pyright: ignore - if value is None: - self.alts.pop("html", None) - else: - self.alts["html"] = value - - def _mimetext(self, text: str | None, subtype: str = "plain") -> MIMEText: - """Creates a MIMEText object with the given subtype (default: 'plain') - If the text is unicode, the utf-8 charset is used. - """ - charset = self.charset or "utf-8" - return MIMEText(text, _subtype=subtype, _charset=charset) # type: ignore[arg-type] - - def _message(self) -> MIMEBase: - """Creates the email""" - ascii_attachments = current_app.extensions["mail"].ascii_attachments - encoding = self.charset or "utf-8" - attachments = self.attachments or [] - msg: MIMEBase - - if len(attachments) == 0 and not self.alts: - # No html content and zero attachments means plain text - msg = self._mimetext(self.body) - elif len(attachments) > 0 and not self.alts: - # No html and at least one attachment means multipart - msg = MIMEMultipart() - msg.attach(self._mimetext(self.body)) - else: - # Anything else - msg = MIMEMultipart() - alternative = MIMEMultipart("alternative") - alternative.attach(self._mimetext(self.body, "plain")) - - for mimetype, content in self.alts.items(): - alternative.attach(self._mimetext(content, mimetype)) - - msg.attach(alternative) - - if self.subject: - msg["Subject"] = sanitize_subject(force_text(self.subject), encoding) - - msg["From"] = sanitize_address(self.sender, encoding) - msg["To"] = ", ".join(list(set(sanitize_addresses(self.recipients, encoding)))) - msg["Date"] = formatdate(self.date, localtime=True) - # see RFC 5322 section 3.6.4. - msg["Message-ID"] = self.msgId - - if self.cc: - msg["Cc"] = ", ".join(list(set(sanitize_addresses(self.cc, encoding)))) - - if self.reply_to: - msg["Reply-To"] = sanitize_address(self.reply_to, encoding) - - if self.extra_headers: - for k, v in self.extra_headers.items(): - msg[k] = v - - SPACES = re.compile(r"[\s]+", re.UNICODE) - - for attachment in attachments: - f = MIMEBase(*attachment.content_type.split("/")) - f.set_payload(attachment.data) - encode_base64(f) - - if attachment.filename is not None: - filename = attachment.filename - - if ascii_attachments: - # force filename to ascii - filename = unicodedata.normalize("NFKD", attachment.filename) - filename = filename.encode("ascii", "ignore").decode("ascii") - filename = SPACES.sub(" ", filename).strip() - - try: - filename.encode("ascii") - except UnicodeEncodeError: - f.add_header( - "Content-Disposition", - attachment.disposition, - filename=("UTF8", "", filename), - ) - else: - f.add_header( - "Content-Disposition", attachment.disposition, filename=filename - ) - - for key, value in attachment.headers.items(): - f.add_header(key, value) - - msg.attach(f) - - msg.policy = policy.SMTP - return msg - - def as_string(self) -> str: - return self._message().as_string() - - def as_bytes(self) -> bytes: - return self._message().as_bytes() - - def __str__(self) -> str: - return self.as_string() - - def __bytes__(self) -> bytes: - return self.as_bytes() - - def has_bad_headers(self) -> bool: - """Checks for bad headers i.e. newlines in subject, sender or recipients. - RFC5322: Allows multiline CRLF with trailing whitespace (FWS) in headers - """ - headers = [self.sender, *self.recipients] - - if self.reply_to: - headers.append(self.reply_to) - - for header in headers: - if isinstance(header, tuple): - header = f"{header[0]} <{header[1]}>" - - if _has_newline(header): - return True - - if self.subject: - if _has_newline(self.subject): - for linenum, line in enumerate(self.subject.split("\r\n")): - if not line: - return True - if linenum > 0 and line[0] not in "\t ": - return True - if _has_newline(line): - return True - if len(line.strip()) == 0: - return True - - return False - - def is_bad_headers(self) -> bool: - warnings.warn( - "'is_bad_headers' is renamed to 'has_bad_headers'. The old name is" - " deprecated and will be removed in Flask-Mail 1.0.", - DeprecationWarning, - stacklevel=2, - ) - return self.has_bad_headers() - - def send(self, connection: Connection) -> None: - """Verifies and sends the message.""" - - connection.send(self) - - def add_recipient(self, recipient: str | tuple[str, str]) -> None: - """Adds another recipient to the message. - - :param recipient: email address of recipient. - """ - - self.recipients.append(recipient) - - def attach( - self, - filename: str | None = None, - content_type: str | None = None, - data: str | bytes | None = None, - disposition: str | None = None, - headers: dict[str, str] | None = None, - ) -> None: - """Adds an attachment to the message. - - :param filename: filename of attachment - :param content_type: file mimetype - :param data: the raw file data - :param disposition: content-disposition (if any) - """ - self.attachments.append( - Attachment(filename, content_type, data, disposition, headers) - ) - - -class _MailMixin: - @contextmanager - def record_messages(self) -> c.Iterator[list[Message]]: - """Records all messages. Use in unit tests for example:: - - with mail.record_messages() as outbox: - response = app.test_client.get("/email-sending-view/") - assert len(outbox) == 1 - assert outbox[0].subject == "testing" - - :versionadded: 0.4 - """ - outbox = [] - - def record(app: Flask, message: Message) -> None: - outbox.append(message) - - with email_dispatched.connected_to(record): - yield outbox - - def send(self, message: Message) -> None: - """Sends a single message instance. If TESTING is True the message will - not actually be sent. - - :param message: a Message instance. - """ - - with self.connect() as connection: - message.send(connection) - - def send_message(self, *args: t.Any, **kwargs: t.Any) -> None: - """Shortcut for send(msg). - - Takes same arguments as Message constructor. - - :versionadded: 0.3.5 - """ - - self.send(Message(*args, **kwargs)) - - def connect(self) -> Connection: - """Opens a connection to the mail host.""" - app = getattr(self, "app", None) or current_app - - try: - return Connection(app.extensions["mail"]) - except KeyError as err: - raise RuntimeError( - "The current application was not configured with Flask-Mail" - ) from err - - -class _Mail(_MailMixin): - def __init__( - self, - server: str, - username: str | None, - password: str | None, - port: int | None, - use_tls: bool, - use_ssl: bool, - default_sender: str | None, - debug: int, - max_emails: int | None, - suppress: bool, - ascii_attachments: bool, - ): - self.server = server - self.username = username - self.password = password - self.port = port - self.use_tls = use_tls - self.use_ssl = use_ssl - self.default_sender = default_sender - self.debug = debug - self.max_emails = max_emails - self.suppress = suppress - self.ascii_attachments = ascii_attachments - - -class Mail(_MailMixin): - """Manages email messaging.""" - - def __init__(self, app: Flask | None = None) -> None: - self.app = app - - if app is not None: - self.state: _Mail | None = self.init_app(app) - else: - self.state = None - - def init_mail( - self, config: dict[str, t.Any], debug: bool | int = False, testing: bool = False - ) -> _Mail: - return _Mail( - config.get("MAIL_SERVER", "127.0.0.1"), - config.get("MAIL_USERNAME"), - config.get("MAIL_PASSWORD"), - config.get("MAIL_PORT", 25), - config.get("MAIL_USE_TLS", False), - config.get("MAIL_USE_SSL", False), - config.get("MAIL_DEFAULT_SENDER"), - int(config.get("MAIL_DEBUG", debug)), - config.get("MAIL_MAX_EMAILS"), - config.get("MAIL_SUPPRESS_SEND", testing), - config.get("MAIL_ASCII_ATTACHMENTS", False), - ) - - def init_app(self, app: Flask) -> _Mail: - """Initializes your mail settings from the application settings. - - You can use this if you want to set up your Mail instance - at configuration time. - """ - state = self.init_mail(app.config, app.debug, app.testing) - - # register extension with app - app.extensions = getattr(app, "extensions", {}) - app.extensions["mail"] = state - return state - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.state, name, None) - - -signals: blinker.Namespace = blinker.Namespace() -email_dispatched: blinker.NamedSignal = signals.signal( - "email-dispatched", - doc=""" -Signal sent when an email is dispatched. This signal will also be sent -in testing mode, even though the email will not actually be sent. -""", -) - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Flask-Mail 1.0. Use feature detection or" - " 'importlib.metadata.version(\"flask-mail\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("flask-mail") - - raise AttributeError(name) diff --git a/port/lib/python3.11/site-packages/flask_mail/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_mail/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index d2836e1202b983afcce496e6bf2837b5b2fc1dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32623 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 L>{eC*jC=gQ+aNpS diff --git a/port/lib/python3.11/site-packages/flask_mail/py.typed b/port/lib/python3.11/site-packages/flask_mail/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER b/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst b/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA b/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA deleted file mode 100644 index 92f239c..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA +++ /dev/null @@ -1,109 +0,0 @@ -Metadata-Version: 2.1 -Name: Flask-SQLAlchemy -Version: 3.1.1 -Summary: Add SQLAlchemy support to your Flask application. -Maintainer-email: Pallets -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Requires-Dist: flask>=2.2.5 -Requires-Dist: sqlalchemy>=2.0.16 -Project-URL: Changes, https://flask-sqlalchemy.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Issue Tracker, https://github.com/pallets-eco/flask-sqlalchemy/issues/ -Project-URL: Source Code, https://github.com/pallets-eco/flask-sqlalchemy/ - -Flask-SQLAlchemy -================ - -Flask-SQLAlchemy is an extension for `Flask`_ that adds support for -`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy -with Flask by providing useful defaults and extra helpers that make it -easier to accomplish common tasks. - -.. _Flask: https://palletsprojects.com/p/flask/ -.. _SQLAlchemy: https://www.sqlalchemy.org - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - $ pip install -U Flask-SQLAlchemy - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - - -A Simple Example ----------------- - -.. code-block:: python - - from flask import Flask - from flask_sqlalchemy import SQLAlchemy - from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column - - app = Flask(__name__) - app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite" - - class Base(DeclarativeBase): - pass - - db = SQLAlchemy(app, model_class=Base) - - class User(db.Model): - id: Mapped[int] = mapped_column(db.Integer, primary_key=True) - username: Mapped[str] = mapped_column(db.String, unique=True, nullable=False) - - with app.app_context(): - db.create_all() - - db.session.add(User(username="example")) - db.session.commit() - - users = db.session.execute(db.select(User)).scalars() - - -Contributing ------------- - -For guidance on setting up a development environment and how to make a -contribution to Flask-SQLAlchemy, see the `contributing guidelines`_. - -.. _contributing guidelines: https://github.com/pallets-eco/flask-sqlalchemy/blob/main/CONTRIBUTING.rst - - -Donate ------- - -The Pallets organization develops and supports Flask-SQLAlchemy and -other popular packages. In order to grow the community of contributors -and users, and allow the maintainers to devote more time to the -projects, `please donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://flask-sqlalchemy.palletsprojects.com/ -- Changes: https://flask-sqlalchemy.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/Flask-SQLAlchemy/ -- Source Code: https://github.com/pallets-eco/flask-sqlalchemy/ -- Issue Tracker: https://github.com/pallets-eco/flask-sqlalchemy/issues/ -- Website: https://palletsprojects.com/ -- Twitter: https://twitter.com/PalletsTeam -- Chat: https://discord.gg/pallets - diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD b/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD deleted file mode 100644 index 4df6c83..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -flask_sqlalchemy-3.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask_sqlalchemy-3.1.1.dist-info/METADATA,sha256=lBxR1akBt7n9XBjIVTL2OV52OhCfFrb-Mqtoe0DCbR8,3432 -flask_sqlalchemy-3.1.1.dist-info/RECORD,, -flask_sqlalchemy-3.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask_sqlalchemy-3.1.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -flask_sqlalchemy/__init__.py,sha256=he_w4qQQVS2Z1ms5GCTptDTXNOXBXw0n8zSuWCp8n6Y,653 -flask_sqlalchemy/__pycache__/__init__.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/cli.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/extension.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/model.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/pagination.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/query.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/record_queries.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/session.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/table.cpython-311.pyc,, -flask_sqlalchemy/__pycache__/track_modifications.cpython-311.pyc,, -flask_sqlalchemy/cli.py,sha256=pg3QDxP36GW2qnwe_CpPtkRhPchyVSGM6zlBNWuNCFE,484 -flask_sqlalchemy/extension.py,sha256=71tP_kNtb5VgZdafy_OH1sWdZOA6PaT7cJqX7tKgZ-k,38261 -flask_sqlalchemy/model.py,sha256=_mSisC2Eni0TgTyFWeN_O4LIexTeP_sVTdxh03yMK50,11461 -flask_sqlalchemy/pagination.py,sha256=JFpllrqkRkwacb8DAmQWaz9wsvQa0dypfSkhUDSC2ws,11119 -flask_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask_sqlalchemy/query.py,sha256=Uls9qbmnpb9Vba43EDfsRP17eHJ0X4VG7SE22tH5R3g,3748 -flask_sqlalchemy/record_queries.py,sha256=ouS1ayj16h76LJprx13iYdoFZbm6m8OncrOgAVbG1Sk,3520 -flask_sqlalchemy/session.py,sha256=pBbtN8iDc8yuGVt0k18BvZHh2uEI7QPzZXO7eXrRi1g,3426 -flask_sqlalchemy/table.py,sha256=wAPOy8qwyAxpMwOIUJY4iMOultzz2W0D6xvBkQ7U2CE,859 -flask_sqlalchemy/track_modifications.py,sha256=yieyozj7IiVzwnAGZ-ZrgqrzjrUfG0kPrXBfW_hStSU,2755 diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED b/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL b/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy-3.1.1.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/port/lib/python3.11/site-packages/flask_sqlalchemy/__init__.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/__init__.py deleted file mode 100644 index c2fa059..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .extension import SQLAlchemy - -__all__ = [ - "SQLAlchemy", -] - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Flask-SQLAlchemy 3.2. Use feature detection or" - " 'importlib.metadata.version(\"flask-sqlalchemy\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("flask-sqlalchemy") - - raise AttributeError(name) diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index cb158448100bbedc1e17115b9e437da5000df243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1164 zcmZ`&&ubGw6rR~^vYSoQ)FQTmw9{Vd3TCPG*eV6}q7$5B-}g4}@_7e=J)iwmd1WB< zRR?{8SQ|dL41NnS#BhkJxP-CZ8=+B3u@o~yvzjiYA(yV;QikQ2^UN$+%veP3z`icv zVwIy&6iX_DI7$}waX0BK-nlg&mRESSA<~diW<;x8r4lJrMsT?%qQkT-&PR>1KG8S* zYD&ZU0Glne0kBp(P{mbdFchLq+_~dTW5d|)k?0@p-dRd!jx)^slzs~pKf={Dj5hEC zvmb5ij{g|TyaiMrkB}`QnLmDM1D$;O6uZ`f%K82}7YV4~`$8jo{Qm9=CsTiJ|6n}fNQDYe;X*fPDK<%l|-3(r-rZfXaT7E-ABsq!%3$;9Yg`*M30RSa(KsEr^2h(>)vf(xEzN;>}jqZko9T}xe`Y+#p!7;2_(N*0}`~t z6R$(TKj!TDeh>xH_lvcL9#{ob0vIr`5$H3Z8z$hMpq7<;vH96L*R;;H?1^T7wd|1> z1^wHzhhFDj=G%smzlnclP=35MGTP3e?3wQbiCaFuz}Pc zz6Nj}2*t;S5Iq8RYp8=7yAdGN&}SHF0ZoI;~LEo!N+~`fTm-GADA?y=t_qGtT`Wi4}XG{8S_XlQI!CCtS82kXnsU>PHD> zT>2{U&H5U+rNd&f#2Iy+isNwS(X3ftYmQ6FQCO0BoQT5_Ib}}1Yki}BhYF4-i_w`lAQC*TrGj4mTHI5JingGTZl;oA8I=DTJ=^ ztf<;)7_VelWd)N}6PckP^j9~B7_K{|3RG2-vpI1B9J*BG0;sJV#<-78Z~ooBpz+ON V`+`nv{@u2UC46WL{YRNge*yC5E}8%U diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/extension.cpython-311.pyc deleted file mode 100644 index 4a7f8863d68c274413b15b265df834ca853d33f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41752 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 Nl1jhYq>3%oe*;dp?`8l1 diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/query.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/query.cpython-311.pyc deleted file mode 100644 index e545e7a03c285a63999d2721703ee27c26a19aaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4836 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 diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/session.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/session.cpython-311.pyc deleted file mode 100644 index 468fbba8e4bdaa4306ed7e03f860047c5d02fb57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4842 zcmbVPU2NOd6}}|(XUmd*WXG|yAWYgtQ=L-lk|tf&)pcCwXKjU~P6kv%K~W-Q)1gT9 zlJZX=7fBIxDv)-5NS6Rhhdi`dx9njr13F*>y0<-SfIJA8K){26VGn&%kq#&fY}h%M z5>**#I_&D|@RIlco^!tM++W0E{RGlm&;ENMA0y-+_|i#1ufRR{DHLuIm8hISN?exX zu*@5LR$$LSHprf#QaBrF*Y%b9vr$$SjDb=t8{>#3EX6xR(~ufagT`QKC_BUvo}3|S z=sHouT6Af+)8?K)$bI;GDLbqVtMTiB?1(y|4#6{_^7AB>_!O&CoEue4({dC?w@f<& z?_s4}mJ816r<_;cKY!t+8KbbMmDUR0h@K315AMM;Q1~%yQzKbUC0SnOV0*(gQsmUg z^?_`lkKhj`Pq1%8*JIgWjjVFn5G-TV4bN+~4U;QBfeB~C?rh@8f}z;<$=nxSa3 zK(c5_YIn$qtX^~$6-O*AT9&QZ;tIZK=7Mf&qGR=okSew&<`r90MazW7@S>Zlcv)K$ zVRWmYD-Kkx=*}XmENPCSDvt8dN@r0w7ucYA4NBtc6^-heD)qB(7cH?+u^p?VU(v)| zPR&cOBHUUocSN)+`Ob26TU1~LWtd*n9hitsoXfF#IhSK=)7e_txVc<=9N8)}H9-@{ z@{dRA9$Buv5=j!5HHuRg78P?rQ%{~0k4oQWqv4UfqM1qwc3q@a3069Ydc z3j<+0msj&N1p0MDmsb?JVDAJSX~tZ0LsWAr)N}(G%hU?IX9`TB?MDgW9{dmr?{T-l zMjf=IcDe`8`<)lENc&(`iazW1$+CCUvW-Rz`@FhyKE15a^vcRg z`n*M*qGjk-x(ubXq36@(HD}Q>k4jHHm9}+9d$Oz)E-MR~oi2ibUY5J&nQkjeDz8y= z$16ka1C=^!oP@9T(;&XMN}7?q?*!it-v~D%d+U)ykZ&LNo*MTEijwIuTO5md!-5FrY5UV0;!41Ktz}DRW+V_rRE0X62(wyfGRk8bN)-pkFXiV+i zJIQY4Bik3+evd05VfZs;{~Q#F%B~96_^L1uDqCU=P;`~N9;|ZLs(r+110<{URa@om z!6^5AlUV1>mmece#2<((`TZUz^n2?e2Y|Pes+{A4Bq8^}eD3=uL`7$)(+<{ymcY_o z2H~Bz&U5!Vs-ZXeHvz)eLvMsuxD~Q0yh>I$XS~y%fWa;ebl$4L-nrMq)i9h%7|w*h zHrmsR|LV3XR}C%`8mR_VZlW_Zm_9huKL3^MawdQOssJtodQka0LN$O+1x^!C{tibw zuNk0sz@H9C_8?;}hqfaFHUh+0#YY074<-ny%;iK24qC|@fUrI2D4r{drqzXAz&~4a zjvz35(5GrerD8a&MH|7uDaEfqG3ls3HMTmfuZl%jHR7?4?nPLNA}(1#1FEQ-ivZJ( zViwv9{rWk2X1E9&)JtVUD`}=jl(1i_0sR2w7;9olaeyAZt>AHfnZtVfea*z*k)G_7=hN7j=K@h1yIsy+j>;Z!9 z^0wlJb<-|`Ew~|Dk+s!=JC?D|d7l6lW|kG*KwY~1x(zMa>A3-Ctqec|9e{^j0eg*H zG8r1Fvq;u+lv>msMtlYB%8n&_Q@T;ZDkz4`%!8scx{(FVk;Hu^8_7SmO_2ir}7=z?u$WbAGK2Lym^>o6G@sz>)V6XUfPw@3Ee{8nS+ zP%XS29j-_BxA;(O&(_4gJCk=$Z%#}#CZ;w*8=)_@5)+L?xzJDX;EoE!$@ZIH)RyM~@G{#Qssvq1qQJbz!HxrY$ zkKO!!eL&nEJn&BC?UfrVjll!;!B_4s|EBoKF(^R(({b-vkGx{z@xC|u1o_qA%rW72 z$7j;QAJai7ra~SoBEvIkqyXlGB9>8v)|8ORWK#W}W)OxvyJ96~T;ITNOi|sA`>|sf zSs7ytVC8-p8M$I$c|ew5uP8>lCM?UURgh)Il}v|jtj)~@%`jv+#d#V>PI%taG|~Y@ zfoNyH1p<`Y`L+1IV5CJ*>=A;exE6V&j1%$k=7GnW)3dFEE(Ic5qgQCxt({Ra>Lx^WU4zB;!Zj@82xThXzN;`{kKi<{A8Bbo%?>^s;T zovh8(=C)$vw?iNDAH+6eQX?h-s`efH?a7aezc>DJ>d$94k6vmVy~I93`Z!7?|L*5$M+Zd6WLuYT#*N4t} z`7?n}#6Kq>T7-|qTM;rezG2^}LZH1J9jqN={_G06=@eiqenR_XUUmu!w|cHNj_(yc zz6I^>``vr(3~Y+K@`E#)!^}p93u@cEDwIN~A)dzTg$Oud=mmB`M-@8|0*Dyjpdq&J z8=_sX%9@lCTwYfxuF*}%$btoLB-zR@0oAi$zym5|O*bmH@A@+InuRYV_}ggrSIIx4 zv3C|4@ziE~su7>sj2>x3kJJN4Sa0AB7GNBOmJHA6F)T6Oz`IR~_sY{)9z_BuR^Yk_ z1VHhO+z^Bj0DUg!xc%MBlV`B;?gt6t3!21{nQeZ#hJ_y>=wTc$#_nO#f??$q!}j(c zyZGw)IT`$8_Qi9VGj1OSPA1-n*?ranYG$&y?_CG86M5EStmkM3YLR{H7KoO>aa@xe zs`ut?GE(p4Z8Bc(#@68YUabDyn+%p}VxbRtOLh;(&!34rn=yCf>EX$$HnBSvMHv zkb?z53fxdRa6kwZs$Te0eBcnxsS+n{uFL^hLgKwy+o@#}n4Nv|-n=*S-uu0o`MFlB z5NKaK{JZ_BNyzUg%$i*=bQ}Qll!PRt3F**)Qsj-q2uwX%fvrcUQ)(KNbljj!i9y~c zp*bL-71{gR2k!O^e7u0aXu(=&?2@|u2a0v7)_9s`InU!Pm5t`qNDo#a(D4~CUqUbu z31~Vk^A5Y!Pmqk`@g&2Gzhm zC7;p2f#9zzhkeZVlBfX*xO;ILvV*9vtdw^mWy)MAi;K3LY)j7MVZvndan#}7t{y(f zqmFPOz)1xxcaC=&SsE$l;7BjAbMKwBuN)EOJ&`I4l}%%s6onE0D=>_43oOtsc}^S8 z0a0biC~1ij%Kj1j*aH6_ey!L1Ubw`Qh{#^z@fMiKDH5(mV%arTNSF0pV7{eK;V$I}!?Z0P z-2J)cn6~M$@gsdiVsdQ$M8BbUPj`uit8OS;_PUYKKrG-kk6)D;YeID;WAjsTa!D?C zARu`k$X`%ahm>!AZGTldEB)qff44bw{U0nKMgPT_vjwA*u2+h}xv)i1I6NoCd0j&e z&#R~*c>@VxLKfEOir++)&OxtUwZ>iPXO(3M4>4X{##Du|P8RkOg{uHbt%(B?)77Ds-K(G;bFGVoe1Sj8yVEd8=e9ElMisJiXH+iP)e%`H zuT0{sgOP!%4dRq${M>e>g^9b($lL-aDyID=s{S|8CDSR?tB6gj2d@%fBk;B=C+~OT zv@LF&Qz!^ypPJ(Z>n~uZ+hV!@9V^USd`^0;em)4 z%M&0YlTvz4ZVwmxOR_PX^_S$vaMsVs-QmCVk#mazEX(Bd(b*@jaQ@E~N*&=p6#$yE diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-311.pyc b/port/lib/python3.11/site-packages/flask_sqlalchemy/__pycache__/track_modifications.cpython-311.pyc deleted file mode 100644 index af0b89e37cd06067a3db6d7f3388bd11ae3e8ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4003 zcmd5;|4ST67O(E9?&rdVVH?V&~mc9GECp2Uz2nfghu)huDx4^=^>YkplW3nvl z4|hfNt5@&UtE#T|srTydEiFL=c)of3uETd=A6C408xQLMl?Z9LjSkj$=HZ z<5NDn#VNsV#k@Zy)pdbd-p&Pc^#77*#reT^_>clvHN`y>)EhwXv}PQajbiL!3IT z#?&aZXVlYbJG5QUc0k(=?I~z`RDKa9&iud@NpLiz6beN{F|x&izQFqFbwad)AuFX4 zbX!*xow0JdSTM9d7$6EPD0xjUDQWEowpWn&7d2gn3BGL07ga5%kEDzFeAX~D^~=~j zEmI`g$m zY%9^QZ-8U@x|NE++x`U_b{rvRa_joa5;#pLfE!iXQkOd}qhTduXau~?97rQhj}&vc zdrEpOAyNsvrQHX7P%)R)4Xr>!GSSjSqRPdRP9w5+x)#|pUu(VVPWYH30obM}Dv^5l;d zJZ<4=)2%OIX+)T_skpYGkY)XqV2oZbYU&<8zpCi{J8yFMV=-=0o}8+q1XkZ_Qj^x^;VDk&4-Zt`R`%dP!9bjfxPTG($^-3HwFD z{+o&r+cMc@>MLj)R8X_T0JJ#cRLbiL^}{43Ep5;+i-uVh;GcytVV9HFv`xxqRe--8 z=j8N?QUGiw{5HHvoUP(Fz|ESW(*VRdV&jsEj*JRAL|~2jU>==_J&PqpytPYVhu^cHJenVu5JJBnOYFVdTYoR04b2|`4=6XfBj(Zex>8Q)p34% zt~xwo4NscU4|acLMF-93;J^5%R=1?)AD?!6ORT$wwD^Ecgs2I|SI(ZCo&$M3`bu`mvM ztQYS}uOXf{BJMbZ_8Zu5%3uYq%zwilz|IdFyJt^|Mf-c~TOj=~oMl!QNr7W{ZI=N@ zvYV%i_f`R#WDpF<2oQ={oTK7>CAY5Ww4Q(+VCwb24w;!^T`Q=MeKta=4^ljN53F@| zvVcAZdYx=iMkbkR8_1iX7d&MJ6P4fvD|q3-%uy(^Gii2?TcL?24v+j1%O9^HUYL3j z?cCk4Vk6IEm!8EgRbt~-Y`hYku%Z*&{uff;b7}CIG`PR`?T{%AR-{Qwnl#;76Tse{ z8X>;Dae?*2bO$OGL*pas7*iWj;~(2+|pBoS=FjEsYz2`e(ey1xNJ>#w{fmI#9f z71B9PA!G`8FN$K!l98KC^%am`iXxvd^wTIh{alJalj3{ne@vKCydsTR(wHfYRi#!- z>U9uSkBqJ$xccEZp}Xt6tLM<@3Ck63(w)+ze{wv**ehn(OR61;sw$uw9H zmX)1{k8{^fGa)0tV+xis9-t}?S-9&t?tg~+EBKs+&zWwucbULWf?@AJ!Xg+614)RE zl!YEU_mEz%zHVjfn^tiel;zAiJhnAiCM*s>e%dT$3(J%@y$UTDZ~t zBPz-DaWJ24K(4`fa+wkKwsR7u9lC7fu`_*)?DMiu`jvDAvh;dRyGHJSiaAhU0$THN z99Ko>Om96xQPZtQC}z5~iUv$?t)f2DTdOE;dTSM(HNExZJV!qKkfm_$Y!&yL-g*@3 z*uMPdshz0@(ouW&qv^j)n*;Av+Q+T-aTB%Gc#*@kHq<@vb@FdX^WB+B*R0hw3wy5d rJZORf_dZucCumzM2btbW216W#S}*Adb8ttzq?h9c*k<2I>{I_Q3@~vL diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/cli.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/cli.py deleted file mode 100644 index d7d7e4b..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/cli.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import annotations - -import typing as t - -from flask import current_app - - -def add_models_to_shell() -> dict[str, t.Any]: - """Registered with :meth:`~flask.Flask.shell_context_processor` if - ``add_models_to_shell`` is enabled. Adds the ``db`` instance and all model classes - to ``flask shell``. - """ - db = current_app.extensions["sqlalchemy"] - out = {m.class_.__name__: m.class_ for m in db.Model._sa_registry.mappers} - out["db"] = db - return out diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/extension.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/extension.py deleted file mode 100644 index 43e1b9a..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/extension.py +++ /dev/null @@ -1,1008 +0,0 @@ -from __future__ import annotations - -import os -import types -import typing as t -import warnings -from weakref import WeakKeyDictionary - -import sqlalchemy as sa -import sqlalchemy.event as sa_event -import sqlalchemy.exc as sa_exc -import sqlalchemy.orm as sa_orm -from flask import abort -from flask import current_app -from flask import Flask -from flask import has_app_context - -from .model import _QueryProperty -from .model import BindMixin -from .model import DefaultMeta -from .model import DefaultMetaNoName -from .model import Model -from .model import NameMixin -from .pagination import Pagination -from .pagination import SelectPagination -from .query import Query -from .session import _app_ctx_id -from .session import Session -from .table import _Table - -_O = t.TypeVar("_O", bound=object) # Based on sqlalchemy.orm._typing.py - - -# Type accepted for model_class argument -_FSA_MCT = t.TypeVar( - "_FSA_MCT", - bound=t.Union[ - t.Type[Model], - sa_orm.DeclarativeMeta, - t.Type[sa_orm.DeclarativeBase], - t.Type[sa_orm.DeclarativeBaseNoMeta], - ], -) - - -# Type returned by make_declarative_base -class _FSAModel(Model): - metadata: sa.MetaData - - -def _get_2x_declarative_bases( - model_class: _FSA_MCT, -) -> list[t.Type[t.Union[sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta]]]: - return [ - b - for b in model_class.__bases__ - if issubclass(b, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) - ] - - -class SQLAlchemy: - """Integrates SQLAlchemy with Flask. This handles setting up one or more engines, - associating tables and models with specific engines, and cleaning up connections and - sessions after each request. - - Only the engine configuration is specific to each application, other things like - the model, table, metadata, and session are shared for all applications using that - extension instance. Call :meth:`init_app` to configure the extension on an - application. - - After creating the extension, create model classes by subclassing :attr:`Model`, and - table classes with :attr:`Table`. These can be accessed before :meth:`init_app` is - called, making it possible to define the models separately from the application. - - Accessing :attr:`session` and :attr:`engine` requires an active Flask application - context. This includes methods like :meth:`create_all` which use the engine. - - This class also provides access to names in SQLAlchemy's ``sqlalchemy`` and - ``sqlalchemy.orm`` modules. For example, you can use ``db.Column`` and - ``db.relationship`` instead of importing ``sqlalchemy.Column`` and - ``sqlalchemy.orm.relationship``. This can be convenient when defining models. - - :param app: Call :meth:`init_app` on this Flask application now. - :param metadata: Use this as the default :class:`sqlalchemy.schema.MetaData`. Useful - for setting a naming convention. - :param session_options: Arguments used by :attr:`session` to create each session - instance. A ``scopefunc`` key will be passed to the scoped session, not the - session instance. See :class:`sqlalchemy.orm.sessionmaker` for a list of - arguments. - :param query_class: Use this as the default query class for models and dynamic - relationships. The query interface is considered legacy in SQLAlchemy. - :param model_class: Use this as the model base class when creating the declarative - model class :attr:`Model`. Can also be a fully created declarative model class - for further customization. - :param engine_options: Default arguments used when creating every engine. These are - lower precedence than application config. See :func:`sqlalchemy.create_engine` - for a list of arguments. - :param add_models_to_shell: Add the ``db`` instance and all model classes to - ``flask shell``. - - .. versionchanged:: 3.1.0 - The ``metadata`` parameter can still be used with SQLAlchemy 1.x classes, - but is ignored when using SQLAlchemy 2.x style of declarative classes. - Instead, specify metadata on your Base class. - - .. versionchanged:: 3.1.0 - Added the ``disable_autonaming`` parameter. - - .. versionchanged:: 3.1.0 - Changed ``model_class`` parameter to accepta SQLAlchemy 2.x - declarative base subclass. - - .. versionchanged:: 3.0 - An active Flask application context is always required to access ``session`` and - ``engine``. - - .. versionchanged:: 3.0 - Separate ``metadata`` are used for each bind key. - - .. versionchanged:: 3.0 - The ``engine_options`` parameter is applied as defaults before per-engine - configuration. - - .. versionchanged:: 3.0 - The session class can be customized in ``session_options``. - - .. versionchanged:: 3.0 - Added the ``add_models_to_shell`` parameter. - - .. versionchanged:: 3.0 - Engines are created when calling ``init_app`` rather than the first time they - are accessed. - - .. versionchanged:: 3.0 - All parameters except ``app`` are keyword-only. - - .. versionchanged:: 3.0 - The extension instance is stored directly as ``app.extensions["sqlalchemy"]``. - - .. versionchanged:: 3.0 - Setup methods are renamed with a leading underscore. They are considered - internal interfaces which may change at any time. - - .. versionchanged:: 3.0 - Removed the ``use_native_unicode`` parameter and config. - - .. versionchanged:: 2.4 - Added the ``engine_options`` parameter. - - .. versionchanged:: 2.1 - Added the ``metadata``, ``query_class``, and ``model_class`` parameters. - - .. versionchanged:: 2.1 - Use the same query class across ``session``, ``Model.query`` and - ``Query``. - - .. versionchanged:: 0.16 - ``scopefunc`` is accepted in ``session_options``. - - .. versionchanged:: 0.10 - Added the ``session_options`` parameter. - """ - - def __init__( - self, - app: Flask | None = None, - *, - metadata: sa.MetaData | None = None, - session_options: dict[str, t.Any] | None = None, - query_class: type[Query] = Query, - model_class: _FSA_MCT = Model, # type: ignore[assignment] - engine_options: dict[str, t.Any] | None = None, - add_models_to_shell: bool = True, - disable_autonaming: bool = False, - ): - if session_options is None: - session_options = {} - - self.Query = query_class - """The default query class used by ``Model.query`` and ``lazy="dynamic"`` - relationships. - - .. warning:: - The query interface is considered legacy in SQLAlchemy. - - Customize this by passing the ``query_class`` parameter to the extension. - """ - - self.session = self._make_scoped_session(session_options) - """A :class:`sqlalchemy.orm.scoping.scoped_session` that creates instances of - :class:`.Session` scoped to the current Flask application context. The session - will be removed, returning the engine connection to the pool, when the - application context exits. - - Customize this by passing ``session_options`` to the extension. - - This requires that a Flask application context is active. - - .. versionchanged:: 3.0 - The session is scoped to the current app context. - """ - - self.metadatas: dict[str | None, sa.MetaData] = {} - """Map of bind keys to :class:`sqlalchemy.schema.MetaData` instances. The - ``None`` key refers to the default metadata, and is available as - :attr:`metadata`. - - Customize the default metadata by passing the ``metadata`` parameter to the - extension. This can be used to set a naming convention. When metadata for - another bind key is created, it copies the default's naming convention. - - .. versionadded:: 3.0 - """ - - if metadata is not None: - if len(_get_2x_declarative_bases(model_class)) > 0: - warnings.warn( - "When using SQLAlchemy 2.x style of declarative classes," - " the `metadata` should be an attribute of the base class." - "The metadata passed into SQLAlchemy() is ignored.", - DeprecationWarning, - stacklevel=2, - ) - else: - metadata.info["bind_key"] = None - self.metadatas[None] = metadata - - self.Table = self._make_table_class() - """A :class:`sqlalchemy.schema.Table` class that chooses a metadata - automatically. - - Unlike the base ``Table``, the ``metadata`` argument is not required. If it is - not given, it is selected based on the ``bind_key`` argument. - - :param bind_key: Used to select a different metadata. - :param args: Arguments passed to the base class. These are typically the table's - name, columns, and constraints. - :param kwargs: Arguments passed to the base class. - - .. versionchanged:: 3.0 - This is a subclass of SQLAlchemy's ``Table`` rather than a function. - """ - - self.Model = self._make_declarative_base( - model_class, disable_autonaming=disable_autonaming - ) - """A SQLAlchemy declarative model class. Subclass this to define database - models. - - If a model does not set ``__tablename__``, it will be generated by converting - the class name from ``CamelCase`` to ``snake_case``. It will not be generated - if the model looks like it uses single-table inheritance. - - If a model or parent class sets ``__bind_key__``, it will use that metadata and - database engine. Otherwise, it will use the default :attr:`metadata` and - :attr:`engine`. This is ignored if the model sets ``metadata`` or ``__table__``. - - For code using the SQLAlchemy 1.x API, customize this model by subclassing - :class:`.Model` and passing the ``model_class`` parameter to the extension. - A fully created declarative model class can be - passed as well, to use a custom metaclass. - - For code using the SQLAlchemy 2.x API, customize this model by subclassing - :class:`sqlalchemy.orm.DeclarativeBase` or - :class:`sqlalchemy.orm.DeclarativeBaseNoMeta` - and passing the ``model_class`` parameter to the extension. - """ - - if engine_options is None: - engine_options = {} - - self._engine_options = engine_options - self._app_engines: WeakKeyDictionary[Flask, dict[str | None, sa.engine.Engine]] - self._app_engines = WeakKeyDictionary() - self._add_models_to_shell = add_models_to_shell - - if app is not None: - self.init_app(app) - - def __repr__(self) -> str: - if not has_app_context(): - return f"<{type(self).__name__}>" - - message = f"{type(self).__name__} {self.engine.url}" - - if len(self.engines) > 1: - message = f"{message} +{len(self.engines) - 1}" - - return f"<{message}>" - - def init_app(self, app: Flask) -> None: - """Initialize a Flask application for use with this extension instance. This - must be called before accessing the database engine or session with the app. - - This sets default configuration values, then configures the extension on the - application and creates the engines for each bind key. Therefore, this must be - called after the application has been configured. Changes to application config - after this call will not be reflected. - - The following keys from ``app.config`` are used: - - - :data:`.SQLALCHEMY_DATABASE_URI` - - :data:`.SQLALCHEMY_ENGINE_OPTIONS` - - :data:`.SQLALCHEMY_ECHO` - - :data:`.SQLALCHEMY_BINDS` - - :data:`.SQLALCHEMY_RECORD_QUERIES` - - :data:`.SQLALCHEMY_TRACK_MODIFICATIONS` - - :param app: The Flask application to initialize. - """ - if "sqlalchemy" in app.extensions: - raise RuntimeError( - "A 'SQLAlchemy' instance has already been registered on this Flask app." - " Import and use that instance instead." - ) - - app.extensions["sqlalchemy"] = self - app.teardown_appcontext(self._teardown_session) - - if self._add_models_to_shell: - from .cli import add_models_to_shell - - app.shell_context_processor(add_models_to_shell) - - basic_uri: str | sa.engine.URL | None = app.config.setdefault( - "SQLALCHEMY_DATABASE_URI", None - ) - basic_engine_options = self._engine_options.copy() - basic_engine_options.update( - app.config.setdefault("SQLALCHEMY_ENGINE_OPTIONS", {}) - ) - echo: bool = app.config.setdefault("SQLALCHEMY_ECHO", False) - config_binds: dict[ - str | None, str | sa.engine.URL | dict[str, t.Any] - ] = app.config.setdefault("SQLALCHEMY_BINDS", {}) - engine_options: dict[str | None, dict[str, t.Any]] = {} - - # Build the engine config for each bind key. - for key, value in config_binds.items(): - engine_options[key] = self._engine_options.copy() - - if isinstance(value, (str, sa.engine.URL)): - engine_options[key]["url"] = value - else: - engine_options[key].update(value) - - # Build the engine config for the default bind key. - if basic_uri is not None: - basic_engine_options["url"] = basic_uri - - if "url" in basic_engine_options: - engine_options.setdefault(None, {}).update(basic_engine_options) - - if not engine_options: - raise RuntimeError( - "Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set." - ) - - engines = self._app_engines.setdefault(app, {}) - - # Dispose existing engines in case init_app is called again. - if engines: - for engine in engines.values(): - engine.dispose() - - engines.clear() - - # Create the metadata and engine for each bind key. - for key, options in engine_options.items(): - self._make_metadata(key) - options.setdefault("echo", echo) - options.setdefault("echo_pool", echo) - self._apply_driver_defaults(options, app) - engines[key] = self._make_engine(key, options, app) - - if app.config.setdefault("SQLALCHEMY_RECORD_QUERIES", False): - from . import record_queries - - for engine in engines.values(): - record_queries._listen(engine) - - if app.config.setdefault("SQLALCHEMY_TRACK_MODIFICATIONS", False): - from . import track_modifications - - track_modifications._listen(self.session) - - def _make_scoped_session( - self, options: dict[str, t.Any] - ) -> sa_orm.scoped_session[Session]: - """Create a :class:`sqlalchemy.orm.scoping.scoped_session` around the factory - from :meth:`_make_session_factory`. The result is available as :attr:`session`. - - The scope function can be customized using the ``scopefunc`` key in the - ``session_options`` parameter to the extension. By default it uses the current - thread or greenlet id. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param options: The ``session_options`` parameter from ``__init__``. Keyword - arguments passed to the session factory. A ``scopefunc`` key is popped. - - .. versionchanged:: 3.0 - The session is scoped to the current app context. - - .. versionchanged:: 3.0 - Renamed from ``create_scoped_session``, this method is internal. - """ - scope = options.pop("scopefunc", _app_ctx_id) - factory = self._make_session_factory(options) - return sa_orm.scoped_session(factory, scope) - - def _make_session_factory( - self, options: dict[str, t.Any] - ) -> sa_orm.sessionmaker[Session]: - """Create the SQLAlchemy :class:`sqlalchemy.orm.sessionmaker` used by - :meth:`_make_scoped_session`. - - To customize, pass the ``session_options`` parameter to :class:`SQLAlchemy`. To - customize the session class, subclass :class:`.Session` and pass it as the - ``class_`` key. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param options: The ``session_options`` parameter from ``__init__``. Keyword - arguments passed to the session factory. - - .. versionchanged:: 3.0 - The session class can be customized. - - .. versionchanged:: 3.0 - Renamed from ``create_session``, this method is internal. - """ - options.setdefault("class_", Session) - options.setdefault("query_cls", self.Query) - return sa_orm.sessionmaker(db=self, **options) - - def _teardown_session(self, exc: BaseException | None) -> None: - """Remove the current session at the end of the request. - - :meta private: - - .. versionadded:: 3.0 - """ - self.session.remove() - - def _make_metadata(self, bind_key: str | None) -> sa.MetaData: - """Get or create a :class:`sqlalchemy.schema.MetaData` for the given bind key. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param bind_key: The name of the metadata being created. - - .. versionadded:: 3.0 - """ - if bind_key in self.metadatas: - return self.metadatas[bind_key] - - if bind_key is not None: - # Copy the naming convention from the default metadata. - naming_convention = self._make_metadata(None).naming_convention - else: - naming_convention = None - - # Set the bind key in info to be used by session.get_bind. - metadata = sa.MetaData( - naming_convention=naming_convention, info={"bind_key": bind_key} - ) - self.metadatas[bind_key] = metadata - return metadata - - def _make_table_class(self) -> type[_Table]: - """Create a SQLAlchemy :class:`sqlalchemy.schema.Table` class that chooses a - metadata automatically based on the ``bind_key``. The result is available as - :attr:`Table`. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - .. versionadded:: 3.0 - """ - - class Table(_Table): - def __new__( - cls, *args: t.Any, bind_key: str | None = None, **kwargs: t.Any - ) -> Table: - # If a metadata arg is passed, go directly to the base Table. Also do - # this for no args so the correct error is shown. - if not args or (len(args) >= 2 and isinstance(args[1], sa.MetaData)): - return super().__new__(cls, *args, **kwargs) - - metadata = self._make_metadata(bind_key) - return super().__new__(cls, *[args[0], metadata, *args[1:]], **kwargs) - - return Table - - def _make_declarative_base( - self, - model_class: _FSA_MCT, - disable_autonaming: bool = False, - ) -> t.Type[_FSAModel]: - """Create a SQLAlchemy declarative model class. The result is available as - :attr:`Model`. - - To customize, subclass :class:`.Model` and pass it as ``model_class`` to - :class:`SQLAlchemy`. To customize at the metaclass level, pass an already - created declarative model class as ``model_class``. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param model_class: A model base class, or an already created declarative model - class. - - :param disable_autonaming: Turns off automatic tablename generation in models. - - .. versionchanged:: 3.1.0 - Added support for passing SQLAlchemy 2.x base class as model class. - Added optional ``disable_autonaming`` parameter. - - .. versionchanged:: 3.0 - Renamed with a leading underscore, this method is internal. - - .. versionchanged:: 2.3 - ``model`` can be an already created declarative model class. - """ - model: t.Type[_FSAModel] - declarative_bases = _get_2x_declarative_bases(model_class) - if len(declarative_bases) > 1: - # raise error if more than one declarative base is found - raise ValueError( - "Only one declarative base can be passed to SQLAlchemy." - " Got: {}".format(model_class.__bases__) - ) - elif len(declarative_bases) == 1: - body = dict(model_class.__dict__) - body["__fsa__"] = self - mixin_classes = [BindMixin, NameMixin, Model] - if disable_autonaming: - mixin_classes.remove(NameMixin) - model = types.new_class( - "FlaskSQLAlchemyBase", - (*mixin_classes, *model_class.__bases__), - {"metaclass": type(declarative_bases[0])}, - lambda ns: ns.update(body), - ) - elif not isinstance(model_class, sa_orm.DeclarativeMeta): - metadata = self._make_metadata(None) - metaclass = DefaultMetaNoName if disable_autonaming else DefaultMeta - model = sa_orm.declarative_base( - metadata=metadata, cls=model_class, name="Model", metaclass=metaclass - ) - else: - model = model_class # type: ignore[assignment] - - if None not in self.metadatas: - # Use the model's metadata as the default metadata. - model.metadata.info["bind_key"] = None - self.metadatas[None] = model.metadata - else: - # Use the passed in default metadata as the model's metadata. - model.metadata = self.metadatas[None] - - model.query_class = self.Query - model.query = _QueryProperty() # type: ignore[assignment] - model.__fsa__ = self - return model - - def _apply_driver_defaults(self, options: dict[str, t.Any], app: Flask) -> None: - """Apply driver-specific configuration to an engine. - - SQLite in-memory databases use ``StaticPool`` and disable ``check_same_thread``. - File paths are relative to the app's :attr:`~flask.Flask.instance_path`, - which is created if it doesn't exist. - - MySQL sets ``charset="utf8mb4"``, and ``pool_timeout`` defaults to 2 hours. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param options: Arguments passed to the engine. - :param app: The application that the engine configuration belongs to. - - .. versionchanged:: 3.0 - SQLite paths are relative to ``app.instance_path``. It does not use - ``NullPool`` if ``pool_size`` is 0. Driver-level URIs are supported. - - .. versionchanged:: 3.0 - MySQL sets ``charset="utf8mb4". It does not set ``pool_size`` to 10. It - does not set ``pool_recycle`` if not using a queue pool. - - .. versionchanged:: 3.0 - Renamed from ``apply_driver_hacks``, this method is internal. It does not - return anything. - - .. versionchanged:: 2.5 - Returns ``(sa_url, options)``. - """ - url = sa.engine.make_url(options["url"]) - - if url.drivername in {"sqlite", "sqlite+pysqlite"}: - if url.database is None or url.database in {"", ":memory:"}: - options["poolclass"] = sa.pool.StaticPool - - if "connect_args" not in options: - options["connect_args"] = {} - - options["connect_args"]["check_same_thread"] = False - else: - # the url might look like sqlite:///file:path?uri=true - is_uri = url.query.get("uri", False) - - if is_uri: - db_str = url.database[5:] - else: - db_str = url.database - - if not os.path.isabs(db_str): - os.makedirs(app.instance_path, exist_ok=True) - db_str = os.path.join(app.instance_path, db_str) - - if is_uri: - db_str = f"file:{db_str}" - - options["url"] = url.set(database=db_str) - elif url.drivername.startswith("mysql"): - # set queue defaults only when using queue pool - if ( - "pool_class" not in options - or options["pool_class"] is sa.pool.QueuePool - ): - options.setdefault("pool_recycle", 7200) - - if "charset" not in url.query: - options["url"] = url.update_query_dict({"charset": "utf8mb4"}) - - def _make_engine( - self, bind_key: str | None, options: dict[str, t.Any], app: Flask - ) -> sa.engine.Engine: - """Create the :class:`sqlalchemy.engine.Engine` for the given bind key and app. - - To customize, use :data:`.SQLALCHEMY_ENGINE_OPTIONS` or - :data:`.SQLALCHEMY_BINDS` config. Pass ``engine_options`` to :class:`SQLAlchemy` - to set defaults for all engines. - - This method is used for internal setup. Its signature may change at any time. - - :meta private: - - :param bind_key: The name of the engine being created. - :param options: Arguments passed to the engine. - :param app: The application that the engine configuration belongs to. - - .. versionchanged:: 3.0 - Renamed from ``create_engine``, this method is internal. - """ - return sa.engine_from_config(options, prefix="") - - @property - def metadata(self) -> sa.MetaData: - """The default metadata used by :attr:`Model` and :attr:`Table` if no bind key - is set. - """ - return self.metadatas[None] - - @property - def engines(self) -> t.Mapping[str | None, sa.engine.Engine]: - """Map of bind keys to :class:`sqlalchemy.engine.Engine` instances for current - application. The ``None`` key refers to the default engine, and is available as - :attr:`engine`. - - To customize, set the :data:`.SQLALCHEMY_BINDS` config, and set defaults by - passing the ``engine_options`` parameter to the extension. - - This requires that a Flask application context is active. - - .. versionadded:: 3.0 - """ - app = current_app._get_current_object() # type: ignore[attr-defined] - - if app not in self._app_engines: - raise RuntimeError( - "The current Flask app is not registered with this 'SQLAlchemy'" - " instance. Did you forget to call 'init_app', or did you create" - " multiple 'SQLAlchemy' instances?" - ) - - return self._app_engines[app] - - @property - def engine(self) -> sa.engine.Engine: - """The default :class:`~sqlalchemy.engine.Engine` for the current application, - used by :attr:`session` if the :attr:`Model` or :attr:`Table` being queried does - not set a bind key. - - To customize, set the :data:`.SQLALCHEMY_ENGINE_OPTIONS` config, and set - defaults by passing the ``engine_options`` parameter to the extension. - - This requires that a Flask application context is active. - """ - return self.engines[None] - - def get_engine( - self, bind_key: str | None = None, **kwargs: t.Any - ) -> sa.engine.Engine: - """Get the engine for the given bind key for the current application. - This requires that a Flask application context is active. - - :param bind_key: The name of the engine. - - .. deprecated:: 3.0 - Will be removed in Flask-SQLAlchemy 3.2. Use ``engines[key]`` instead. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - """ - warnings.warn( - "'get_engine' is deprecated and will be removed in Flask-SQLAlchemy" - " 3.2. Use 'engine' or 'engines[key]' instead. If you're using" - " Flask-Migrate or Alembic, you'll need to update your 'env.py' file.", - DeprecationWarning, - stacklevel=2, - ) - - if "bind" in kwargs: - bind_key = kwargs.pop("bind") - - return self.engines[bind_key] - - def get_or_404( - self, - entity: type[_O], - ident: t.Any, - *, - description: str | None = None, - **kwargs: t.Any, - ) -> _O: - """Like :meth:`session.get() ` but aborts with a - ``404 Not Found`` error instead of returning ``None``. - - :param entity: The model class to query. - :param ident: The primary key to query. - :param description: A custom message to show on the error page. - :param kwargs: Extra arguments passed to ``session.get()``. - - .. versionchanged:: 3.1 - Pass extra keyword arguments to ``session.get()``. - - .. versionadded:: 3.0 - """ - value = self.session.get(entity, ident, **kwargs) - - if value is None: - abort(404, description=description) - - return value - - def first_or_404( - self, statement: sa.sql.Select[t.Any], *, description: str | None = None - ) -> t.Any: - """Like :meth:`Result.scalar() `, but aborts - with a ``404 Not Found`` error instead of returning ``None``. - - :param statement: The ``select`` statement to execute. - :param description: A custom message to show on the error page. - - .. versionadded:: 3.0 - """ - value = self.session.execute(statement).scalar() - - if value is None: - abort(404, description=description) - - return value - - def one_or_404( - self, statement: sa.sql.Select[t.Any], *, description: str | None = None - ) -> t.Any: - """Like :meth:`Result.scalar_one() `, - but aborts with a ``404 Not Found`` error instead of raising ``NoResultFound`` - or ``MultipleResultsFound``. - - :param statement: The ``select`` statement to execute. - :param description: A custom message to show on the error page. - - .. versionadded:: 3.0 - """ - try: - return self.session.execute(statement).scalar_one() - except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): - abort(404, description=description) - - def paginate( - self, - select: sa.sql.Select[t.Any], - *, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = None, - error_out: bool = True, - count: bool = True, - ) -> Pagination: - """Apply an offset and limit to a select statment based on the current page and - number of items per page, returning a :class:`.Pagination` object. - - The statement should select a model class, like ``select(User)``. This applies - ``unique()`` and ``scalars()`` modifiers to the result, so compound selects will - not return the expected results. - - :param select: The ``select`` statement to paginate. - :param page: The current page, used to calculate the offset. Defaults to the - ``page`` query arg during a request, or 1 otherwise. - :param per_page: The maximum number of items on a page, used to calculate the - offset and limit. Defaults to the ``per_page`` query arg during a request, - or 20 otherwise. - :param max_per_page: The maximum allowed value for ``per_page``, to limit a - user-provided value. Use ``None`` for no limit. Defaults to 100. - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - :param count: Calculate the total number of values by issuing an extra count - query. For very complex queries this may be inaccurate or slow, so it can be - disabled and set manually if necessary. - - .. versionchanged:: 3.0 - The ``count`` query is more efficient. - - .. versionadded:: 3.0 - """ - return SelectPagination( - select=select, - session=self.session(), - page=page, - per_page=per_page, - max_per_page=max_per_page, - error_out=error_out, - count=count, - ) - - def _call_for_binds( - self, bind_key: str | None | list[str | None], op_name: str - ) -> None: - """Call a method on each metadata. - - :meta private: - - :param bind_key: A bind key or list of keys. Defaults to all binds. - :param op_name: The name of the method to call. - - .. versionchanged:: 3.0 - Renamed from ``_execute_for_all_tables``. - """ - if bind_key == "__all__": - keys: list[str | None] = list(self.metadatas) - elif bind_key is None or isinstance(bind_key, str): - keys = [bind_key] - else: - keys = bind_key - - for key in keys: - try: - engine = self.engines[key] - except KeyError: - message = f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." - - if key is None: - message = f"'SQLALCHEMY_DATABASE_URI' config is not set. {message}" - - raise sa_exc.UnboundExecutionError(message) from None - - metadata = self.metadatas[key] - getattr(metadata, op_name)(bind=engine) - - def create_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: - """Create tables that do not exist in the database by calling - ``metadata.create_all()`` for all or some bind keys. This does not - update existing tables, use a migration library for that. - - This requires that a Flask application context is active. - - :param bind_key: A bind key or list of keys to create the tables for. Defaults - to all binds. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - - .. versionchanged:: 0.12 - Added the ``bind`` and ``app`` parameters. - """ - self._call_for_binds(bind_key, "create_all") - - def drop_all(self, bind_key: str | None | list[str | None] = "__all__") -> None: - """Drop tables by calling ``metadata.drop_all()`` for all or some bind keys. - - This requires that a Flask application context is active. - - :param bind_key: A bind key or list of keys to drop the tables from. Defaults to - all binds. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - - .. versionchanged:: 0.12 - Added the ``bind`` and ``app`` parameters. - """ - self._call_for_binds(bind_key, "drop_all") - - def reflect(self, bind_key: str | None | list[str | None] = "__all__") -> None: - """Load table definitions from the database by calling ``metadata.reflect()`` - for all or some bind keys. - - This requires that a Flask application context is active. - - :param bind_key: A bind key or list of keys to reflect the tables from. Defaults - to all binds. - - .. versionchanged:: 3.0 - Renamed the ``bind`` parameter to ``bind_key``. Removed the ``app`` - parameter. - - .. versionchanged:: 0.12 - Added the ``bind`` and ``app`` parameters. - """ - self._call_for_binds(bind_key, "reflect") - - def _set_rel_query(self, kwargs: dict[str, t.Any]) -> None: - """Apply the extension's :attr:`Query` class as the default for relationships - and backrefs. - - :meta private: - """ - kwargs.setdefault("query_class", self.Query) - - if "backref" in kwargs: - backref = kwargs["backref"] - - if isinstance(backref, str): - backref = (backref, {}) - - backref[1].setdefault("query_class", self.Query) - - def relationship( - self, *args: t.Any, **kwargs: t.Any - ) -> sa_orm.RelationshipProperty[t.Any]: - """A :func:`sqlalchemy.orm.relationship` that applies this extension's - :attr:`Query` class for dynamic relationships and backrefs. - - .. versionchanged:: 3.0 - The :attr:`Query` class is set on ``backref``. - """ - self._set_rel_query(kwargs) - return sa_orm.relationship(*args, **kwargs) - - def dynamic_loader( - self, argument: t.Any, **kwargs: t.Any - ) -> sa_orm.RelationshipProperty[t.Any]: - """A :func:`sqlalchemy.orm.dynamic_loader` that applies this extension's - :attr:`Query` class for relationships and backrefs. - - .. versionchanged:: 3.0 - The :attr:`Query` class is set on ``backref``. - """ - self._set_rel_query(kwargs) - return sa_orm.dynamic_loader(argument, **kwargs) - - def _relation( - self, *args: t.Any, **kwargs: t.Any - ) -> sa_orm.RelationshipProperty[t.Any]: - """A :func:`sqlalchemy.orm.relationship` that applies this extension's - :attr:`Query` class for dynamic relationships and backrefs. - - SQLAlchemy 2.0 removes this name, use ``relationship`` instead. - - :meta private: - - .. versionchanged:: 3.0 - The :attr:`Query` class is set on ``backref``. - """ - self._set_rel_query(kwargs) - f = sa_orm.relationship - return f(*args, **kwargs) - - def __getattr__(self, name: str) -> t.Any: - if name == "relation": - return self._relation - - if name == "event": - return sa_event - - if name.startswith("_"): - raise AttributeError(name) - - for mod in (sa, sa_orm): - if hasattr(mod, name): - return getattr(mod, name) - - raise AttributeError(name) diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/model.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/model.py deleted file mode 100644 index c6f9e5a..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/model.py +++ /dev/null @@ -1,330 +0,0 @@ -from __future__ import annotations - -import re -import typing as t - -import sqlalchemy as sa -import sqlalchemy.orm as sa_orm - -from .query import Query - -if t.TYPE_CHECKING: - from .extension import SQLAlchemy - - -class _QueryProperty: - """A class property that creates a query object for a model. - - :meta private: - """ - - def __get__(self, obj: Model | None, cls: type[Model]) -> Query: - return cls.query_class( - cls, session=cls.__fsa__.session() # type: ignore[arg-type] - ) - - -class Model: - """The base class of the :attr:`.SQLAlchemy.Model` declarative model class. - - To define models, subclass :attr:`db.Model <.SQLAlchemy.Model>`, not this. To - customize ``db.Model``, subclass this and pass it as ``model_class`` to - :class:`.SQLAlchemy`. To customize ``db.Model`` at the metaclass level, pass an - already created declarative model class as ``model_class``. - """ - - __fsa__: t.ClassVar[SQLAlchemy] - """Internal reference to the extension object. - - :meta private: - """ - - query_class: t.ClassVar[type[Query]] = Query - """Query class used by :attr:`query`. Defaults to :attr:`.SQLAlchemy.Query`, which - defaults to :class:`.Query`. - """ - - query: t.ClassVar[Query] = _QueryProperty() # type: ignore[assignment] - """A SQLAlchemy query for a model. Equivalent to ``db.session.query(Model)``. Can be - customized per-model by overriding :attr:`query_class`. - - .. warning:: - The query interface is considered legacy in SQLAlchemy. Prefer using - ``session.execute(select())`` instead. - """ - - def __repr__(self) -> str: - state = sa.inspect(self) - assert state is not None - - if state.transient: - pk = f"(transient {id(self)})" - elif state.pending: - pk = f"(pending {id(self)})" - else: - pk = ", ".join(map(str, state.identity)) - - return f"<{type(self).__name__} {pk}>" - - -class BindMetaMixin(type): - """Metaclass mixin that sets a model's ``metadata`` based on its ``__bind_key__``. - - If the model sets ``metadata`` or ``__table__`` directly, ``__bind_key__`` is - ignored. If the ``metadata`` is the same as the parent model, it will not be set - directly on the child model. - """ - - __fsa__: SQLAlchemy - metadata: sa.MetaData - - def __init__( - cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any - ) -> None: - if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__): - bind_key = getattr(cls, "__bind_key__", None) - parent_metadata = getattr(cls, "metadata", None) - metadata = cls.__fsa__._make_metadata(bind_key) - - if metadata is not parent_metadata: - cls.metadata = metadata - - super().__init__(name, bases, d, **kwargs) - - -class BindMixin: - """DeclarativeBase mixin to set a model's ``metadata`` based on ``__bind_key__``. - - If no ``__bind_key__`` is specified, the model will use the default metadata - provided by ``DeclarativeBase`` or ``DeclarativeBaseNoMeta``. - If the model doesn't set ``metadata`` or ``__table__`` directly - and does set ``__bind_key__``, the model will use the metadata - for the specified bind key. - If the ``metadata`` is the same as the parent model, it will not be set - directly on the child model. - - .. versionchanged:: 3.1.0 - """ - - __fsa__: SQLAlchemy - metadata: sa.MetaData - - @classmethod - def __init_subclass__(cls: t.Type[BindMixin], **kwargs: t.Dict[str, t.Any]) -> None: - if not ("metadata" in cls.__dict__ or "__table__" in cls.__dict__) and hasattr( - cls, "__bind_key__" - ): - bind_key = getattr(cls, "__bind_key__", None) - parent_metadata = getattr(cls, "metadata", None) - metadata = cls.__fsa__._make_metadata(bind_key) - - if metadata is not parent_metadata: - cls.metadata = metadata - - super().__init_subclass__(**kwargs) - - -class NameMetaMixin(type): - """Metaclass mixin that sets a model's ``__tablename__`` by converting the - ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models - that do not otherwise define ``__tablename__``. If a model does not define a primary - key, it will not generate a name or ``__table__``, for single-table inheritance. - """ - - metadata: sa.MetaData - __tablename__: str - __table__: sa.Table - - def __init__( - cls, name: str, bases: tuple[type, ...], d: dict[str, t.Any], **kwargs: t.Any - ) -> None: - if should_set_tablename(cls): - cls.__tablename__ = camel_to_snake_case(cls.__name__) - - super().__init__(name, bases, d, **kwargs) - - # __table_cls__ has run. If no table was created, use the parent table. - if ( - "__tablename__" not in cls.__dict__ - and "__table__" in cls.__dict__ - and cls.__dict__["__table__"] is None - ): - del cls.__table__ - - def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: - """This is called by SQLAlchemy during mapper setup. It determines the final - table object that the model will use. - - If no primary key is found, that indicates single-table inheritance, so no table - will be created and ``__tablename__`` will be unset. - """ - schema = kwargs.get("schema") - - if schema is None: - key = args[0] - else: - key = f"{schema}.{args[0]}" - - # Check if a table with this name already exists. Allows reflected tables to be - # applied to models by name. - if key in cls.metadata.tables: - return sa.Table(*args, **kwargs) - - # If a primary key is found, create a table for joined-table inheritance. - for arg in args: - if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( - arg, sa.PrimaryKeyConstraint - ): - return sa.Table(*args, **kwargs) - - # If no base classes define a table, return one that's missing a primary key - # so SQLAlchemy shows the correct error. - for base in cls.__mro__[1:-1]: - if "__table__" in base.__dict__: - break - else: - return sa.Table(*args, **kwargs) - - # Single-table inheritance, use the parent table name. __init__ will unset - # __table__ based on this. - if "__tablename__" in cls.__dict__: - del cls.__tablename__ - - return None - - -class NameMixin: - """DeclarativeBase mixin that sets a model's ``__tablename__`` by converting the - ``CamelCase`` class name to ``snake_case``. A name is set for non-abstract models - that do not otherwise define ``__tablename__``. If a model does not define a primary - key, it will not generate a name or ``__table__``, for single-table inheritance. - - .. versionchanged:: 3.1.0 - """ - - metadata: sa.MetaData - __tablename__: str - __table__: sa.Table - - @classmethod - def __init_subclass__(cls: t.Type[NameMixin], **kwargs: t.Dict[str, t.Any]) -> None: - if should_set_tablename(cls): - cls.__tablename__ = camel_to_snake_case(cls.__name__) - - super().__init_subclass__(**kwargs) - - # __table_cls__ has run. If no table was created, use the parent table. - if ( - "__tablename__" not in cls.__dict__ - and "__table__" in cls.__dict__ - and cls.__dict__["__table__"] is None - ): - del cls.__table__ - - @classmethod - def __table_cls__(cls, *args: t.Any, **kwargs: t.Any) -> sa.Table | None: - """This is called by SQLAlchemy during mapper setup. It determines the final - table object that the model will use. - - If no primary key is found, that indicates single-table inheritance, so no table - will be created and ``__tablename__`` will be unset. - """ - schema = kwargs.get("schema") - - if schema is None: - key = args[0] - else: - key = f"{schema}.{args[0]}" - - # Check if a table with this name already exists. Allows reflected tables to be - # applied to models by name. - if key in cls.metadata.tables: - return sa.Table(*args, **kwargs) - - # If a primary key is found, create a table for joined-table inheritance. - for arg in args: - if (isinstance(arg, sa.Column) and arg.primary_key) or isinstance( - arg, sa.PrimaryKeyConstraint - ): - return sa.Table(*args, **kwargs) - - # If no base classes define a table, return one that's missing a primary key - # so SQLAlchemy shows the correct error. - for base in cls.__mro__[1:-1]: - if "__table__" in base.__dict__: - break - else: - return sa.Table(*args, **kwargs) - - # Single-table inheritance, use the parent table name. __init__ will unset - # __table__ based on this. - if "__tablename__" in cls.__dict__: - del cls.__tablename__ - - return None - - -def should_set_tablename(cls: type) -> bool: - """Determine whether ``__tablename__`` should be generated for a model. - - - If no class in the MRO sets a name, one should be generated. - - If a declared attr is found, it should be used instead. - - If a name is found, it should be used if the class is a mixin, otherwise one - should be generated. - - Abstract models should not have one generated. - - Later, ``__table_cls__`` will determine if the model looks like single or - joined-table inheritance. If no primary key is found, the name will be unset. - """ - if ( - cls.__dict__.get("__abstract__", False) - or ( - not issubclass(cls, (sa_orm.DeclarativeBase, sa_orm.DeclarativeBaseNoMeta)) - and not any(isinstance(b, sa_orm.DeclarativeMeta) for b in cls.__mro__[1:]) - ) - or any( - (b is sa_orm.DeclarativeBase or b is sa_orm.DeclarativeBaseNoMeta) - for b in cls.__bases__ - ) - ): - return False - - for base in cls.__mro__: - if "__tablename__" not in base.__dict__: - continue - - if isinstance(base.__dict__["__tablename__"], sa_orm.declared_attr): - return False - - return not ( - base is cls - or base.__dict__.get("__abstract__", False) - or not ( - # SQLAlchemy 1.x - isinstance(base, sa_orm.DeclarativeMeta) - # 2.x: DeclarativeBas uses this as metaclass - or isinstance(base, sa_orm.decl_api.DeclarativeAttributeIntercept) - # 2.x: DeclarativeBaseNoMeta doesn't use a metaclass - or issubclass(base, sa_orm.DeclarativeBaseNoMeta) - ) - ) - - return True - - -def camel_to_snake_case(name: str) -> str: - """Convert a ``CamelCase`` name to ``snake_case``.""" - name = re.sub(r"((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))", r"_\1", name) - return name.lower().lstrip("_") - - -class DefaultMeta(BindMetaMixin, NameMetaMixin, sa_orm.DeclarativeMeta): - """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and - ``__tablename__`` support. - """ - - -class DefaultMetaNoName(BindMetaMixin, sa_orm.DeclarativeMeta): - """SQLAlchemy declarative metaclass that provides ``__bind_key__`` and - ``__tablename__`` support. - """ diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/pagination.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/pagination.py deleted file mode 100644 index 3d49d6e..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/pagination.py +++ /dev/null @@ -1,364 +0,0 @@ -from __future__ import annotations - -import typing as t -from math import ceil - -import sqlalchemy as sa -import sqlalchemy.orm as sa_orm -from flask import abort -from flask import request - - -class Pagination: - """Apply an offset and limit to the query based on the current page and number of - items per page. - - Don't create pagination objects manually. They are created by - :meth:`.SQLAlchemy.paginate` and :meth:`.Query.paginate`. - - This is a base class, a subclass must implement :meth:`_query_items` and - :meth:`_query_count`. Those methods will use arguments passed as ``kwargs`` to - perform the queries. - - :param page: The current page, used to calculate the offset. Defaults to the - ``page`` query arg during a request, or 1 otherwise. - :param per_page: The maximum number of items on a page, used to calculate the - offset and limit. Defaults to the ``per_page`` query arg during a request, - or 20 otherwise. - :param max_per_page: The maximum allowed value for ``per_page``, to limit a - user-provided value. Use ``None`` for no limit. Defaults to 100. - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - :param count: Calculate the total number of values by issuing an extra count - query. For very complex queries this may be inaccurate or slow, so it can be - disabled and set manually if necessary. - :param kwargs: Information about the query to paginate. Different subclasses will - require different arguments. - - .. versionchanged:: 3.0 - Iterating over a pagination object iterates over its items. - - .. versionchanged:: 3.0 - Creating instances manually is not a public API. - """ - - def __init__( - self, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = 100, - error_out: bool = True, - count: bool = True, - **kwargs: t.Any, - ) -> None: - self._query_args = kwargs - page, per_page = self._prepare_page_args( - page=page, - per_page=per_page, - max_per_page=max_per_page, - error_out=error_out, - ) - - self.page: int = page - """The current page.""" - - self.per_page: int = per_page - """The maximum number of items on a page.""" - - self.max_per_page: int | None = max_per_page - """The maximum allowed value for ``per_page``.""" - - items = self._query_items() - - if not items and page != 1 and error_out: - abort(404) - - self.items: list[t.Any] = items - """The items on the current page. Iterating over the pagination object is - equivalent to iterating over the items. - """ - - if count: - total = self._query_count() - else: - total = None - - self.total: int | None = total - """The total number of items across all pages.""" - - @staticmethod - def _prepare_page_args( - *, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = None, - error_out: bool = True, - ) -> tuple[int, int]: - if request: - if page is None: - try: - page = int(request.args.get("page", 1)) - except (TypeError, ValueError): - if error_out: - abort(404) - - page = 1 - - if per_page is None: - try: - per_page = int(request.args.get("per_page", 20)) - except (TypeError, ValueError): - if error_out: - abort(404) - - per_page = 20 - else: - if page is None: - page = 1 - - if per_page is None: - per_page = 20 - - if max_per_page is not None: - per_page = min(per_page, max_per_page) - - if page < 1: - if error_out: - abort(404) - else: - page = 1 - - if per_page < 1: - if error_out: - abort(404) - else: - per_page = 20 - - return page, per_page - - @property - def _query_offset(self) -> int: - """The index of the first item to query, passed to ``offset()``. - - :meta private: - - .. versionadded:: 3.0 - """ - return (self.page - 1) * self.per_page - - def _query_items(self) -> list[t.Any]: - """Execute the query to get the items on the current page. - - Uses init arguments stored in :attr:`_query_args`. - - :meta private: - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - def _query_count(self) -> int: - """Execute the query to get the total number of items. - - Uses init arguments stored in :attr:`_query_args`. - - :meta private: - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - @property - def first(self) -> int: - """The number of the first item on the page, starting from 1, or 0 if there are - no items. - - .. versionadded:: 3.0 - """ - if len(self.items) == 0: - return 0 - - return (self.page - 1) * self.per_page + 1 - - @property - def last(self) -> int: - """The number of the last item on the page, starting from 1, inclusive, or 0 if - there are no items. - - .. versionadded:: 3.0 - """ - first = self.first - return max(first, first + len(self.items) - 1) - - @property - def pages(self) -> int: - """The total number of pages.""" - if self.total == 0 or self.total is None: - return 0 - - return ceil(self.total / self.per_page) - - @property - def has_prev(self) -> bool: - """``True`` if this is not the first page.""" - return self.page > 1 - - @property - def prev_num(self) -> int | None: - """The previous page number, or ``None`` if this is the first page.""" - if not self.has_prev: - return None - - return self.page - 1 - - def prev(self, *, error_out: bool = False) -> Pagination: - """Query the :class:`Pagination` object for the previous page. - - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - """ - p = type(self)( - page=self.page - 1, - per_page=self.per_page, - error_out=error_out, - count=False, - **self._query_args, - ) - p.total = self.total - return p - - @property - def has_next(self) -> bool: - """``True`` if this is not the last page.""" - return self.page < self.pages - - @property - def next_num(self) -> int | None: - """The next page number, or ``None`` if this is the last page.""" - if not self.has_next: - return None - - return self.page + 1 - - def next(self, *, error_out: bool = False) -> Pagination: - """Query the :class:`Pagination` object for the next page. - - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - """ - p = type(self)( - page=self.page + 1, - per_page=self.per_page, - max_per_page=self.max_per_page, - error_out=error_out, - count=False, - **self._query_args, - ) - p.total = self.total - return p - - def iter_pages( - self, - *, - left_edge: int = 2, - left_current: int = 2, - right_current: int = 4, - right_edge: int = 2, - ) -> t.Iterator[int | None]: - """Yield page numbers for a pagination widget. Skipped pages between the edges - and middle are represented by a ``None``. - - For example, if there are 20 pages and the current page is 7, the following - values are yielded. - - .. code-block:: python - - 1, 2, None, 5, 6, 7, 8, 9, 10, 11, None, 19, 20 - - :param left_edge: How many pages to show from the first page. - :param left_current: How many pages to show left of the current page. - :param right_current: How many pages to show right of the current page. - :param right_edge: How many pages to show from the last page. - - .. versionchanged:: 3.0 - Improved efficiency of calculating what to yield. - - .. versionchanged:: 3.0 - ``right_current`` boundary is inclusive. - - .. versionchanged:: 3.0 - All parameters are keyword-only. - """ - pages_end = self.pages + 1 - - if pages_end == 1: - return - - left_end = min(1 + left_edge, pages_end) - yield from range(1, left_end) - - if left_end == pages_end: - return - - mid_start = max(left_end, self.page - left_current) - mid_end = min(self.page + right_current + 1, pages_end) - - if mid_start - left_end > 0: - yield None - - yield from range(mid_start, mid_end) - - if mid_end == pages_end: - return - - right_start = max(mid_end, pages_end - right_edge) - - if right_start - mid_end > 0: - yield None - - yield from range(right_start, pages_end) - - def __iter__(self) -> t.Iterator[t.Any]: - yield from self.items - - -class SelectPagination(Pagination): - """Returned by :meth:`.SQLAlchemy.paginate`. Takes ``select`` and ``session`` - arguments in addition to the :class:`Pagination` arguments. - - .. versionadded:: 3.0 - """ - - def _query_items(self) -> list[t.Any]: - select = self._query_args["select"] - select = select.limit(self.per_page).offset(self._query_offset) - session = self._query_args["session"] - return list(session.execute(select).unique().scalars()) - - def _query_count(self) -> int: - select = self._query_args["select"] - sub = select.options(sa_orm.lazyload("*")).order_by(None).subquery() - session = self._query_args["session"] - out = session.execute(sa.select(sa.func.count()).select_from(sub)).scalar() - return out # type: ignore[no-any-return] - - -class QueryPagination(Pagination): - """Returned by :meth:`.Query.paginate`. Takes a ``query`` argument in addition to - the :class:`Pagination` arguments. - - .. versionadded:: 3.0 - """ - - def _query_items(self) -> list[t.Any]: - query = self._query_args["query"] - out = query.limit(self.per_page).offset(self._query_offset).all() - return out # type: ignore[no-any-return] - - def _query_count(self) -> int: - # Query.count automatically disables eager loads - out = self._query_args["query"].order_by(None).count() - return out # type: ignore[no-any-return] diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/py.typed b/port/lib/python3.11/site-packages/flask_sqlalchemy/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/query.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/query.py deleted file mode 100644 index 35f927d..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/query.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy.exc as sa_exc -import sqlalchemy.orm as sa_orm -from flask import abort - -from .pagination import Pagination -from .pagination import QueryPagination - - -class Query(sa_orm.Query): # type: ignore[type-arg] - """SQLAlchemy :class:`~sqlalchemy.orm.query.Query` subclass with some extra methods - useful for querying in a web application. - - This is the default query class for :attr:`.Model.query`. - - .. versionchanged:: 3.0 - Renamed to ``Query`` from ``BaseQuery``. - """ - - def get_or_404(self, ident: t.Any, description: str | None = None) -> t.Any: - """Like :meth:`~sqlalchemy.orm.Query.get` but aborts with a ``404 Not Found`` - error instead of returning ``None``. - - :param ident: The primary key to query. - :param description: A custom message to show on the error page. - """ - rv = self.get(ident) - - if rv is None: - abort(404, description=description) - - return rv - - def first_or_404(self, description: str | None = None) -> t.Any: - """Like :meth:`~sqlalchemy.orm.Query.first` but aborts with a ``404 Not Found`` - error instead of returning ``None``. - - :param description: A custom message to show on the error page. - """ - rv = self.first() - - if rv is None: - abort(404, description=description) - - return rv - - def one_or_404(self, description: str | None = None) -> t.Any: - """Like :meth:`~sqlalchemy.orm.Query.one` but aborts with a ``404 Not Found`` - error instead of raising ``NoResultFound`` or ``MultipleResultsFound``. - - :param description: A custom message to show on the error page. - - .. versionadded:: 3.0 - """ - try: - return self.one() - except (sa_exc.NoResultFound, sa_exc.MultipleResultsFound): - abort(404, description=description) - - def paginate( - self, - *, - page: int | None = None, - per_page: int | None = None, - max_per_page: int | None = None, - error_out: bool = True, - count: bool = True, - ) -> Pagination: - """Apply an offset and limit to the query based on the current page and number - of items per page, returning a :class:`.Pagination` object. - - :param page: The current page, used to calculate the offset. Defaults to the - ``page`` query arg during a request, or 1 otherwise. - :param per_page: The maximum number of items on a page, used to calculate the - offset and limit. Defaults to the ``per_page`` query arg during a request, - or 20 otherwise. - :param max_per_page: The maximum allowed value for ``per_page``, to limit a - user-provided value. Use ``None`` for no limit. Defaults to 100. - :param error_out: Abort with a ``404 Not Found`` error if no items are returned - and ``page`` is not 1, or if ``page`` or ``per_page`` is less than 1, or if - either are not ints. - :param count: Calculate the total number of values by issuing an extra count - query. For very complex queries this may be inaccurate or slow, so it can be - disabled and set manually if necessary. - - .. versionchanged:: 3.0 - All parameters are keyword-only. - - .. versionchanged:: 3.0 - The ``count`` query is more efficient. - - .. versionchanged:: 3.0 - ``max_per_page`` defaults to 100. - """ - return QueryPagination( - query=self, - page=page, - per_page=per_page, - max_per_page=max_per_page, - error_out=error_out, - count=count, - ) diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/record_queries.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/record_queries.py deleted file mode 100644 index e8273be..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/record_queries.py +++ /dev/null @@ -1,117 +0,0 @@ -from __future__ import annotations - -import dataclasses -import inspect -import typing as t -from time import perf_counter - -import sqlalchemy as sa -import sqlalchemy.event as sa_event -from flask import current_app -from flask import g -from flask import has_app_context - - -def get_recorded_queries() -> list[_QueryInfo]: - """Get the list of recorded query information for the current session. Queries are - recorded if the config :data:`.SQLALCHEMY_RECORD_QUERIES` is enabled. - - Each query info object has the following attributes: - - ``statement`` - The string of SQL generated by SQLAlchemy with parameter placeholders. - ``parameters`` - The parameters sent with the SQL statement. - ``start_time`` / ``end_time`` - Timing info about when the query started execution and when the results where - returned. Accuracy and value depends on the operating system. - ``duration`` - The time the query took in seconds. - ``location`` - A string description of where in your application code the query was executed. - This may not be possible to calculate, and the format is not stable. - - .. versionchanged:: 3.0 - Renamed from ``get_debug_queries``. - - .. versionchanged:: 3.0 - The info object is a dataclass instead of a tuple. - - .. versionchanged:: 3.0 - The info object attribute ``context`` is renamed to ``location``. - - .. versionchanged:: 3.0 - Not enabled automatically in debug or testing mode. - """ - return g.get("_sqlalchemy_queries", []) # type: ignore[no-any-return] - - -@dataclasses.dataclass -class _QueryInfo: - """Information about an executed query. Returned by :func:`get_recorded_queries`. - - .. versionchanged:: 3.0 - Renamed from ``_DebugQueryTuple``. - - .. versionchanged:: 3.0 - Changed to a dataclass instead of a tuple. - - .. versionchanged:: 3.0 - ``context`` is renamed to ``location``. - """ - - statement: str | None - parameters: t.Any - start_time: float - end_time: float - location: str - - @property - def duration(self) -> float: - return self.end_time - self.start_time - - -def _listen(engine: sa.engine.Engine) -> None: - sa_event.listen(engine, "before_cursor_execute", _record_start, named=True) - sa_event.listen(engine, "after_cursor_execute", _record_end, named=True) - - -def _record_start(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: - if not has_app_context(): - return - - context._fsa_start_time = perf_counter() # type: ignore[attr-defined] - - -def _record_end(context: sa.engine.ExecutionContext, **kwargs: t.Any) -> None: - if not has_app_context(): - return - - if "_sqlalchemy_queries" not in g: - g._sqlalchemy_queries = [] - - import_top = current_app.import_name.partition(".")[0] - import_dot = f"{import_top}." - frame = inspect.currentframe() - - while frame: - name = frame.f_globals.get("__name__") - - if name and (name == import_top or name.startswith(import_dot)): - code = frame.f_code - location = f"{code.co_filename}:{frame.f_lineno} ({code.co_name})" - break - - frame = frame.f_back - else: - location = "" - - g._sqlalchemy_queries.append( - _QueryInfo( - statement=context.statement, - parameters=context.parameters, - start_time=context._fsa_start_time, # type: ignore[attr-defined] - end_time=perf_counter(), - location=location, - ) - ) diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/session.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/session.py deleted file mode 100644 index 631fffa..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/session.py +++ /dev/null @@ -1,111 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy as sa -import sqlalchemy.exc as sa_exc -import sqlalchemy.orm as sa_orm -from flask.globals import app_ctx - -if t.TYPE_CHECKING: - from .extension import SQLAlchemy - - -class Session(sa_orm.Session): - """A SQLAlchemy :class:`~sqlalchemy.orm.Session` class that chooses what engine to - use based on the bind key associated with the metadata associated with the thing - being queried. - - To customize ``db.session``, subclass this and pass it as the ``class_`` key in the - ``session_options`` to :class:`.SQLAlchemy`. - - .. versionchanged:: 3.0 - Renamed from ``SignallingSession``. - """ - - def __init__(self, db: SQLAlchemy, **kwargs: t.Any) -> None: - super().__init__(**kwargs) - self._db = db - self._model_changes: dict[object, tuple[t.Any, str]] = {} - - def get_bind( - self, - mapper: t.Any | None = None, - clause: t.Any | None = None, - bind: sa.engine.Engine | sa.engine.Connection | None = None, - **kwargs: t.Any, - ) -> sa.engine.Engine | sa.engine.Connection: - """Select an engine based on the ``bind_key`` of the metadata associated with - the model or table being queried. If no bind key is set, uses the default bind. - - .. versionchanged:: 3.0.3 - Fix finding the bind for a joined inheritance model. - - .. versionchanged:: 3.0 - The implementation more closely matches the base SQLAlchemy implementation. - - .. versionchanged:: 2.1 - Support joining an external transaction. - """ - if bind is not None: - return bind - - engines = self._db.engines - - if mapper is not None: - try: - mapper = sa.inspect(mapper) - except sa_exc.NoInspectionAvailable as e: - if isinstance(mapper, type): - raise sa_orm.exc.UnmappedClassError(mapper) from e - - raise - - engine = _clause_to_engine(mapper.local_table, engines) - - if engine is not None: - return engine - - if clause is not None: - engine = _clause_to_engine(clause, engines) - - if engine is not None: - return engine - - if None in engines: - return engines[None] - - return super().get_bind(mapper=mapper, clause=clause, bind=bind, **kwargs) - - -def _clause_to_engine( - clause: sa.ClauseElement | None, - engines: t.Mapping[str | None, sa.engine.Engine], -) -> sa.engine.Engine | None: - """If the clause is a table, return the engine associated with the table's - metadata's bind key. - """ - table = None - - if clause is not None: - if isinstance(clause, sa.Table): - table = clause - elif isinstance(clause, sa.UpdateBase) and isinstance(clause.table, sa.Table): - table = clause.table - - if table is not None and "bind_key" in table.metadata.info: - key = table.metadata.info["bind_key"] - - if key not in engines: - raise sa_exc.UnboundExecutionError( - f"Bind key '{key}' is not in 'SQLALCHEMY_BINDS' config." - ) - - return engines[key] - - return None - - -def _app_ctx_id() -> int: - """Get the id of the current Flask application context for the session scope.""" - return id(app_ctx._get_current_object()) # type: ignore[attr-defined] diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/table.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/table.py deleted file mode 100644 index ab08a69..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/table.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy as sa -import sqlalchemy.sql.schema as sa_sql_schema - - -class _Table(sa.Table): - @t.overload - def __init__( - self, - name: str, - *args: sa_sql_schema.SchemaItem, - bind_key: str | None = None, - **kwargs: t.Any, - ) -> None: - ... - - @t.overload - def __init__( - self, - name: str, - metadata: sa.MetaData, - *args: sa_sql_schema.SchemaItem, - **kwargs: t.Any, - ) -> None: - ... - - @t.overload - def __init__( - self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any - ) -> None: - ... - - def __init__( - self, name: str, *args: sa_sql_schema.SchemaItem, **kwargs: t.Any - ) -> None: - super().__init__(name, *args, **kwargs) # type: ignore[arg-type] diff --git a/port/lib/python3.11/site-packages/flask_sqlalchemy/track_modifications.py b/port/lib/python3.11/site-packages/flask_sqlalchemy/track_modifications.py deleted file mode 100644 index 7028b65..0000000 --- a/port/lib/python3.11/site-packages/flask_sqlalchemy/track_modifications.py +++ /dev/null @@ -1,88 +0,0 @@ -from __future__ import annotations - -import typing as t - -import sqlalchemy as sa -import sqlalchemy.event as sa_event -import sqlalchemy.orm as sa_orm -from flask import current_app -from flask import has_app_context -from flask.signals import Namespace # type: ignore[attr-defined] - -if t.TYPE_CHECKING: - from .session import Session - -_signals = Namespace() - -models_committed = _signals.signal("models-committed") -"""This Blinker signal is sent after the session is committed if there were changed -models in the session. - -The sender is the application that emitted the changes. The receiver is passed the -``changes`` argument with a list of tuples in the form ``(instance, operation)``. -The operations are ``"insert"``, ``"update"``, and ``"delete"``. -""" - -before_models_committed = _signals.signal("before-models-committed") -"""This signal works exactly like :data:`models_committed` but is emitted before the -commit takes place. -""" - - -def _listen(session: sa_orm.scoped_session[Session]) -> None: - sa_event.listen(session, "before_flush", _record_ops, named=True) - sa_event.listen(session, "before_commit", _record_ops, named=True) - sa_event.listen(session, "before_commit", _before_commit) - sa_event.listen(session, "after_commit", _after_commit) - sa_event.listen(session, "after_rollback", _after_rollback) - - -def _record_ops(session: Session, **kwargs: t.Any) -> None: - if not has_app_context(): - return - - if not current_app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: - return - - for targets, operation in ( - (session.new, "insert"), - (session.dirty, "update"), - (session.deleted, "delete"), - ): - for target in targets: - state = sa.inspect(target) - key = state.identity_key if state.has_identity else id(target) - session._model_changes[key] = (target, operation) - - -def _before_commit(session: Session) -> None: - if not has_app_context(): - return - - app = current_app._get_current_object() # type: ignore[attr-defined] - - if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: - return - - if session._model_changes: - changes = list(session._model_changes.values()) - before_models_committed.send(app, changes=changes) - - -def _after_commit(session: Session) -> None: - if not has_app_context(): - return - - app = current_app._get_current_object() # type: ignore[attr-defined] - - if not app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]: - return - - if session._model_changes: - changes = list(session._model_changes.values()) - models_committed.send(app, changes=changes) - session._model_changes.clear() - - -def _after_rollback(session: Session) -> None: - session._model_changes.clear() diff --git a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/AUTHORS b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/AUTHORS deleted file mode 100644 index 42a5c22..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/AUTHORS +++ /dev/null @@ -1,51 +0,0 @@ -Original Authors ----------------- -* Armin Rigo -* Christian Tismer - -Contributors ------------- -* Al Stone -* Alexander Schmidt -* Alexey Borzenkov -* Andreas Schwab -* Armin Ronacher -* Bin Wang -* Bob Ippolito -* ChangBo Guo -* Christoph Gohlke -* Denis Bilenko -* Dirk Mueller -* Donovan Preston -* Fantix King -* Floris Bruynooghe -* Fredrik Fornwall -* Gerd Woetzel -* Giel van Schijndel -* Gökhan Karabulut -* Gustavo Niemeyer -* Guy Rozendorn -* Hye-Shik Chang -* Jared Kuolt -* Jason Madden -* Josh Snyder -* Kyle Ambroff -* Laszlo Boszormenyi -* Mao Han -* Marc Abramowitz -* Marc Schlaich -* Marcin Bachry -* Matt Madison -* Matt Turner -* Michael Ellerman -* Michael Matz -* Ralf Schmitt -* Robie Basak -* Ronny Pfannschmidt -* Samual M. Rushing -* Tony Bowles -* Tony Breeds -* Trevor Bowen -* Tulio Magno Quites Machado Filho -* Ulrich Weigand -* Victor Stinner diff --git a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/INSTALLER b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE deleted file mode 100644 index b73a4a1..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -The following files are derived from Stackless Python and are subject to the -same license as Stackless Python: - - src/greenlet/slp_platformselect.h - files in src/greenlet/platform/ directory - -See LICENSE.PSF and http://www.stackless.com/ for details. - -Unless otherwise noted, the files in greenlet have been released under the -following MIT license: - -Copyright (c) Armin Rigo, Christian Tismer and 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/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE.PSF b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE.PSF deleted file mode 100644 index d3b509a..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/LICENSE.PSF +++ /dev/null @@ -1,47 +0,0 @@ -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 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. diff --git a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/METADATA b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/METADATA deleted file mode 100644 index 1529410..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/METADATA +++ /dev/null @@ -1,103 +0,0 @@ -Metadata-Version: 2.1 -Name: greenlet -Version: 3.1.1 -Summary: Lightweight in-process concurrent programming -Home-page: https://greenlet.readthedocs.io/ -Author: Alexey Borzenkov -Author-email: snaury@gmail.com -Maintainer: Jason Madden -Maintainer-email: jason@seecoresoftware.com -License: MIT License -Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues -Project-URL: Source Code, https://github.com/python-greenlet/greenlet/ -Project-URL: Documentation, https://greenlet.readthedocs.io/ -Keywords: greenlet coroutine concurrency threads cooperative -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Natural Language :: English -Classifier: Programming Language :: C -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 -Classifier: Operating System :: OS Independent -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: LICENSE.PSF -License-File: AUTHORS -Provides-Extra: docs -Requires-Dist: Sphinx ; extra == 'docs' -Requires-Dist: furo ; extra == 'docs' -Provides-Extra: test -Requires-Dist: objgraph ; extra == 'test' -Requires-Dist: psutil ; extra == 'test' - -.. This file is included into docs/history.rst - - -Greenlets are lightweight coroutines for in-process concurrent -programming. - -The "greenlet" package is a spin-off of `Stackless`_, a version of -CPython that supports micro-threads called "tasklets". Tasklets run -pseudo-concurrently (typically in a single or a few OS-level threads) -and are synchronized with data exchanges on "channels". - -A "greenlet", on the other hand, is a still more primitive notion of -micro-thread with no implicit scheduling; coroutines, in other words. -This is useful when you want to control exactly when your code runs. -You can build custom scheduled micro-threads on top of greenlet; -however, it seems that greenlets are useful on their own as a way to -make advanced control flow structures. For example, we can recreate -generators; the difference with Python's own generators is that our -generators can call nested functions and the nested functions can -yield values too. (Additionally, you don't need a "yield" keyword. See -the example in `test_generator.py -`_). - -Greenlets are provided as a C extension module for the regular unmodified -interpreter. - -.. _`Stackless`: http://www.stackless.com - - -Who is using Greenlet? -====================== - -There are several libraries that use Greenlet as a more flexible -alternative to Python's built in coroutine support: - - - `Concurrence`_ - - `Eventlet`_ - - `Gevent`_ - -.. _Concurrence: http://opensource.hyves.org/concurrence/ -.. _Eventlet: http://eventlet.net/ -.. _Gevent: http://www.gevent.org/ - -Getting Greenlet -================ - -The easiest way to get Greenlet is to install it with pip:: - - pip install greenlet - - -Source code archives and binary distributions are available on the -python package index at https://pypi.org/project/greenlet - -The source code repository is hosted on github: -https://github.com/python-greenlet/greenlet - -Documentation is available on readthedocs.org: -https://greenlet.readthedocs.io diff --git a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/RECORD b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/RECORD deleted file mode 100644 index b09b3d8..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/RECORD +++ /dev/null @@ -1,122 +0,0 @@ -../../../include/site/python3.11/greenlet/greenlet.h,sha256=sz5pYRSQqedgOt2AMgxLZdTjO-qcr_JMvgiEJR9IAJ8,4755 -greenlet-3.1.1.dist-info/AUTHORS,sha256=swW28t2knVRxRkaEQNZtO7MP9Sgnompb7B6cNgJM8Gk,849 -greenlet-3.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -greenlet-3.1.1.dist-info/LICENSE,sha256=dpgx1uXfrywggC-sz_H6-0wgJd2PYlPfpH_K1Z1NCXk,1434 -greenlet-3.1.1.dist-info/LICENSE.PSF,sha256=5f88I8EQ5JTNfXNsEP2W1GJFe6_soxCEDbZScpjH1Gs,2424 -greenlet-3.1.1.dist-info/METADATA,sha256=MoOb0T5ZdGbCymjJygO-CkVIAaeI5KcuwE_JPpH1hp4,3830 -greenlet-3.1.1.dist-info/RECORD,, -greenlet-3.1.1.dist-info/WHEEL,sha256=CRp2yyI45DUqY_MzVrM2qWvgCKfzJQ8_OP2vRpS-Uvw,152 -greenlet-3.1.1.dist-info/top_level.txt,sha256=YSnRsCRoO61JGlP57o8iKL6rdLWDWuiyKD8ekpWUsDc,9 -greenlet/CObjects.cpp,sha256=OPej1bWBgc4sRrTRQ2aFFML9pzDYKlKhlJSjsI0X_eU,3508 -greenlet/PyGreenlet.cpp,sha256=ogWsQ5VhSdItWRLLpWOgSuqYuM3QwQ4cVCxOQIgHx6E,23441 -greenlet/PyGreenlet.hpp,sha256=2ZQlOxYNoy7QwD7mppFoOXe_At56NIsJ0eNsE_hoSsw,1463 -greenlet/PyGreenletUnswitchable.cpp,sha256=PQE0fSZa_IOyUM44IESHkJoD2KtGW3dkhkmZSYY3WHs,4375 -greenlet/PyModule.cpp,sha256=J2TH06dGcNEarioS6NbWXkdME8hJY05XVbdqLrfO5w4,8587 -greenlet/TBrokenGreenlet.cpp,sha256=smN26uC7ahAbNYiS10rtWPjCeTG4jevM8siA2sjJiXg,1021 -greenlet/TExceptionState.cpp,sha256=U7Ctw9fBdNraS0d174MoQW7bN-ae209Ta0JuiKpcpVI,1359 -greenlet/TGreenlet.cpp,sha256=HGYGKpmKYqQ842tASW-QaaV8wua4a5XV_quYKPDsV_Y,25731 -greenlet/TGreenlet.hpp,sha256=mMHcb_rSuozdDiGJjX3GgyYkWgVM4kuO1UgbUP84BlU,27869 -greenlet/TGreenletGlobals.cpp,sha256=YyEmDjKf1g32bsL-unIUScFLnnA1fzLWf2gOMd-D0Zw,3264 -greenlet/TMainGreenlet.cpp,sha256=fvgb8HHB-FVTPEKjR1s_ifCZSpp5D5YQByik0CnIABg,3276 -greenlet/TPythonState.cpp,sha256=FxRdi76lTGXaQKWwkq82VaCfIRdF2Z-fh-TlRTMjYqg,15359 -greenlet/TStackState.cpp,sha256=V444I8Jj9DhQz-9leVW_9dtiSRjaE1NMlgDG02Xxq-Y,7381 -greenlet/TThreadState.hpp,sha256=2Jgg7DtGggMYR_x3CLAvAFf1mIdIDtQvSSItcdmX4ZQ,19131 -greenlet/TThreadStateCreator.hpp,sha256=uYTexDWooXSSgUc5uh-Mhm5BQi3-kR6CqpizvNynBFQ,2610 -greenlet/TThreadStateDestroy.cpp,sha256=wt7lQwLI0mi_JtnZB_jB4bUmfCa5b6nQhA7XOmnI1yk,9568 -greenlet/TUserGreenlet.cpp,sha256=uemg0lwKXtYB0yzmvyYdIIAsKnNkifXM1OJ2OlrFP1A,23553 -greenlet/__init__.py,sha256=OOmvT6_vn_SekdPzkj4qm6hjfikXMmdNZYDmGTOaRNo,1723 -greenlet/__pycache__/__init__.cpython-311.pyc,, -greenlet/_greenlet.cpython-311-x86_64-linux-gnu.so,sha256=9bkeEnah8_cB8qynTpqSwZjkuOc9GIPh7x9uBxNvRIM,1388888 -greenlet/greenlet.cpp,sha256=WdItb1yWL9WNsTqJNf0Iw8ZwDHD49pkDP0rIRGBg2pw,10996 -greenlet/greenlet.h,sha256=sz5pYRSQqedgOt2AMgxLZdTjO-qcr_JMvgiEJR9IAJ8,4755 -greenlet/greenlet_allocator.hpp,sha256=kxyWW4Qdwlrc7ufgdb5vd6Y7jhauQ699Kod0mqiO1iM,1582 -greenlet/greenlet_compiler_compat.hpp,sha256=nRxpLN9iNbnLVyFDeVmOwyeeNm6scQrOed1l7JQYMCM,4346 -greenlet/greenlet_cpython_add_pending.hpp,sha256=apAwIhGlgYrnYn03zWL6Sxy68kltDeb1e0QupZfb3DQ,6043 -greenlet/greenlet_cpython_compat.hpp,sha256=L_jig3dm2bsJWRazrhlokma2NfnwixoQ0cydshh6ce4,3964 -greenlet/greenlet_exceptions.hpp,sha256=06Bx81DtVaJTa6RtiMcV141b-XHv4ppEgVItkblcLWY,4503 -greenlet/greenlet_internal.hpp,sha256=Ajc-_09W4xWzm9XfyXHAeQAFUgKGKsnJwYsTCoNy3ns,2709 -greenlet/greenlet_refs.hpp,sha256=OnbA91yZf3QHH6-eJccvoNDAaN-pQBMMrclFU1Ot3J4,34436 -greenlet/greenlet_slp_switch.hpp,sha256=kM1QHA2iV-gH4cFyN6lfIagHQxvJZjWOVJdIxRE3TlQ,3198 -greenlet/greenlet_thread_support.hpp,sha256=XUJ6ljWjf9OYyuOILiz8e_yHvT3fbaUiHdhiPNQUV4s,867 -greenlet/platform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -greenlet/platform/__pycache__/__init__.cpython-311.pyc,, -greenlet/platform/setup_switch_x64_masm.cmd,sha256=ZpClUJeU0ujEPSTWNSepP0W2f9XiYQKA8QKSoVou8EU,143 -greenlet/platform/switch_aarch64_gcc.h,sha256=GKC0yWNXnbK2X--X6aguRCMj2Tg7hDU1Zkl3RljDvC8,4307 -greenlet/platform/switch_alpha_unix.h,sha256=Z-SvF8JQV3oxWT8JRbL9RFu4gRFxPdJ7cviM8YayMmw,671 -greenlet/platform/switch_amd64_unix.h,sha256=EcSFCBlodEBhqhKjcJqY_5Dn_jn7pKpkJlOvp7gFXLI,2748 -greenlet/platform/switch_arm32_gcc.h,sha256=Z3KkHszdgq6uU4YN3BxvKMG2AdDnovwCCNrqGWZ1Lyo,2479 -greenlet/platform/switch_arm32_ios.h,sha256=mm5_R9aXB92hyxzFRwB71M60H6AlvHjrpTrc72Pz3l8,1892 -greenlet/platform/switch_arm64_masm.asm,sha256=4kpTtfy7rfcr8j1CpJLAK21EtZpGDAJXWRU68HEy5A8,1245 -greenlet/platform/switch_arm64_masm.obj,sha256=DmLnIB_icoEHAz1naue_pJPTZgR9ElM7-Nmztr-o9_U,746 -greenlet/platform/switch_arm64_msvc.h,sha256=RqK5MHLmXI3Q-FQ7tm32KWnbDNZKnkJdq8CR89cz640,398 -greenlet/platform/switch_csky_gcc.h,sha256=kDikyiPpewP71KoBZQO_MukDTXTXBiC7x-hF0_2DL0w,1331 -greenlet/platform/switch_loongarch64_linux.h,sha256=7M-Dhc4Q8tRbJCJhalDLwU6S9Mx8MjmN1RbTDgIvQTM,779 -greenlet/platform/switch_m68k_gcc.h,sha256=VSa6NpZhvyyvF-Q58CTIWSpEDo4FKygOyTz00whctlw,928 -greenlet/platform/switch_mips_unix.h,sha256=E0tYsqc5anDY1BhenU1l8DW-nVHC_BElzLgJw3TGtPk,1426 -greenlet/platform/switch_ppc64_aix.h,sha256=_BL0iyRr3ZA5iPlr3uk9SJ5sNRWGYLrXcZ5z-CE9anE,3860 -greenlet/platform/switch_ppc64_linux.h,sha256=0rriT5XyxPb0GqsSSn_bP9iQsnjsPbBmu0yqo5goSyQ,3815 -greenlet/platform/switch_ppc_aix.h,sha256=pHA4slEjUFP3J3SYm1TAlNPhgb2G_PAtax5cO8BEe1A,2941 -greenlet/platform/switch_ppc_linux.h,sha256=YwrlKUzxlXuiKMQqr6MFAV1bPzWnmvk6X1AqJZEpOWU,2759 -greenlet/platform/switch_ppc_macosx.h,sha256=Z6KN_ud0n6nC3ltJrNz2qtvER6vnRAVRNH9mdIDpMxY,2624 -greenlet/platform/switch_ppc_unix.h,sha256=-ZG7MSSPEA5N4qO9PQChtyEJ-Fm6qInhyZm_ZBHTtMg,2652 -greenlet/platform/switch_riscv_unix.h,sha256=Xg0wBen8Je21LWzFtLNLvUUYq6p9n_WY7AUQbiBVyyk,865 -greenlet/platform/switch_s390_unix.h,sha256=RRlGu957ybmq95qNNY4Qw1mcaoT3eBnW5KbVwu48KX8,2763 -greenlet/platform/switch_sh_gcc.h,sha256=mcRJBTu-2UBf4kZtX601qofwuDuy-Y-hnxJtrcaB7do,901 -greenlet/platform/switch_sparc_sun_gcc.h,sha256=xZish9GsMHBienUbUMsX1-ZZ-as7hs36sVhYIE3ew8Y,2797 -greenlet/platform/switch_x32_unix.h,sha256=nM98PKtzTWc1lcM7TRMUZJzskVdR1C69U1UqZRWX0GE,1509 -greenlet/platform/switch_x64_masm.asm,sha256=nu6n2sWyXuXfpPx40d9YmLfHXUc1sHgeTvX1kUzuvEM,1841 -greenlet/platform/switch_x64_masm.obj,sha256=GNtTNxYdo7idFUYsQv-mrXWgyT5EJ93-9q90lN6svtQ,1078 -greenlet/platform/switch_x64_msvc.h,sha256=LIeasyKo_vHzspdMzMHbosRhrBfKI4BkQOh4qcTHyJw,1805 -greenlet/platform/switch_x86_msvc.h,sha256=TtGOwinbFfnn6clxMNkCz8i6OmgB6kVRrShoF5iT9to,12838 -greenlet/platform/switch_x86_unix.h,sha256=VplW9H0FF0cZHw1DhJdIUs5q6YLS4cwb2nYwjF83R1s,3059 -greenlet/slp_platformselect.h,sha256=s-U-BrZ3qwwfI-6W9zWw2rb404OksZYbxYC2w5kSMXM,3841 -greenlet/tests/__init__.py,sha256=cj2-qpMXnlVRLbMLX-rPNNMVJ42ZssdxHd84NSQ3YXw,9246 -greenlet/tests/__pycache__/__init__.cpython-311.pyc,, -greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-311.pyc,, -greenlet/tests/__pycache__/fail_cpp_exception.cpython-311.pyc,, -greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-311.pyc,, -greenlet/tests/__pycache__/fail_slp_switch.cpython-311.pyc,, -greenlet/tests/__pycache__/fail_switch_three_greenlets.cpython-311.pyc,, -greenlet/tests/__pycache__/fail_switch_three_greenlets2.cpython-311.pyc,, -greenlet/tests/__pycache__/fail_switch_two_greenlets.cpython-311.pyc,, -greenlet/tests/__pycache__/leakcheck.cpython-311.pyc,, -greenlet/tests/__pycache__/test_contextvars.cpython-311.pyc,, -greenlet/tests/__pycache__/test_cpp.cpython-311.pyc,, -greenlet/tests/__pycache__/test_extension_interface.cpython-311.pyc,, -greenlet/tests/__pycache__/test_gc.cpython-311.pyc,, -greenlet/tests/__pycache__/test_generator.cpython-311.pyc,, -greenlet/tests/__pycache__/test_generator_nested.cpython-311.pyc,, -greenlet/tests/__pycache__/test_greenlet.cpython-311.pyc,, -greenlet/tests/__pycache__/test_greenlet_trash.cpython-311.pyc,, -greenlet/tests/__pycache__/test_leaks.cpython-311.pyc,, -greenlet/tests/__pycache__/test_stack_saved.cpython-311.pyc,, -greenlet/tests/__pycache__/test_throw.cpython-311.pyc,, -greenlet/tests/__pycache__/test_tracing.cpython-311.pyc,, -greenlet/tests/__pycache__/test_version.cpython-311.pyc,, -greenlet/tests/__pycache__/test_weakref.cpython-311.pyc,, -greenlet/tests/_test_extension.c,sha256=vkeGA-6oeJcGILsD7oIrT1qZop2GaTOHXiNT7mcSl-0,5773 -greenlet/tests/_test_extension.cpython-311-x86_64-linux-gnu.so,sha256=by4B4SzGfk95WO70GaTZPzNld-R6DAg7O-L-6-xr1Vc,36624 -greenlet/tests/_test_extension_cpp.cpp,sha256=e0kVnaB8CCaEhE9yHtNyfqTjevsPDKKx-zgxk7PPK48,6565 -greenlet/tests/_test_extension_cpp.cpython-311-x86_64-linux-gnu.so,sha256=weieflEaO2huADQsIVai032PTLyzEXCqNnDbLtkB4W4,57288 -greenlet/tests/fail_clearing_run_switches.py,sha256=o433oA_nUCtOPaMEGc8VEhZIKa71imVHXFw7TsXaP8M,1263 -greenlet/tests/fail_cpp_exception.py,sha256=o_ZbipWikok8Bjc-vjiQvcb5FHh2nVW-McGKMLcMzh0,985 -greenlet/tests/fail_initialstub_already_started.py,sha256=txENn5IyzGx2p-XR1XB7qXmC8JX_4mKDEA8kYBXUQKc,1961 -greenlet/tests/fail_slp_switch.py,sha256=rJBZcZfTWR3e2ERQtPAud6YKShiDsP84PmwOJbp4ey0,524 -greenlet/tests/fail_switch_three_greenlets.py,sha256=zSitV7rkNnaoHYVzAGGLnxz-yPtohXJJzaE8ehFDQ0M,956 -greenlet/tests/fail_switch_three_greenlets2.py,sha256=FPJensn2EJxoropl03JSTVP3kgP33k04h6aDWWozrOk,1285 -greenlet/tests/fail_switch_two_greenlets.py,sha256=1CaI8s3504VbbF1vj1uBYuy-zxBHVzHPIAd1LIc8ONg,817 -greenlet/tests/leakcheck.py,sha256=inbfM7_oVzd8jIKGxCgo4JqpFZaDAnWPkSULJ8vIE1s,11964 -greenlet/tests/test_contextvars.py,sha256=0n5pR_lbpAppc5wFfK0e1SwYLM-fsSFp72B5_ArLPGE,10348 -greenlet/tests/test_cpp.py,sha256=hpxhFAdKJTpAVZP8CBGs1ZcrKdscI9BaDZk4btkI5d4,2736 -greenlet/tests/test_extension_interface.py,sha256=eJ3cwLacdK2WbsrC-4DgeyHdwLRcG4zx7rrkRtqSzC4,3829 -greenlet/tests/test_gc.py,sha256=PCOaRpIyjNnNlDogGL3FZU_lrdXuM-pv1rxeE5TP5mc,2923 -greenlet/tests/test_generator.py,sha256=tONXiTf98VGm347o1b-810daPiwdla5cbpFg6QI1R1g,1240 -greenlet/tests/test_generator_nested.py,sha256=7v4HOYrf1XZP39dk5IUMubdZ8yc3ynwZcqj9GUJyMSA,3718 -greenlet/tests/test_greenlet.py,sha256=zoAy56MtEyz5P93Iknpt2pPjNO3ePYrgM7SDE8Cw_uI,45990 -greenlet/tests/test_greenlet_trash.py,sha256=n2dBlQfOoEO1ODatFi8QdhboH3fB86YtqzcYMYOXxbw,7947 -greenlet/tests/test_leaks.py,sha256=wskLqCAvqZ3qTZkam_wXzd-E5zelUjlXS5Ss8KshtZY,17465 -greenlet/tests/test_stack_saved.py,sha256=eyzqNY2VCGuGlxhT_In6TvZ6Okb0AXFZVyBEnK1jDwA,446 -greenlet/tests/test_throw.py,sha256=u2TQ_WvvCd6N6JdXWIxVEcXkKu5fepDlz9dktYdmtng,3712 -greenlet/tests/test_tracing.py,sha256=VlwzMU0C1noospZhuUMyB7MHw200emIvGCN_6G2p2ZU,8250 -greenlet/tests/test_version.py,sha256=O9DpAITsOFgiRcjd4odQ7ejmwx_N9Q1zQENVcbtFHIc,1339 -greenlet/tests/test_weakref.py,sha256=F8M23btEF87bIbpptLNBORosbQqNZGiYeKMqYjWrsak,883 diff --git a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/WHEEL b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/WHEEL deleted file mode 100644 index d942138..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.1.0) -Root-Is-Purelib: false -Tag: cp311-cp311-manylinux_2_24_x86_64 -Tag: cp311-cp311-manylinux_2_28_x86_64 - diff --git a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/top_level.txt b/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/top_level.txt deleted file mode 100644 index 46725be..0000000 --- a/port/lib/python3.11/site-packages/greenlet-3.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -greenlet diff --git a/port/lib/python3.11/site-packages/greenlet/CObjects.cpp b/port/lib/python3.11/site-packages/greenlet/CObjects.cpp deleted file mode 100644 index c135995..0000000 --- a/port/lib/python3.11/site-packages/greenlet/CObjects.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#ifndef COBJECTS_CPP -#define COBJECTS_CPP -/***************************************************************************** - * C interface - * - * These are exported using the CObject API - */ -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -#endif - -#include "greenlet_exceptions.hpp" - -#include "greenlet_internal.hpp" -#include "greenlet_refs.hpp" - - -#include "TThreadStateDestroy.cpp" - -#include "PyGreenlet.hpp" - -using greenlet::PyErrOccurred; -using greenlet::Require; - - - -extern "C" { -static PyGreenlet* -PyGreenlet_GetCurrent(void) -{ - return GET_THREAD_STATE().state().get_current().relinquish_ownership(); -} - -static int -PyGreenlet_SetParent(PyGreenlet* g, PyGreenlet* nparent) -{ - return green_setparent((PyGreenlet*)g, (PyObject*)nparent, NULL); -} - -static PyGreenlet* -PyGreenlet_New(PyObject* run, PyGreenlet* parent) -{ - using greenlet::refs::NewDictReference; - // In the past, we didn't use green_new and green_init, but that - // was a maintenance issue because we duplicated code. This way is - // much safer, but slightly slower. If that's a problem, we could - // refactor green_init to separate argument parsing from initialization. - OwnedGreenlet g = OwnedGreenlet::consuming(green_new(&PyGreenlet_Type, nullptr, nullptr)); - if (!g) { - return NULL; - } - - try { - NewDictReference kwargs; - if (run) { - kwargs.SetItem(mod_globs->str_run, run); - } - if (parent) { - kwargs.SetItem("parent", (PyObject*)parent); - } - - Require(green_init(g.borrow(), mod_globs->empty_tuple, kwargs.borrow())); - } - catch (const PyErrOccurred&) { - return nullptr; - } - - return g.relinquish_ownership(); -} - -static PyObject* -PyGreenlet_Switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return NULL; - } - - if (args == NULL) { - args = mod_globs->empty_tuple; - } - - if (kwargs == NULL || !PyDict_Check(kwargs)) { - kwargs = NULL; - } - - return green_switch(self, args, kwargs); -} - -static PyObject* -PyGreenlet_Throw(PyGreenlet* self, PyObject* typ, PyObject* val, PyObject* tb) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return nullptr; - } - try { - PyErrPieces err_pieces(typ, val, tb); - return internal_green_throw(self, err_pieces).relinquish_ownership(); - } - catch (const PyErrOccurred&) { - return nullptr; - } -} - - - -static int -Extern_PyGreenlet_MAIN(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return -1; - } - return self->pimpl->main(); -} - -static int -Extern_PyGreenlet_ACTIVE(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return -1; - } - return self->pimpl->active(); -} - -static int -Extern_PyGreenlet_STARTED(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return -1; - } - return self->pimpl->started(); -} - -static PyGreenlet* -Extern_PyGreenlet_GET_PARENT(PyGreenlet* self) -{ - if (!PyGreenlet_Check(self)) { - PyErr_BadArgument(); - return NULL; - } - // This can return NULL even if there is no exception - return self->pimpl->parent().acquire(); -} -} // extern C. - -/** End C API ****************************************************************/ -#ifdef __clang__ -# pragma clang diagnostic pop -#endif - - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/PyGreenlet.cpp b/port/lib/python3.11/site-packages/greenlet/PyGreenlet.cpp deleted file mode 100644 index 29c0bba..0000000 --- a/port/lib/python3.11/site-packages/greenlet/PyGreenlet.cpp +++ /dev/null @@ -1,738 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef PYGREENLET_CPP -#define PYGREENLET_CPP -/***************** -The Python slot functions for TGreenlet. - */ - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" // PyMemberDef - -#include "greenlet_internal.hpp" -#include "TThreadStateDestroy.cpp" -#include "TGreenlet.hpp" -// #include "TUserGreenlet.cpp" -// #include "TMainGreenlet.cpp" -// #include "TBrokenGreenlet.cpp" - - -#include "greenlet_refs.hpp" -#include "greenlet_slp_switch.hpp" - -#include "greenlet_thread_support.hpp" -#include "TGreenlet.hpp" - -#include "TGreenletGlobals.cpp" -#include "TThreadStateDestroy.cpp" -#include "PyGreenlet.hpp" -// #include "TGreenlet.cpp" - -// #include "TExceptionState.cpp" -// #include "TPythonState.cpp" -// #include "TStackState.cpp" - -using greenlet::LockGuard; -using greenlet::LockInitError; -using greenlet::PyErrOccurred; -using greenlet::Require; - -using greenlet::g_handle_exit; -using greenlet::single_result; - -using greenlet::Greenlet; -using greenlet::UserGreenlet; -using greenlet::MainGreenlet; -using greenlet::BrokenGreenlet; -using greenlet::ThreadState; -using greenlet::PythonState; - - - -static PyGreenlet* -green_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)) -{ - PyGreenlet* o = - (PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict); - if (o) { - new UserGreenlet(o, GET_THREAD_STATE().state().borrow_current()); - assert(Py_REFCNT(o) == 1); - } - return o; -} - - -// green_init is used in the tp_init slot. So it's important that -// it can be called directly from CPython. Thus, we don't use -// BorrowedGreenlet and BorrowedObject --- although in theory -// these should be binary layout compatible, that may not be -// guaranteed to be the case (32-bit linux ppc possibly). -static int -green_init(PyGreenlet* self, PyObject* args, PyObject* kwargs) -{ - PyArgParseParam run; - PyArgParseParam nparent; - static const char* kwlist[] = { - "run", - "parent", - NULL - }; - - // recall: The O specifier does NOT increase the reference count. - if (!PyArg_ParseTupleAndKeywords( - args, kwargs, "|OO:green", (char**)kwlist, &run, &nparent)) { - return -1; - } - - if (run) { - if (green_setrun(self, run, NULL)) { - return -1; - } - } - if (nparent && !nparent.is_None()) { - return green_setparent(self, nparent, NULL); - } - return 0; -} - - - -static int -green_traverse(PyGreenlet* self, visitproc visit, void* arg) -{ - // We must only visit referenced objects, i.e. only objects - // Py_INCREF'ed by this greenlet (directly or indirectly): - // - // - stack_prev is not visited: holds previous stack pointer, but it's not - // referenced - // - frames are not visited as we don't strongly reference them; - // alive greenlets are not garbage collected - // anyway. This can be a problem, however, if this greenlet is - // never allowed to finish, and is referenced from the frame: we - // have an uncollectible cycle in that case. Note that the - // frame object itself is also frequently not even tracked by the GC - // starting with Python 3.7 (frames are allocated by the - // interpreter untracked, and only become tracked when their - // evaluation is finished if they have a refcount > 1). All of - // this is to say that we should probably strongly reference - // the frame object. Doing so, while always allowing GC on a - // greenlet, solves several leaks for us. - - Py_VISIT(self->dict); - if (!self->pimpl) { - // Hmm. I have seen this at interpreter shutdown time, - // I think. That's very odd because this doesn't go away until - // we're ``green_dealloc()``, at which point we shouldn't be - // traversed anymore. - return 0; - } - - return self->pimpl->tp_traverse(visit, arg); -} - -static int -green_is_gc(PyObject* _self) -{ - BorrowedGreenlet self(_self); - int result = 0; - /* Main greenlet can be garbage collected since it can only - become unreachable if the underlying thread exited. - Active greenlets --- including those that are suspended --- - cannot be garbage collected, however. - */ - if (self->main() || !self->active()) { - result = 1; - } - // The main greenlet pointer will eventually go away after the thread dies. - if (self->was_running_in_dead_thread()) { - // Our thread is dead! We can never run again. Might as well - // GC us. Note that if a tuple containing only us and other - // immutable objects had been scanned before this, when we - // would have returned 0, the tuple will take itself out of GC - // tracking and never be investigated again. So that could - // result in both us and the tuple leaking due to an - // unreachable/uncollectible reference. The same goes for - // dictionaries. - // - // It's not a great idea to be changing our GC state on the - // fly. - result = 1; - } - return result; -} - - -static int -green_clear(PyGreenlet* self) -{ - /* Greenlet is only cleared if it is about to be collected. - Since active greenlets are not garbage collectable, we can - be sure that, even if they are deallocated during clear, - nothing they reference is in unreachable or finalizers, - so even if it switches we are relatively safe. */ - // XXX: Are we responsible for clearing weakrefs here? - Py_CLEAR(self->dict); - return self->pimpl->tp_clear(); -} - -/** - * Returns 0 on failure (the object was resurrected) or 1 on success. - **/ -static int -_green_dealloc_kill_started_non_main_greenlet(BorrowedGreenlet self) -{ - /* Hacks hacks hacks copied from instance_dealloc() */ - /* Temporarily resurrect the greenlet. */ - assert(self.REFCNT() == 0); - Py_SET_REFCNT(self.borrow(), 1); - /* Save the current exception, if any. */ - PyErrPieces saved_err; - try { - // BY THE TIME WE GET HERE, the state may actually be going - // away - // if we're shutting down the interpreter and freeing thread - // entries, - // this could result in freeing greenlets that were leaked. So - // we can't try to read the state. - self->deallocing_greenlet_in_thread( - self->thread_state() - ? static_cast(GET_THREAD_STATE()) - : nullptr); - } - catch (const PyErrOccurred&) { - PyErr_WriteUnraisable(self.borrow_o()); - /* XXX what else should we do? */ - } - /* Check for no resurrection must be done while we keep - * our internal reference, otherwise PyFile_WriteObject - * causes recursion if using Py_INCREF/Py_DECREF - */ - if (self.REFCNT() == 1 && self->active()) { - /* Not resurrected, but still not dead! - XXX what else should we do? we complain. */ - PyObject* f = PySys_GetObject("stderr"); - Py_INCREF(self.borrow_o()); /* leak! */ - if (f != NULL) { - PyFile_WriteString("GreenletExit did not kill ", f); - PyFile_WriteObject(self.borrow_o(), f, 0); - PyFile_WriteString("\n", f); - } - } - /* Restore the saved exception. */ - saved_err.PyErrRestore(); - /* Undo the temporary resurrection; can't use DECREF here, - * it would cause a recursive call. - */ - assert(self.REFCNT() > 0); - - Py_ssize_t refcnt = self.REFCNT() - 1; - Py_SET_REFCNT(self.borrow_o(), refcnt); - if (refcnt != 0) { - /* Resurrected! */ - _Py_NewReference(self.borrow_o()); - Py_SET_REFCNT(self.borrow_o(), refcnt); - /* Better to use tp_finalizer slot (PEP 442) - * and call ``PyObject_CallFinalizerFromDealloc``, - * but that's only supported in Python 3.4+; see - * Modules/_io/iobase.c for an example. - * - * The following approach is copied from iobase.c in CPython 2.7. - * (along with much of this function in general). Here's their - * comment: - * - * When called from a heap type's dealloc, the type will be - * decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */ - if (PyType_HasFeature(self.TYPE(), Py_TPFLAGS_HEAPTYPE)) { - Py_INCREF(self.TYPE()); - } - - PyObject_GC_Track((PyObject*)self); - - _Py_DEC_REFTOTAL; -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; -#endif /* COUNT_ALLOCS */ - return 0; - } - return 1; -} - - -static void -green_dealloc(PyGreenlet* self) -{ - PyObject_GC_UnTrack(self); - BorrowedGreenlet me(self); - if (me->active() - && me->started() - && !me->main()) { - if (!_green_dealloc_kill_started_non_main_greenlet(me)) { - return; - } - } - - if (self->weakreflist != NULL) { - PyObject_ClearWeakRefs((PyObject*)self); - } - Py_CLEAR(self->dict); - - if (self->pimpl) { - // In case deleting this, which frees some memory, - // somehow winds up calling back into us. That's usually a - //bug in our code. - Greenlet* p = self->pimpl; - self->pimpl = nullptr; - delete p; - } - // and finally we're done. self is now invalid. - Py_TYPE(self)->tp_free((PyObject*)self); -} - - - -static OwnedObject -internal_green_throw(BorrowedGreenlet self, PyErrPieces& err_pieces) -{ - PyObject* result = nullptr; - err_pieces.PyErrRestore(); - assert(PyErr_Occurred()); - if (self->started() && !self->active()) { - /* dead greenlet: turn GreenletExit into a regular return */ - result = g_handle_exit(OwnedObject()).relinquish_ownership(); - } - self->args() <<= result; - - return single_result(self->g_switch()); -} - - - -PyDoc_STRVAR( - green_switch_doc, - "switch(*args, **kwargs)\n" - "\n" - "Switch execution to this greenlet.\n" - "\n" - "If this greenlet has never been run, then this greenlet\n" - "will be switched to using the body of ``self.run(*args, **kwargs)``.\n" - "\n" - "If the greenlet is active (has been run, but was switch()'ed\n" - "out before leaving its run function), then this greenlet will\n" - "be resumed and the return value to its switch call will be\n" - "None if no arguments are given, the given argument if one\n" - "argument is given, or the args tuple and keyword args dict if\n" - "multiple arguments are given.\n" - "\n" - "If the greenlet is dead, or is the current greenlet then this\n" - "function will simply return the arguments using the same rules as\n" - "above.\n"); - -static PyObject* -green_switch(PyGreenlet* self, PyObject* args, PyObject* kwargs) -{ - using greenlet::SwitchingArgs; - SwitchingArgs switch_args(OwnedObject::owning(args), OwnedObject::owning(kwargs)); - self->pimpl->may_switch_away(); - self->pimpl->args() <<= switch_args; - - // If we're switching out of a greenlet, and that switch is the - // last thing the greenlet does, the greenlet ought to be able to - // go ahead and die at that point. Currently, someone else must - // manually switch back to the greenlet so that we "fall off the - // end" and can perform cleanup. You'd think we'd be able to - // figure out that this is happening using the frame's ``f_lasti`` - // member, which is supposed to be an index into - // ``frame->f_code->co_code``, the bytecode string. However, in - // recent interpreters, ``f_lasti`` tends not to be updated thanks - // to things like the PREDICT() macros in ceval.c. So it doesn't - // really work to do that in many cases. For example, the Python - // code: - // def run(): - // greenlet.getcurrent().parent.switch() - // produces bytecode of len 16, with the actual call to switch() - // being at index 10 (in Python 3.10). However, the reported - // ``f_lasti`` we actually see is...5! (Which happens to be the - // second byte of the CALL_METHOD op for ``getcurrent()``). - - try { - //OwnedObject result = single_result(self->pimpl->g_switch()); - OwnedObject result(single_result(self->pimpl->g_switch())); -#ifndef NDEBUG - // Note that the current greenlet isn't necessarily self. If self - // finished, we went to one of its parents. - assert(!self->pimpl->args()); - - const BorrowedGreenlet& current = GET_THREAD_STATE().state().borrow_current(); - // It's possible it's never been switched to. - assert(!current->args()); -#endif - PyObject* p = result.relinquish_ownership(); - - if (!p && !PyErr_Occurred()) { - // This shouldn't be happening anymore, so the asserts - // are there for debug builds. Non-debug builds - // crash "gracefully" in this case, although there is an - // argument to be made for killing the process in all - // cases --- for this to be the case, our switches - // probably nested in an incorrect way, so the state is - // suspicious. Nothing should be corrupt though, just - // confused at the Python level. Letting this propagate is - // probably good enough. - assert(p || PyErr_Occurred()); - throw PyErrOccurred( - mod_globs->PyExc_GreenletError, - "Greenlet.switch() returned NULL without an exception set." - ); - } - return p; - } - catch(const PyErrOccurred&) { - return nullptr; - } -} - -PyDoc_STRVAR( - green_throw_doc, - "Switches execution to this greenlet, but immediately raises the\n" - "given exception in this greenlet. If no argument is provided, the " - "exception\n" - "defaults to `greenlet.GreenletExit`. The normal exception\n" - "propagation rules apply, as described for `switch`. Note that calling " - "this\n" - "method is almost equivalent to the following::\n" - "\n" - " def raiser():\n" - " raise typ, val, tb\n" - " g_raiser = greenlet(raiser, parent=g)\n" - " g_raiser.switch()\n" - "\n" - "except that this trick does not work for the\n" - "`greenlet.GreenletExit` exception, which would not propagate\n" - "from ``g_raiser`` to ``g``.\n"); - -static PyObject* -green_throw(PyGreenlet* self, PyObject* args) -{ - PyArgParseParam typ(mod_globs->PyExc_GreenletExit); - PyArgParseParam val; - PyArgParseParam tb; - - if (!PyArg_ParseTuple(args, "|OOO:throw", &typ, &val, &tb)) { - return nullptr; - } - - assert(typ.borrow() || val.borrow()); - - self->pimpl->may_switch_away(); - try { - // Both normalizing the error and the actual throw_greenlet - // could throw PyErrOccurred. - PyErrPieces err_pieces(typ.borrow(), val.borrow(), tb.borrow()); - - return internal_green_throw(self, err_pieces).relinquish_ownership(); - } - catch (const PyErrOccurred&) { - return nullptr; - } -} - -static int -green_bool(PyGreenlet* self) -{ - return self->pimpl->active(); -} - -/** - * CAUTION: Allocates memory, may run GC and arbitrary Python code. - */ -static PyObject* -green_getdict(PyGreenlet* self, void* UNUSED(context)) -{ - if (self->dict == NULL) { - self->dict = PyDict_New(); - if (self->dict == NULL) { - return NULL; - } - } - Py_INCREF(self->dict); - return self->dict; -} - -static int -green_setdict(PyGreenlet* self, PyObject* val, void* UNUSED(context)) -{ - PyObject* tmp; - - if (val == NULL) { - PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted"); - return -1; - } - if (!PyDict_Check(val)) { - PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary"); - return -1; - } - tmp = self->dict; - Py_INCREF(val); - self->dict = val; - Py_XDECREF(tmp); - return 0; -} - -static bool -_green_not_dead(BorrowedGreenlet self) -{ - // XXX: Where else should we do this? - // Probably on entry to most Python-facing functions? - if (self->was_running_in_dead_thread()) { - self->deactivate_and_free(); - return false; - } - return self->active() || !self->started(); -} - - -static PyObject* -green_getdead(PyGreenlet* self, void* UNUSED(context)) -{ - if (_green_not_dead(self)) { - Py_RETURN_FALSE; - } - else { - Py_RETURN_TRUE; - } -} - -static PyObject* -green_get_stack_saved(PyGreenlet* self, void* UNUSED(context)) -{ - return PyLong_FromSsize_t(self->pimpl->stack_saved()); -} - - -static PyObject* -green_getrun(PyGreenlet* self, void* UNUSED(context)) -{ - try { - OwnedObject result(BorrowedGreenlet(self)->run()); - return result.relinquish_ownership(); - } - catch(const PyErrOccurred&) { - return nullptr; - } -} - - -static int -green_setrun(PyGreenlet* self, PyObject* nrun, void* UNUSED(context)) -{ - try { - BorrowedGreenlet(self)->run(nrun); - return 0; - } - catch(const PyErrOccurred&) { - return -1; - } -} - -static PyObject* -green_getparent(PyGreenlet* self, void* UNUSED(context)) -{ - return BorrowedGreenlet(self)->parent().acquire_or_None(); -} - - -static int -green_setparent(PyGreenlet* self, PyObject* nparent, void* UNUSED(context)) -{ - try { - BorrowedGreenlet(self)->parent(nparent); - } - catch(const PyErrOccurred&) { - return -1; - } - return 0; -} - - -static PyObject* -green_getcontext(const PyGreenlet* self, void* UNUSED(context)) -{ - const Greenlet *const g = self->pimpl; - try { - OwnedObject result(g->context()); - return result.relinquish_ownership(); - } - catch(const PyErrOccurred&) { - return nullptr; - } -} - -static int -green_setcontext(PyGreenlet* self, PyObject* nctx, void* UNUSED(context)) -{ - try { - BorrowedGreenlet(self)->context(nctx); - return 0; - } - catch(const PyErrOccurred&) { - return -1; - } -} - - -static PyObject* -green_getframe(PyGreenlet* self, void* UNUSED(context)) -{ - const PythonState::OwnedFrame& top_frame = BorrowedGreenlet(self)->top_frame(); - return top_frame.acquire_or_None(); -} - - -static PyObject* -green_getstate(PyGreenlet* self) -{ - PyErr_Format(PyExc_TypeError, - "cannot serialize '%s' object", - Py_TYPE(self)->tp_name); - return nullptr; -} - -static PyObject* -green_repr(PyGreenlet* _self) -{ - BorrowedGreenlet self(_self); - /* - Return a string like - - - The handling of greenlets across threads is not super good. - We mostly use the internal definitions of these terms, but they - generally should make sense to users as well. - */ - PyObject* result; - int never_started = !self->started() && !self->active(); - - const char* const tp_name = Py_TYPE(self)->tp_name; - - if (_green_not_dead(self)) { - /* XXX: The otid= is almost useless because you can't correlate it to - any thread identifier exposed to Python. We could use - PyThreadState_GET()->thread_id, but we'd need to save that in the - greenlet, or save the whole PyThreadState object itself. - - As it stands, its only useful for identifying greenlets from the same thread. - */ - const char* state_in_thread; - if (self->was_running_in_dead_thread()) { - // The thread it was running in is dead! - // This can happen, especially at interpreter shut down. - // It complicates debugging output because it may be - // impossible to access the current thread state at that - // time. Thus, don't access the current thread state. - state_in_thread = " (thread exited)"; - } - else { - state_in_thread = GET_THREAD_STATE().state().is_current(self) - ? " current" - : (self->started() ? " suspended" : ""); - } - result = PyUnicode_FromFormat( - "<%s object at %p (otid=%p)%s%s%s%s>", - tp_name, - self.borrow_o(), - self->thread_state(), - state_in_thread, - self->active() ? " active" : "", - never_started ? " pending" : " started", - self->main() ? " main" : "" - ); - } - else { - result = PyUnicode_FromFormat( - "<%s object at %p (otid=%p) %sdead>", - tp_name, - self.borrow_o(), - self->thread_state(), - self->was_running_in_dead_thread() - ? "(thread exited) " - : "" - ); - } - - return result; -} - - -static PyMethodDef green_methods[] = { - { - .ml_name="switch", - .ml_meth=reinterpret_cast(green_switch), - .ml_flags=METH_VARARGS | METH_KEYWORDS, - .ml_doc=green_switch_doc - }, - {.ml_name="throw", .ml_meth=(PyCFunction)green_throw, .ml_flags=METH_VARARGS, .ml_doc=green_throw_doc}, - {.ml_name="__getstate__", .ml_meth=(PyCFunction)green_getstate, .ml_flags=METH_NOARGS, .ml_doc=NULL}, - {.ml_name=NULL, .ml_meth=NULL} /* sentinel */ -}; - -static PyGetSetDef green_getsets[] = { - /* name, getter, setter, doc, context pointer */ - {.name="__dict__", .get=(getter)green_getdict, .set=(setter)green_setdict}, - {.name="run", .get=(getter)green_getrun, .set=(setter)green_setrun}, - {.name="parent", .get=(getter)green_getparent, .set=(setter)green_setparent}, - {.name="gr_frame", .get=(getter)green_getframe }, - { - .name="gr_context", - .get=(getter)green_getcontext, - .set=(setter)green_setcontext - }, - {.name="dead", .get=(getter)green_getdead}, - {.name="_stack_saved", .get=(getter)green_get_stack_saved}, - {.name=NULL} -}; - -static PyMemberDef green_members[] = { - {.name=NULL} -}; - -static PyNumberMethods green_as_number = { - .nb_bool=(inquiry)green_bool, -}; - - -PyTypeObject PyGreenlet_Type = { - .ob_base=PyVarObject_HEAD_INIT(NULL, 0) - .tp_name="greenlet.greenlet", /* tp_name */ - .tp_basicsize=sizeof(PyGreenlet), /* tp_basicsize */ - /* methods */ - .tp_dealloc=(destructor)green_dealloc, /* tp_dealloc */ - .tp_repr=(reprfunc)green_repr, /* tp_repr */ - .tp_as_number=&green_as_number, /* tp_as _number*/ - .tp_flags=G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - .tp_doc="greenlet(run=None, parent=None) -> greenlet\n\n" - "Creates a new greenlet object (without running it).\n\n" - " - *run* -- The callable to invoke.\n" - " - *parent* -- The parent greenlet. The default is the current " - "greenlet.", /* tp_doc */ - .tp_traverse=(traverseproc)green_traverse, /* tp_traverse */ - .tp_clear=(inquiry)green_clear, /* tp_clear */ - .tp_weaklistoffset=offsetof(PyGreenlet, weakreflist), /* tp_weaklistoffset */ - - .tp_methods=green_methods, /* tp_methods */ - .tp_members=green_members, /* tp_members */ - .tp_getset=green_getsets, /* tp_getset */ - .tp_dictoffset=offsetof(PyGreenlet, dict), /* tp_dictoffset */ - .tp_init=(initproc)green_init, /* tp_init */ - .tp_alloc=PyType_GenericAlloc, /* tp_alloc */ - .tp_new=(newfunc)green_new, /* tp_new */ - .tp_free=PyObject_GC_Del, /* tp_free */ - .tp_is_gc=(inquiry)green_is_gc, /* tp_is_gc */ -}; - -#endif - -// Local Variables: -// flycheck-clang-include-path: ("/opt/local/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8") -// End: diff --git a/port/lib/python3.11/site-packages/greenlet/PyGreenlet.hpp b/port/lib/python3.11/site-packages/greenlet/PyGreenlet.hpp deleted file mode 100644 index df6cd80..0000000 --- a/port/lib/python3.11/site-packages/greenlet/PyGreenlet.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef PYGREENLET_HPP -#define PYGREENLET_HPP - - -#include "greenlet.h" -#include "greenlet_compiler_compat.hpp" -#include "greenlet_refs.hpp" - - -using greenlet::refs::OwnedGreenlet; -using greenlet::refs::BorrowedGreenlet; -using greenlet::refs::BorrowedObject;; -using greenlet::refs::OwnedObject; -using greenlet::refs::PyErrPieces; - - -// XXX: These doesn't really belong here, it's not a Python slot. -static OwnedObject internal_green_throw(BorrowedGreenlet self, PyErrPieces& err_pieces); - -static PyGreenlet* green_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)); -static int green_clear(PyGreenlet* self); -static int green_init(PyGreenlet* self, PyObject* args, PyObject* kwargs); -static int green_setparent(PyGreenlet* self, PyObject* nparent, void* UNUSED(context)); -static int green_setrun(PyGreenlet* self, PyObject* nrun, void* UNUSED(context)); -static int green_traverse(PyGreenlet* self, visitproc visit, void* arg); -static void green_dealloc(PyGreenlet* self); -static PyObject* green_getparent(PyGreenlet* self, void* UNUSED(context)); - -static int green_is_gc(PyObject* self); -static PyObject* green_getdead(PyGreenlet* self, void* UNUSED(context)); -static PyObject* green_getrun(PyGreenlet* self, void* UNUSED(context)); -static int green_setcontext(PyGreenlet* self, PyObject* nctx, void* UNUSED(context)); -static PyObject* green_getframe(PyGreenlet* self, void* UNUSED(context)); -static PyObject* green_repr(PyGreenlet* self); -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/PyGreenletUnswitchable.cpp b/port/lib/python3.11/site-packages/greenlet/PyGreenletUnswitchable.cpp deleted file mode 100644 index 1b768ee..0000000 --- a/port/lib/python3.11/site-packages/greenlet/PyGreenletUnswitchable.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - Implementation of the Python slots for PyGreenletUnswitchable_Type -*/ -#ifndef PY_GREENLET_UNSWITCHABLE_CPP -#define PY_GREENLET_UNSWITCHABLE_CPP - - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" // PyMemberDef - -#include "greenlet_internal.hpp" -// Code after this point can assume access to things declared in stdint.h, -// including the fixed-width types. This goes for the platform-specific switch functions -// as well. -#include "greenlet_refs.hpp" -#include "greenlet_slp_switch.hpp" - -#include "greenlet_thread_support.hpp" -#include "TGreenlet.hpp" - -#include "TGreenlet.cpp" -#include "TGreenletGlobals.cpp" -#include "TThreadStateDestroy.cpp" - - -using greenlet::LockGuard; -using greenlet::LockInitError; -using greenlet::PyErrOccurred; -using greenlet::Require; - -using greenlet::g_handle_exit; -using greenlet::single_result; - -using greenlet::Greenlet; -using greenlet::UserGreenlet; -using greenlet::MainGreenlet; -using greenlet::BrokenGreenlet; -using greenlet::ThreadState; -using greenlet::PythonState; - - -#include "PyGreenlet.hpp" - -static PyGreenlet* -green_unswitchable_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds)) -{ - PyGreenlet* o = - (PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict); - if (o) { - new BrokenGreenlet(o, GET_THREAD_STATE().state().borrow_current()); - assert(Py_REFCNT(o) == 1); - } - return o; -} - -static PyObject* -green_unswitchable_getforce(PyGreenlet* self, void* UNUSED(context)) -{ - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - return PyBool_FromLong(broken->_force_switch_error); -} - -static int -green_unswitchable_setforce(PyGreenlet* self, PyObject* nforce, void* UNUSED(context)) -{ - if (!nforce) { - PyErr_SetString( - PyExc_AttributeError, - "Cannot delete force_switch_error" - ); - return -1; - } - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - int is_true = PyObject_IsTrue(nforce); - if (is_true == -1) { - return -1; - } - broken->_force_switch_error = is_true; - return 0; -} - -static PyObject* -green_unswitchable_getforceslp(PyGreenlet* self, void* UNUSED(context)) -{ - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - return PyBool_FromLong(broken->_force_slp_switch_error); -} - -static int -green_unswitchable_setforceslp(PyGreenlet* self, PyObject* nforce, void* UNUSED(context)) -{ - if (!nforce) { - PyErr_SetString( - PyExc_AttributeError, - "Cannot delete force_slp_switch_error" - ); - return -1; - } - BrokenGreenlet* broken = dynamic_cast(self->pimpl); - int is_true = PyObject_IsTrue(nforce); - if (is_true == -1) { - return -1; - } - broken->_force_slp_switch_error = is_true; - return 0; -} - -static PyGetSetDef green_unswitchable_getsets[] = { - /* name, getter, setter, doc, closure (context pointer) */ - { - .name="force_switch_error", - .get=(getter)green_unswitchable_getforce, - .set=(setter)green_unswitchable_setforce, - .doc=NULL - }, - { - .name="force_slp_switch_error", - .get=(getter)green_unswitchable_getforceslp, - .set=(setter)green_unswitchable_setforceslp, - .doc=nullptr - }, - {.name=nullptr} -}; - -PyTypeObject PyGreenletUnswitchable_Type = { - .ob_base=PyVarObject_HEAD_INIT(NULL, 0) - .tp_name="greenlet._greenlet.UnswitchableGreenlet", - .tp_dealloc= (destructor)green_dealloc, /* tp_dealloc */ - .tp_flags=G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - .tp_doc="Undocumented internal class", /* tp_doc */ - .tp_traverse=(traverseproc)green_traverse, /* tp_traverse */ - .tp_clear=(inquiry)green_clear, /* tp_clear */ - - .tp_getset=green_unswitchable_getsets, /* tp_getset */ - .tp_base=&PyGreenlet_Type, /* tp_base */ - .tp_init=(initproc)green_init, /* tp_init */ - .tp_alloc=PyType_GenericAlloc, /* tp_alloc */ - .tp_new=(newfunc)green_unswitchable_new, /* tp_new */ - .tp_free=PyObject_GC_Del, /* tp_free */ - .tp_is_gc=(inquiry)green_is_gc, /* tp_is_gc */ -}; - - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/PyModule.cpp b/port/lib/python3.11/site-packages/greenlet/PyModule.cpp deleted file mode 100644 index 6adcb5c..0000000 --- a/port/lib/python3.11/site-packages/greenlet/PyModule.cpp +++ /dev/null @@ -1,292 +0,0 @@ -#ifndef PY_MODULE_CPP -#define PY_MODULE_CPP - -#include "greenlet_internal.hpp" - - -#include "TGreenletGlobals.cpp" -#include "TMainGreenlet.cpp" -#include "TThreadStateDestroy.cpp" - -using greenlet::LockGuard; -using greenlet::ThreadState; - -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -# pragma clang diagnostic ignored "-Wunused-variable" -#endif - -PyDoc_STRVAR(mod_getcurrent_doc, - "getcurrent() -> greenlet\n" - "\n" - "Returns the current greenlet (i.e. the one which called this " - "function).\n"); - -static PyObject* -mod_getcurrent(PyObject* UNUSED(module)) -{ - return GET_THREAD_STATE().state().get_current().relinquish_ownership_o(); -} - -PyDoc_STRVAR(mod_settrace_doc, - "settrace(callback) -> object\n" - "\n" - "Sets a new tracing function and returns the previous one.\n"); -static PyObject* -mod_settrace(PyObject* UNUSED(module), PyObject* args) -{ - PyArgParseParam tracefunc; - if (!PyArg_ParseTuple(args, "O", &tracefunc)) { - return NULL; - } - ThreadState& state = GET_THREAD_STATE(); - OwnedObject previous = state.get_tracefunc(); - if (!previous) { - previous = Py_None; - } - - state.set_tracefunc(tracefunc); - - return previous.relinquish_ownership(); -} - -PyDoc_STRVAR(mod_gettrace_doc, - "gettrace() -> object\n" - "\n" - "Returns the currently set tracing function, or None.\n"); - -static PyObject* -mod_gettrace(PyObject* UNUSED(module)) -{ - OwnedObject tracefunc = GET_THREAD_STATE().state().get_tracefunc(); - if (!tracefunc) { - tracefunc = Py_None; - } - return tracefunc.relinquish_ownership(); -} - - - -PyDoc_STRVAR(mod_set_thread_local_doc, - "set_thread_local(key, value) -> None\n" - "\n" - "Set a value in the current thread-local dictionary. Debugging only.\n"); - -static PyObject* -mod_set_thread_local(PyObject* UNUSED(module), PyObject* args) -{ - PyArgParseParam key; - PyArgParseParam value; - PyObject* result = NULL; - - if (PyArg_UnpackTuple(args, "set_thread_local", 2, 2, &key, &value)) { - if(PyDict_SetItem( - PyThreadState_GetDict(), // borrow - key, - value) == 0 ) { - // success - Py_INCREF(Py_None); - result = Py_None; - } - } - return result; -} - -PyDoc_STRVAR(mod_get_pending_cleanup_count_doc, - "get_pending_cleanup_count() -> Integer\n" - "\n" - "Get the number of greenlet cleanup operations pending. Testing only.\n"); - - -static PyObject* -mod_get_pending_cleanup_count(PyObject* UNUSED(module)) -{ - LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); - return PyLong_FromSize_t(mod_globs->thread_states_to_destroy.size()); -} - -PyDoc_STRVAR(mod_get_total_main_greenlets_doc, - "get_total_main_greenlets() -> Integer\n" - "\n" - "Quickly return the number of main greenlets that exist. Testing only.\n"); - -static PyObject* -mod_get_total_main_greenlets(PyObject* UNUSED(module)) -{ - return PyLong_FromSize_t(G_TOTAL_MAIN_GREENLETS); -} - - - -PyDoc_STRVAR(mod_get_clocks_used_doing_optional_cleanup_doc, - "get_clocks_used_doing_optional_cleanup() -> Integer\n" - "\n" - "Get the number of clock ticks the program has used doing optional " - "greenlet cleanup.\n" - "Beginning in greenlet 2.0, greenlet tries to find and dispose of greenlets\n" - "that leaked after a thread exited. This requires invoking Python's garbage collector,\n" - "which may have a performance cost proportional to the number of live objects.\n" - "This function returns the amount of processor time\n" - "greenlet has used to do this. In programs that run with very large amounts of live\n" - "objects, this metric can be used to decide whether the cost of doing this cleanup\n" - "is worth the memory leak being corrected. If not, you can disable the cleanup\n" - "using ``enable_optional_cleanup(False)``.\n" - "The units are arbitrary and can only be compared to themselves (similarly to ``time.clock()``);\n" - "for example, to see how it scales with your heap. You can attempt to convert them into seconds\n" - "by dividing by the value of CLOCKS_PER_SEC." - "If cleanup has been disabled, returns None." - "\n" - "This is an implementation specific, provisional API. It may be changed or removed\n" - "in the future.\n" - ".. versionadded:: 2.0" - ); -static PyObject* -mod_get_clocks_used_doing_optional_cleanup(PyObject* UNUSED(module)) -{ - std::clock_t& clocks = ThreadState::clocks_used_doing_gc(); - - if (clocks == std::clock_t(-1)) { - Py_RETURN_NONE; - } - // This might not actually work on some implementations; clock_t - // is an opaque type. - return PyLong_FromSsize_t(clocks); -} - -PyDoc_STRVAR(mod_enable_optional_cleanup_doc, - "mod_enable_optional_cleanup(bool) -> None\n" - "\n" - "Enable or disable optional cleanup operations.\n" - "See ``get_clocks_used_doing_optional_cleanup()`` for details.\n" - ); -static PyObject* -mod_enable_optional_cleanup(PyObject* UNUSED(module), PyObject* flag) -{ - int is_true = PyObject_IsTrue(flag); - if (is_true == -1) { - return nullptr; - } - - std::clock_t& clocks = ThreadState::clocks_used_doing_gc(); - if (is_true) { - // If we already have a value, we don't want to lose it. - if (clocks == std::clock_t(-1)) { - clocks = 0; - } - } - else { - clocks = std::clock_t(-1); - } - Py_RETURN_NONE; -} - - - - -#if !GREENLET_PY313 -PyDoc_STRVAR(mod_get_tstate_trash_delete_nesting_doc, - "get_tstate_trash_delete_nesting() -> Integer\n" - "\n" - "Return the 'trash can' nesting level. Testing only.\n"); -static PyObject* -mod_get_tstate_trash_delete_nesting(PyObject* UNUSED(module)) -{ - PyThreadState* tstate = PyThreadState_GET(); - -#if GREENLET_PY312 - return PyLong_FromLong(tstate->trash.delete_nesting); -#else - return PyLong_FromLong(tstate->trash_delete_nesting); -#endif -} -#endif - - - - -static PyMethodDef GreenMethods[] = { - { - .ml_name="getcurrent", - .ml_meth=(PyCFunction)mod_getcurrent, - .ml_flags=METH_NOARGS, - .ml_doc=mod_getcurrent_doc - }, - { - .ml_name="settrace", - .ml_meth=(PyCFunction)mod_settrace, - .ml_flags=METH_VARARGS, - .ml_doc=mod_settrace_doc - }, - { - .ml_name="gettrace", - .ml_meth=(PyCFunction)mod_gettrace, - .ml_flags=METH_NOARGS, - .ml_doc=mod_gettrace_doc - }, - { - .ml_name="set_thread_local", - .ml_meth=(PyCFunction)mod_set_thread_local, - .ml_flags=METH_VARARGS, - .ml_doc=mod_set_thread_local_doc - }, - { - .ml_name="get_pending_cleanup_count", - .ml_meth=(PyCFunction)mod_get_pending_cleanup_count, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_pending_cleanup_count_doc - }, - { - .ml_name="get_total_main_greenlets", - .ml_meth=(PyCFunction)mod_get_total_main_greenlets, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_total_main_greenlets_doc - }, - { - .ml_name="get_clocks_used_doing_optional_cleanup", - .ml_meth=(PyCFunction)mod_get_clocks_used_doing_optional_cleanup, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_clocks_used_doing_optional_cleanup_doc - }, - { - .ml_name="enable_optional_cleanup", - .ml_meth=(PyCFunction)mod_enable_optional_cleanup, - .ml_flags=METH_O, - .ml_doc=mod_enable_optional_cleanup_doc - }, -#if !GREENLET_PY313 - { - .ml_name="get_tstate_trash_delete_nesting", - .ml_meth=(PyCFunction)mod_get_tstate_trash_delete_nesting, - .ml_flags=METH_NOARGS, - .ml_doc=mod_get_tstate_trash_delete_nesting_doc - }, -#endif - {.ml_name=NULL, .ml_meth=NULL} /* Sentinel */ -}; - -static const char* const copy_on_greentype[] = { - "getcurrent", - "error", - "GreenletExit", - "settrace", - "gettrace", - NULL -}; - -static struct PyModuleDef greenlet_module_def = { - .m_base=PyModuleDef_HEAD_INIT, - .m_name="greenlet._greenlet", - .m_doc=NULL, - .m_size=-1, - .m_methods=GreenMethods, -}; - - -#endif - -#ifdef __clang__ -# pragma clang diagnostic pop -#elif defined(__GNUC__) -# pragma GCC diagnostic pop -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/TBrokenGreenlet.cpp b/port/lib/python3.11/site-packages/greenlet/TBrokenGreenlet.cpp deleted file mode 100644 index 7e9ab5b..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TBrokenGreenlet.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::UserGreenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ - -#include "TGreenlet.hpp" - -namespace greenlet { - -void* BrokenGreenlet::operator new(size_t UNUSED(count)) -{ - return allocator.allocate(1); -} - - -void BrokenGreenlet::operator delete(void* ptr) -{ - return allocator.deallocate(static_cast(ptr), - 1); -} - -greenlet::PythonAllocator greenlet::BrokenGreenlet::allocator; - -bool -BrokenGreenlet::force_slp_switch_error() const noexcept -{ - return this->_force_slp_switch_error; -} - -UserGreenlet::switchstack_result_t BrokenGreenlet::g_switchstack(void) -{ - if (this->_force_switch_error) { - return switchstack_result_t(-1); - } - return UserGreenlet::g_switchstack(); -} - -}; //namespace greenlet diff --git a/port/lib/python3.11/site-packages/greenlet/TExceptionState.cpp b/port/lib/python3.11/site-packages/greenlet/TExceptionState.cpp deleted file mode 100644 index 08a94ae..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TExceptionState.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef GREENLET_EXCEPTION_STATE_CPP -#define GREENLET_EXCEPTION_STATE_CPP - -#include -#include "TGreenlet.hpp" - -namespace greenlet { - - -ExceptionState::ExceptionState() -{ - this->clear(); -} - -void ExceptionState::operator<<(const PyThreadState *const tstate) noexcept -{ - this->exc_info = tstate->exc_info; - this->exc_state = tstate->exc_state; -} - -void ExceptionState::operator>>(PyThreadState *const tstate) noexcept -{ - tstate->exc_state = this->exc_state; - tstate->exc_info = - this->exc_info ? this->exc_info : &tstate->exc_state; - this->clear(); -} - -void ExceptionState::clear() noexcept -{ - this->exc_info = nullptr; - this->exc_state.exc_value = nullptr; -#if !GREENLET_PY311 - this->exc_state.exc_type = nullptr; - this->exc_state.exc_traceback = nullptr; -#endif - this->exc_state.previous_item = nullptr; -} - -int ExceptionState::tp_traverse(visitproc visit, void* arg) noexcept -{ - Py_VISIT(this->exc_state.exc_value); -#if !GREENLET_PY311 - Py_VISIT(this->exc_state.exc_type); - Py_VISIT(this->exc_state.exc_traceback); -#endif - return 0; -} - -void ExceptionState::tp_clear() noexcept -{ - Py_CLEAR(this->exc_state.exc_value); -#if !GREENLET_PY311 - Py_CLEAR(this->exc_state.exc_type); - Py_CLEAR(this->exc_state.exc_traceback); -#endif -} - - -}; // namespace greenlet - -#endif // GREENLET_EXCEPTION_STATE_CPP diff --git a/port/lib/python3.11/site-packages/greenlet/TGreenlet.cpp b/port/lib/python3.11/site-packages/greenlet/TGreenlet.cpp deleted file mode 100644 index 4698a17..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TGreenlet.cpp +++ /dev/null @@ -1,718 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::Greenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef TGREENLET_CPP -#define TGREENLET_CPP -#include "greenlet_internal.hpp" -#include "TGreenlet.hpp" - - -#include "TGreenletGlobals.cpp" -#include "TThreadStateDestroy.cpp" - -namespace greenlet { - -Greenlet::Greenlet(PyGreenlet* p) - : Greenlet(p, StackState()) -{ -} - -Greenlet::Greenlet(PyGreenlet* p, const StackState& initial_stack) - : _self(p), stack_state(initial_stack) -{ - assert(p->pimpl == nullptr); - p->pimpl = this; -} - -Greenlet::~Greenlet() -{ - // XXX: Can't do this. tp_clear is a virtual function, and by the - // time we're here, we've sliced off our child classes. - //this->tp_clear(); - this->_self->pimpl = nullptr; -} - -bool -Greenlet::force_slp_switch_error() const noexcept -{ - return false; -} - -void -Greenlet::release_args() -{ - this->switch_args.CLEAR(); -} - -/** - * CAUTION: This will allocate memory and may trigger garbage - * collection and arbitrary Python code. - */ -OwnedObject -Greenlet::throw_GreenletExit_during_dealloc(const ThreadState& UNUSED(current_thread_state)) -{ - // If we're killed because we lost all references in the - // middle of a switch, that's ok. Don't reset the args/kwargs, - // we still want to pass them to the parent. - PyErr_SetString(mod_globs->PyExc_GreenletExit, - "Killing the greenlet because all references have vanished."); - // To get here it had to have run before - return this->g_switch(); -} - -inline void -Greenlet::slp_restore_state() noexcept -{ -#ifdef SLP_BEFORE_RESTORE_STATE - SLP_BEFORE_RESTORE_STATE(); -#endif - this->stack_state.copy_heap_to_stack( - this->thread_state()->borrow_current()->stack_state); -} - - -inline int -Greenlet::slp_save_state(char *const stackref) noexcept -{ - // XXX: This used to happen in the middle, before saving, but - // after finding the next owner. Does that matter? This is - // only defined for Sparc/GCC where it flushes register - // windows to the stack (I think) -#ifdef SLP_BEFORE_SAVE_STATE - SLP_BEFORE_SAVE_STATE(); -#endif - return this->stack_state.copy_stack_to_heap(stackref, - this->thread_state()->borrow_current()->stack_state); -} - -/** - * CAUTION: This will allocate memory and may trigger garbage - * collection and arbitrary Python code. - */ -OwnedObject -Greenlet::on_switchstack_or_initialstub_failure( - Greenlet* target, - const Greenlet::switchstack_result_t& err, - const bool target_was_me, - const bool was_initial_stub) -{ - // If we get here, either g_initialstub() - // failed, or g_switchstack() failed. Either one of those - // cases SHOULD leave us in the original greenlet with a valid stack. - if (!PyErr_Occurred()) { - PyErr_SetString( - PyExc_SystemError, - was_initial_stub - ? "Failed to switch stacks into a greenlet for the first time." - : "Failed to switch stacks into a running greenlet."); - } - this->release_args(); - - if (target && !target_was_me) { - target->murder_in_place(); - } - - assert(!err.the_new_current_greenlet); - assert(!err.origin_greenlet); - return OwnedObject(); - -} - -OwnedGreenlet -Greenlet::g_switchstack_success() noexcept -{ - PyThreadState* tstate = PyThreadState_GET(); - // restore the saved state - this->python_state >> tstate; - this->exception_state >> tstate; - - // The thread state hasn't been changed yet. - ThreadState* thread_state = this->thread_state(); - OwnedGreenlet result(thread_state->get_current()); - thread_state->set_current(this->self()); - //assert(thread_state->borrow_current().borrow() == this->_self); - return result; -} - -Greenlet::switchstack_result_t -Greenlet::g_switchstack(void) -{ - // if any of these assertions fail, it's likely because we - // switched away and tried to switch back to us. Early stages of - // switching are not reentrant because we re-use ``this->args()``. - // Switching away would happen if we trigger a garbage collection - // (by just using some Python APIs that happen to allocate Python - // objects) and some garbage had weakref callbacks or __del__ that - // switches (people don't write code like that by hand, but with - // gevent it's possible without realizing it) - assert(this->args() || PyErr_Occurred()); - { /* save state */ - if (this->thread_state()->is_current(this->self())) { - // Hmm, nothing to do. - // TODO: Does this bypass trace events that are - // important? - return switchstack_result_t(0, - this, this->thread_state()->borrow_current()); - } - BorrowedGreenlet current = this->thread_state()->borrow_current(); - PyThreadState* tstate = PyThreadState_GET(); - - current->python_state << tstate; - current->exception_state << tstate; - this->python_state.will_switch_from(tstate); - switching_thread_state = this; - current->expose_frames(); - } - assert(this->args() || PyErr_Occurred()); - // If this is the first switch into a greenlet, this will - // return twice, once with 1 in the new greenlet, once with 0 - // in the origin. - int err; - if (this->force_slp_switch_error()) { - err = -1; - } - else { - err = slp_switch(); - } - - if (err < 0) { /* error */ - // Tested by - // test_greenlet.TestBrokenGreenlets.test_failed_to_slp_switch_into_running - // - // It's not clear if it's worth trying to clean up and - // continue here. Failing to switch stacks is a big deal which - // may not be recoverable (who knows what state the stack is in). - // Also, we've stolen references in preparation for calling - // ``g_switchstack_success()`` and we don't have a clean - // mechanism for backing that all out. - Py_FatalError("greenlet: Failed low-level slp_switch(). The stack is probably corrupt."); - } - - // No stack-based variables are valid anymore. - - // But the global is volatile so we can reload it without the - // compiler caching it from earlier. - Greenlet* greenlet_that_switched_in = switching_thread_state; // aka this - switching_thread_state = nullptr; - // except that no stack variables are valid, we would: - // assert(this == greenlet_that_switched_in); - - // switchstack success is where we restore the exception state, - // etc. It returns the origin greenlet because its convenient. - - OwnedGreenlet origin = greenlet_that_switched_in->g_switchstack_success(); - assert(greenlet_that_switched_in->args() || PyErr_Occurred()); - return switchstack_result_t(err, greenlet_that_switched_in, origin); -} - - -inline void -Greenlet::check_switch_allowed() const -{ - // TODO: Make this take a parameter of the current greenlet, - // or current main greenlet, to make the check for - // cross-thread switching cheaper. Surely somewhere up the - // call stack we've already accessed the thread local variable. - - // We expect to always have a main greenlet now; accessing the thread state - // created it. However, if we get here and cleanup has already - // begun because we're a greenlet that was running in a - // (now dead) thread, these invariants will not hold true. In - // fact, accessing `this->thread_state` may not even be possible. - - // If the thread this greenlet was running in is dead, - // we'll still have a reference to a main greenlet, but the - // thread state pointer we have is bogus. - // TODO: Give the objects an API to determine if they belong - // to a dead thread. - - const BorrowedMainGreenlet main_greenlet = this->find_main_greenlet_in_lineage(); - - if (!main_greenlet) { - throw PyErrOccurred(mod_globs->PyExc_GreenletError, - "cannot switch to a garbage collected greenlet"); - } - - if (!main_greenlet->thread_state()) { - throw PyErrOccurred(mod_globs->PyExc_GreenletError, - "cannot switch to a different thread (which happens to have exited)"); - } - - // The main greenlet we found was from the .parent lineage. - // That may or may not have any relationship to the main - // greenlet of the running thread. We can't actually access - // our this->thread_state members to try to check that, - // because it could be in the process of getting destroyed, - // but setting the main_greenlet->thread_state member to NULL - // may not be visible yet. So we need to check against the - // current thread state (once the cheaper checks are out of - // the way) - const BorrowedMainGreenlet current_main_greenlet = GET_THREAD_STATE().state().borrow_main_greenlet(); - if ( - // lineage main greenlet is not this thread's greenlet - current_main_greenlet != main_greenlet - || ( - // atteched to some thread - this->main_greenlet() - // XXX: Same condition as above. Was this supposed to be - // this->main_greenlet()? - && current_main_greenlet != main_greenlet) - // switching into a known dead thread (XXX: which, if we get here, - // is bad, because we just accessed the thread state, which is - // gone!) - || (!current_main_greenlet->thread_state())) { - // CAUTION: This may trigger memory allocations, gc, and - // arbitrary Python code. - throw PyErrOccurred( - mod_globs->PyExc_GreenletError, - "Cannot switch to a different thread\n\tCurrent: %R\n\tExpected: %R", - current_main_greenlet, main_greenlet); - } -} - -const OwnedObject -Greenlet::context() const -{ - using greenlet::PythonStateContext; - OwnedObject result; - - if (this->is_currently_running_in_some_thread()) { - /* Currently running greenlet: context is stored in the thread state, - not the greenlet object. */ - if (GET_THREAD_STATE().state().is_current(this->self())) { - result = PythonStateContext::context(PyThreadState_GET()); - } - else { - throw ValueError( - "cannot get context of a " - "greenlet that is running in a different thread"); - } - } - else { - /* Greenlet is not running: just return context. */ - result = this->python_state.context(); - } - if (!result) { - result = OwnedObject::None(); - } - return result; -} - - -void -Greenlet::context(BorrowedObject given) -{ - using greenlet::PythonStateContext; - if (!given) { - throw AttributeError("can't delete context attribute"); - } - if (given.is_None()) { - /* "Empty context" is stored as NULL, not None. */ - given = nullptr; - } - - //checks type, incrs refcnt - greenlet::refs::OwnedContext context(given); - PyThreadState* tstate = PyThreadState_GET(); - - if (this->is_currently_running_in_some_thread()) { - if (!GET_THREAD_STATE().state().is_current(this->self())) { - throw ValueError("cannot set context of a greenlet" - " that is running in a different thread"); - } - - /* Currently running greenlet: context is stored in the thread state, - not the greenlet object. */ - OwnedObject octx = OwnedObject::consuming(PythonStateContext::context(tstate)); - PythonStateContext::context(tstate, context.relinquish_ownership()); - } - else { - /* Greenlet is not running: just set context. Note that the - greenlet may be dead.*/ - this->python_state.context() = context; - } -} - -/** - * CAUTION: May invoke arbitrary Python code. - * - * Figure out what the result of ``greenlet.switch(arg, kwargs)`` - * should be and transfers ownership of it to the left-hand-side. - * - * If switch() was just passed an arg tuple, then we'll just return that. - * If only keyword arguments were passed, then we'll pass the keyword - * argument dict. Otherwise, we'll create a tuple of (args, kwargs) and - * return both. - * - * CAUTION: This may allocate a new tuple object, which may - * cause the Python garbage collector to run, which in turn may - * run arbitrary Python code that switches. - */ -OwnedObject& operator<<=(OwnedObject& lhs, greenlet::SwitchingArgs& rhs) noexcept -{ - // Because this may invoke arbitrary Python code, which could - // result in switching back to us, we need to get the - // arguments locally on the stack. - assert(rhs); - OwnedObject args = rhs.args(); - OwnedObject kwargs = rhs.kwargs(); - rhs.CLEAR(); - // We shouldn't be called twice for the same switch. - assert(args || kwargs); - assert(!rhs); - - if (!kwargs) { - lhs = args; - } - else if (!PyDict_Size(kwargs.borrow())) { - lhs = args; - } - else if (!PySequence_Length(args.borrow())) { - lhs = kwargs; - } - else { - // PyTuple_Pack allocates memory, may GC, may run arbitrary - // Python code. - lhs = OwnedObject::consuming(PyTuple_Pack(2, args.borrow(), kwargs.borrow())); - } - return lhs; -} - -static OwnedObject -g_handle_exit(const OwnedObject& greenlet_result) -{ - if (!greenlet_result && mod_globs->PyExc_GreenletExit.PyExceptionMatches()) { - /* catch and ignore GreenletExit */ - PyErrFetchParam val; - PyErr_Fetch(PyErrFetchParam(), val, PyErrFetchParam()); - if (!val) { - return OwnedObject::None(); - } - return OwnedObject(val); - } - - if (greenlet_result) { - // package the result into a 1-tuple - // PyTuple_Pack increments the reference of its arguments, - // so we always need to decref the greenlet result; - // the owner will do that. - return OwnedObject::consuming(PyTuple_Pack(1, greenlet_result.borrow())); - } - - return OwnedObject(); -} - - - -/** - * May run arbitrary Python code. - */ -OwnedObject -Greenlet::g_switch_finish(const switchstack_result_t& err) -{ - assert(err.the_new_current_greenlet == this); - - ThreadState& state = *this->thread_state(); - // Because calling the trace function could do arbitrary things, - // including switching away from this greenlet and then maybe - // switching back, we need to capture the arguments now so that - // they don't change. - OwnedObject result; - if (this->args()) { - result <<= this->args(); - } - else { - assert(PyErr_Occurred()); - } - assert(!this->args()); - try { - // Our only caller handles the bad error case - assert(err.status >= 0); - assert(state.borrow_current() == this->self()); - if (OwnedObject tracefunc = state.get_tracefunc()) { - assert(result || PyErr_Occurred()); - g_calltrace(tracefunc, - result ? mod_globs->event_switch : mod_globs->event_throw, - err.origin_greenlet, - this->self()); - } - // The above could have invoked arbitrary Python code, but - // it couldn't switch back to this object and *also* - // throw an exception, so the args won't have changed. - - if (PyErr_Occurred()) { - // We get here if we fell of the end of the run() function - // raising an exception. The switch itself was - // successful, but the function raised. - // valgrind reports that memory allocated here can still - // be reached after a test run. - throw PyErrOccurred::from_current(); - } - return result; - } - catch (const PyErrOccurred&) { - /* Turn switch errors into switch throws */ - /* Turn trace errors into switch throws */ - this->release_args(); - throw; - } -} - -void -Greenlet::g_calltrace(const OwnedObject& tracefunc, - const greenlet::refs::ImmortalEventName& event, - const BorrowedGreenlet& origin, - const BorrowedGreenlet& target) -{ - PyErrPieces saved_exc; - try { - TracingGuard tracing_guard; - // TODO: We have saved the active exception (if any) that's - // about to be raised. In the 'throw' case, we could provide - // the exception to the tracefunction, which seems very helpful. - tracing_guard.CallTraceFunction(tracefunc, event, origin, target); - } - catch (const PyErrOccurred&) { - // In case of exceptions trace function is removed, - // and any existing exception is replaced with the tracing - // exception. - GET_THREAD_STATE().state().set_tracefunc(Py_None); - throw; - } - - saved_exc.PyErrRestore(); - assert( - (event == mod_globs->event_throw && PyErr_Occurred()) - || (event == mod_globs->event_switch && !PyErr_Occurred()) - ); -} - -void -Greenlet::murder_in_place() -{ - if (this->active()) { - assert(!this->is_currently_running_in_some_thread()); - this->deactivate_and_free(); - } -} - -inline void -Greenlet::deactivate_and_free() -{ - if (!this->active()) { - return; - } - // Throw away any saved stack. - this->stack_state = StackState(); - assert(!this->stack_state.active()); - // Throw away any Python references. - // We're holding a borrowed reference to the last - // frame we executed. Since we borrowed it, the - // normal traversal, clear, and dealloc functions - // ignore it, meaning it leaks. (The thread state - // object can't find it to clear it when that's - // deallocated either, because by definition if we - // got an object on this list, it wasn't - // running and the thread state doesn't have - // this frame.) - // So here, we *do* clear it. - this->python_state.tp_clear(true); -} - -bool -Greenlet::belongs_to_thread(const ThreadState* thread_state) const -{ - if (!this->thread_state() // not running anywhere, or thread - // exited - || !thread_state) { // same, or there is no thread state. - return false; - } - return true; -} - - -void -Greenlet::deallocing_greenlet_in_thread(const ThreadState* current_thread_state) -{ - /* Cannot raise an exception to kill the greenlet if - it is not running in the same thread! */ - if (this->belongs_to_thread(current_thread_state)) { - assert(current_thread_state); - // To get here it had to have run before - /* Send the greenlet a GreenletExit exception. */ - - // We don't care about the return value, only whether an - // exception happened. - this->throw_GreenletExit_during_dealloc(*current_thread_state); - return; - } - - // Not the same thread! Temporarily save the greenlet - // into its thread's deleteme list, *if* it exists. - // If that thread has already exited, and processed its pending - // cleanup, we'll never be able to clean everything up: we won't - // be able to raise an exception. - // That's mostly OK! Since we can't add it to a list, our refcount - // won't increase, and we'll go ahead with the DECREFs later. - ThreadState *const thread_state = this->thread_state(); - if (thread_state) { - thread_state->delete_when_thread_running(this->self()); - } - else { - // The thread is dead, we can't raise an exception. - // We need to make it look non-active, though, so that dealloc - // finishes killing it. - this->deactivate_and_free(); - } - return; -} - - -int -Greenlet::tp_traverse(visitproc visit, void* arg) -{ - - int result; - if ((result = this->exception_state.tp_traverse(visit, arg)) != 0) { - return result; - } - //XXX: This is ugly. But so is handling everything having to do - //with the top frame. - bool visit_top_frame = this->was_running_in_dead_thread(); - // When true, the thread is dead. Our implicit weak reference to the - // frame is now all that's left; we consider ourselves to - // strongly own it now. - if ((result = this->python_state.tp_traverse(visit, arg, visit_top_frame)) != 0) { - return result; - } - return 0; -} - -int -Greenlet::tp_clear() -{ - bool own_top_frame = this->was_running_in_dead_thread(); - this->exception_state.tp_clear(); - this->python_state.tp_clear(own_top_frame); - return 0; -} - -bool Greenlet::is_currently_running_in_some_thread() const -{ - return this->stack_state.active() && !this->python_state.top_frame(); -} - -#if GREENLET_PY312 -void GREENLET_NOINLINE(Greenlet::expose_frames)() -{ - if (!this->python_state.top_frame()) { - return; - } - - _PyInterpreterFrame* last_complete_iframe = nullptr; - _PyInterpreterFrame* iframe = this->python_state.top_frame()->f_frame; - while (iframe) { - // We must make a copy before looking at the iframe contents, - // since iframe might point to a portion of the greenlet's C stack - // that was spilled when switching greenlets. - _PyInterpreterFrame iframe_copy; - this->stack_state.copy_from_stack(&iframe_copy, iframe, sizeof(*iframe)); - if (!_PyFrame_IsIncomplete(&iframe_copy)) { - // If the iframe were OWNED_BY_CSTACK then it would always be - // incomplete. Since it's not incomplete, it's not on the C stack - // and we can access it through the original `iframe` pointer - // directly. This is important since GetFrameObject might - // lazily _create_ the frame object and we don't want the - // interpreter to lose track of it. - assert(iframe_copy.owner != FRAME_OWNED_BY_CSTACK); - - // We really want to just write: - // PyFrameObject* frame = _PyFrame_GetFrameObject(iframe); - // but _PyFrame_GetFrameObject calls _PyFrame_MakeAndSetFrameObject - // which is not a visible symbol in libpython. The easiest - // way to get a public function to call it is using - // PyFrame_GetBack, which is defined as follows: - // assert(frame != NULL); - // assert(!_PyFrame_IsIncomplete(frame->f_frame)); - // PyFrameObject *back = frame->f_back; - // if (back == NULL) { - // _PyInterpreterFrame *prev = frame->f_frame->previous; - // prev = _PyFrame_GetFirstComplete(prev); - // if (prev) { - // back = _PyFrame_GetFrameObject(prev); - // } - // } - // return (PyFrameObject*)Py_XNewRef(back); - if (!iframe->frame_obj) { - PyFrameObject dummy_frame; - _PyInterpreterFrame dummy_iframe; - dummy_frame.f_back = nullptr; - dummy_frame.f_frame = &dummy_iframe; - // force the iframe to be considered complete without - // needing to check its code object: - dummy_iframe.owner = FRAME_OWNED_BY_GENERATOR; - dummy_iframe.previous = iframe; - assert(!_PyFrame_IsIncomplete(&dummy_iframe)); - // Drop the returned reference immediately; the iframe - // continues to hold a strong reference - Py_XDECREF(PyFrame_GetBack(&dummy_frame)); - assert(iframe->frame_obj); - } - - // This is a complete frame, so make the last one of those we saw - // point at it, bypassing any incomplete frames (which may have - // been on the C stack) in between the two. We're overwriting - // last_complete_iframe->previous and need that to be reversible, - // so we store the original previous ptr in the frame object - // (which we must have created on a previous iteration through - // this loop). The frame object has a bunch of storage that is - // only used when its iframe is OWNED_BY_FRAME_OBJECT, which only - // occurs when the frame object outlives the frame's execution, - // which can't have happened yet because the frame is currently - // executing as far as the interpreter is concerned. So, we can - // reuse it for our own purposes. - assert(iframe->owner == FRAME_OWNED_BY_THREAD - || iframe->owner == FRAME_OWNED_BY_GENERATOR); - if (last_complete_iframe) { - assert(last_complete_iframe->frame_obj); - memcpy(&last_complete_iframe->frame_obj->_f_frame_data[0], - &last_complete_iframe->previous, sizeof(void *)); - last_complete_iframe->previous = iframe; - } - last_complete_iframe = iframe; - } - // Frames that are OWNED_BY_FRAME_OBJECT are linked via the - // frame's f_back while all others are linked via the iframe's - // previous ptr. Since all the frames we traverse are running - // as far as the interpreter is concerned, we don't have to - // worry about the OWNED_BY_FRAME_OBJECT case. - iframe = iframe_copy.previous; - } - - // Give the outermost complete iframe a null previous pointer to - // account for any potential incomplete/C-stack iframes between it - // and the actual top-of-stack - if (last_complete_iframe) { - assert(last_complete_iframe->frame_obj); - memcpy(&last_complete_iframe->frame_obj->_f_frame_data[0], - &last_complete_iframe->previous, sizeof(void *)); - last_complete_iframe->previous = nullptr; - } -} -#else -void Greenlet::expose_frames() -{ - -} -#endif - -}; // namespace greenlet -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/TGreenlet.hpp b/port/lib/python3.11/site-packages/greenlet/TGreenlet.hpp deleted file mode 100644 index 512f7fb..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TGreenlet.hpp +++ /dev/null @@ -1,813 +0,0 @@ -#ifndef GREENLET_GREENLET_HPP -#define GREENLET_GREENLET_HPP -/* - * Declarations of the core data structures. -*/ - -#define PY_SSIZE_T_CLEAN -#include - -#include "greenlet_compiler_compat.hpp" -#include "greenlet_refs.hpp" -#include "greenlet_cpython_compat.hpp" -#include "greenlet_allocator.hpp" - -using greenlet::refs::OwnedObject; -using greenlet::refs::OwnedGreenlet; -using greenlet::refs::OwnedMainGreenlet; -using greenlet::refs::BorrowedGreenlet; - -#if PY_VERSION_HEX < 0x30B00A6 -# define _PyCFrame CFrame -# define _PyInterpreterFrame _interpreter_frame -#endif - -#if GREENLET_PY312 -# define Py_BUILD_CORE -# include "internal/pycore_frame.h" -#endif - -// XXX: TODO: Work to remove all virtual functions -// for speed of calling and size of objects (no vtable). -// One pattern is the Curiously Recurring Template -namespace greenlet -{ - class ExceptionState - { - private: - G_NO_COPIES_OF_CLS(ExceptionState); - - // Even though these are borrowed objects, we actually own - // them, when they're not null. - // XXX: Express that in the API. - private: - _PyErr_StackItem* exc_info; - _PyErr_StackItem exc_state; - public: - ExceptionState(); - void operator<<(const PyThreadState *const tstate) noexcept; - void operator>>(PyThreadState* tstate) noexcept; - void clear() noexcept; - - int tp_traverse(visitproc visit, void* arg) noexcept; - void tp_clear() noexcept; - }; - - template - void operator<<(const PyThreadState *const tstate, T& exc); - - class PythonStateContext - { - protected: - greenlet::refs::OwnedContext _context; - public: - inline const greenlet::refs::OwnedContext& context() const - { - return this->_context; - } - inline greenlet::refs::OwnedContext& context() - { - return this->_context; - } - - inline void tp_clear() - { - this->_context.CLEAR(); - } - - template - inline static PyObject* context(T* tstate) - { - return tstate->context; - } - - template - inline static void context(T* tstate, PyObject* new_context) - { - tstate->context = new_context; - tstate->context_ver++; - } - }; - class SwitchingArgs; - class PythonState : public PythonStateContext - { - public: - typedef greenlet::refs::OwnedReference OwnedFrame; - private: - G_NO_COPIES_OF_CLS(PythonState); - // We own this if we're suspended (although currently we don't - // tp_traverse into it; that's a TODO). If we're running, it's - // empty. If we get deallocated and *still* have a frame, it - // won't be reachable from the place that normally decref's - // it, so we need to do it (hence owning it). - OwnedFrame _top_frame; -#if GREENLET_USE_CFRAME - _PyCFrame* cframe; - int use_tracing; -#endif -#if GREENLET_PY312 - int py_recursion_depth; - int c_recursion_depth; -#else - int recursion_depth; -#endif -#if GREENLET_PY313 - PyObject *delete_later; -#else - int trash_delete_nesting; -#endif -#if GREENLET_PY311 - _PyInterpreterFrame* current_frame; - _PyStackChunk* datastack_chunk; - PyObject** datastack_top; - PyObject** datastack_limit; -#endif - // The PyInterpreterFrame list on 3.12+ contains some entries that are - // on the C stack, which can't be directly accessed while a greenlet is - // suspended. In order to keep greenlet gr_frame introspection working, - // we adjust stack switching to rewrite the interpreter frame list - // to skip these C-stack frames; we call this "exposing" the greenlet's - // frames because it makes them valid to work with in Python. Then when - // the greenlet is resumed we need to remember to reverse the operation - // we did. The C-stack frames are "entry frames" which are a low-level - // interpreter detail; they're not needed for introspection, but do - // need to be present for the eval loop to work. - void unexpose_frames(); - - public: - - PythonState(); - // You can use this for testing whether we have a frame - // or not. It returns const so they can't modify it. - const OwnedFrame& top_frame() const noexcept; - - inline void operator<<(const PyThreadState *const tstate) noexcept; - inline void operator>>(PyThreadState* tstate) noexcept; - void clear() noexcept; - - int tp_traverse(visitproc visit, void* arg, bool visit_top_frame) noexcept; - void tp_clear(bool own_top_frame) noexcept; - void set_initial_state(const PyThreadState* const tstate) noexcept; -#if GREENLET_USE_CFRAME - void set_new_cframe(_PyCFrame& frame) noexcept; -#endif - - void may_switch_away() noexcept; - inline void will_switch_from(PyThreadState *const origin_tstate) noexcept; - void did_finish(PyThreadState* tstate) noexcept; - }; - - class StackState - { - // By having only plain C (POD) members, no virtual functions - // or bases, we get a trivial assignment operator generated - // for us. However, that's not safe since we do manage memory. - // So we declare an assignment operator that only works if we - // don't have any memory allocated. (We don't use - // std::shared_ptr for reference counting just to keep this - // object small) - private: - char* _stack_start; - char* stack_stop; - char* stack_copy; - intptr_t _stack_saved; - StackState* stack_prev; - inline int copy_stack_to_heap_up_to(const char* const stop) noexcept; - inline void free_stack_copy() noexcept; - - public: - /** - * Creates a started, but inactive, state, using *current* - * as the previous. - */ - StackState(void* mark, StackState& current); - /** - * Creates an inactive, unstarted, state. - */ - StackState(); - ~StackState(); - StackState(const StackState& other); - StackState& operator=(const StackState& other); - inline void copy_heap_to_stack(const StackState& current) noexcept; - inline int copy_stack_to_heap(char* const stackref, const StackState& current) noexcept; - inline bool started() const noexcept; - inline bool main() const noexcept; - inline bool active() const noexcept; - inline void set_active() noexcept; - inline void set_inactive() noexcept; - inline intptr_t stack_saved() const noexcept; - inline char* stack_start() const noexcept; - static inline StackState make_main() noexcept; -#ifdef GREENLET_USE_STDIO - friend std::ostream& operator<<(std::ostream& os, const StackState& s); -#endif - - // Fill in [dest, dest + n) with the values that would be at - // [src, src + n) while this greenlet is running. This is like memcpy - // except that if the greenlet is suspended it accounts for the portion - // of the greenlet's stack that was spilled to the heap. `src` may - // be on this greenlet's stack, or on the heap, but not on a different - // greenlet's stack. - void copy_from_stack(void* dest, const void* src, size_t n) const; - }; -#ifdef GREENLET_USE_STDIO - std::ostream& operator<<(std::ostream& os, const StackState& s); -#endif - - class SwitchingArgs - { - private: - G_NO_ASSIGNMENT_OF_CLS(SwitchingArgs); - // If args and kwargs are both false (NULL), this is a *throw*, not a - // switch. PyErr_... must have been called already. - OwnedObject _args; - OwnedObject _kwargs; - public: - - SwitchingArgs() - {} - - SwitchingArgs(const OwnedObject& args, const OwnedObject& kwargs) - : _args(args), - _kwargs(kwargs) - {} - - SwitchingArgs(const SwitchingArgs& other) - : _args(other._args), - _kwargs(other._kwargs) - {} - - const OwnedObject& args() - { - return this->_args; - } - - const OwnedObject& kwargs() - { - return this->_kwargs; - } - - /** - * Moves ownership from the argument to this object. - */ - SwitchingArgs& operator<<=(SwitchingArgs& other) - { - if (this != &other) { - this->_args = other._args; - this->_kwargs = other._kwargs; - other.CLEAR(); - } - return *this; - } - - /** - * Acquires ownership of the argument (consumes the reference). - */ - SwitchingArgs& operator<<=(PyObject* args) - { - this->_args = OwnedObject::consuming(args); - this->_kwargs.CLEAR(); - return *this; - } - - /** - * Acquires ownership of the argument. - * - * Sets the args to be the given value; clears the kwargs. - */ - SwitchingArgs& operator<<=(OwnedObject& args) - { - assert(&args != &this->_args); - this->_args = args; - this->_kwargs.CLEAR(); - args.CLEAR(); - - return *this; - } - - explicit operator bool() const noexcept - { - return this->_args || this->_kwargs; - } - - inline void CLEAR() - { - this->_args.CLEAR(); - this->_kwargs.CLEAR(); - } - - const std::string as_str() const noexcept - { - return PyUnicode_AsUTF8( - OwnedObject::consuming( - PyUnicode_FromFormat( - "SwitchingArgs(args=%R, kwargs=%R)", - this->_args.borrow(), - this->_kwargs.borrow() - ) - ).borrow() - ); - } - }; - - class ThreadState; - - class UserGreenlet; - class MainGreenlet; - - class Greenlet - { - private: - G_NO_COPIES_OF_CLS(Greenlet); - PyGreenlet* const _self; - private: - // XXX: Work to remove these. - friend class ThreadState; - friend class UserGreenlet; - friend class MainGreenlet; - protected: - ExceptionState exception_state; - SwitchingArgs switch_args; - StackState stack_state; - PythonState python_state; - Greenlet(PyGreenlet* p, const StackState& initial_state); - public: - // This constructor takes ownership of the PyGreenlet, by - // setting ``p->pimpl = this;``. - Greenlet(PyGreenlet* p); - virtual ~Greenlet(); - - const OwnedObject context() const; - - // You MUST call this _very_ early in the switching process to - // prepare anything that may need prepared. This might perform - // garbage collections or otherwise run arbitrary Python code. - // - // One specific use of it is for Python 3.11+, preventing - // running arbitrary code at unsafe times. See - // PythonState::may_switch_away(). - inline void may_switch_away() - { - this->python_state.may_switch_away(); - } - - inline void context(refs::BorrowedObject new_context); - - inline SwitchingArgs& args() - { - return this->switch_args; - } - - virtual const refs::BorrowedMainGreenlet main_greenlet() const = 0; - - inline intptr_t stack_saved() const noexcept - { - return this->stack_state.stack_saved(); - } - - // This is used by the macro SLP_SAVE_STATE to compute the - // difference in stack sizes. It might be nice to handle the - // computation ourself, but the type of the result - // varies by platform, so doing it in the macro is the - // simplest way. - inline const char* stack_start() const noexcept - { - return this->stack_state.stack_start(); - } - - virtual OwnedObject throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state); - virtual OwnedObject g_switch() = 0; - /** - * Force the greenlet to appear dead. Used when it's not - * possible to throw an exception into a greenlet anymore. - * - * This losses access to the thread state and the main greenlet. - */ - virtual void murder_in_place(); - - /** - * Called when somebody notices we were running in a dead - * thread to allow cleaning up resources (because we can't - * raise GreenletExit into it anymore). - * This is very similar to ``murder_in_place()``, except that - * it DOES NOT lose the main greenlet or thread state. - */ - inline void deactivate_and_free(); - - - // Called when some thread wants to deallocate a greenlet - // object. - // The thread may or may not be the same thread the greenlet - // was running in. - // The thread state will be null if the thread the greenlet - // was running in was known to have exited. - void deallocing_greenlet_in_thread(const ThreadState* current_state); - - // Must be called on 3.12+ before exposing a suspended greenlet's - // frames to user code. This rewrites the linked list of interpreter - // frames to skip the ones that are being stored on the C stack (which - // can't be safely accessed while the greenlet is suspended because - // that stack space might be hosting a different greenlet), and - // sets PythonState::frames_were_exposed so we remember to restore - // the original list before resuming the greenlet. The C-stack frames - // are a low-level interpreter implementation detail; while they're - // important to the bytecode eval loop, they're superfluous for - // introspection purposes. - void expose_frames(); - - - // TODO: Figure out how to make these non-public. - inline void slp_restore_state() noexcept; - inline int slp_save_state(char *const stackref) noexcept; - - inline bool is_currently_running_in_some_thread() const; - virtual bool belongs_to_thread(const ThreadState* state) const; - - inline bool started() const - { - return this->stack_state.started(); - } - inline bool active() const - { - return this->stack_state.active(); - } - inline bool main() const - { - return this->stack_state.main(); - } - virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const = 0; - - virtual const OwnedGreenlet parent() const = 0; - virtual void parent(const refs::BorrowedObject new_parent) = 0; - - inline const PythonState::OwnedFrame& top_frame() - { - return this->python_state.top_frame(); - } - - virtual const OwnedObject& run() const = 0; - virtual void run(const refs::BorrowedObject nrun) = 0; - - - virtual int tp_traverse(visitproc visit, void* arg); - virtual int tp_clear(); - - - // Return the thread state that the greenlet is running in, or - // null if the greenlet is not running or the thread is known - // to have exited. - virtual ThreadState* thread_state() const noexcept = 0; - - // Return true if the greenlet is known to have been running - // (active) in a thread that has now exited. - virtual bool was_running_in_dead_thread() const noexcept = 0; - - // Return a borrowed greenlet that is the Python object - // this object represents. - inline BorrowedGreenlet self() const noexcept - { - return BorrowedGreenlet(this->_self); - } - - // For testing. If this returns true, we should pretend that - // slp_switch() failed. - virtual bool force_slp_switch_error() const noexcept; - - protected: - inline void release_args(); - - // The functions that must not be inlined are declared virtual. - // We also mark them as protected, not private, so that the - // compiler is forced to call them through a function pointer. - // (A sufficiently smart compiler could directly call a private - // virtual function since it can never be overridden in a - // subclass). - - // Also TODO: Switch away from integer error codes and to enums, - // or throw exceptions when possible. - struct switchstack_result_t - { - int status; - Greenlet* the_new_current_greenlet; - OwnedGreenlet origin_greenlet; - - switchstack_result_t() - : status(0), - the_new_current_greenlet(nullptr) - {} - - switchstack_result_t(int err) - : status(err), - the_new_current_greenlet(nullptr) - {} - - switchstack_result_t(int err, Greenlet* state, OwnedGreenlet& origin) - : status(err), - the_new_current_greenlet(state), - origin_greenlet(origin) - { - } - - switchstack_result_t(int err, Greenlet* state, const BorrowedGreenlet& origin) - : status(err), - the_new_current_greenlet(state), - origin_greenlet(origin) - { - } - - switchstack_result_t(const switchstack_result_t& other) - : status(other.status), - the_new_current_greenlet(other.the_new_current_greenlet), - origin_greenlet(other.origin_greenlet) - {} - - switchstack_result_t& operator=(const switchstack_result_t& other) - { - this->status = other.status; - this->the_new_current_greenlet = other.the_new_current_greenlet; - this->origin_greenlet = other.origin_greenlet; - return *this; - } - }; - - OwnedObject on_switchstack_or_initialstub_failure( - Greenlet* target, - const switchstack_result_t& err, - const bool target_was_me=false, - const bool was_initial_stub=false); - - // Returns the previous greenlet we just switched away from. - virtual OwnedGreenlet g_switchstack_success() noexcept; - - - // Check the preconditions for switching to this greenlet; if they - // aren't met, throws PyErrOccurred. Most callers will want to - // catch this and clear the arguments - inline void check_switch_allowed() const; - class GreenletStartedWhileInPython : public std::runtime_error - { - public: - GreenletStartedWhileInPython() : std::runtime_error("") - {} - }; - - protected: - - - /** - Perform a stack switch into this greenlet. - - This temporarily sets the global variable - ``switching_thread_state`` to this greenlet; as soon as the - call to ``slp_switch`` completes, this is reset to NULL. - Consequently, this depends on the GIL. - - TODO: Adopt the stackman model and pass ``slp_switch`` a - callback function and context pointer; this eliminates the - need for global variables altogether. - - Because the stack switch happens in this function, this - function can't use its own stack (local) variables, set - before the switch, and then accessed after the switch. - - Further, you con't even access ``g_thread_state_global`` - before and after the switch from the global variable. - Because it is thread local some compilers cache it in a - register/on the stack, notably new versions of MSVC; this - breaks with strange crashes sometime later, because writing - to anything in ``g_thread_state_global`` after the switch - is actually writing to random memory. For this reason, we - call a non-inlined function to finish the operation. (XXX: - The ``/GT`` MSVC compiler argument probably fixes that.) - - It is very important that stack switch is 'atomic', i.e. no - calls into other Python code allowed (except very few that - are safe), because global variables are very fragile. (This - should no longer be the case with thread-local variables.) - - */ - // Made virtual to facilitate subclassing UserGreenlet for testing. - virtual switchstack_result_t g_switchstack(void); - -class TracingGuard -{ -private: - PyThreadState* tstate; -public: - TracingGuard() - : tstate(PyThreadState_GET()) - { - PyThreadState_EnterTracing(this->tstate); - } - - ~TracingGuard() - { - PyThreadState_LeaveTracing(this->tstate); - this->tstate = nullptr; - } - - inline void CallTraceFunction(const OwnedObject& tracefunc, - const greenlet::refs::ImmortalEventName& event, - const BorrowedGreenlet& origin, - const BorrowedGreenlet& target) - { - // TODO: This calls tracefunc(event, (origin, target)). Add a shortcut - // function for that that's specialized to avoid the Py_BuildValue - // string parsing, or start with just using "ON" format with PyTuple_Pack(2, - // origin, target). That seems like what the N format is meant - // for. - // XXX: Why does event not automatically cast back to a PyObject? - // It tries to call the "deleted constructor ImmortalEventName - // const" instead. - assert(tracefunc); - assert(event); - assert(origin); - assert(target); - greenlet::refs::NewReference retval( - PyObject_CallFunction( - tracefunc.borrow(), - "O(OO)", - event.borrow(), - origin.borrow(), - target.borrow() - )); - if (!retval) { - throw PyErrOccurred::from_current(); - } - } -}; - - static void - g_calltrace(const OwnedObject& tracefunc, - const greenlet::refs::ImmortalEventName& event, - const greenlet::refs::BorrowedGreenlet& origin, - const BorrowedGreenlet& target); - private: - OwnedObject g_switch_finish(const switchstack_result_t& err); - - }; - - class UserGreenlet : public Greenlet - { - private: - static greenlet::PythonAllocator allocator; - OwnedMainGreenlet _main_greenlet; - OwnedObject _run_callable; - OwnedGreenlet _parent; - public: - static void* operator new(size_t UNUSED(count)); - static void operator delete(void* ptr); - - UserGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent); - virtual ~UserGreenlet(); - - virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const; - virtual bool was_running_in_dead_thread() const noexcept; - virtual ThreadState* thread_state() const noexcept; - virtual OwnedObject g_switch(); - virtual const OwnedObject& run() const - { - if (this->started() || !this->_run_callable) { - throw AttributeError("run"); - } - return this->_run_callable; - } - virtual void run(const refs::BorrowedObject nrun); - - virtual const OwnedGreenlet parent() const; - virtual void parent(const refs::BorrowedObject new_parent); - - virtual const refs::BorrowedMainGreenlet main_greenlet() const; - - virtual void murder_in_place(); - virtual bool belongs_to_thread(const ThreadState* state) const; - virtual int tp_traverse(visitproc visit, void* arg); - virtual int tp_clear(); - class ParentIsCurrentGuard - { - private: - OwnedGreenlet oldparent; - UserGreenlet* greenlet; - G_NO_COPIES_OF_CLS(ParentIsCurrentGuard); - public: - ParentIsCurrentGuard(UserGreenlet* p, const ThreadState& thread_state); - ~ParentIsCurrentGuard(); - }; - virtual OwnedObject throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state); - protected: - virtual switchstack_result_t g_initialstub(void* mark); - private: - // This function isn't meant to return. - // This accepts raw pointers and the ownership of them at the - // same time. The caller should use ``inner_bootstrap(origin.relinquish_ownership())``. - void inner_bootstrap(PyGreenlet* origin_greenlet, PyObject* run); - }; - - class BrokenGreenlet : public UserGreenlet - { - private: - static greenlet::PythonAllocator allocator; - public: - bool _force_switch_error = false; - bool _force_slp_switch_error = false; - - static void* operator new(size_t UNUSED(count)); - static void operator delete(void* ptr); - BrokenGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent) - : UserGreenlet(p, the_parent) - {} - virtual ~BrokenGreenlet() - {} - - virtual switchstack_result_t g_switchstack(void); - virtual bool force_slp_switch_error() const noexcept; - - }; - - class MainGreenlet : public Greenlet - { - private: - static greenlet::PythonAllocator allocator; - refs::BorrowedMainGreenlet _self; - ThreadState* _thread_state; - G_NO_COPIES_OF_CLS(MainGreenlet); - public: - static void* operator new(size_t UNUSED(count)); - static void operator delete(void* ptr); - - MainGreenlet(refs::BorrowedMainGreenlet::PyType*, ThreadState*); - virtual ~MainGreenlet(); - - - virtual const OwnedObject& run() const; - virtual void run(const refs::BorrowedObject nrun); - - virtual const OwnedGreenlet parent() const; - virtual void parent(const refs::BorrowedObject new_parent); - - virtual const refs::BorrowedMainGreenlet main_greenlet() const; - - virtual refs::BorrowedMainGreenlet find_main_greenlet_in_lineage() const; - virtual bool was_running_in_dead_thread() const noexcept; - virtual ThreadState* thread_state() const noexcept; - void thread_state(ThreadState*) noexcept; - virtual OwnedObject g_switch(); - virtual int tp_traverse(visitproc visit, void* arg); - }; - - // Instantiate one on the stack to save the GC state, - // and then disable GC. When it goes out of scope, GC will be - // restored to its original state. Sadly, these APIs are only - // available on 3.10+; luckily, we only need them on 3.11+. -#if GREENLET_PY310 - class GCDisabledGuard - { - private: - int was_enabled = 0; - public: - GCDisabledGuard() - : was_enabled(PyGC_IsEnabled()) - { - PyGC_Disable(); - } - - ~GCDisabledGuard() - { - if (this->was_enabled) { - PyGC_Enable(); - } - } - }; -#endif - - OwnedObject& operator<<=(OwnedObject& lhs, greenlet::SwitchingArgs& rhs) noexcept; - - //TODO: Greenlet::g_switch() should call this automatically on its - //return value. As it is, the module code is calling it. - static inline OwnedObject - single_result(const OwnedObject& results) - { - if (results - && PyTuple_Check(results.borrow()) - && PyTuple_GET_SIZE(results.borrow()) == 1) { - PyObject* result = PyTuple_GET_ITEM(results.borrow(), 0); - assert(result); - return OwnedObject::owning(result); - } - return results; - } - - - static OwnedObject - g_handle_exit(const OwnedObject& greenlet_result); - - - template - void operator<<(const PyThreadState *const lhs, T& rhs) - { - rhs.operator<<(lhs); - } - -} // namespace greenlet ; - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/TGreenletGlobals.cpp b/port/lib/python3.11/site-packages/greenlet/TGreenletGlobals.cpp deleted file mode 100644 index 0087d2f..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TGreenletGlobals.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of GreenletGlobals. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_GREENLET_GLOBALS -#define T_GREENLET_GLOBALS - -#include "greenlet_refs.hpp" -#include "greenlet_exceptions.hpp" -#include "greenlet_thread_support.hpp" -#include "greenlet_internal.hpp" - -namespace greenlet { - -// This encapsulates what were previously module global "constants" -// established at init time. -// This is a step towards Python3 style module state that allows -// reloading. -// -// In an earlier iteration of this code, we used placement new to be -// able to allocate this object statically still, so that references -// to its members don't incur an extra pointer indirection. -// But under some scenarios, that could result in crashes at -// shutdown because apparently the destructor was getting run twice? -class GreenletGlobals -{ - -public: - const greenlet::refs::ImmortalEventName event_switch; - const greenlet::refs::ImmortalEventName event_throw; - const greenlet::refs::ImmortalException PyExc_GreenletError; - const greenlet::refs::ImmortalException PyExc_GreenletExit; - const greenlet::refs::ImmortalObject empty_tuple; - const greenlet::refs::ImmortalObject empty_dict; - const greenlet::refs::ImmortalString str_run; - Mutex* const thread_states_to_destroy_lock; - greenlet::cleanup_queue_t thread_states_to_destroy; - - GreenletGlobals() : - event_switch("switch"), - event_throw("throw"), - PyExc_GreenletError("greenlet.error"), - PyExc_GreenletExit("greenlet.GreenletExit", PyExc_BaseException), - empty_tuple(Require(PyTuple_New(0))), - empty_dict(Require(PyDict_New())), - str_run("run"), - thread_states_to_destroy_lock(new Mutex()) - {} - - ~GreenletGlobals() - { - // This object is (currently) effectively immortal, and not - // just because of those placement new tricks; if we try to - // deallocate the static object we allocated, and overwrote, - // we would be doing so at C++ teardown time, which is after - // the final Python GIL is released, and we can't use the API - // then. - // (The members will still be destructed, but they also don't - // do any deallocation.) - } - - void queue_to_destroy(ThreadState* ts) const - { - // we're currently accessed through a static const object, - // implicitly marking our members as const, so code can't just - // call push_back (or pop_back) without casting away the - // const. - // - // Do that for callers. - greenlet::cleanup_queue_t& q = const_cast(this->thread_states_to_destroy); - q.push_back(ts); - } - - ThreadState* take_next_to_destroy() const - { - greenlet::cleanup_queue_t& q = const_cast(this->thread_states_to_destroy); - ThreadState* result = q.back(); - q.pop_back(); - return result; - } -}; - -}; // namespace greenlet - -static const greenlet::GreenletGlobals* mod_globs; - -#endif // T_GREENLET_GLOBALS diff --git a/port/lib/python3.11/site-packages/greenlet/TMainGreenlet.cpp b/port/lib/python3.11/site-packages/greenlet/TMainGreenlet.cpp deleted file mode 100644 index a2a9cfe..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TMainGreenlet.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::MainGreenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_MAIN_GREENLET_CPP -#define T_MAIN_GREENLET_CPP - -#include "TGreenlet.hpp" - - - -// Protected by the GIL. Incremented when we create a main greenlet, -// in a new thread, decremented when it is destroyed. -static Py_ssize_t G_TOTAL_MAIN_GREENLETS; - -namespace greenlet { -greenlet::PythonAllocator MainGreenlet::allocator; - -void* MainGreenlet::operator new(size_t UNUSED(count)) -{ - return allocator.allocate(1); -} - - -void MainGreenlet::operator delete(void* ptr) -{ - return allocator.deallocate(static_cast(ptr), - 1); -} - - -MainGreenlet::MainGreenlet(PyGreenlet* p, ThreadState* state) - : Greenlet(p, StackState::make_main()), - _self(p), - _thread_state(state) -{ - G_TOTAL_MAIN_GREENLETS++; -} - -MainGreenlet::~MainGreenlet() -{ - G_TOTAL_MAIN_GREENLETS--; - this->tp_clear(); -} - -ThreadState* -MainGreenlet::thread_state() const noexcept -{ - return this->_thread_state; -} - -void -MainGreenlet::thread_state(ThreadState* t) noexcept -{ - assert(!t); - this->_thread_state = t; -} - - -const BorrowedMainGreenlet -MainGreenlet::main_greenlet() const -{ - return this->_self; -} - -BorrowedMainGreenlet -MainGreenlet::find_main_greenlet_in_lineage() const -{ - return BorrowedMainGreenlet(this->_self); -} - -bool -MainGreenlet::was_running_in_dead_thread() const noexcept -{ - return !this->_thread_state; -} - -OwnedObject -MainGreenlet::g_switch() -{ - try { - this->check_switch_allowed(); - } - catch (const PyErrOccurred&) { - this->release_args(); - throw; - } - - switchstack_result_t err = this->g_switchstack(); - if (err.status < 0) { - // XXX: This code path is untested, but it is shared - // with the UserGreenlet path that is tested. - return this->on_switchstack_or_initialstub_failure( - this, - err, - true, // target was me - false // was initial stub - ); - } - - return err.the_new_current_greenlet->g_switch_finish(err); -} - -int -MainGreenlet::tp_traverse(visitproc visit, void* arg) -{ - if (this->_thread_state) { - // we've already traversed main, (self), don't do it again. - int result = this->_thread_state->tp_traverse(visit, arg, false); - if (result) { - return result; - } - } - return Greenlet::tp_traverse(visit, arg); -} - -const OwnedObject& -MainGreenlet::run() const -{ - throw AttributeError("Main greenlets do not have a run attribute."); -} - -void -MainGreenlet::run(const BorrowedObject UNUSED(nrun)) -{ - throw AttributeError("Main greenlets do not have a run attribute."); -} - -void -MainGreenlet::parent(const BorrowedObject raw_new_parent) -{ - if (!raw_new_parent) { - throw AttributeError("can't delete attribute"); - } - throw AttributeError("cannot set the parent of a main greenlet"); -} - -const OwnedGreenlet -MainGreenlet::parent() const -{ - return OwnedGreenlet(); // null becomes None -} - -}; // namespace greenlet - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/TPythonState.cpp b/port/lib/python3.11/site-packages/greenlet/TPythonState.cpp deleted file mode 100644 index cc5dff5..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TPythonState.cpp +++ /dev/null @@ -1,393 +0,0 @@ -#ifndef GREENLET_PYTHON_STATE_CPP -#define GREENLET_PYTHON_STATE_CPP - -#include -#include "TGreenlet.hpp" - -namespace greenlet { - -PythonState::PythonState() - : _top_frame() -#if GREENLET_USE_CFRAME - ,cframe(nullptr) - ,use_tracing(0) -#endif -#if GREENLET_PY312 - ,py_recursion_depth(0) - ,c_recursion_depth(0) -#else - ,recursion_depth(0) -#endif -#if GREENLET_PY313 - ,delete_later(nullptr) -#else - ,trash_delete_nesting(0) -#endif -#if GREENLET_PY311 - ,current_frame(nullptr) - ,datastack_chunk(nullptr) - ,datastack_top(nullptr) - ,datastack_limit(nullptr) -#endif -{ -#if GREENLET_USE_CFRAME - /* - The PyThreadState->cframe pointer usually points to memory on - the stack, alloceted in a call into PyEval_EvalFrameDefault. - - Initially, before any evaluation begins, it points to the - initial PyThreadState object's ``root_cframe`` object, which is - statically allocated for the lifetime of the thread. - - A greenlet can last for longer than a call to - PyEval_EvalFrameDefault, so we can't set its ``cframe`` pointer - to be the current ``PyThreadState->cframe``; nor could we use - one from the greenlet parent for the same reason. Yet a further - no: we can't allocate one scoped to the greenlet and then - destroy it when the greenlet is deallocated, because inside the - interpreter the _PyCFrame objects form a linked list, and that too - can result in accessing memory beyond its dynamic lifetime (if - the greenlet doesn't actually finish before it dies, its entry - could still be in the list). - - Using the ``root_cframe`` is problematic, though, because its - members are never modified by the interpreter and are set to 0, - meaning that its ``use_tracing`` flag is never updated. We don't - want to modify that value in the ``root_cframe`` ourself: it - *shouldn't* matter much because we should probably never get - back to the point where that's the only cframe on the stack; - even if it did matter, the major consequence of an incorrect - value for ``use_tracing`` is that if its true the interpreter - does some extra work --- however, it's just good code hygiene. - - Our solution: before a greenlet runs, after its initial - creation, it uses the ``root_cframe`` just to have something to - put there. However, once the greenlet is actually switched to - for the first time, ``g_initialstub`` (which doesn't actually - "return" while the greenlet is running) stores a new _PyCFrame on - its local stack, and copies the appropriate values from the - currently running _PyCFrame; this is then made the _PyCFrame for the - newly-minted greenlet. ``g_initialstub`` then proceeds to call - ``glet.run()``, which results in ``PyEval_...`` adding the - _PyCFrame to the list. Switches continue as normal. Finally, when - the greenlet finishes, the call to ``glet.run()`` returns and - the _PyCFrame is taken out of the linked list and the stack value - is now unused and free to expire. - - XXX: I think we can do better. If we're deallocing in the same - thread, can't we traverse the list and unlink our frame? - Can we just keep a reference to the thread state in case we - dealloc in another thread? (Is that even possible if we're still - running and haven't returned from g_initialstub?) - */ - this->cframe = &PyThreadState_GET()->root_cframe; -#endif -} - - -inline void PythonState::may_switch_away() noexcept -{ -#if GREENLET_PY311 - // PyThreadState_GetFrame is probably going to have to allocate a - // new frame object. That may trigger garbage collection. Because - // we call this during the early phases of a switch (it doesn't - // matter to which greenlet, as this has a global effect), if a GC - // triggers a switch away, two things can happen, both bad: - // - We might not get switched back to, halting forward progress. - // this is pathological, but possible. - // - We might get switched back to with a different set of - // arguments or a throw instead of a switch. That would corrupt - // our state (specifically, PyErr_Occurred() and this->args() - // would no longer agree). - // - // Thus, when we call this API, we need to have GC disabled. - // This method serves as a bottleneck we call when maybe beginning - // a switch. In this way, it is always safe -- no risk of GC -- to - // use ``_GetFrame()`` whenever we need to, just as it was in - // <=3.10 (because subsequent calls will be cached and not - // allocate memory). - - GCDisabledGuard no_gc; - Py_XDECREF(PyThreadState_GetFrame(PyThreadState_GET())); -#endif -} - -void PythonState::operator<<(const PyThreadState *const tstate) noexcept -{ - this->_context.steal(tstate->context); -#if GREENLET_USE_CFRAME - /* - IMPORTANT: ``cframe`` is a pointer into the STACK. Thus, because - the call to ``slp_switch()`` changes the contents of the stack, - you cannot read from ``ts_current->cframe`` after that call and - necessarily get the same values you get from reading it here. - Anything you need to restore from now to then must be saved in a - global/threadlocal variable (because we can't use stack - variables here either). For things that need to persist across - the switch, use `will_switch_from`. - */ - this->cframe = tstate->cframe; - #if !GREENLET_PY312 - this->use_tracing = tstate->cframe->use_tracing; - #endif -#endif // GREENLET_USE_CFRAME -#if GREENLET_PY311 - #if GREENLET_PY312 - this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; - this->c_recursion_depth = Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining; - #else // not 312 - this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining; - #endif // GREENLET_PY312 - #if GREENLET_PY313 - this->current_frame = tstate->current_frame; - #elif GREENLET_USE_CFRAME - this->current_frame = tstate->cframe->current_frame; - #endif - this->datastack_chunk = tstate->datastack_chunk; - this->datastack_top = tstate->datastack_top; - this->datastack_limit = tstate->datastack_limit; - - PyFrameObject *frame = PyThreadState_GetFrame((PyThreadState *)tstate); - Py_XDECREF(frame); // PyThreadState_GetFrame gives us a new - // reference. - this->_top_frame.steal(frame); - #if GREENLET_PY313 - this->delete_later = Py_XNewRef(tstate->delete_later); - #elif GREENLET_PY312 - this->trash_delete_nesting = tstate->trash.delete_nesting; - #else // not 312 - this->trash_delete_nesting = tstate->trash_delete_nesting; - #endif // GREENLET_PY312 -#else // Not 311 - this->recursion_depth = tstate->recursion_depth; - this->_top_frame.steal(tstate->frame); - this->trash_delete_nesting = tstate->trash_delete_nesting; -#endif // GREENLET_PY311 -} - -#if GREENLET_PY312 -void GREENLET_NOINLINE(PythonState::unexpose_frames)() -{ - if (!this->top_frame()) { - return; - } - - // See GreenletState::expose_frames() and the comment on frames_were_exposed - // for more information about this logic. - _PyInterpreterFrame *iframe = this->_top_frame->f_frame; - while (iframe != nullptr) { - _PyInterpreterFrame *prev_exposed = iframe->previous; - assert(iframe->frame_obj); - memcpy(&iframe->previous, &iframe->frame_obj->_f_frame_data[0], - sizeof(void *)); - iframe = prev_exposed; - } -} -#else -void PythonState::unexpose_frames() -{} -#endif - -void PythonState::operator>>(PyThreadState *const tstate) noexcept -{ - tstate->context = this->_context.relinquish_ownership(); - /* Incrementing this value invalidates the contextvars cache, - which would otherwise remain valid across switches */ - tstate->context_ver++; -#if GREENLET_USE_CFRAME - tstate->cframe = this->cframe; - /* - If we were tracing, we need to keep tracing. - There should never be the possibility of hitting the - root_cframe here. See note above about why we can't - just copy this from ``origin->cframe->use_tracing``. - */ - #if !GREENLET_PY312 - tstate->cframe->use_tracing = this->use_tracing; - #endif -#endif // GREENLET_USE_CFRAME -#if GREENLET_PY311 - #if GREENLET_PY312 - tstate->py_recursion_remaining = tstate->py_recursion_limit - this->py_recursion_depth; - tstate->c_recursion_remaining = Py_C_RECURSION_LIMIT - this->c_recursion_depth; - this->unexpose_frames(); - #else // \/ 3.11 - tstate->recursion_remaining = tstate->recursion_limit - this->recursion_depth; - #endif // GREENLET_PY312 - #if GREENLET_PY313 - tstate->current_frame = this->current_frame; - #elif GREENLET_USE_CFRAME - tstate->cframe->current_frame = this->current_frame; - #endif - tstate->datastack_chunk = this->datastack_chunk; - tstate->datastack_top = this->datastack_top; - tstate->datastack_limit = this->datastack_limit; - this->_top_frame.relinquish_ownership(); - #if GREENLET_PY313 - Py_XDECREF(tstate->delete_later); - tstate->delete_later = this->delete_later; - Py_CLEAR(this->delete_later); - #elif GREENLET_PY312 - tstate->trash.delete_nesting = this->trash_delete_nesting; - #else // not 3.12 - tstate->trash_delete_nesting = this->trash_delete_nesting; - #endif // GREENLET_PY312 -#else // not 3.11 - tstate->frame = this->_top_frame.relinquish_ownership(); - tstate->recursion_depth = this->recursion_depth; - tstate->trash_delete_nesting = this->trash_delete_nesting; -#endif // GREENLET_PY311 -} - -inline void PythonState::will_switch_from(PyThreadState *const origin_tstate) noexcept -{ -#if GREENLET_USE_CFRAME && !GREENLET_PY312 - // The weird thing is, we don't actually save this for an - // effect on the current greenlet, it's saved for an - // effect on the target greenlet. That is, we want - // continuity of this setting across the greenlet switch. - this->use_tracing = origin_tstate->cframe->use_tracing; -#endif -} - -void PythonState::set_initial_state(const PyThreadState* const tstate) noexcept -{ - this->_top_frame = nullptr; -#if GREENLET_PY312 - this->py_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; - // XXX: TODO: Comment from a reviewer: - // Should this be ``Py_C_RECURSION_LIMIT - tstate->c_recursion_remaining``? - // But to me it looks more like that might not be the right - // initialization either? - this->c_recursion_depth = tstate->py_recursion_limit - tstate->py_recursion_remaining; -#elif GREENLET_PY311 - this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining; -#else - this->recursion_depth = tstate->recursion_depth; -#endif -} -// TODO: Better state management about when we own the top frame. -int PythonState::tp_traverse(visitproc visit, void* arg, bool own_top_frame) noexcept -{ - Py_VISIT(this->_context.borrow()); - if (own_top_frame) { - Py_VISIT(this->_top_frame.borrow()); - } - return 0; -} - -void PythonState::tp_clear(bool own_top_frame) noexcept -{ - PythonStateContext::tp_clear(); - // If we get here owning a frame, - // we got dealloc'd without being finished. We may or may not be - // in the same thread. - if (own_top_frame) { - this->_top_frame.CLEAR(); - } -} - -#if GREENLET_USE_CFRAME -void PythonState::set_new_cframe(_PyCFrame& frame) noexcept -{ - frame = *PyThreadState_GET()->cframe; - /* Make the target greenlet refer to the stack value. */ - this->cframe = &frame; - /* - And restore the link to the previous frame so this one gets - unliked appropriately. - */ - this->cframe->previous = &PyThreadState_GET()->root_cframe; -} -#endif - -const PythonState::OwnedFrame& PythonState::top_frame() const noexcept -{ - return this->_top_frame; -} - -void PythonState::did_finish(PyThreadState* tstate) noexcept -{ -#if GREENLET_PY311 - // See https://github.com/gevent/gevent/issues/1924 and - // https://github.com/python-greenlet/greenlet/issues/328. In - // short, Python 3.11 allocates memory for frames as a sort of - // linked list that's kept as part of PyThreadState in the - // ``datastack_chunk`` member and friends. These are saved and - // restored as part of switching greenlets. - // - // When we initially switch to a greenlet, we set those to NULL. - // That causes the frame management code to treat this like a - // brand new thread and start a fresh list of chunks, beginning - // with a new "root" chunk. As we make calls in this greenlet, - // those chunks get added, and as calls return, they get popped. - // But the frame code (pystate.c) is careful to make sure that the - // root chunk never gets popped. - // - // Thus, when a greenlet exits for the last time, there will be at - // least a single root chunk that we must be responsible for - // deallocating. - // - // The complex part is that these chunks are allocated and freed - // using ``_PyObject_VirtualAlloc``/``Free``. Those aren't public - // functions, and they aren't exported for linking. It so happens - // that we know they are just thin wrappers around the Arena - // allocator, so we can use that directly to deallocate in a - // compatible way. - // - // CAUTION: Check this implementation detail on every major version. - // - // It might be nice to be able to do this in our destructor, but - // can we be sure that no one else is using that memory? Plus, as - // described below, our pointers may not even be valid anymore. As - // a special case, there is one time that we know we can do this, - // and that's from the destructor of the associated UserGreenlet - // (NOT main greenlet) - PyObjectArenaAllocator alloc; - _PyStackChunk* chunk = nullptr; - if (tstate) { - // We really did finish, we can never be switched to again. - chunk = tstate->datastack_chunk; - // Unfortunately, we can't do much sanity checking. Our - // this->datastack_chunk pointer is out of date (evaluation may - // have popped down through it already) so we can't verify that - // we deallocate it. I don't think we can even check datastack_top - // for the same reason. - - PyObject_GetArenaAllocator(&alloc); - tstate->datastack_chunk = nullptr; - tstate->datastack_limit = nullptr; - tstate->datastack_top = nullptr; - - } - else if (this->datastack_chunk) { - // The UserGreenlet (NOT the main greenlet!) is being deallocated. If we're - // still holding a stack chunk, it's garbage because we know - // we can never switch back to let cPython clean it up. - // Because the last time we got switched away from, and we - // haven't run since then, we know our chain is valid and can - // be dealloced. - chunk = this->datastack_chunk; - PyObject_GetArenaAllocator(&alloc); - } - - if (alloc.free && chunk) { - // In case the arena mechanism has been torn down already. - while (chunk) { - _PyStackChunk *prev = chunk->previous; - chunk->previous = nullptr; - alloc.free(alloc.ctx, chunk, chunk->size); - chunk = prev; - } - } - - this->datastack_chunk = nullptr; - this->datastack_limit = nullptr; - this->datastack_top = nullptr; -#endif -} - - -}; // namespace greenlet - -#endif // GREENLET_PYTHON_STATE_CPP diff --git a/port/lib/python3.11/site-packages/greenlet/TStackState.cpp b/port/lib/python3.11/site-packages/greenlet/TStackState.cpp deleted file mode 100644 index 9743ab5..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TStackState.cpp +++ /dev/null @@ -1,265 +0,0 @@ -#ifndef GREENLET_STACK_STATE_CPP -#define GREENLET_STACK_STATE_CPP - -#include "TGreenlet.hpp" - -namespace greenlet { - -#ifdef GREENLET_USE_STDIO -#include -using std::cerr; -using std::endl; - -std::ostream& operator<<(std::ostream& os, const StackState& s) -{ - os << "StackState(stack_start=" << (void*)s._stack_start - << ", stack_stop=" << (void*)s.stack_stop - << ", stack_copy=" << (void*)s.stack_copy - << ", stack_saved=" << s._stack_saved - << ", stack_prev=" << s.stack_prev - << ", addr=" << &s - << ")"; - return os; -} -#endif - -StackState::StackState(void* mark, StackState& current) - : _stack_start(nullptr), - stack_stop((char*)mark), - stack_copy(nullptr), - _stack_saved(0), - /* Skip a dying greenlet */ - stack_prev(current._stack_start - ? ¤t - : current.stack_prev) -{ -} - -StackState::StackState() - : _stack_start(nullptr), - stack_stop(nullptr), - stack_copy(nullptr), - _stack_saved(0), - stack_prev(nullptr) -{ -} - -StackState::StackState(const StackState& other) -// can't use a delegating constructor because of -// MSVC for Python 2.7 - : _stack_start(nullptr), - stack_stop(nullptr), - stack_copy(nullptr), - _stack_saved(0), - stack_prev(nullptr) -{ - this->operator=(other); -} - -StackState& StackState::operator=(const StackState& other) -{ - if (&other == this) { - return *this; - } - if (other._stack_saved) { - throw std::runtime_error("Refusing to steal memory."); - } - - //If we have memory allocated, dispose of it - this->free_stack_copy(); - - this->_stack_start = other._stack_start; - this->stack_stop = other.stack_stop; - this->stack_copy = other.stack_copy; - this->_stack_saved = other._stack_saved; - this->stack_prev = other.stack_prev; - return *this; -} - -inline void StackState::free_stack_copy() noexcept -{ - PyMem_Free(this->stack_copy); - this->stack_copy = nullptr; - this->_stack_saved = 0; -} - -inline void StackState::copy_heap_to_stack(const StackState& current) noexcept -{ - - /* Restore the heap copy back into the C stack */ - if (this->_stack_saved != 0) { - memcpy(this->_stack_start, this->stack_copy, this->_stack_saved); - this->free_stack_copy(); - } - StackState* owner = const_cast(¤t); - if (!owner->_stack_start) { - owner = owner->stack_prev; /* greenlet is dying, skip it */ - } - while (owner && owner->stack_stop <= this->stack_stop) { - // cerr << "\tOwner: " << owner << endl; - owner = owner->stack_prev; /* find greenlet with more stack */ - } - this->stack_prev = owner; - // cerr << "\tFinished with: " << *this << endl; -} - -inline int StackState::copy_stack_to_heap_up_to(const char* const stop) noexcept -{ - /* Save more of g's stack into the heap -- at least up to 'stop' - g->stack_stop |________| - | | - | __ stop . . . . . - | | ==> . . - |________| _______ - | | | | - | | | | - g->stack_start | | |_______| g->stack_copy - */ - intptr_t sz1 = this->_stack_saved; - intptr_t sz2 = stop - this->_stack_start; - assert(this->_stack_start); - if (sz2 > sz1) { - char* c = (char*)PyMem_Realloc(this->stack_copy, sz2); - if (!c) { - PyErr_NoMemory(); - return -1; - } - memcpy(c + sz1, this->_stack_start + sz1, sz2 - sz1); - this->stack_copy = c; - this->_stack_saved = sz2; - } - return 0; -} - -inline int StackState::copy_stack_to_heap(char* const stackref, - const StackState& current) noexcept -{ - /* must free all the C stack up to target_stop */ - const char* const target_stop = this->stack_stop; - - StackState* owner = const_cast(¤t); - assert(owner->_stack_saved == 0); // everything is present on the stack - if (!owner->_stack_start) { - owner = owner->stack_prev; /* not saved if dying */ - } - else { - owner->_stack_start = stackref; - } - - while (owner->stack_stop < target_stop) { - /* ts_current is entierely within the area to free */ - if (owner->copy_stack_to_heap_up_to(owner->stack_stop)) { - return -1; /* XXX */ - } - owner = owner->stack_prev; - } - if (owner != this) { - if (owner->copy_stack_to_heap_up_to(target_stop)) { - return -1; /* XXX */ - } - } - return 0; -} - -inline bool StackState::started() const noexcept -{ - return this->stack_stop != nullptr; -} - -inline bool StackState::main() const noexcept -{ - return this->stack_stop == (char*)-1; -} - -inline bool StackState::active() const noexcept -{ - return this->_stack_start != nullptr; -} - -inline void StackState::set_active() noexcept -{ - assert(this->_stack_start == nullptr); - this->_stack_start = (char*)1; -} - -inline void StackState::set_inactive() noexcept -{ - this->_stack_start = nullptr; - // XXX: What if we still have memory out there? - // That case is actually triggered by - // test_issue251_issue252_explicit_reference_not_collectable (greenlet.tests.test_leaks.TestLeaks) - // and - // test_issue251_issue252_need_to_collect_in_background - // (greenlet.tests.test_leaks.TestLeaks) - // - // Those objects never get deallocated, so the destructor never - // runs. - // It *seems* safe to clean up the memory here? - if (this->_stack_saved) { - this->free_stack_copy(); - } -} - -inline intptr_t StackState::stack_saved() const noexcept -{ - return this->_stack_saved; -} - -inline char* StackState::stack_start() const noexcept -{ - return this->_stack_start; -} - - -inline StackState StackState::make_main() noexcept -{ - StackState s; - s._stack_start = (char*)1; - s.stack_stop = (char*)-1; - return s; -} - -StackState::~StackState() -{ - if (this->_stack_saved != 0) { - this->free_stack_copy(); - } -} - -void StackState::copy_from_stack(void* vdest, const void* vsrc, size_t n) const -{ - char* dest = static_cast(vdest); - const char* src = static_cast(vsrc); - if (src + n <= this->_stack_start - || src >= this->_stack_start + this->_stack_saved - || this->_stack_saved == 0) { - // Nothing we're copying was spilled from the stack - memcpy(dest, src, n); - return; - } - - if (src < this->_stack_start) { - // Copy the part before the saved stack. - // We know src + n > _stack_start due to the test above. - const size_t nbefore = this->_stack_start - src; - memcpy(dest, src, nbefore); - dest += nbefore; - src += nbefore; - n -= nbefore; - } - // We know src >= _stack_start after the before-copy, and - // src < _stack_start + _stack_saved due to the first if condition - size_t nspilled = std::min(n, this->_stack_start + this->_stack_saved - src); - memcpy(dest, this->stack_copy + (src - this->_stack_start), nspilled); - dest += nspilled; - src += nspilled; - n -= nspilled; - if (n > 0) { - // Copy the part after the saved stack - memcpy(dest, src, n); - } -} - -}; // namespace greenlet - -#endif // GREENLET_STACK_STATE_CPP diff --git a/port/lib/python3.11/site-packages/greenlet/TThreadState.hpp b/port/lib/python3.11/site-packages/greenlet/TThreadState.hpp deleted file mode 100644 index e4e6f6c..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TThreadState.hpp +++ /dev/null @@ -1,497 +0,0 @@ -#ifndef GREENLET_THREAD_STATE_HPP -#define GREENLET_THREAD_STATE_HPP - -#include -#include - -#include "greenlet_internal.hpp" -#include "greenlet_refs.hpp" -#include "greenlet_thread_support.hpp" - -using greenlet::refs::BorrowedObject; -using greenlet::refs::BorrowedGreenlet; -using greenlet::refs::BorrowedMainGreenlet; -using greenlet::refs::OwnedMainGreenlet; -using greenlet::refs::OwnedObject; -using greenlet::refs::OwnedGreenlet; -using greenlet::refs::OwnedList; -using greenlet::refs::PyErrFetchParam; -using greenlet::refs::PyArgParseParam; -using greenlet::refs::ImmortalString; -using greenlet::refs::CreatedModule; -using greenlet::refs::PyErrPieces; -using greenlet::refs::NewReference; - -namespace greenlet { -/** - * Thread-local state of greenlets. - * - * Each native thread will get exactly one of these objects, - * automatically accessed through the best available thread-local - * mechanism the compiler supports (``thread_local`` for C++11 - * compilers or ``__thread``/``declspec(thread)`` for older GCC/clang - * or MSVC, respectively.) - * - * Previously, we kept thread-local state mostly in a bunch of - * ``static volatile`` variables in the main greenlet file.. This had - * the problem of requiring extra checks, loops, and great care - * accessing these variables if we potentially invoked any Python code - * that could release the GIL, because the state could change out from - * under us. Making the variables thread-local solves this problem. - * - * When we detected that a greenlet API accessing the current greenlet - * was invoked from a different thread than the greenlet belonged to, - * we stored a reference to the greenlet in the Python thread - * dictionary for the thread the greenlet belonged to. This could lead - * to memory leaks if the thread then exited (because of a reference - * cycle, as greenlets referred to the thread dictionary, and deleting - * non-current greenlets leaked their frame plus perhaps arguments on - * the C stack). If a thread exited while still having running - * greenlet objects (perhaps that had just switched back to the main - * greenlet), and did not invoke one of the greenlet APIs *in that - * thread, immediately before it exited, without some other thread - * then being invoked*, such a leak was guaranteed. - * - * This can be partly solved by using compiler thread-local variables - * instead of the Python thread dictionary, thus avoiding a cycle. - * - * To fully solve this problem, we need a reliable way to know that a - * thread is done and we should clean up the main greenlet. On POSIX, - * we can use the destructor function of ``pthread_key_create``, but - * there's nothing similar on Windows; a C++11 thread local object - * reliably invokes its destructor when the thread it belongs to exits - * (non-C++11 compilers offer ``__thread`` or ``declspec(thread)`` to - * create thread-local variables, but they can't hold C++ objects that - * invoke destructors; the C++11 version is the most portable solution - * I found). When the thread exits, we can drop references and - * otherwise manipulate greenlets and frames that we know can no - * longer be switched to. For compilers that don't support C++11 - * thread locals, we have a solution that uses the python thread - * dictionary, though it may not collect everything as promptly as - * other compilers do, if some other library is using the thread - * dictionary and has a cycle or extra reference. - * - * There are two small wrinkles. The first is that when the thread - * exits, it is too late to actually invoke Python APIs: the Python - * thread state is gone, and the GIL is released. To solve *this* - * problem, our destructor uses ``Py_AddPendingCall`` to transfer the - * destruction work to the main thread. (This is not an issue for the - * dictionary solution.) - * - * The second is that once the thread exits, the thread local object - * is invalid and we can't even access a pointer to it, so we can't - * pass it to ``Py_AddPendingCall``. This is handled by actually using - * a second object that's thread local (ThreadStateCreator) and having - * it dynamically allocate this object so it can live until the - * pending call runs. - */ - - - -class ThreadState { -private: - // As of commit 08ad1dd7012b101db953f492e0021fb08634afad - // this class needed 56 bytes in o Py_DEBUG build - // on 64-bit macOS 11. - // Adding the vector takes us up to 80 bytes () - - /* Strong reference to the main greenlet */ - OwnedMainGreenlet main_greenlet; - - /* Strong reference to the current greenlet. */ - OwnedGreenlet current_greenlet; - - /* Strong reference to the trace function, if any. */ - OwnedObject tracefunc; - - typedef std::vector > deleteme_t; - /* A vector of raw PyGreenlet pointers representing things that need - deleted when this thread is running. The vector owns the - references, but you need to manually INCREF/DECREF as you use - them. We don't use a vector because we - make copy of this vector, and that would become O(n) as all the - refcounts are incremented in the copy. - */ - deleteme_t deleteme; - -#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED - void* exception_state; -#endif - - static std::clock_t _clocks_used_doing_gc; - static ImmortalString get_referrers_name; - static PythonAllocator allocator; - - G_NO_COPIES_OF_CLS(ThreadState); - - - // Allocates a main greenlet for the thread state. If this fails, - // exits the process. Called only during constructing a ThreadState. - MainGreenlet* alloc_main() - { - PyGreenlet* gmain; - - /* create the main greenlet for this thread */ - gmain = reinterpret_cast(PyType_GenericAlloc(&PyGreenlet_Type, 0)); - if (gmain == NULL) { - throw PyFatalError("alloc_main failed to alloc"); //exits the process - } - - MainGreenlet* const main = new MainGreenlet(gmain, this); - - assert(Py_REFCNT(gmain) == 1); - assert(gmain->pimpl == main); - return main; - } - - -public: - static void* operator new(size_t UNUSED(count)) - { - return ThreadState::allocator.allocate(1); - } - - static void operator delete(void* ptr) - { - return ThreadState::allocator.deallocate(static_cast(ptr), - 1); - } - - static void init() - { - ThreadState::get_referrers_name = "get_referrers"; - ThreadState::_clocks_used_doing_gc = 0; - } - - ThreadState() - { - -#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED - this->exception_state = slp_get_exception_state(); -#endif - - // XXX: Potentially dangerous, exposing a not fully - // constructed object. - MainGreenlet* const main = this->alloc_main(); - this->main_greenlet = OwnedMainGreenlet::consuming( - main->self() - ); - assert(this->main_greenlet); - this->current_greenlet = main->self(); - // The main greenlet starts with 1 refs: The returned one. We - // then copied it to the current greenlet. - assert(this->main_greenlet.REFCNT() == 2); - } - - inline void restore_exception_state() - { -#ifdef GREENLET_NEEDS_EXCEPTION_STATE_SAVED - // It's probably important this be inlined and only call C - // functions to avoid adding an SEH frame. - slp_set_exception_state(this->exception_state); -#endif - } - - inline bool has_main_greenlet() const noexcept - { - return bool(this->main_greenlet); - } - - // Called from the ThreadStateCreator when we're in non-standard - // threading mode. In that case, there is an object in the Python - // thread state dictionary that points to us. The main greenlet - // also traverses into us, in which case it's crucial not to - // traverse back into the main greenlet. - int tp_traverse(visitproc visit, void* arg, bool traverse_main=true) - { - if (traverse_main) { - Py_VISIT(main_greenlet.borrow_o()); - } - if (traverse_main || current_greenlet != main_greenlet) { - Py_VISIT(current_greenlet.borrow_o()); - } - Py_VISIT(tracefunc.borrow()); - return 0; - } - - inline BorrowedMainGreenlet borrow_main_greenlet() const noexcept - { - assert(this->main_greenlet); - assert(this->main_greenlet.REFCNT() >= 2); - return this->main_greenlet; - }; - - inline OwnedMainGreenlet get_main_greenlet() const noexcept - { - return this->main_greenlet; - } - - /** - * In addition to returning a new reference to the currunt - * greenlet, this performs any maintenance needed. - */ - inline OwnedGreenlet get_current() - { - /* green_dealloc() cannot delete greenlets from other threads, so - it stores them in the thread dict; delete them now. */ - this->clear_deleteme_list(); - //assert(this->current_greenlet->main_greenlet == this->main_greenlet); - //assert(this->main_greenlet->main_greenlet == this->main_greenlet); - return this->current_greenlet; - } - - /** - * As for non-const get_current(); - */ - inline BorrowedGreenlet borrow_current() - { - this->clear_deleteme_list(); - return this->current_greenlet; - } - - /** - * Does no maintenance. - */ - inline OwnedGreenlet get_current() const - { - return this->current_greenlet; - } - - template - inline bool is_current(const refs::PyObjectPointer& obj) const - { - return this->current_greenlet.borrow_o() == obj.borrow_o(); - } - - inline void set_current(const OwnedGreenlet& target) - { - this->current_greenlet = target; - } - -private: - /** - * Deref and remove the greenlets from the deleteme list. Must be - * holding the GIL. - * - * If *murder* is true, then we must be called from a different - * thread than the one that these greenlets were running in. - * In that case, if the greenlet was actually running, we destroy - * the frame reference and otherwise make it appear dead before - * proceeding; otherwise, we would try (and fail) to raise an - * exception in it and wind up right back in this list. - */ - inline void clear_deleteme_list(const bool murder=false) - { - if (!this->deleteme.empty()) { - // It's possible we could add items to this list while - // running Python code if there's a thread switch, so we - // need to defensively copy it before that can happen. - deleteme_t copy = this->deleteme; - this->deleteme.clear(); // in case things come back on the list - for(deleteme_t::iterator it = copy.begin(), end = copy.end(); - it != end; - ++it ) { - PyGreenlet* to_del = *it; - if (murder) { - // Force each greenlet to appear dead; we can't raise an - // exception into it anymore anyway. - to_del->pimpl->murder_in_place(); - } - - // The only reference to these greenlets should be in - // this list, decreffing them should let them be - // deleted again, triggering calls to green_dealloc() - // in the correct thread (if we're not murdering). - // This may run arbitrary Python code and switch - // threads or greenlets! - Py_DECREF(to_del); - if (PyErr_Occurred()) { - PyErr_WriteUnraisable(nullptr); - PyErr_Clear(); - } - } - } - } - -public: - - /** - * Returns a new reference, or a false object. - */ - inline OwnedObject get_tracefunc() const - { - return tracefunc; - }; - - - inline void set_tracefunc(BorrowedObject tracefunc) - { - assert(tracefunc); - if (tracefunc == BorrowedObject(Py_None)) { - this->tracefunc.CLEAR(); - } - else { - this->tracefunc = tracefunc; - } - } - - /** - * Given a reference to a greenlet that some other thread - * attempted to delete (has a refcount of 0) store it for later - * deletion when the thread this state belongs to is current. - */ - inline void delete_when_thread_running(PyGreenlet* to_del) - { - Py_INCREF(to_del); - this->deleteme.push_back(to_del); - } - - /** - * Set to std::clock_t(-1) to disable. - */ - inline static std::clock_t& clocks_used_doing_gc() - { - return ThreadState::_clocks_used_doing_gc; - } - - ~ThreadState() - { - if (!PyInterpreterState_Head()) { - // We shouldn't get here (our callers protect us) - // but if we do, all we can do is bail early. - return; - } - - // We should not have an "origin" greenlet; that only exists - // for the temporary time during a switch, which should not - // be in progress as the thread dies. - //assert(!this->switching_state.origin); - - this->tracefunc.CLEAR(); - - // Forcibly GC as much as we can. - this->clear_deleteme_list(true); - - // The pending call did this. - assert(this->main_greenlet->thread_state() == nullptr); - - // If the main greenlet is the current greenlet, - // then we "fell off the end" and the thread died. - // It's possible that there is some other greenlet that - // switched to us, leaving a reference to the main greenlet - // on the stack, somewhere uncollectible. Try to detect that. - if (this->current_greenlet == this->main_greenlet && this->current_greenlet) { - assert(this->current_greenlet->is_currently_running_in_some_thread()); - // Drop one reference we hold. - this->current_greenlet.CLEAR(); - assert(!this->current_greenlet); - // Only our reference to the main greenlet should be left, - // But hold onto the pointer in case we need to do extra cleanup. - PyGreenlet* old_main_greenlet = this->main_greenlet.borrow(); - Py_ssize_t cnt = this->main_greenlet.REFCNT(); - this->main_greenlet.CLEAR(); - if (ThreadState::_clocks_used_doing_gc != std::clock_t(-1) - && cnt == 2 && Py_REFCNT(old_main_greenlet) == 1) { - // Highly likely that the reference is somewhere on - // the stack, not reachable by GC. Verify. - // XXX: This is O(n) in the total number of objects. - // TODO: Add a way to disable this at runtime, and - // another way to report on it. - std::clock_t begin = std::clock(); - NewReference gc(PyImport_ImportModule("gc")); - if (gc) { - OwnedObject get_referrers = gc.PyRequireAttr(ThreadState::get_referrers_name); - OwnedList refs(get_referrers.PyCall(old_main_greenlet)); - if (refs && refs.empty()) { - assert(refs.REFCNT() == 1); - // We found nothing! So we left a dangling - // reference: Probably the last thing some - // other greenlet did was call - // 'getcurrent().parent.switch()' to switch - // back to us. Clean it up. This will be the - // case on CPython 3.7 and newer, as they use - // an internal calling conversion that avoids - // creating method objects and storing them on - // the stack. - Py_DECREF(old_main_greenlet); - } - else if (refs - && refs.size() == 1 - && PyCFunction_Check(refs.at(0)) - && Py_REFCNT(refs.at(0)) == 2) { - assert(refs.REFCNT() == 1); - // Ok, we found a C method that refers to the - // main greenlet, and its only referenced - // twice, once in the list we just created, - // once from...somewhere else. If we can't - // find where else, then this is a leak. - // This happens in older versions of CPython - // that create a bound method object somewhere - // on the stack that we'll never get back to. - if (PyCFunction_GetFunction(refs.at(0).borrow()) == (PyCFunction)green_switch) { - BorrowedObject function_w = refs.at(0); - refs.clear(); // destroy the reference - // from the list. - // back to one reference. Can *it* be - // found? - assert(function_w.REFCNT() == 1); - refs = get_referrers.PyCall(function_w); - if (refs && refs.empty()) { - // Nope, it can't be found so it won't - // ever be GC'd. Drop it. - Py_CLEAR(function_w); - } - } - } - std::clock_t end = std::clock(); - ThreadState::_clocks_used_doing_gc += (end - begin); - } - } - } - - // We need to make sure this greenlet appears to be dead, - // because otherwise deallocing it would fail to raise an - // exception in it (the thread is dead) and put it back in our - // deleteme list. - if (this->current_greenlet) { - this->current_greenlet->murder_in_place(); - this->current_greenlet.CLEAR(); - } - - if (this->main_greenlet) { - // Couldn't have been the main greenlet that was running - // when the thread exited (because we already cleared this - // pointer if it was). This shouldn't be possible? - - // If the main greenlet was current when the thread died (it - // should be, right?) then we cleared its self pointer above - // when we cleared the current greenlet's main greenlet pointer. - // assert(this->main_greenlet->main_greenlet == this->main_greenlet - // || !this->main_greenlet->main_greenlet); - // // self reference, probably gone - // this->main_greenlet->main_greenlet.CLEAR(); - - // This will actually go away when the ivar is destructed. - this->main_greenlet.CLEAR(); - } - - if (PyErr_Occurred()) { - PyErr_WriteUnraisable(NULL); - PyErr_Clear(); - } - - } - -}; - -ImmortalString ThreadState::get_referrers_name(nullptr); -PythonAllocator ThreadState::allocator; -std::clock_t ThreadState::_clocks_used_doing_gc(0); - - - - - -}; // namespace greenlet - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/TThreadStateCreator.hpp b/port/lib/python3.11/site-packages/greenlet/TThreadStateCreator.hpp deleted file mode 100644 index 2ec7ab5..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TThreadStateCreator.hpp +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef GREENLET_THREAD_STATE_CREATOR_HPP -#define GREENLET_THREAD_STATE_CREATOR_HPP - -#include -#include - -#include "greenlet_internal.hpp" -#include "greenlet_refs.hpp" -#include "greenlet_thread_support.hpp" - -#include "TThreadState.hpp" - -namespace greenlet { - - -typedef void (*ThreadStateDestructor)(ThreadState* const); - -template -class ThreadStateCreator -{ -private: - // Initialized to 1, and, if still 1, created on access. - // Set to 0 on destruction. - ThreadState* _state; - G_NO_COPIES_OF_CLS(ThreadStateCreator); - - inline bool has_initialized_state() const noexcept - { - return this->_state != (ThreadState*)1; - } - - inline bool has_state() const noexcept - { - return this->has_initialized_state() && this->_state != nullptr; - } - -public: - - // Only one of these, auto created per thread. - // Constructing the state constructs the MainGreenlet. - ThreadStateCreator() : - _state((ThreadState*)1) - { - } - - ~ThreadStateCreator() - { - if (this->has_state()) { - Destructor(this->_state); - } - - this->_state = nullptr; - } - - inline ThreadState& state() - { - // The main greenlet will own this pointer when it is created, - // which will be right after this. The plan is to give every - // greenlet a pointer to the main greenlet for the thread it - // runs in; if we are doing something cross-thread, we need to - // access the pointer from the main greenlet. Deleting the - // thread, and hence the thread-local storage, will delete the - // state pointer in the main greenlet. - if (!this->has_initialized_state()) { - // XXX: Assuming allocation never fails - this->_state = new ThreadState; - // For non-standard threading, we need to store an object - // in the Python thread state dictionary so that it can be - // DECREF'd when the thread ends (ideally; the dict could - // last longer) and clean this object up. - } - if (!this->_state) { - throw std::runtime_error("Accessing state after destruction."); - } - return *this->_state; - } - - operator ThreadState&() - { - return this->state(); - } - - operator ThreadState*() - { - return &this->state(); - } - - inline int tp_traverse(visitproc visit, void* arg) - { - if (this->has_state()) { - return this->_state->tp_traverse(visit, arg); - } - return 0; - } - -}; - - - -}; // namespace greenlet - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/TThreadStateDestroy.cpp b/port/lib/python3.11/site-packages/greenlet/TThreadStateDestroy.cpp deleted file mode 100644 index 37fcc8c..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TThreadStateDestroy.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of the ThreadState destructors. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_THREADSTATE_DESTROY -#define T_THREADSTATE_DESTROY - -#include "TGreenlet.hpp" - -#include "greenlet_thread_support.hpp" -#include "greenlet_cpython_add_pending.hpp" -#include "greenlet_compiler_compat.hpp" -#include "TGreenletGlobals.cpp" -#include "TThreadState.hpp" -#include "TThreadStateCreator.hpp" - -namespace greenlet { - -extern "C" { - -struct ThreadState_DestroyNoGIL -{ - /** - This function uses the same lock that the PendingCallback does - */ - static void - MarkGreenletDeadAndQueueCleanup(ThreadState* const state) - { -#if GREENLET_BROKEN_THREAD_LOCAL_CLEANUP_JUST_LEAK - return; -#endif - // We are *NOT* holding the GIL. Our thread is in the middle - // of its death throes and the Python thread state is already - // gone so we can't use most Python APIs. One that is safe is - // ``Py_AddPendingCall``, unless the interpreter itself has - // been torn down. There is a limited number of calls that can - // be queued: 32 (NPENDINGCALLS) in CPython 3.10, so we - // coalesce these calls using our own queue. - - if (!MarkGreenletDeadIfNeeded(state)) { - // No state, or no greenlet - return; - } - - // XXX: Because we don't have the GIL, this is a race condition. - if (!PyInterpreterState_Head()) { - // We have to leak the thread state, if the - // interpreter has shut down when we're getting - // deallocated, we can't run the cleanup code that - // deleting it would imply. - return; - } - - AddToCleanupQueue(state); - - } - -private: - - // If the state has an allocated main greenlet: - // - mark the greenlet as dead by disassociating it from the state; - // - return 1 - // Otherwise, return 0. - static bool - MarkGreenletDeadIfNeeded(ThreadState* const state) - { - if (state && state->has_main_greenlet()) { - // mark the thread as dead ASAP. - // this is racy! If we try to throw or switch to a - // greenlet from this thread from some other thread before - // we clear the state pointer, it won't realize the state - // is dead which can crash the process. - PyGreenlet* p(state->borrow_main_greenlet().borrow()); - assert(p->pimpl->thread_state() == state || p->pimpl->thread_state() == nullptr); - dynamic_cast(p->pimpl)->thread_state(nullptr); - return true; - } - return false; - } - - static void - AddToCleanupQueue(ThreadState* const state) - { - assert(state && state->has_main_greenlet()); - - // NOTE: Because we're not holding the GIL here, some other - // Python thread could run and call ``os.fork()``, which would - // be bad if that happened while we are holding the cleanup - // lock (it wouldn't function in the child process). - // Make a best effort to try to keep the duration we hold the - // lock short. - // TODO: On platforms that support it, use ``pthread_atfork`` to - // drop this lock. - LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); - - mod_globs->queue_to_destroy(state); - if (mod_globs->thread_states_to_destroy.size() == 1) { - // We added the first item to the queue. We need to schedule - // the cleanup. - - // A size greater than 1 means that we have already added the pending call, - // and in fact, it may be executing now. - // If it is executing, our lock makes sure that it will see the item we just added - // to the queue on its next iteration (after we release the lock) - // - // A size of 1 means there is no pending call, OR the pending call is - // currently executing, has dropped the lock, and is deleting the last item - // from the queue; its next iteration will go ahead and delete the item we just added. - // And the pending call we schedule here will have no work to do. - int result = AddPendingCall( - PendingCallback_DestroyQueueWithGIL, - nullptr); - if (result < 0) { - // Hmm, what can we do here? - fprintf(stderr, - "greenlet: WARNING: failed in call to Py_AddPendingCall; " - "expect a memory leak.\n"); - } - } - } - - static int - PendingCallback_DestroyQueueWithGIL(void* UNUSED(arg)) - { - // We're holding the GIL here, so no Python code should be able to - // run to call ``os.fork()``. - while (1) { - ThreadState* to_destroy; - { - LockGuard cleanup_lock(*mod_globs->thread_states_to_destroy_lock); - if (mod_globs->thread_states_to_destroy.empty()) { - break; - } - to_destroy = mod_globs->take_next_to_destroy(); - } - assert(to_destroy); - assert(to_destroy->has_main_greenlet()); - // Drop the lock while we do the actual deletion. - // This allows other calls to MarkGreenletDeadAndQueueCleanup - // to enter and add to our queue. - DestroyOneWithGIL(to_destroy); - } - return 0; - } - - static void - DestroyOneWithGIL(const ThreadState* const state) - { - // Holding the GIL. - // Passed a non-shared pointer to the actual thread state. - // state -> main greenlet - assert(state->has_main_greenlet()); - PyGreenlet* main(state->borrow_main_greenlet()); - // When we need to do cross-thread operations, we check this. - // A NULL value means the thread died some time ago. - // We do this here, rather than in a Python dealloc function - // for the greenlet, in case there's still a reference out - // there. - dynamic_cast(main->pimpl)->thread_state(nullptr); - - delete state; // Deleting this runs the destructor, DECREFs the main greenlet. - } - - // ensure this is actually defined. - static_assert(GREENLET_BROKEN_PY_ADD_PENDING == 1 || GREENLET_BROKEN_PY_ADD_PENDING == 0, - "GREENLET_BROKEN_PY_ADD_PENDING not defined correctly."); - -#if GREENLET_BROKEN_PY_ADD_PENDING - static int _push_pending_call(struct _pending_calls *pending, - int (*func)(void *), void *arg) - { - int i = pending->last; - int j = (i + 1) % NPENDINGCALLS; - if (j == pending->first) { - return -1; /* Queue full */ - } - pending->calls[i].func = func; - pending->calls[i].arg = arg; - pending->last = j; - return 0; - } - - static int AddPendingCall(int (*func)(void *), void *arg) - { - _PyRuntimeState *runtime = &_PyRuntime; - if (!runtime) { - // obviously impossible - return 0; - } - struct _pending_calls *pending = &runtime->ceval.pending; - if (!pending->lock) { - return 0; - } - int result = 0; - PyThread_acquire_lock(pending->lock, WAIT_LOCK); - if (!pending->finishing) { - result = _push_pending_call(pending, func, arg); - } - PyThread_release_lock(pending->lock); - SIGNAL_PENDING_CALLS(&runtime->ceval); - return result; - } -#else - // Python < 3.8 or >= 3.9 - static int AddPendingCall(int (*func)(void*), void* arg) - { - // If the interpreter is in the middle of finalizing, we can't add a - // pending call. Trying to do so will end up in a SIGSEGV, as - // Py_AddPendingCall will not be able to get the interpreter and will - // try to dereference a NULL pointer. It's possible this can still - // segfault if we happen to get context switched, and maybe we should - // just always implement our own AddPendingCall, but I'd like to see if - // this works first -#if GREENLET_PY313 - if (Py_IsFinalizing()) { -#else - if (_Py_IsFinalizing()) { -#endif -#ifdef GREENLET_DEBUG - // No need to log in the general case. Yes, we'll leak, - // but we're shutting down so it should be ok. - fprintf(stderr, - "greenlet: WARNING: Interpreter is finalizing. Ignoring " - "call to Py_AddPendingCall; \n"); -#endif - return 0; - } - return Py_AddPendingCall(func, arg); - } -#endif - - - - -}; -}; - -}; // namespace greenlet - -// The intent when GET_THREAD_STATE() is needed multiple times in a -// function is to take a reference to its return value in a local -// variable, to avoid the thread-local indirection. On some platforms -// (macOS), accessing a thread-local involves a function call (plus an -// initial function call in each function that uses a thread local); -// in contrast, static volatile variables are at some pre-computed -// offset. -typedef greenlet::ThreadStateCreator ThreadStateCreator; -static thread_local ThreadStateCreator g_thread_state_global; -#define GET_THREAD_STATE() g_thread_state_global - -#endif //T_THREADSTATE_DESTROY diff --git a/port/lib/python3.11/site-packages/greenlet/TUserGreenlet.cpp b/port/lib/python3.11/site-packages/greenlet/TUserGreenlet.cpp deleted file mode 100644 index 73a8133..0000000 --- a/port/lib/python3.11/site-packages/greenlet/TUserGreenlet.cpp +++ /dev/null @@ -1,662 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -/** - * Implementation of greenlet::UserGreenlet. - * - * Format with: - * clang-format -i --style=file src/greenlet/greenlet.c - * - * - * Fix missing braces with: - * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" -*/ -#ifndef T_USER_GREENLET_CPP -#define T_USER_GREENLET_CPP - -#include "greenlet_internal.hpp" -#include "TGreenlet.hpp" - -#include "TThreadStateDestroy.cpp" - - -namespace greenlet { -using greenlet::refs::BorrowedMainGreenlet; -greenlet::PythonAllocator UserGreenlet::allocator; - -void* UserGreenlet::operator new(size_t UNUSED(count)) -{ - return allocator.allocate(1); -} - - -void UserGreenlet::operator delete(void* ptr) -{ - return allocator.deallocate(static_cast(ptr), - 1); -} - - -UserGreenlet::UserGreenlet(PyGreenlet* p, BorrowedGreenlet the_parent) - : Greenlet(p), _parent(the_parent) -{ -} - -UserGreenlet::~UserGreenlet() -{ - // Python 3.11: If we don't clear out the raw frame datastack - // when deleting an unfinished greenlet, - // TestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main fails. - this->python_state.did_finish(nullptr); - this->tp_clear(); -} - - -const BorrowedMainGreenlet -UserGreenlet::main_greenlet() const -{ - return this->_main_greenlet; -} - - -BorrowedMainGreenlet -UserGreenlet::find_main_greenlet_in_lineage() const -{ - if (this->started()) { - assert(this->_main_greenlet); - return BorrowedMainGreenlet(this->_main_greenlet); - } - - if (!this->_parent) { - /* garbage collected greenlet in chain */ - // XXX: WHAT? - return BorrowedMainGreenlet(nullptr); - } - - return this->_parent->find_main_greenlet_in_lineage(); -} - - -/** - * CAUTION: This will allocate memory and may trigger garbage - * collection and arbitrary Python code. - */ -OwnedObject -UserGreenlet::throw_GreenletExit_during_dealloc(const ThreadState& current_thread_state) -{ - /* The dying greenlet cannot be a parent of ts_current - because the 'parent' field chain would hold a - reference */ - UserGreenlet::ParentIsCurrentGuard with_current_parent(this, current_thread_state); - - // We don't care about the return value, only whether an - // exception happened. Whether or not an exception happens, - // we need to restore the parent in case the greenlet gets - // resurrected. - return Greenlet::throw_GreenletExit_during_dealloc(current_thread_state); -} - -ThreadState* -UserGreenlet::thread_state() const noexcept -{ - // TODO: maybe make this throw, if the thread state isn't there? - // if (!this->main_greenlet) { - // throw std::runtime_error("No thread state"); // TODO: Better exception - // } - if (!this->_main_greenlet) { - return nullptr; - } - return this->_main_greenlet->thread_state(); -} - - -bool -UserGreenlet::was_running_in_dead_thread() const noexcept -{ - return this->_main_greenlet && !this->thread_state(); -} - -OwnedObject -UserGreenlet::g_switch() -{ - assert(this->args() || PyErr_Occurred()); - - try { - this->check_switch_allowed(); - } - catch (const PyErrOccurred&) { - this->release_args(); - throw; - } - - // Switching greenlets used to attempt to clean out ones that need - // deleted *if* we detected a thread switch. Should it still do - // that? - // An issue is that if we delete a greenlet from another thread, - // it gets queued to this thread, and ``kill_greenlet()`` switches - // back into the greenlet - - /* find the real target by ignoring dead greenlets, - and if necessary starting a greenlet. */ - switchstack_result_t err; - Greenlet* target = this; - // TODO: probably cleaner to handle the case where we do - // switch to ourself separately from the other cases. - // This can probably even further be simplified if we keep - // track of the switching_state we're going for and just call - // into g_switch() if it's not ourself. The main problem with that - // is that we would be using more stack space. - bool target_was_me = true; - bool was_initial_stub = false; - while (target) { - if (target->active()) { - if (!target_was_me) { - target->args() <<= this->args(); - assert(!this->args()); - } - err = target->g_switchstack(); - break; - } - if (!target->started()) { - // We never encounter a main greenlet that's not started. - assert(!target->main()); - UserGreenlet* real_target = static_cast(target); - assert(real_target); - void* dummymarker; - was_initial_stub = true; - if (!target_was_me) { - target->args() <<= this->args(); - assert(!this->args()); - } - try { - // This can only throw back to us while we're - // still in this greenlet. Once the new greenlet - // is bootstrapped, it has its own exception state. - err = real_target->g_initialstub(&dummymarker); - } - catch (const PyErrOccurred&) { - this->release_args(); - throw; - } - catch (const GreenletStartedWhileInPython&) { - // The greenlet was started sometime before this - // greenlet actually switched to it, i.e., - // "concurrent" calls to switch() or throw(). - // We need to retry the switch. - // Note that the current greenlet has been reset - // to this one (or we wouldn't be running!) - continue; - } - break; - } - - target = target->parent(); - target_was_me = false; - } - // The ``this`` pointer and all other stack or register based - // variables are invalid now, at least where things succeed - // above. - // But this one, probably not so much? It's not clear if it's - // safe to throw an exception at this point. - - if (err.status < 0) { - // If we get here, either g_initialstub() - // failed, or g_switchstack() failed. Either one of those - // cases SHOULD leave us in the original greenlet with a valid - // stack. - return this->on_switchstack_or_initialstub_failure(target, err, target_was_me, was_initial_stub); - } - - // err.the_new_current_greenlet would be the same as ``target``, - // if target wasn't probably corrupt. - return err.the_new_current_greenlet->g_switch_finish(err); -} - - - -Greenlet::switchstack_result_t -UserGreenlet::g_initialstub(void* mark) -{ - OwnedObject run; - - // We need to grab a reference to the current switch arguments - // in case we're entered concurrently during the call to - // GetAttr() and have to try again. - // We'll restore them when we return in that case. - // Scope them tightly to avoid ref leaks. - { - SwitchingArgs args(this->args()); - - /* save exception in case getattr clears it */ - PyErrPieces saved; - - /* - self.run is the object to call in the new greenlet. - This could run arbitrary python code and switch greenlets! - */ - run = this->self().PyRequireAttr(mod_globs->str_run); - /* restore saved exception */ - saved.PyErrRestore(); - - - /* recheck that it's safe to switch in case greenlet reparented anywhere above */ - this->check_switch_allowed(); - - /* by the time we got here another start could happen elsewhere, - * that means it should now be a regular switch. - * This can happen if the Python code is a subclass that implements - * __getattribute__ or __getattr__, or makes ``run`` a descriptor; - * all of those can run arbitrary code that switches back into - * this greenlet. - */ - if (this->stack_state.started()) { - // the successful switch cleared these out, we need to - // restore our version. They will be copied on up to the - // next target. - assert(!this->args()); - this->args() <<= args; - throw GreenletStartedWhileInPython(); - } - } - - // Sweet, if we got here, we have the go-ahead and will switch - // greenlets. - // Nothing we do from here on out should allow for a thread or - // greenlet switch: No arbitrary calls to Python, including - // decref'ing - -#if GREENLET_USE_CFRAME - /* OK, we need it, we're about to switch greenlets, save the state. */ - /* - See green_new(). This is a stack-allocated variable used - while *self* is in PyObject_Call(). - We want to defer copying the state info until we're sure - we need it and are in a stable place to do so. - */ - _PyCFrame trace_info; - - this->python_state.set_new_cframe(trace_info); -#endif - /* start the greenlet */ - ThreadState& thread_state = GET_THREAD_STATE().state(); - this->stack_state = StackState(mark, - thread_state.borrow_current()->stack_state); - this->python_state.set_initial_state(PyThreadState_GET()); - this->exception_state.clear(); - this->_main_greenlet = thread_state.get_main_greenlet(); - - /* perform the initial switch */ - switchstack_result_t err = this->g_switchstack(); - /* returns twice! - The 1st time with ``err == 1``: we are in the new greenlet. - This one owns a greenlet that used to be current. - The 2nd time with ``err <= 0``: back in the caller's - greenlet; this happens if the child finishes or switches - explicitly to us. Either way, the ``err`` variable is - created twice at the same memory location, but possibly - having different ``origin`` values. Note that it's not - constructed for the second time until the switch actually happens. - */ - if (err.status == 1) { - // In the new greenlet. - - // This never returns! Calling inner_bootstrap steals - // the contents of our run object within this stack frame, so - // it is not valid to do anything with it. - try { - this->inner_bootstrap(err.origin_greenlet.relinquish_ownership(), - run.relinquish_ownership()); - } - // Getting a C++ exception here isn't good. It's probably a - // bug in the underlying greenlet, meaning it's probably a - // C++ extension. We're going to abort anyway, but try to - // display some nice information *if* possible. Some obscure - // platforms don't properly support this (old 32-bit Arm, see see - // https://github.com/python-greenlet/greenlet/issues/385); that's not - // great, but should usually be OK because, as mentioned above, we're - // terminating anyway. - // - // The catching is tested by - // ``test_cpp.CPPTests.test_unhandled_exception_in_greenlet_aborts``. - // - // PyErrOccurred can theoretically be thrown by - // inner_bootstrap() -> g_switch_finish(), but that should - // never make it back to here. It is a std::exception and - // would be caught if it is. - catch (const std::exception& e) { - std::string base = "greenlet: Unhandled C++ exception: "; - base += e.what(); - Py_FatalError(base.c_str()); - } - catch (...) { - // Some compilers/runtimes use exceptions internally. - // It appears that GCC on Linux with libstdc++ throws an - // exception internally at process shutdown time to unwind - // stacks and clean up resources. Depending on exactly - // where we are when the process exits, that could result - // in an unknown exception getting here. If we - // Py_FatalError() or abort() here, we interfere with - // orderly process shutdown. Throwing the exception on up - // is the right thing to do. - // - // gevent's ``examples/dns_mass_resolve.py`` demonstrates this. -#ifndef NDEBUG - fprintf(stderr, - "greenlet: inner_bootstrap threw unknown exception; " - "is the process terminating?\n"); -#endif - throw; - } - Py_FatalError("greenlet: inner_bootstrap returned with no exception.\n"); - } - - - // In contrast, notice that we're keeping the origin greenlet - // around as an owned reference; we need it to call the trace - // function for the switch back into the parent. It was only - // captured at the time the switch actually happened, though, - // so we haven't been keeping an extra reference around this - // whole time. - - /* back in the parent */ - if (err.status < 0) { - /* start failed badly, restore greenlet state */ - this->stack_state = StackState(); - this->_main_greenlet.CLEAR(); - // CAUTION: This may run arbitrary Python code. - run.CLEAR(); // inner_bootstrap didn't run, we own the reference. - } - - // In the success case, the spawned code (inner_bootstrap) will - // take care of decrefing this, so we relinquish ownership so as - // to not double-decref. - - run.relinquish_ownership(); - - return err; -} - - -void -UserGreenlet::inner_bootstrap(PyGreenlet* origin_greenlet, PyObject* run) -{ - // The arguments here would be another great place for move. - // As it is, we take them as a reference so that when we clear - // them we clear what's on the stack above us. Do that NOW, and - // without using a C++ RAII object, - // so there's no way that exiting the parent frame can clear it, - // or we clear it unexpectedly. This arises in the context of the - // interpreter shutting down. See https://github.com/python-greenlet/greenlet/issues/325 - //PyObject* run = _run.relinquish_ownership(); - - /* in the new greenlet */ - assert(this->thread_state()->borrow_current() == BorrowedGreenlet(this->_self)); - // C++ exceptions cannot propagate to the parent greenlet from - // here. (TODO: Do we need a catch(...) clause, perhaps on the - // function itself? ALl we could do is terminate the program.) - // NOTE: On 32-bit Windows, the call chain is extremely - // important here in ways that are subtle, having to do with - // the depth of the SEH list. The call to restore it MUST NOT - // add a new SEH handler to the list, or we'll restore it to - // the wrong thing. - this->thread_state()->restore_exception_state(); - /* stack variables from above are no good and also will not unwind! */ - // EXCEPT: That can't be true, we access run, among others, here. - - this->stack_state.set_active(); /* running */ - - // We're about to possibly run Python code again, which - // could switch back/away to/from us, so we need to grab the - // arguments locally. - SwitchingArgs args; - args <<= this->args(); - assert(!this->args()); - - // XXX: We could clear this much earlier, right? - // Or would that introduce the possibility of running Python - // code when we don't want to? - // CAUTION: This may run arbitrary Python code. - this->_run_callable.CLEAR(); - - - // The first switch we need to manually call the trace - // function here instead of in g_switch_finish, because we - // never return there. - if (OwnedObject tracefunc = this->thread_state()->get_tracefunc()) { - OwnedGreenlet trace_origin; - trace_origin = origin_greenlet; - try { - g_calltrace(tracefunc, - args ? mod_globs->event_switch : mod_globs->event_throw, - trace_origin, - this->_self); - } - catch (const PyErrOccurred&) { - /* Turn trace errors into switch throws */ - args.CLEAR(); - } - } - - // We no longer need the origin, it was only here for - // tracing. - // We may never actually exit this stack frame so we need - // to explicitly clear it. - // This could run Python code and switch. - Py_CLEAR(origin_greenlet); - - OwnedObject result; - if (!args) { - /* pending exception */ - result = NULL; - } - else { - /* call g.run(*args, **kwargs) */ - // This could result in further switches - try { - //result = run.PyCall(args.args(), args.kwargs()); - // CAUTION: Just invoking this, before the function even - // runs, may cause memory allocations, which may trigger - // GC, which may run arbitrary Python code. - result = OwnedObject::consuming(PyObject_Call(run, args.args().borrow(), args.kwargs().borrow())); - } - catch (...) { - // Unhandled C++ exception! - - // If we declare ourselves as noexcept, if we don't catch - // this here, most platforms will just abort() the - // process. But on 64-bit Windows with older versions of - // the C runtime, this can actually corrupt memory and - // just return. We see this when compiling with the - // Windows 7.0 SDK targeting Windows Server 2008, but not - // when using the Appveyor Visual Studio 2019 image. So - // this currently only affects Python 2.7 on Windows 64. - // That is, the tests pass and the runtime aborts - // everywhere else. - // - // However, if we catch it and try to continue with a - // Python error, then all Windows 64 bit platforms corrupt - // memory. So all we can do is manually abort, hopefully - // with a good error message. (Note that the above was - // tested WITHOUT the `/EHr` switch being used at compile - // time, so MSVC may have "optimized" out important - // checking. Using that switch, we may be in a better - // place in terms of memory corruption.) But sometimes it - // can't be caught here at all, which is confusing but not - // terribly surprising; so again, the G_NOEXCEPT_WIN32 - // plus "/EHr". - // - // Hopefully the basic C stdlib is still functional enough - // for us to at least print an error. - // - // It gets more complicated than that, though, on some - // platforms, specifically at least Linux/gcc/libstdc++. They use - // an exception to unwind the stack when a background - // thread exits. (See comments about noexcept.) So this - // may not actually represent anything untoward. On those - // platforms we allow throws of this to propagate, or - // attempt to anyway. -# if defined(WIN32) || defined(_WIN32) - Py_FatalError( - "greenlet: Unhandled C++ exception from a greenlet run function. " - "Because memory is likely corrupted, terminating process."); - std::abort(); -#else - throw; -#endif - } - } - // These lines may run arbitrary code - args.CLEAR(); - Py_CLEAR(run); - - if (!result - && mod_globs->PyExc_GreenletExit.PyExceptionMatches() - && (this->args())) { - // This can happen, for example, if our only reference - // goes away after we switch back to the parent. - // See test_dealloc_switch_args_not_lost - PyErrPieces clear_error; - result <<= this->args(); - result = single_result(result); - } - this->release_args(); - this->python_state.did_finish(PyThreadState_GET()); - - result = g_handle_exit(result); - assert(this->thread_state()->borrow_current() == this->_self); - - /* jump back to parent */ - this->stack_state.set_inactive(); /* dead */ - - - // TODO: Can we decref some things here? Release our main greenlet - // and maybe parent? - for (Greenlet* parent = this->_parent; - parent; - parent = parent->parent()) { - // We need to somewhere consume a reference to - // the result; in most cases we'll never have control - // back in this stack frame again. Calling - // green_switch actually adds another reference! - // This would probably be clearer with a specific API - // to hand results to the parent. - parent->args() <<= result; - assert(!result); - // The parent greenlet now owns the result; in the - // typical case we'll never get back here to assign to - // result and thus release the reference. - try { - result = parent->g_switch(); - } - catch (const PyErrOccurred&) { - // Ignore, keep passing the error on up. - } - - /* Return here means switch to parent failed, - * in which case we throw *current* exception - * to the next parent in chain. - */ - assert(!result); - } - /* We ran out of parents, cannot continue */ - PyErr_WriteUnraisable(this->self().borrow_o()); - Py_FatalError("greenlet: ran out of parent greenlets while propagating exception; " - "cannot continue"); - std::abort(); -} - -void -UserGreenlet::run(const BorrowedObject nrun) -{ - if (this->started()) { - throw AttributeError( - "run cannot be set " - "after the start of the greenlet"); - } - this->_run_callable = nrun; -} - -const OwnedGreenlet -UserGreenlet::parent() const -{ - return this->_parent; -} - -void -UserGreenlet::parent(const BorrowedObject raw_new_parent) -{ - if (!raw_new_parent) { - throw AttributeError("can't delete attribute"); - } - - BorrowedMainGreenlet main_greenlet_of_new_parent; - BorrowedGreenlet new_parent(raw_new_parent.borrow()); // could - // throw - // TypeError! - for (BorrowedGreenlet p = new_parent; p; p = p->parent()) { - if (p == this->self()) { - throw ValueError("cyclic parent chain"); - } - main_greenlet_of_new_parent = p->main_greenlet(); - } - - if (!main_greenlet_of_new_parent) { - throw ValueError("parent must not be garbage collected"); - } - - if (this->started() - && this->_main_greenlet != main_greenlet_of_new_parent) { - throw ValueError("parent cannot be on a different thread"); - } - - this->_parent = new_parent; -} - -void -UserGreenlet::murder_in_place() -{ - this->_main_greenlet.CLEAR(); - Greenlet::murder_in_place(); -} - -bool -UserGreenlet::belongs_to_thread(const ThreadState* thread_state) const -{ - return Greenlet::belongs_to_thread(thread_state) && this->_main_greenlet == thread_state->borrow_main_greenlet(); -} - - -int -UserGreenlet::tp_traverse(visitproc visit, void* arg) -{ - Py_VISIT(this->_parent.borrow_o()); - Py_VISIT(this->_main_greenlet.borrow_o()); - Py_VISIT(this->_run_callable.borrow_o()); - - return Greenlet::tp_traverse(visit, arg); -} - -int -UserGreenlet::tp_clear() -{ - Greenlet::tp_clear(); - this->_parent.CLEAR(); - this->_main_greenlet.CLEAR(); - this->_run_callable.CLEAR(); - return 0; -} - -UserGreenlet::ParentIsCurrentGuard::ParentIsCurrentGuard(UserGreenlet* p, - const ThreadState& thread_state) - : oldparent(p->_parent), - greenlet(p) -{ - p->_parent = thread_state.get_current(); -} - -UserGreenlet::ParentIsCurrentGuard::~ParentIsCurrentGuard() -{ - this->greenlet->_parent = oldparent; - oldparent.CLEAR(); -} - -}; //namespace greenlet -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/__init__.py b/port/lib/python3.11/site-packages/greenlet/__init__.py deleted file mode 100644 index b2dcc9b..0000000 --- a/port/lib/python3.11/site-packages/greenlet/__init__.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -""" -The root of the greenlet package. -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -__all__ = [ - '__version__', - '_C_API', - - 'GreenletExit', - 'error', - - 'getcurrent', - 'greenlet', - - 'gettrace', - 'settrace', -] - -# pylint:disable=no-name-in-module - -### -# Metadata -### -__version__ = '3.1.1' -from ._greenlet import _C_API # pylint:disable=no-name-in-module - -### -# Exceptions -### -from ._greenlet import GreenletExit -from ._greenlet import error - -### -# greenlets -### -from ._greenlet import getcurrent -from ._greenlet import greenlet - -### -# tracing -### -try: - from ._greenlet import gettrace - from ._greenlet import settrace -except ImportError: - # Tracing wasn't supported. - # XXX: The option to disable it was removed in 1.0, - # so this branch should be dead code. - pass - -### -# Constants -# These constants aren't documented and aren't recommended. -# In 1.0, USE_GC and USE_TRACING are always true, and USE_CONTEXT_VARS -# is the same as ``sys.version_info[:2] >= 3.7`` -### -from ._greenlet import GREENLET_USE_CONTEXT_VARS # pylint:disable=unused-import -from ._greenlet import GREENLET_USE_GC # pylint:disable=unused-import -from ._greenlet import GREENLET_USE_TRACING # pylint:disable=unused-import - -# Controlling the use of the gc module. Provisional API for this greenlet -# implementation in 2.0. -from ._greenlet import CLOCKS_PER_SEC # pylint:disable=unused-import -from ._greenlet import enable_optional_cleanup # pylint:disable=unused-import -from ._greenlet import get_clocks_used_doing_optional_cleanup # pylint:disable=unused-import - -# Other APIS in the _greenlet module are for test support. diff --git a/port/lib/python3.11/site-packages/greenlet/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 78280dc1fa5bf0958da930f6e57384391c2b2d53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336 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�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%0AUqRM3WI(^sM*m3PAT-W9 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

pQecY~S7GCw?qgrH z^dWt9V2hR`5f0aZ7A+SeOaQiMacwr|@Jcd|(rDy}kx;WxSp(6EJx{)V?g| zPwV-IsMdWT+gC-Rt>+hV=4W8*c~@o;N_t$+JEwS9m?GWz9bxUPbG7HU;k$Db7ao-L zTs}-IW_mC=u$xBm`lwe!9oaS-Yil_r>F-cJ?dqJa zlWq!8508dI+7*-@9*yDXEMPyP<(gQii!x)=xG}vxj_aA8!JlamZv|#>UPX8rn89() z8s27;m7dj-T*?j3Lih`$BZK42+9+i_}O*zDQkr%oZ?TWNn1rp!j*a{vxGgAdLt;wN9miL*F&kg zX<4iPKYf&?XBCnQLK|~Ya+g8#$GV$S_dd{$q^gIi?kjUJ72$ed4vS}yugIWqU%Hlk zt#vls7o@DOwbs-zkpgpAT)C=J*&UYNaC-uCSPn)w5EQQn)n0_d;z?}d3nX_~)S@c} z&>}f3CSe(U=Vz%W6hvhw} z?}#pk#Yy=ndH1@*Qq@2Mfj;K2xC*c6Xj6iQ*gS?y$zgFubp^NNu-MmHoya?=HQO|$ zO?|hf=M?W;o5EKH7Vn&e@VE{X@4ToZzYz>9-sw5Cw;W=;^KXr;vVp}r??t#p2ij(J z(qg<}2iOxT*RGEhEq_9F{g%{4vCm~X@pVj)#Xg@cwf~YV_BnDZh>Cq~4ryaxvCp6W z<(=9e9#5#6L{seZG$<#6;=(}r>)7X)fuUKiC;HjStghw8EN{(vdu69BuEMLX{^EUI zeQwG$%446l&B`Ac^$4}?z!fOPL9Yw5F~PSW`E8{*=sRkW;-D|kn&;G_I|9pH!Bfb! z&Q%o${UOv=anO4L+2Wv&g@Y^(>Ydys4!Y^2Y)F>&Tz&8&`-{UB$tR=e>2#&E@S29v z_ayy5rRIWaIl<1WN~Y_|-I2C854iW@^er$Cc#f`>z6X0GXATAC0lOw~u!&_JuycxU zF46-|>>IeAMsy2Z)o$=M)K0$lRPw*xOCCk4l{||x|MrsK32oz5iRC5#O8R_Ie5Q5D z9v$Wp-JRIU(5GoKM@4g^o<5MGWec|Hj57)BX`1tLNz0|of6V{iZwpWJ|5!L@il_PC zdAxX0Jm&o6#nYVsB%H^^)12?Ts$`sa%=6!?$(rZCf%6r}=J^d`1zifGu(T7QQxlUG z2=ly0{Rz(ohoDnXiSzvWu-64P&ksY`6WBcOD!F8)>g5a5v810V1eW57m0j^NTM*YzWvqzdgcsI?z0S48ll|G@KpkTRzWk9^3Cy#nZGa zQN9A$Jnt-`ov>SThX<#SwwEkl|cf(A7;K+ON;o+px(6C3$hDG8NodcK(lWo~U8n1L3@0NZd3i zS56LS6q&8c-P>?u?r$VxKIjHa~?u_xfb-JuJ-@yaBoUPNAyD zX5{?%ai{WFJj|rJDyrlNspj+((!;Lf>B+V?SawOT>|gRVx*cvJp&yO!3+jdhh9P_CjsDzlX0ecQw|h8Q_j6fhT{)o|DYM_o^*Nq*eWo_? zO#YuZOZ%u^N(Vi|J^nCSTfg#8q*oS`T%F8Xd@f5>^F8)Y(jMt@FCr%E?|I@Qc9OBx@wip_k`>+SHqh{FP;aC+Pkt*L9L$wZj+ypv=+{{x^JZna4~c~|ZSRF# zw~`8ZgUnt5z2t z_-tIY>@%GV8V}xl(hdyHTS*xQFIT3KRj~P++)_O^4cX{U zJBITOr-T!|M;ohY3u-$koGVG*wT*{#eL>|8fpr>Xo(httJvrJZ*3TthWi}p~p0^`9 zhrzl7{&djTjrKXQr0gn7e7$6$7mUV6TI95Rlp^hzuIUOe-X+JkLDmD#FKK4&=Rs<_ z{8BxSY|{fgmQwvMy&_}L<<(rsL(?7%1*>z~g>5F}-l94?ji<`cyq+zprzcfqNuh45 zqP;T6>gF7NWhs=`s&3bXlYVu$K6{1gYQz?A3F+^ZJ%BoKUPoq~f!RGXiArbp%)l0n z-&NP!lFlBuzT_Pa-T(Ncal6jv6K(8&Keu1w;7mT7o1$_1262)p=>R6+#tkgHnR_KHoA=)c3pL+TvGq})%;Wf zJ(zuZE#w`-fA**&rSKyuN%6dp)@iWK1nFSx9<%87bG(s%t^Z!#A@< zD$sI9>vHKD>4%(sf#l~v`WgrSL71n57dYtBmAZgt<=X9A&J>>uSF1L4z;ZE>r zTI)6z)v@9(;hflq+8weBwc7;NipvsS1vOWXFRA3Bva484r$N~d?lAF}pcbBSK1z|V zTCWb}8n{=1v^xjyBfJfYUxm8eF}u9h?Wf^_$6CAOSyJn{s`Zkvy0mclfCa9c$Pd^D zWmmDjTl02iUAQ}gY-=^b1W;TM=pk@reOJE+SJo4_zS+fGayJS-gp`-jn+>YZEu#@% zfu>)BNiWlB(tj3b_)T2-PzFmtarjl3^b}6FEXN}{(DWpO!Z}q@3KvSh6!V{5Df$&y z1E6mX8Xp^3QYqEdRoXANMmihD5l{~kedOUKdUZt!gjv(kFfM_55#ZA@v8+z~V7cmj zZm0A*&OQj^{*0CMU4^zLY|!YjH?HTZ9DGX3hoJrjZc$Cf`p`LWx=dT^mZ3D{E>f27 z#YA+5V2q+Y1A5i+jLkK+5+`j9^(sIF(=y!}j7G9csRYVJ+CZy3%W7|z+tgsD)77}OmZ zs-=L+DH(?_a^1Dz^y6eVF{<(|!BD~Suu0OCf1Gd7gn~+vTj4IZFEMdS z1Di2iDHqkFQkUG{Y{pm_g_WeF8KbyOs9KmQ%oU<;O&?ArR1nfiQmA#(WqQBIXlY?C ztfc9=GHyO<#a@}-?}?0rx17Ud6#Ago#q_ z#_i{ID@4i5E4-bqm#zop5x5UYxfchYAbcccSpZkAj#5-sC|=f}eRmfBz^p+pgw;WD z*U%%u8hCHjPoiy}M!1KyYnMA}=l-2mPa|btRCiKdH*nBlMXnoY7OTU9oH>)DlR@oq zXP0up*pgoOC0%{2vN?;SPvLwFs;^_=;HBj=-eqZhdMBsrRwBX)Z2hrcynZgZ_u4R+ z$52{-^oF|z;8Q(@t;jIlln z1vYG6cA%5>y_kZ|i8%}=2L{u5d(y^DNLj51d(lAkKbgdx#&&XOh1Ut&-OA}nq>lq# zAK{>5LYK}&s9u>zaMIMT4O|clP3RwWlRyT30Dy8OCmkbH1-xofp! z_M)P?zwaWOJAmEalLL`0ctP^JF5cg7!F>ai?r*2^2)2z1q7gnoPC;)z4f};^Kd) zNB7Syn|{FQF{GaX($_h74B=rZ>~TU#0Z&W{Nv>x)g44;WG)W4FaIiiH>wsoaI*j7X zaU6{V?KH-33H3{&{zXtae!0f9b|8Oj2 zlqz~$TK|S}*0BE#)-S-u)Z;Pd>G0yPUuU&6=>r-HWn&6g-Yegx<6AWTUk^ry@GMy| z{%!34gIo>+MZMftpIJ9$p{en^a$q;k!%plpjU$5h*{_MtOvE7jQY< z(lI|}x+}=h=G{2SXXt$b+ATh&M9W15RYjjA-^q2Esq(r(tMADi36gfR&n_udRVuxm zYiLkG)hMlnLLZPWKxcP^-E{B`2d5#N3h1{`{~f59Zp{(R)c@(n3dxL+z#jIj{=<~* zTck`y@p@47?z!pKpv!I8)AcN~j$}51E8xAvb4D^_>GOv&JDHRh$>;^pGUjGt!l6uN zS(Q1tcX}gde<1mLkp7c{C0A$fFGweHupz<*pjq?|cXH-1jt&9E7eiL}h9!`$3og$( z;k4Y6&aC99rQDJ&!|9I(ahGJLvj}Bve)>fky3*Yp6Xr*YM#5TM9f#HblH@R%pXFz8}3~oeUpRt5Z(dp zv`4RRD1}WeLGr1zuxr}0rwY{Sp=u2-7qHdC$_Oig;$}gm{IPe9rUg$R7!@dfix-9l zGq?j83<7-WNB$F&5s3L@HW#L`f9J0#yKpWk>1h5;fI0>=E4AAs&eW=)t%4T$}<8-d!Ej-L((ij09^WB#WzUt259P>qSxp2+{BpL%#()0RIW_Jr|4DLbWC-*+VLmJ&J zq%n{R3;?|>T++Rd!W_47JQ-wRj+HD_k{jQDvxAwQ8dqIxvyFMW-J4Y_*t%LFqt!wr zWXt-oM1!W``DC9_6xp~^=P?J+;whv&g~k&gy_AD*5WWJ{P1D(f6?9l2qEpzRYOAy- zr#q?oAYFlj^$_|3`zDSnuo{wrY@tThFw*ywf_8wOg>VKaJ{WQ@Uza9LM^On+$wett zJ!$N*)Pt(`sjzM(lbbXik7)?LXf zIb7Ln(j_^FW-18uDouPDSP;l*yr2S_2Z0unyZ~4bXgNZ{%K{4m4Mf-+G>e`Efi?*x zEg}dsC?qi*XO%c+B$ZGQ=q>X2H?Sa(({f1*E(8IK`&3s2f%aYtg90oF|!o+CN#9Kz1%aG{uPKfPfku-)3Rn=xIlQPf)W~mbf-gTGLeUBW-3Wau zupp2V3l%CJ1ey)?MbQ-ma(Z=?yaW#d{S5U-z{i3>u2GYWQ@ukFXqj~x+dv-+0?j6| z=ZFvl8bHdXz=A->ho{L7>;TaxzjLb4lt>38@MK{hFm# z27!JIq}D;83qzX}1X_!Vka0y2==#7>5NO+sV?m(1!}-I)Ij@ihfp!Qb%G)|UK_{0;NTwQ~3^48>P5NJOG9Lq!bs4PR&&+`6BUL6vj%)f`N)mEGQHokN6;$@0!^pf+kgduT&1c)B?f_BgZm1wAkeP}zerg@ zAXnxaZ=r5pUJL>)*AJrvEC{p(!e+pNK(10fe-DN`2$b$`rxM6&qZIG&qfr_R7Xk|ct;cd;ZD2tlSIB1y9t1j;^bx>Epb$Z=XOafuAp}W>*_N{_IuBZEaga?7V6y|j@W9gG;fn`CU z&Bkt&`#faQGU22VEnNStJC@5@U z;R+{F1xN~46x0RQ^s(f0HYjejVpbJz`pK$S?bFxMwIPK#jmj95E_*B$E4)uq`WkC{u;0V*l!5Gf@V=VC;+zn0G=WMn}dh0nAL>W0tBgi z4lbxu6cpPM{uaRcd#}J`h6z$de;*F_P!Q(e!(u7JR8i*OVai!^@B~=nfX%^2#hk~% zi*xWjq|X2iE3A~&Hq60ZW$#9F;**+dZ-W(>CCTrEF59Ht(%YfDOO9`YjqfkxJFCM3 zoXl@YCxRM1ck0y+LMn`4@=~JTz&CdkLSY1K;=O6 zwgGmDMk4$J*d=-+cAiV#-HKaIQZBkgc4?fEPh4_tc?{Fjyx%nZ>SlM(D*nf|yt0Q( zZ9e5M-#@r`QkJB()_7(ww{MC-&I?rS4|p?7Ogdjf_%XO%-9HNFyM%M&w@iv(m2tD8 z6vft0fb&rKvH#OGEBX`Ke!ql886#JWCYOeT3{yuyFRpdNQ(d2%jssVoSWoCx*C6H(1} zVujLJ8ITp0=uFZr2sf8zd<(LjSb>%|ng`*UwqhSTuprz92u=l=>j4YG9glD{D1II2l|eX9!Pjk* zCAB{OWNNJ-+&yG+C$J!#6LS?RF$nh~-0y*zlHLOe9D(A(P(rwuOFOYVfgoIVF|R#^ zf)#{29KAz<1>u}V5Dr=l!d*=I1aTCEa}Gf`aXbk30O|Ju3&J^vpY{wj3KvSjuai`? zf^Z)}p93ri=S21ew^8vRTn}N#Toi=s$P`ouEC{zJ!mglMth)X|NkO=w@Uyv8JF#&0>h=t& z3c{V5rM3>jK`QB#{u}FUr?hBx_NOvla#@Z;wMfwjYd@rTANOx+kQpp$T&0Mu6kS)@; z3wirmk&B~`1>ro6?-#`eWXY@>x22_JK{#jRBRBTS^nQaz(<`q|<=3kyw;!+|oU2q- zsKg-LK5&Nt3&Nd^aHfCR!FdN*5YBlRW$`=+R~Uk82+ZR;DAblEW02e}i~)&N z;PwD~EC~0Hs4_*_dJt|WCuT2^X^P(${`*X3s8Ct z!krA~cu?$HRx9`LsGQy3lY?$PamfbSB7RJ73HSlD~vbtBYzXYYV{J;ZFlL=4S*ZV=+kn9qTyeUx)iD2n)c+ zV=05xG8TY)D`zbLe}}aI*qC}I<~#~s9QJ*8BlZj$dX|kT42V~`O~+dhZgMa#teMHm zgK#6r<#15EE+mIIRDS&QQ>m=oIcG%8InunhFjsZeo$~~mk4gKy*4i?DSp?5b9TQZo z=}wcUt*uyJqW3wl2%gh&iA!W)A4TxCk&YsG9fxwsKo-GsYE`8Y5xmQ#qzGPL6xIe7 z!P^sI4;?6icLu^}kQ9f9`g;WLB;Sg4LP$uG{#pIMRw4!iNW~VEoa9;$HqHym;Qc~=A zcXq+td6Ai_U-gng@_bx8PN#m2UHkN64V$h<%2iZx0;oUk;u4K}w;iqiw%g*DK)aBX z)%KucKzbGjGZF3r?bf~lk27Rl(spCRH*>lTIfo23g|^w>d9fa7SLC9*PIZ(#B(UTL zRm*%c7M;$}4uyX(sQGY2NvBw;b9%mG`U{i^aL0kdTn-4_ElVD=yGqn!8JEh6>YVn3 zavv)904v5>xk~<#p_n;v-v^sV=Sl?KwYBrFCyvwAOHSI;naic!?;c0P z+S3^gd!h}}90wB+#(;KH&MGP8qPo?dKTGbMTYt8C^EPOU?Zu41F>!HvWG~Q14cx=yFZ>$~G%3T?fF|7( zNhOh#Bq|}5p*bq0`P=Y+KhIvzI>)_!zu*77UY~o{-s|(Mwf5R;uf3l2JbNwT=Yuet zgXV*o?*~Of$*xW7Qa)1GhPA``oW2~=2oSdB;5hoQ%3^3|6nA+MH+yt|&L88tdL&lR?_ zI!Z}*SNZTLmMWB@4v5uUjjVQY6)z$SkS$%D@p2-bb!$C{?+#pllag-DsJTIl@==nN z?;=U*&Za`Wt#p#*BA#_&>xq9eBgtQwg0Up2A4!r%e>q7evKeF4YWGAsOGf3ymn+Om zoW$8$=g~$?l(!{Ovii=YoaL9Qlo6W=YvP z6jtQ{I|IT=Ak5=nC4r?N@h<}5Py9LMVtQUsBtqru!?|S`247I4H3xDw`?vq_W^i`_ zGe!X;ydYg!myK zT+6{a0&mE{OB|FNK_Nk{0W?IDjz`k}tq{)S>|mk?f^Z54s|ma+2iJ3u1^(f{{Zb!4 zMnbOqXo!@cdY!O#gXvV`w?v%_y)Vd~NwJNGh6t}}=j@`egwxLw|0D<(a1g(Y(KrV+ zUg2OPwDKzm^ychYfM44uc$KjlbMPK{lz)OtT0!KtV^21?+*%oa(uO)6s&PaHBiCxHo1d;dD>PZC_|(cLBWUa z^sk(ziOJUncFoCP6osmOOql9@4;jfA_j)p!Acd2rXuKRBa%I!c4VvGLj5Nyy@E-%w z7}tby%L*~ZohU*w#(fuocYuy@e*Vg4czXx}KqDx1KNv9xDTkcs9$Y5B1Im_vKjLrBYU1E){ zIx0+tZ$s%p%4dKI(p4EN=0j0pjFKjo52eSt8tOQqOV4HWxDOefUM!SetQhJXp-XRO z^ei7Tx-4fSJ=>d5-vH4sTUy|JHzenA%8go}w!WWXeGjzt87Jo1mau48PfLrH)^{Sk zM^_NFJ`>6+D@5!2ON6BLU53C2psnv-0yE@5THnhAmV+R<$d%D)SWdqTDjf54`l6Hm zqAR;dC5(%1zOCv%W9XnI;Er;JQuS2!TN3Q8`owH%NbDFf_c}45iAFe*Zeyr) zCZZ8;C9nacL?bkrtYD?cpanL103p!=PrZ_NdjP03xl< zgt87M)M3?3ghZ?R4S`>PYIP=)C?jK9-Qhf2)q!etM$axo_gdYFaJvd$loaD9eaNn( znrU^H!o38fwK@~ZDI;`%R%f(S8QMX#IwP0!yZH>n%Z>Sj=o=^)bTCi`2rQyK>Y z+>>VU?0T*4b(qV5YIXguW-J6$t24=1U?ID1(dv$Rh*Z2*_Y^`;0M+V@9xp36t#VxC zyjJ%CGVcM^>P#-HjGSq8e?k3I=%Upb9Y_51W35Frt*-7hjNAY})#{9wEF)oBU3b{s zR6?~n6JVFOx2ZhS>L$Xt0;pD3@mk*eK(#s(K&ul0)9OYNKLn^&_Z@+6K#@>XtGnBm zf6#iQOsi{p9j>oHwYt#+h6B~=On~_c1iV(ajrh$XAX;73@zfKDv^wFbR(Cz8CV;$0 zU8bVdHK9pJ7t73R^1*UZS9)-*?qw&H3`(S^Xe%?3)$VIPsXh#}`!Zfm#Ix?}bK-Y` zOs&qSxoqtkCAn9U6s@k#1jdozfFxPqOL*3W4I=(rU`fhQ$&$q6E>s%*iL+^TUaPZs z%*n(bpw(FvCU&AqYjqZz2qsCwXmuk=SO+k3D8qvw(&~(uACw5uw7T68J_4%M^`1y$ z18J@9V~*YcMIxkHUA0L}rUKRKs%|s$(a&}R+l@MY80*Rd#K+6)#{8FSDx4E8ll)W0IJoUMc@q3 zS+u%GT*cVqS9iaSyb?=5#A8s1|F^5ltzx51sx(C{|8dg3i9^@N7k z=3z1t4ewzxDVD;ChG#tHZ=HlIn`(F!ijk2q_B!})f@q9w)U2{XjIjrakc_cqwqYO8 zG4^4+Uy6W^u{#s!2qF#7l4H&PcWLpa;SGZ@6sU%0oSdMCaM19^%p)7o@TS3;3RJ^; zk-!UbAR6AM1U?2uBBL7KW`B{>B$)#=yj;4CET9@*KLWjgYIr6^UPv9N;mw3JL!?B* z`;x$JP$WFn@ETAIsldFiT+X85T|m*L)5NqP(@FhG+D+57}Ke4R1Bn*Mu$_p3$>>$mpiw?Sb_Th<-Vu;Z=DqI!K31 zago-jEwRe2WB{}!8Xw1JCuy08w)c>VuDugDJ73>ok6vAHf z5fX*)B{(k%Pv*&umk4UH`l2X=dme))3gK=zJAn>=jF%npY($m1iva>~!yh&O88ycz zZjF}YBjvCKBF%uB|BRn1%ePThKe&C;**Ha!0w1U-#`CO2ln^J1;*zJh7*P~&MtVF@ zMKLvvkqQT@D4G!aDLQfYSjxz){ku|YqA1>q%q<{N6pfm7Frf~679b>wVhI9^fGUb6 zgT1m;My4okfw~!}qG+V-GIXyf{sZ?f;TK=Z{IW|l=|grMUQw*agwPQnttgsMP8p#C z6h)(@%Fqs?C>pt(Cub^(wH8u0q9}H!Al*QuD5hNLv9Z2SI}}UE6Z9EgQJesCG*Csc z!rjdE1634Fk_C}VRjVk910N?9uP9!G&|sj7qS51J1*cVRB640)yc3z*fhvk7msLj2 z6vZV_pA)($ibhZPklhzk6hDEw9q>~{(Ik>(Bur6E%;0_lMkHeXGl5jFQYz0B#kMdS z1635?Ca?ymqG$rS!Ke=qFh%jmdl>2iRTSqFco-B3MHR)$zJ3cgBV~%>mymXgl$ie- z-OE@7sG?{B+*Aa-qIfs)Q-Laq?-5uBB1KVnswf_JA0N7byap~)Q55^oBur6kUtTLL zIJlzN*-2rXkfNdhtwL72wOdJbGSF_#csUWzy0x{$uLh>o$vl@)bAy#G$wQwcNl_FN z_j57efF#RBJnO=`65kP6lAMR5&;SAZ&tZ69ES0n&=%s~kNJibO~i#eZg^ zHvv@?<*X`-J@TV_gb9&TbxcwG`av2DP(|^ShnPnOswmz{;3lAoqDix)Khj=N+(rC$ z5fDYO^DG=)fhvkO5*QCuQ8ejzB<&Q%kBI(2_@XGbpG_MBswiGZ;7Z_rswkf6S`n)1 z7Tzay!rDhZO*M+5_&(HkfGUc{Ln(#l6~(%9cou*vif0fw1*rM25Sl87b2&2`@Kfcm z6A_!pLzTnrM7#~s%HbrD6Z7BwbD4+*svItG)f@{flxhB(BSjYF@MZYRLBV3jkCem7 z?nsrx>Fz+3!&L}6COe#jRj~}o zn=L{{nq`W?VNwQ&y4sjgS-`in5JU0_A|yldmIyQlIwT)Jpr0JbkbDw>i6BxAEfJgn zD63Zv7eIInsB&nWoS<+k9F)Up&ybBMhws992dHxRJAq&2K$OE8^Dx$dB9T$$u#Ycq zCrRc28~QD;{sf!LHHsE*Af^9iiA~u181J+s05V%h=Y9uz6CYD7s*AP;60(zj)lce(STjvlM$`y{Ss&%!!yuQ3jK#K z^dKqp>?T^^xnwmPXo24(unH6jLknExaUM0G1s+OZ5YPgbSb<;Q%rhXbugg>l{H80g zeAY9@otFadbp@UfjEf39o&W`Y>c9e{X76`OuJlLvZ3P9b-E*L7_PFikVnM|_!tU*u z=R;|e-<0Sd8u$52(YO~+#m;v}BVp8_YdHi|{+;*P-;T}_+AdVp309n%n_9w+tny1D zxCi>(AS}nh>jY#e+0bdy9hw>wVpyG^%bEVWfV2vfQ zD}Wl@8+j26`DfO?MR^GBOySF_h0PtGm!k_YFwvj)%U=n11>mQvF0}F@8%ew3jG7&& zdG+`H3f5;JTTJanV?dO0>-CCxz1~y2l|YRLIcPyl`G*Kx#F_Jfdh{RbuVIi#&U2qi zFCqRJki5*r%b0|g5})2bQX1=7ef6Y3(uAfD3kv!;^4!z7f^jF_N{Md_Wu9guQ!n!C z9Q~sO&40mK(2Yk*3rbP2f5}i=&^AX80t@*T^q<_*kkl4536Y6FTTlssr+~H~lVbT| zYD8L4a}kmj^fjC>MMzpu~iaLEpPl9i#>259V{2fC(M> zF*`#76{pmCKr$Uo%pejt4`g?tn=l&Qt#Z4b3Y&(#IDIqm|Iv&JesdW`)!4rl58~BY zjiX!+>1zCLnN{P}^`#n@k-{RN)p(7g2Z4orHC~&0HBUJ;UNTti?r&}uZHtVqaJ*VqcBLacqtHTw~aom=z@O zGRQuX`Z5}}G^xht!$x5{PJd4PZq2CRWS5Xu;~n7(pOD(Qx&*+!`)Ta6Zg|(~?%czr z?%FKoRRyjXd(9}A&16}CoacFqJjc0l7hKA@4sx#k65e{?im?}Rs=J&zWhq8y(6z?{ zK`>(j+iHDtA-N4cbP-FUi;GtNlC>=UAD0T?M6eQC#lcPbzs;5HCgz?O=%GQlg@bZ0 zvf9)#4%TyU?sDn@gsVAt>m>$KAa~}Q>D01(y45swI>Ybc`Io#*(k0NUtzeJSdxR8w%{hRCqxbFe^X+;n4G8Xa`{e3+D{a0K?|BcLVKr8z6mH0^k zt!NXA1s3x4L`8R$1f-(xf`2Q}irztBJJ5bq7K7c&amrNmGo zYywu%C&KM0GP35-y#%I%<1z?xW#s#qOEAa?MOT@ql2!9Jgc9=B(6_~hNPPe* z$mrJuS@Fat5eeFxHu#!L zhth=}AcdCnIw5g9(Da587z#AKI|-Xq?sh6G={PUVVh>f*@BK-Y@==(jj+Ajk8)+T!oM{!ZQ%) zE<&ljG~HMhA%0ALKSryNz9Fy+WM4oMCd3#=gx1E(g;#UB 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

ku7ksjjy-Or^Q38 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

WXQJxEvh%Rc->OOiHqmtaKRRpy*{at4$ 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%0AK@?1=0BYM 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 -#include -#include -#include - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" // PyMemberDef - -#include "greenlet_internal.hpp" -// Code after this point can assume access to things declared in stdint.h, -// including the fixed-width types. This goes for the platform-specific switch functions -// as well. -#include "greenlet_refs.hpp" -#include "greenlet_slp_switch.hpp" - -#include "greenlet_thread_support.hpp" -#include "TGreenlet.hpp" - -#include "TGreenletGlobals.cpp" - -#include "TGreenlet.cpp" -#include "TMainGreenlet.cpp" -#include "TUserGreenlet.cpp" -#include "TBrokenGreenlet.cpp" -#include "TExceptionState.cpp" -#include "TPythonState.cpp" -#include "TStackState.cpp" - -#include "TThreadState.hpp" -#include "TThreadStateCreator.hpp" -#include "TThreadStateDestroy.cpp" - -#include "PyGreenlet.cpp" -#include "PyGreenletUnswitchable.cpp" -#include "CObjects.cpp" - -using greenlet::LockGuard; -using greenlet::LockInitError; -using greenlet::PyErrOccurred; -using greenlet::Require; - -using greenlet::g_handle_exit; -using greenlet::single_result; - -using greenlet::Greenlet; -using greenlet::UserGreenlet; -using greenlet::MainGreenlet; -using greenlet::BrokenGreenlet; -using greenlet::ThreadState; -using greenlet::PythonState; - - - -// ******* Implementation of things from included files -template -greenlet::refs::_BorrowedGreenlet& greenlet::refs::_BorrowedGreenlet::operator=(const greenlet::refs::BorrowedObject& other) -{ - this->_set_raw_pointer(static_cast(other)); - return *this; -} - -template -inline greenlet::refs::_BorrowedGreenlet::operator Greenlet*() const noexcept -{ - if (!this->p) { - return nullptr; - } - return reinterpret_cast(this->p)->pimpl; -} - -template -greenlet::refs::_BorrowedGreenlet::_BorrowedGreenlet(const BorrowedObject& p) - : BorrowedReference(nullptr) -{ - - this->_set_raw_pointer(p.borrow()); -} - -template -inline greenlet::refs::_OwnedGreenlet::operator Greenlet*() const noexcept -{ - if (!this->p) { - return nullptr; - } - return reinterpret_cast(this->p)->pimpl; -} - - - -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wmissing-field-initializers" -# pragma clang diagnostic ignored "-Wwritable-strings" -#elif defined(__GNUC__) -# pragma GCC diagnostic push -// warning: ISO C++ forbids converting a string constant to ‘char*’ -// (The python APIs aren't const correct and accept writable char*) -# pragma GCC diagnostic ignored "-Wwrite-strings" -#endif - - -/*********************************************************** - -A PyGreenlet is a range of C stack addresses that must be -saved and restored in such a way that the full range of the -stack contains valid data when we switch to it. - -Stack layout for a greenlet: - - | ^^^ | - | older data | - | | - stack_stop . |_______________| - . | | - . | greenlet data | - . | in stack | - . * |_______________| . . _____________ stack_copy + stack_saved - . | | | | - . | data | |greenlet data| - . | unrelated | | saved | - . | to | | in heap | - stack_start . | this | . . |_____________| stack_copy - | greenlet | - | | - | newer data | - | vvv | - - -Note that a greenlet's stack data is typically partly at its correct -place in the stack, and partly saved away in the heap, but always in -the above configuration: two blocks, the more recent one in the heap -and the older one still in the stack (either block may be empty). - -Greenlets are chained: each points to the previous greenlet, which is -the one that owns the data currently in the C stack above my -stack_stop. The currently running greenlet is the first element of -this chain. The main (initial) greenlet is the last one. Greenlets -whose stack is entirely in the heap can be skipped from the chain. - -The chain is not related to execution order, but only to the order -in which bits of C stack happen to belong to greenlets at a particular -point in time. - -The main greenlet doesn't have a stack_stop: it is responsible for the -complete rest of the C stack, and we don't know where it begins. We -use (char*) -1, the largest possible address. - -States: - stack_stop == NULL && stack_start == NULL: did not start yet - stack_stop != NULL && stack_start == NULL: already finished - stack_stop != NULL && stack_start != NULL: active - -The running greenlet's stack_start is undefined but not NULL. - - ***********************************************************/ - - - - -/***********************************************************/ - -/* Some functions must not be inlined: - * slp_restore_state, when inlined into slp_switch might cause - it to restore stack over its own local variables - * slp_save_state, when inlined would add its own local - variables to the saved stack, wasting space - * slp_switch, cannot be inlined for obvious reasons - * g_initialstub, when inlined would receive a pointer into its - own stack frame, leading to incomplete stack save/restore - -g_initialstub is a member function and declared virtual so that the -compiler always calls it through a vtable. - -slp_save_state and slp_restore_state are also member functions. They -are called from trampoline functions that themselves are declared as -not eligible for inlining. -*/ - -extern "C" { -static int GREENLET_NOINLINE(slp_save_state_trampoline)(char* stackref) -{ - return switching_thread_state->slp_save_state(stackref); -} -static void GREENLET_NOINLINE(slp_restore_state_trampoline)() -{ - switching_thread_state->slp_restore_state(); -} -} - - -/***********************************************************/ - - -#include "PyModule.cpp" - - - -static PyObject* -greenlet_internal_mod_init() noexcept -{ - static void* _PyGreenlet_API[PyGreenlet_API_pointers]; - - try { - CreatedModule m(greenlet_module_def); - - Require(PyType_Ready(&PyGreenlet_Type)); - Require(PyType_Ready(&PyGreenletUnswitchable_Type)); - - mod_globs = new greenlet::GreenletGlobals; - ThreadState::init(); - - m.PyAddObject("greenlet", PyGreenlet_Type); - m.PyAddObject("UnswitchableGreenlet", PyGreenletUnswitchable_Type); - m.PyAddObject("error", mod_globs->PyExc_GreenletError); - m.PyAddObject("GreenletExit", mod_globs->PyExc_GreenletExit); - - m.PyAddObject("GREENLET_USE_GC", 1); - m.PyAddObject("GREENLET_USE_TRACING", 1); - m.PyAddObject("GREENLET_USE_CONTEXT_VARS", 1L); - m.PyAddObject("GREENLET_USE_STANDARD_THREADING", 1L); - - OwnedObject clocks_per_sec = OwnedObject::consuming(PyLong_FromSsize_t(CLOCKS_PER_SEC)); - m.PyAddObject("CLOCKS_PER_SEC", clocks_per_sec); - - /* also publish module-level data as attributes of the greentype. */ - // XXX: This is weird, and enables a strange pattern of - // confusing the class greenlet with the module greenlet; with - // the exception of (possibly) ``getcurrent()``, this - // shouldn't be encouraged so don't add new items here. - for (const char* const* p = copy_on_greentype; *p; p++) { - OwnedObject o = m.PyRequireAttr(*p); - PyDict_SetItemString(PyGreenlet_Type.tp_dict, *p, o.borrow()); - } - - /* - * Expose C API - */ - - /* types */ - _PyGreenlet_API[PyGreenlet_Type_NUM] = (void*)&PyGreenlet_Type; - - /* exceptions */ - _PyGreenlet_API[PyExc_GreenletError_NUM] = (void*)mod_globs->PyExc_GreenletError; - _PyGreenlet_API[PyExc_GreenletExit_NUM] = (void*)mod_globs->PyExc_GreenletExit; - - /* methods */ - _PyGreenlet_API[PyGreenlet_New_NUM] = (void*)PyGreenlet_New; - _PyGreenlet_API[PyGreenlet_GetCurrent_NUM] = (void*)PyGreenlet_GetCurrent; - _PyGreenlet_API[PyGreenlet_Throw_NUM] = (void*)PyGreenlet_Throw; - _PyGreenlet_API[PyGreenlet_Switch_NUM] = (void*)PyGreenlet_Switch; - _PyGreenlet_API[PyGreenlet_SetParent_NUM] = (void*)PyGreenlet_SetParent; - - /* Previously macros, but now need to be functions externally. */ - _PyGreenlet_API[PyGreenlet_MAIN_NUM] = (void*)Extern_PyGreenlet_MAIN; - _PyGreenlet_API[PyGreenlet_STARTED_NUM] = (void*)Extern_PyGreenlet_STARTED; - _PyGreenlet_API[PyGreenlet_ACTIVE_NUM] = (void*)Extern_PyGreenlet_ACTIVE; - _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM] = (void*)Extern_PyGreenlet_GET_PARENT; - - /* XXX: Note that our module name is ``greenlet._greenlet``, but for - backwards compatibility with existing C code, we need the _C_API to - be directly in greenlet. - */ - const NewReference c_api_object(Require( - PyCapsule_New( - (void*)_PyGreenlet_API, - "greenlet._C_API", - NULL))); - m.PyAddObject("_C_API", c_api_object); - assert(c_api_object.REFCNT() == 2); - - // cerr << "Sizes:" - // << "\n\tGreenlet : " << sizeof(Greenlet) - // << "\n\tUserGreenlet : " << sizeof(UserGreenlet) - // << "\n\tMainGreenlet : " << sizeof(MainGreenlet) - // << "\n\tExceptionState : " << sizeof(greenlet::ExceptionState) - // << "\n\tPythonState : " << sizeof(greenlet::PythonState) - // << "\n\tStackState : " << sizeof(greenlet::StackState) - // << "\n\tSwitchingArgs : " << sizeof(greenlet::SwitchingArgs) - // << "\n\tOwnedObject : " << sizeof(greenlet::refs::OwnedObject) - // << "\n\tBorrowedObject : " << sizeof(greenlet::refs::BorrowedObject) - // << "\n\tPyGreenlet : " << sizeof(PyGreenlet) - // << endl; - - return m.borrow(); // But really it's the main reference. - } - catch (const LockInitError& e) { - PyErr_SetString(PyExc_MemoryError, e.what()); - return NULL; - } - catch (const PyErrOccurred&) { - return NULL; - } - -} - -extern "C" { - -PyMODINIT_FUNC -PyInit__greenlet(void) -{ - return greenlet_internal_mod_init(); -} - -}; // extern C - -#ifdef __clang__ -# pragma clang diagnostic pop -#elif defined(__GNUC__) -# pragma GCC diagnostic pop -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet.h b/port/lib/python3.11/site-packages/greenlet/greenlet.h deleted file mode 100644 index d02a16e..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ - -/* Greenlet object interface */ - -#ifndef Py_GREENLETOBJECT_H -#define Py_GREENLETOBJECT_H - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* This is deprecated and undocumented. It does not change. */ -#define GREENLET_VERSION "1.0.0" - -#ifndef GREENLET_MODULE -#define implementation_ptr_t void* -#endif - -typedef struct _greenlet { - PyObject_HEAD - PyObject* weakreflist; - PyObject* dict; - implementation_ptr_t pimpl; -} PyGreenlet; - -#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) - - -/* C API functions */ - -/* Total number of symbols that are exported */ -#define PyGreenlet_API_pointers 12 - -#define PyGreenlet_Type_NUM 0 -#define PyExc_GreenletError_NUM 1 -#define PyExc_GreenletExit_NUM 2 - -#define PyGreenlet_New_NUM 3 -#define PyGreenlet_GetCurrent_NUM 4 -#define PyGreenlet_Throw_NUM 5 -#define PyGreenlet_Switch_NUM 6 -#define PyGreenlet_SetParent_NUM 7 - -#define PyGreenlet_MAIN_NUM 8 -#define PyGreenlet_STARTED_NUM 9 -#define PyGreenlet_ACTIVE_NUM 10 -#define PyGreenlet_GET_PARENT_NUM 11 - -#ifndef GREENLET_MODULE -/* This section is used by modules that uses the greenlet C API */ -static void** _PyGreenlet_API = NULL; - -# define PyGreenlet_Type \ - (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) - -# define PyExc_GreenletError \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) - -# define PyExc_GreenletExit \ - ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) - -/* - * PyGreenlet_New(PyObject *args) - * - * greenlet.greenlet(run, parent=None) - */ -# define PyGreenlet_New \ - (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ - _PyGreenlet_API[PyGreenlet_New_NUM]) - -/* - * PyGreenlet_GetCurrent(void) - * - * greenlet.getcurrent() - */ -# define PyGreenlet_GetCurrent \ - (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) - -/* - * PyGreenlet_Throw( - * PyGreenlet *greenlet, - * PyObject *typ, - * PyObject *val, - * PyObject *tb) - * - * g.throw(...) - */ -# define PyGreenlet_Throw \ - (*(PyObject * (*)(PyGreenlet * self, \ - PyObject * typ, \ - PyObject * val, \ - PyObject * tb)) \ - _PyGreenlet_API[PyGreenlet_Throw_NUM]) - -/* - * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) - * - * g.switch(*args, **kwargs) - */ -# define PyGreenlet_Switch \ - (*(PyObject * \ - (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ - _PyGreenlet_API[PyGreenlet_Switch_NUM]) - -/* - * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) - * - * g.parent = new_parent - */ -# define PyGreenlet_SetParent \ - (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ - _PyGreenlet_API[PyGreenlet_SetParent_NUM]) - -/* - * PyGreenlet_GetParent(PyObject* greenlet) - * - * return greenlet.parent; - * - * This could return NULL even if there is no exception active. - * If it does not return NULL, you are responsible for decrementing the - * reference count. - */ -# define PyGreenlet_GetParent \ - (*(PyGreenlet* (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) - -/* - * deprecated, undocumented alias. - */ -# define PyGreenlet_GET_PARENT PyGreenlet_GetParent - -# define PyGreenlet_MAIN \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_MAIN_NUM]) - -# define PyGreenlet_STARTED \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_STARTED_NUM]) - -# define PyGreenlet_ACTIVE \ - (*(int (*)(PyGreenlet*)) \ - _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) - - - - -/* Macro that imports greenlet and initializes C API */ -/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we - keep the older definition to be sure older code that might have a copy of - the header still works. */ -# define PyGreenlet_Import() \ - { \ - _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ - } - -#endif /* GREENLET_MODULE */ - -#ifdef __cplusplus -} -#endif -#endif /* !Py_GREENLETOBJECT_H */ diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_allocator.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_allocator.hpp deleted file mode 100644 index b452f54..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_allocator.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef GREENLET_ALLOCATOR_HPP -#define GREENLET_ALLOCATOR_HPP - -#define PY_SSIZE_T_CLEAN -#include -#include -#include "greenlet_compiler_compat.hpp" - - -namespace greenlet -{ - // This allocator is stateless; all instances are identical. - // It can *ONLY* be used when we're sure we're holding the GIL - // (Python's allocators require the GIL). - template - struct PythonAllocator : public std::allocator { - - PythonAllocator(const PythonAllocator& UNUSED(other)) - : std::allocator() - { - } - - PythonAllocator(const std::allocator other) - : std::allocator(other) - {} - - template - PythonAllocator(const std::allocator& other) - : std::allocator(other) - { - } - - PythonAllocator() : std::allocator() {} - - T* allocate(size_t number_objects, const void* UNUSED(hint)=0) - { - void* p; - if (number_objects == 1) - p = PyObject_Malloc(sizeof(T)); - else - p = PyMem_Malloc(sizeof(T) * number_objects); - return static_cast(p); - } - - void deallocate(T* t, size_t n) - { - void* p = t; - if (n == 1) { - PyObject_Free(p); - } - else - PyMem_Free(p); - } - // This member is deprecated in C++17 and removed in C++20 - template< class U > - struct rebind { - typedef PythonAllocator other; - }; - - }; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_compiler_compat.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_compiler_compat.hpp deleted file mode 100644 index af24bd8..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_compiler_compat.hpp +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef GREENLET_COMPILER_COMPAT_HPP -#define GREENLET_COMPILER_COMPAT_HPP - -/** - * Definitions to aid with compatibility with different compilers. - * - * .. caution:: Use extreme care with noexcept. - * Some compilers and runtimes, specifically gcc/libgcc/libstdc++ on - * Linux, implement stack unwinding by throwing an uncatchable - * exception, one that specifically does not appear to be an active - * exception to the rest of the runtime. If this happens while we're in a noexcept function, - * we have violated our dynamic exception contract, and so the runtime - * will call std::terminate(), which kills the process with the - * unhelpful message "terminate called without an active exception". - * - * This has happened in this scenario: A background thread is running - * a greenlet that has made a native call and released the GIL. - * Meanwhile, the main thread finishes and starts shutting down the - * interpreter. When the background thread is scheduled again and - * attempts to obtain the GIL, it notices that the interpreter is - * exiting and calls ``pthread_exit()``. This in turn starts to unwind - * the stack by throwing that exception. But we had the ``PyCall`` - * functions annotated as noexcept, so the runtime terminated us. - * - * #2 0x00007fab26fec2b7 in std::terminate() () from /lib/x86_64-linux-gnu/libstdc++.so.6 - * #3 0x00007fab26febb3c in __gxx_personality_v0 () from /lib/x86_64-linux-gnu/libstdc++.so.6 - * #4 0x00007fab26f34de6 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1 - * #6 0x00007fab276a34c6 in __GI___pthread_unwind at ./nptl/unwind.c:130 - * #7 0x00007fab2769bd3a in __do_cancel () at ../sysdeps/nptl/pthreadP.h:280 - * #8 __GI___pthread_exit (value=value@entry=0x0) at ./nptl/pthread_exit.c:36 - * #9 0x000000000052e567 in PyThread_exit_thread () at ../Python/thread_pthread.h:370 - * #10 0x00000000004d60b5 in take_gil at ../Python/ceval_gil.h:224 - * #11 0x00000000004d65f9 in PyEval_RestoreThread at ../Python/ceval.c:467 - * #12 0x000000000060cce3 in setipaddr at ../Modules/socketmodule.c:1203 - * #13 0x00000000006101cd in socket_gethostbyname - */ - -#include - -# define G_NO_COPIES_OF_CLS(Cls) private: \ - Cls(const Cls& other) = delete; \ - Cls& operator=(const Cls& other) = delete - -# define G_NO_ASSIGNMENT_OF_CLS(Cls) private: \ - Cls& operator=(const Cls& other) = delete - -# define G_NO_COPY_CONSTRUCTOR_OF_CLS(Cls) private: \ - Cls(const Cls& other) = delete; - - -// CAUTION: MSVC is stupidly picky: -// -// "The compiler ignores, without warning, any __declspec keywords -// placed after * or & and in front of the variable identifier in a -// declaration." -// (https://docs.microsoft.com/en-us/cpp/cpp/declspec?view=msvc-160) -// -// So pointer return types must be handled differently (because of the -// trailing *), or you get inscrutable compiler warnings like "error -// C2059: syntax error: ''" -// -// In C++ 11, there is a standard syntax for attributes, and -// GCC defines an attribute to use with this: [[gnu:noinline]]. -// In the future, this is expected to become standard. - -#if defined(__GNUC__) || defined(__clang__) -/* We used to check for GCC 4+ or 3.4+, but those compilers are - laughably out of date. Just assume they support it. */ -# define GREENLET_NOINLINE(name) __attribute__((noinline)) name -# define GREENLET_NOINLINE_P(rtype, name) rtype __attribute__((noinline)) name -# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) -#elif defined(_MSC_VER) -/* We used to check for && (_MSC_VER >= 1300) but that's also out of date. */ -# define GREENLET_NOINLINE(name) __declspec(noinline) name -# define GREENLET_NOINLINE_P(rtype, name) __declspec(noinline) rtype name -# define UNUSED(x) UNUSED_ ## x -#endif - -#if defined(_MSC_VER) -# define G_NOEXCEPT_WIN32 noexcept -#else -# define G_NOEXCEPT_WIN32 -#endif - -#if defined(__GNUC__) && defined(__POWERPC__) && defined(__APPLE__) -// 32-bit PPC/MacOSX. Only known to be tested on unreleased versions -// of macOS 10.6 using a macports build gcc 14. It appears that -// running C++ destructors of thread-local variables is broken. - -// See https://github.com/python-greenlet/greenlet/pull/419 -# define GREENLET_BROKEN_THREAD_LOCAL_CLEANUP_JUST_LEAK 1 -#else -# define GREENLET_BROKEN_THREAD_LOCAL_CLEANUP_JUST_LEAK 0 -#endif - - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_cpython_add_pending.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_cpython_add_pending.hpp deleted file mode 100644 index 0d28efd..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_cpython_add_pending.hpp +++ /dev/null @@ -1,172 +0,0 @@ -#ifndef GREENLET_CPYTHON_ADD_PENDING_HPP -#define GREENLET_CPYTHON_ADD_PENDING_HPP - -#if (PY_VERSION_HEX >= 0x30800A0 && PY_VERSION_HEX < 0x3090000) && !(defined(_WIN32) || defined(WIN32)) -// XXX: From Python 3.8a3 [1] up until Python 3.9a6 [2][3], -// ``Py_AddPendingCall`` would try to produce a Python exception if -// the interpreter was in the beginning of shutting down when this -// function is called. However, ``Py_AddPendingCall`` doesn't require -// the GIL, and we are absolutely not holding it when we make that -// call. That means that trying to create the Python exception is -// using the C API in an undefined state; here the C API detects this -// and aborts the process with an error ("Fatal Python error: Python -// memory allocator called without holding the GIL": Add -> -// PyErr_SetString -> PyUnicode_New -> PyObject_Malloc). This arises -// (obviously) in multi-threaded programs and happens if one thread is -// exiting and cleaning up its thread-local data while the other -// thread is trying to shut down the interpreter. A crash on shutdown -// is still a crash and could result in data loss (e.g., daemon -// threads are still running, pending signal handlers may be present, -// buffers may not be flushed, there may be __del__ that need run, -// etc), so we have to work around it. -// -// Of course, we can (and do) check for whether the interpreter is -// shutting down before calling ``Py_AddPendingCall``, but that's a -// race condition since we don't hold the GIL, and so we may not -// actually get the right answer. Plus, ``Py_FinalizeEx`` actually -// calls ``_Py_FinishPendingCalls`` (which sets the pending->finishing -// flag, which is used to gate creating the exceptioen) *before* -// publishing any other data that would let us detect the shutdown -// (such as runtime->finalizing). So that point is moot. -// -// Our solution for those versions is to inline the same code, without -// the problematic bit that sets the exception. Unfortunately, all of -// the structure definitions are private/opaque, *and* we can't -// actually count on being able to include their definitions from -// ``internal/pycore_*``, because on some platforms those header files -// are incomplete (i.e., on macOS with macports 3.8, the includes are -// fine, but on Ubuntu jammy with 3.8 from ppa:deadsnakes or GitHub -// Actions 3.8 (I think it's Ubuntu 18.04), they con't be used; at -// least, I couldn't get them to work). So we need to define the -// structures and _PyRuntime data member ourself. Yet more -// unfortunately, _PyRuntime won't link on Windows, so we can only do -// this on other platforms. -// -// [1] https://github.com/python/cpython/commit/842a2f07f2f08a935ef470bfdaeef40f87490cfc -// [2] https://github.com/python/cpython/commit/cfc3c2f8b34d3864717ab584c5b6c260014ba55a -// [3] https://github.com/python/cpython/issues/81308 -# define GREENLET_BROKEN_PY_ADD_PENDING 1 - -// When defining these structures, the important thing is to get -// binary compatibility, i.e., structure layout. For that, we only -// need to define fields up to the ones we use; after that they're -// irrelevant UNLESS the structure is included in another structure -// *before* the structure we're interested in --- in that case, it -// must be complete. Ellipsis indicate elided trailing members. -// Pointer types are changed to void* to keep from having to define -// more structures. - -// From "internal/pycore_atomic.h" - -// There are several different definitions of this, including the -// plain ``int`` version, a ``volatile int`` and an ``_Atomic int`` -// I don't think any of those change the size/layout. -typedef struct _Py_atomic_int { - volatile int _value; -} _Py_atomic_int; - -// This needs too much infrastructure, so we just do a regular store. -#define _Py_atomic_store_relaxed(ATOMIC_VAL, NEW_VAL) \ - (ATOMIC_VAL)->_value = NEW_VAL - - - -// From "internal/pycore_pymem.h" -#define NUM_GENERATIONS 3 - - -struct gc_generation { - PyGC_Head head; // We already have this defined. - int threshold; - int count; -}; -struct gc_generation_stats { - Py_ssize_t collections; - Py_ssize_t collected; - Py_ssize_t uncollectable; -}; - -struct _gc_runtime_state { - void *trash_delete_later; - int trash_delete_nesting; - int enabled; - int debug; - struct gc_generation generations[NUM_GENERATIONS]; - void *generation0; - struct gc_generation permanent_generation; - struct gc_generation_stats generation_stats[NUM_GENERATIONS]; - int collecting; - void *garbage; - void *callbacks; - Py_ssize_t long_lived_total; - Py_ssize_t long_lived_pending; -}; - -// From "internal/pycore_pystate.h" -struct _pending_calls { - int finishing; - PyThread_type_lock lock; - _Py_atomic_int calls_to_do; - int async_exc; -#define NPENDINGCALLS 32 - struct { - int (*func)(void *); - void *arg; - } calls[NPENDINGCALLS]; - int first; - int last; -}; - -struct _ceval_runtime_state { - int recursion_limit; - int tracing_possible; - _Py_atomic_int eval_breaker; - _Py_atomic_int gil_drop_request; - struct _pending_calls pending; - // ... -}; - -typedef struct pyruntimestate { - int preinitializing; - int preinitialized; - int core_initialized; - int initialized; - void *finalizing; - - struct pyinterpreters { - PyThread_type_lock mutex; - void *head; - void *main; - int64_t next_id; - } interpreters; - // XXX Remove this field once we have a tp_* slot. - struct _xidregistry { - PyThread_type_lock mutex; - void *head; - } xidregistry; - - unsigned long main_thread; - -#define NEXITFUNCS 32 - void (*exitfuncs[NEXITFUNCS])(void); - int nexitfuncs; - - struct _gc_runtime_state gc; - struct _ceval_runtime_state ceval; - // ... -} _PyRuntimeState; - -#define SIGNAL_PENDING_CALLS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) - -extern _PyRuntimeState _PyRuntime; - -#else -# define GREENLET_BROKEN_PY_ADD_PENDING 0 -#endif - - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_cpython_compat.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_cpython_compat.hpp deleted file mode 100644 index ce5fd88..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_cpython_compat.hpp +++ /dev/null @@ -1,142 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef GREENLET_CPYTHON_COMPAT_H -#define GREENLET_CPYTHON_COMPAT_H - -/** - * Helpers for compatibility with multiple versions of CPython. - */ - -#define PY_SSIZE_T_CLEAN -#include "Python.h" - - -#if PY_VERSION_HEX >= 0x30A00B1 -# define GREENLET_PY310 1 -#else -# define GREENLET_PY310 0 -#endif - -/* -Python 3.10 beta 1 changed tstate->use_tracing to a nested cframe member. -See https://github.com/python/cpython/pull/25276 -We have to save and restore this as well. - -Python 3.13 removed PyThreadState.cframe (GH-108035). -*/ -#if GREENLET_PY310 && PY_VERSION_HEX < 0x30D0000 -# define GREENLET_USE_CFRAME 1 -#else -# define GREENLET_USE_CFRAME 0 -#endif - - -#if PY_VERSION_HEX >= 0x30B00A4 -/* -Greenlet won't compile on anything older than Python 3.11 alpha 4 (see -https://bugs.python.org/issue46090). Summary of breaking internal changes: -- Python 3.11 alpha 1 changed how frame objects are represented internally. - - https://github.com/python/cpython/pull/30122 -- Python 3.11 alpha 3 changed how recursion limits are stored. - - https://github.com/python/cpython/pull/29524 -- Python 3.11 alpha 4 changed how exception state is stored. It also includes a - change to help greenlet save and restore the interpreter frame "data stack". - - https://github.com/python/cpython/pull/30122 - - https://github.com/python/cpython/pull/30234 -*/ -# define GREENLET_PY311 1 -#else -# define GREENLET_PY311 0 -#endif - - -#if PY_VERSION_HEX >= 0x30C0000 -# define GREENLET_PY312 1 -#else -# define GREENLET_PY312 0 -#endif - -#if PY_VERSION_HEX >= 0x30D0000 -# define GREENLET_PY313 1 -#else -# define GREENLET_PY313 0 -#endif - -#ifndef Py_SET_REFCNT -/* Py_REFCNT and Py_SIZE macros are converted to functions -https://bugs.python.org/issue39573 */ -# define Py_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) -#endif - -#ifndef _Py_DEC_REFTOTAL -/* _Py_DEC_REFTOTAL macro has been removed from Python 3.9 by: - https://github.com/python/cpython/commit/49932fec62c616ec88da52642339d83ae719e924 - - The symbol we use to replace it was removed by at least 3.12. -*/ -# ifdef Py_REF_DEBUG -# if GREENLET_PY312 -# define _Py_DEC_REFTOTAL -# else -# define _Py_DEC_REFTOTAL _Py_RefTotal-- -# endif -# else -# define _Py_DEC_REFTOTAL -# endif -#endif -// Define these flags like Cython does if we're on an old version. -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif - -#ifndef Py_TPFLAGS_HAVE_VERSION_TAG - #define Py_TPFLAGS_HAVE_VERSION_TAG 0 -#endif - -#define G_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_VERSION_TAG | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_HAVE_GC - - -#if PY_VERSION_HEX < 0x03090000 -// The official version only became available in 3.9 -# define PyObject_GC_IsTracked(o) _PyObject_GC_IS_TRACKED(o) -#endif - - -// bpo-43760 added PyThreadState_EnterTracing() to Python 3.11.0a2 -#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) -static inline void PyThreadState_EnterTracing(PyThreadState *tstate) -{ - tstate->tracing++; -#if PY_VERSION_HEX >= 0x030A00A1 - tstate->cframe->use_tracing = 0; -#else - tstate->use_tracing = 0; -#endif -} -#endif - -// bpo-43760 added PyThreadState_LeaveTracing() to Python 3.11.0a2 -#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) -static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) -{ - tstate->tracing--; - int use_tracing = (tstate->c_tracefunc != NULL - || tstate->c_profilefunc != NULL); -#if PY_VERSION_HEX >= 0x030A00A1 - tstate->cframe->use_tracing = use_tracing; -#else - tstate->use_tracing = use_tracing; -#endif -} -#endif - -#if !defined(Py_C_RECURSION_LIMIT) && defined(C_RECURSION_LIMIT) -# define Py_C_RECURSION_LIMIT C_RECURSION_LIMIT -#endif - -#endif /* GREENLET_CPYTHON_COMPAT_H */ diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_exceptions.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_exceptions.hpp deleted file mode 100644 index 617f07c..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_exceptions.hpp +++ /dev/null @@ -1,171 +0,0 @@ -#ifndef GREENLET_EXCEPTIONS_HPP -#define GREENLET_EXCEPTIONS_HPP - -#define PY_SSIZE_T_CLEAN -#include -#include -#include - -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -#endif - -namespace greenlet { - - class PyErrOccurred : public std::runtime_error - { - public: - - // CAUTION: In debug builds, may run arbitrary Python code. - static const PyErrOccurred - from_current() - { - assert(PyErr_Occurred()); -#ifndef NDEBUG - // This is not exception safe, and - // not necessarily safe in general (what if it switches?) - // But we only do this in debug mode, where we are in - // tight control of what exceptions are getting raised and - // can prevent those issues. - - // You can't call PyObject_Str with a pending exception. - PyObject* typ; - PyObject* val; - PyObject* tb; - - PyErr_Fetch(&typ, &val, &tb); - PyObject* typs = PyObject_Str(typ); - PyObject* vals = PyObject_Str(val ? val : typ); - const char* typ_msg = PyUnicode_AsUTF8(typs); - const char* val_msg = PyUnicode_AsUTF8(vals); - PyErr_Restore(typ, val, tb); - - std::string msg(typ_msg); - msg += ": "; - msg += val_msg; - PyErrOccurred ex(msg); - Py_XDECREF(typs); - Py_XDECREF(vals); - - return ex; -#else - return PyErrOccurred(); -#endif - } - - PyErrOccurred() : std::runtime_error("") - { - assert(PyErr_Occurred()); - } - - PyErrOccurred(const std::string& msg) : std::runtime_error(msg) - { - assert(PyErr_Occurred()); - } - - PyErrOccurred(PyObject* exc_kind, const char* const msg) - : std::runtime_error(msg) - { - PyErr_SetString(exc_kind, msg); - } - - PyErrOccurred(PyObject* exc_kind, const std::string msg) - : std::runtime_error(msg) - { - // This copies the c_str, so we don't have any lifetime - // issues to worry about. - PyErr_SetString(exc_kind, msg.c_str()); - } - - PyErrOccurred(PyObject* exc_kind, - const std::string msg, //This is the format - //string; that's not - //usually safe! - - PyObject* borrowed_obj_one, PyObject* borrowed_obj_two) - : std::runtime_error(msg) - { - - //This is designed specifically for the - //``check_switch_allowed`` function. - - // PyObject_Str and PyObject_Repr are safe to call with - // NULL pointers; they return the string "" in that - // case. - // This function always returns null. - PyErr_Format(exc_kind, - msg.c_str(), - borrowed_obj_one, borrowed_obj_two); - } - }; - - class TypeError : public PyErrOccurred - { - public: - TypeError(const char* const what) - : PyErrOccurred(PyExc_TypeError, what) - { - } - TypeError(const std::string what) - : PyErrOccurred(PyExc_TypeError, what) - { - } - }; - - class ValueError : public PyErrOccurred - { - public: - ValueError(const char* const what) - : PyErrOccurred(PyExc_ValueError, what) - { - } - }; - - class AttributeError : public PyErrOccurred - { - public: - AttributeError(const char* const what) - : PyErrOccurred(PyExc_AttributeError, what) - { - } - }; - - /** - * Calls `Py_FatalError` when constructed, so you can't actually - * throw this. It just makes static analysis easier. - */ - class PyFatalError : public std::runtime_error - { - public: - PyFatalError(const char* const msg) - : std::runtime_error(msg) - { - Py_FatalError(msg); - } - }; - - static inline PyObject* - Require(PyObject* p, const std::string& msg="") - { - if (!p) { - throw PyErrOccurred(msg); - } - return p; - }; - - static inline void - Require(const int retval) - { - if (retval < 0) { - throw PyErrOccurred(); - } - }; - - -}; -#ifdef __clang__ -# pragma clang diagnostic pop -#endif - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_internal.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_internal.hpp deleted file mode 100644 index f2b15d5..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_internal.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ -#ifndef GREENLET_INTERNAL_H -#define GREENLET_INTERNAL_H -#ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunused-function" -#endif - -/** - * Implementation helpers. - * - * C++ templates and inline functions should go here. - */ -#define PY_SSIZE_T_CLEAN -#include "greenlet_compiler_compat.hpp" -#include "greenlet_cpython_compat.hpp" -#include "greenlet_exceptions.hpp" -#include "TGreenlet.hpp" -#include "greenlet_allocator.hpp" - -#include -#include - -#define GREENLET_MODULE -struct _greenlet; -typedef struct _greenlet PyGreenlet; -namespace greenlet { - - class ThreadState; - // We can't use the PythonAllocator for this, because we push to it - // from the thread state destructor, which doesn't have the GIL, - // and Python's allocators can only be called with the GIL. - typedef std::vector cleanup_queue_t; - -}; - - -#define implementation_ptr_t greenlet::Greenlet* - - -#include "greenlet.h" - -void -greenlet::refs::MainGreenletExactChecker(void *p) -{ - if (!p) { - return; - } - // We control the class of the main greenlet exactly. - if (Py_TYPE(p) != &PyGreenlet_Type) { - std::string err("MainGreenlet: Expected exactly a greenlet, not a "); - err += Py_TYPE(p)->tp_name; - throw greenlet::TypeError(err); - } - - // Greenlets from dead threads no longer respond to main() with a - // true value; so in that case we need to perform an additional - // check. - Greenlet* g = static_cast(p)->pimpl; - if (g->main()) { - return; - } - if (!dynamic_cast(g)) { - std::string err("MainGreenlet: Expected exactly a main greenlet, not a "); - err += Py_TYPE(p)->tp_name; - throw greenlet::TypeError(err); - } -} - - - -template -inline greenlet::Greenlet* greenlet::refs::_OwnedGreenlet::operator->() const noexcept -{ - return reinterpret_cast(this->p)->pimpl; -} - -template -inline greenlet::Greenlet* greenlet::refs::_BorrowedGreenlet::operator->() const noexcept -{ - return reinterpret_cast(this->p)->pimpl; -} - -#include -#include - - -extern PyTypeObject PyGreenlet_Type; - - - -/** - * Forward declarations needed in multiple files. - */ -static PyObject* green_switch(PyGreenlet* self, PyObject* args, PyObject* kwargs); - - -#ifdef __clang__ -# pragma clang diagnostic pop -#endif - - -#endif - -// Local Variables: -// flycheck-clang-include-path: ("../../include" "/opt/local/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10") -// End: diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_refs.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_refs.hpp deleted file mode 100644 index b7e5e3f..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_refs.hpp +++ /dev/null @@ -1,1118 +0,0 @@ -#ifndef GREENLET_REFS_HPP -#define GREENLET_REFS_HPP - -#define PY_SSIZE_T_CLEAN -#include - -#include - -//#include "greenlet_internal.hpp" -#include "greenlet_compiler_compat.hpp" -#include "greenlet_cpython_compat.hpp" -#include "greenlet_exceptions.hpp" - -struct _greenlet; -struct _PyMainGreenlet; - -typedef struct _greenlet PyGreenlet; -extern PyTypeObject PyGreenlet_Type; - - -#ifdef GREENLET_USE_STDIO -#include -using std::cerr; -using std::endl; -#endif - -namespace greenlet -{ - class Greenlet; - - namespace refs - { - // Type checkers throw a TypeError if the argument is not - // null, and isn't of the required Python type. - // (We can't use most of the defined type checkers - // like PyList_Check, etc, directly, because they are - // implemented as macros.) - typedef void (*TypeChecker)(void*); - - void - NoOpChecker(void*) - { - return; - } - - void - GreenletChecker(void *p) - { - if (!p) { - return; - } - - PyTypeObject* typ = Py_TYPE(p); - // fast, common path. (PyObject_TypeCheck is a macro or - // static inline function, and it also does a - // direct comparison of the type pointers, but its fast - // path only handles one type) - if (typ == &PyGreenlet_Type) { - return; - } - - if (!PyObject_TypeCheck(p, &PyGreenlet_Type)) { - std::string err("GreenletChecker: Expected any type of greenlet, not "); - err += Py_TYPE(p)->tp_name; - throw TypeError(err); - } - } - - void - MainGreenletExactChecker(void *p); - - template - class PyObjectPointer; - - template - class OwnedReference; - - - template - class BorrowedReference; - - typedef BorrowedReference BorrowedObject; - typedef OwnedReference OwnedObject; - - class ImmortalObject; - class ImmortalString; - - template - class _OwnedGreenlet; - - typedef _OwnedGreenlet OwnedGreenlet; - typedef _OwnedGreenlet OwnedMainGreenlet; - - template - class _BorrowedGreenlet; - - typedef _BorrowedGreenlet BorrowedGreenlet; - - void - ContextExactChecker(void *p) - { - if (!p) { - return; - } - if (!PyContext_CheckExact(p)) { - throw TypeError( - "greenlet context must be a contextvars.Context or None" - ); - } - } - - typedef OwnedReference OwnedContext; - } -} - -namespace greenlet { - - - namespace refs { - // A set of classes to make reference counting rules in python - // code explicit. - // - // Rules of use: - // (1) Functions returning a new reference that the caller of the - // function is expected to dispose of should return a - // ``OwnedObject`` object. This object automatically releases its - // reference when it goes out of scope. It works like a ``std::shared_ptr`` - // and can be copied or used as a function parameter (but don't do - // that). Note that constructing a ``OwnedObject`` from a - // PyObject* steals the reference. - // (2) Parameters to functions should be either a - // ``OwnedObject&``, or, more generally, a ``PyObjectPointer&``. - // If the function needs to create its own new reference, it can - // do so by copying to a local ``OwnedObject``. - // (3) Functions returning an existing pointer that is NOT - // incref'd, and which the caller MUST NOT decref, - // should return a ``BorrowedObject``. - - // XXX: The following two paragraphs do not hold for all platforms. - // Notably, 32-bit PPC Linux passes structs by reference, not by - // value, so this actually doesn't work. (Although that's the only - // platform that doesn't work on.) DO NOT ATTEMPT IT. The - // unfortunate consequence of that is that the slots which we - // *know* are already type safe will wind up calling the type - // checker function (when we had the slots accepting - // BorrowedGreenlet, this was bypassed), so this slows us down. - // TODO: Optimize this again. - - // For a class with a single pointer member, whose constructor - // does nothing but copy a pointer parameter into the member, and - // which can then be converted back to the pointer type, compilers - // generate code that's the same as just passing the pointer. - // That is, func(BorrowedObject x) called like ``PyObject* p = - // ...; f(p)`` has 0 overhead. Similarly, they "unpack" to the - // pointer type with 0 overhead. - // - // If there are no virtual functions, no complex inheritance (maybe?) and - // no destructor, these can be directly used as parameters in - // Python callbacks like tp_init: the layout is the same as a - // single pointer. Only subclasses with trivial constructors that - // do nothing but set the single pointer member are safe to use - // that way. - - - // This is the base class for things that can be done with a - // PyObject pointer. It assumes nothing about memory management. - // NOTE: Nothing is virtual, so subclasses shouldn't add new - // storage fields or try to override these methods. - template - class PyObjectPointer - { - public: - typedef T PyType; - protected: - T* p; - public: - PyObjectPointer(T* it=nullptr) : p(it) - { - TC(p); - } - - // We don't allow automatic casting to PyObject* at this - // level, because then we could be passed to Py_DECREF/INCREF, - // but we want nothing to do with memory management. If you - // know better, then you can use the get() method, like on a - // std::shared_ptr. Except we name it borrow() to clarify that - // if this is a reference-tracked object, the pointer you get - // back will go away when the object does. - // TODO: This should probably not exist here, but be moved - // down to relevant sub-types. - - T* borrow() const noexcept - { - return this->p; - } - - PyObject* borrow_o() const noexcept - { - return reinterpret_cast(this->p); - } - - T* operator->() const noexcept - { - return this->p; - } - - bool is_None() const noexcept - { - return this->p == Py_None; - } - - PyObject* acquire_or_None() const noexcept - { - PyObject* result = this->p ? reinterpret_cast(this->p) : Py_None; - Py_INCREF(result); - return result; - } - - explicit operator bool() const noexcept - { - return this->p != nullptr; - } - - bool operator!() const noexcept - { - return this->p == nullptr; - } - - Py_ssize_t REFCNT() const noexcept - { - return p ? Py_REFCNT(p) : -42; - } - - PyTypeObject* TYPE() const noexcept - { - return p ? Py_TYPE(p) : nullptr; - } - - inline OwnedObject PyStr() const noexcept; - inline const std::string as_str() const noexcept; - inline OwnedObject PyGetAttr(const ImmortalObject& name) const noexcept; - inline OwnedObject PyRequireAttr(const char* const name) const; - inline OwnedObject PyRequireAttr(const ImmortalString& name) const; - inline OwnedObject PyCall(const BorrowedObject& arg) const; - inline OwnedObject PyCall(PyGreenlet* arg) const ; - inline OwnedObject PyCall(PyObject* arg) const ; - // PyObject_Call(this, args, kwargs); - inline OwnedObject PyCall(const BorrowedObject args, - const BorrowedObject kwargs) const; - inline OwnedObject PyCall(const OwnedObject& args, - const OwnedObject& kwargs) const; - - protected: - void _set_raw_pointer(void* t) - { - TC(t); - p = reinterpret_cast(t); - } - void* _get_raw_pointer() const - { - return p; - } - }; - -#ifdef GREENLET_USE_STDIO - template - std::ostream& operator<<(std::ostream& os, const PyObjectPointer& s) - { - const std::type_info& t = typeid(s); - os << t.name() - << "(addr=" << s.borrow() - << ", refcnt=" << s.REFCNT() - << ", value=" << s.as_str() - << ")"; - - return os; - } -#endif - - template - inline bool operator==(const PyObjectPointer& lhs, const PyObject* const rhs) noexcept - { - return static_cast(lhs.borrow_o()) == static_cast(rhs); - } - - template - inline bool operator==(const PyObjectPointer& lhs, const PyObjectPointer& rhs) noexcept - { - return lhs.borrow_o() == rhs.borrow_o(); - } - - template - inline bool operator!=(const PyObjectPointer& lhs, - const PyObjectPointer& rhs) noexcept - { - return lhs.borrow_o() != rhs.borrow_o(); - } - - template - class OwnedReference : public PyObjectPointer - { - private: - friend class OwnedList; - - protected: - explicit OwnedReference(T* it) : PyObjectPointer(it) - { - } - - public: - - // Constructors - - static OwnedReference consuming(PyObject* p) - { - return OwnedReference(reinterpret_cast(p)); - } - - static OwnedReference owning(T* p) - { - OwnedReference result(p); - Py_XINCREF(result.p); - return result; - } - - OwnedReference() : PyObjectPointer(nullptr) - {} - - explicit OwnedReference(const PyObjectPointer<>& other) - : PyObjectPointer(nullptr) - { - T* op = other.borrow(); - TC(op); - this->p = other.borrow(); - Py_XINCREF(this->p); - } - - // It would be good to make use of the C++11 distinction - // between move and copy operations, e.g., constructing from a - // pointer should be a move operation. - // In the common case of ``OwnedObject x = Py_SomeFunction()``, - // the call to the copy constructor will be elided completely. - OwnedReference(const OwnedReference& other) - : PyObjectPointer(other.p) - { - Py_XINCREF(this->p); - } - - static OwnedReference None() - { - Py_INCREF(Py_None); - return OwnedReference(Py_None); - } - - // We can assign from exactly our type without any extra checking - OwnedReference& operator=(const OwnedReference& other) - { - Py_XINCREF(other.p); - const T* tmp = this->p; - this->p = other.p; - Py_XDECREF(tmp); - return *this; - } - - OwnedReference& operator=(const BorrowedReference other) - { - return this->operator=(other.borrow()); - } - - OwnedReference& operator=(T* const other) - { - TC(other); - Py_XINCREF(other); - T* tmp = this->p; - this->p = other; - Py_XDECREF(tmp); - return *this; - } - - // We can assign from an arbitrary reference type - // if it passes our check. - template - OwnedReference& operator=(const OwnedReference& other) - { - X* op = other.borrow(); - TC(op); - return this->operator=(reinterpret_cast(op)); - } - - inline void steal(T* other) - { - assert(this->p == nullptr); - TC(other); - this->p = other; - } - - T* relinquish_ownership() - { - T* result = this->p; - this->p = nullptr; - return result; - } - - T* acquire() const - { - // Return a new reference. - // TODO: This may go away when we have reference objects - // throughout the code. - Py_XINCREF(this->p); - return this->p; - } - - // Nothing else declares a destructor, we're the leaf, so we - // should be able to get away without virtual. - ~OwnedReference() - { - Py_CLEAR(this->p); - } - - void CLEAR() - { - Py_CLEAR(this->p); - assert(this->p == nullptr); - } - }; - - static inline - void operator<<=(PyObject*& target, OwnedObject& o) - { - target = o.relinquish_ownership(); - } - - - class NewReference : public OwnedObject - { - private: - G_NO_COPIES_OF_CLS(NewReference); - public: - // Consumes the reference. Only use this - // for API return values. - NewReference(PyObject* it) : OwnedObject(it) - { - } - }; - - class NewDictReference : public NewReference - { - private: - G_NO_COPIES_OF_CLS(NewDictReference); - public: - NewDictReference() : NewReference(PyDict_New()) - { - if (!this->p) { - throw PyErrOccurred(); - } - } - - void SetItem(const char* const key, PyObject* value) - { - Require(PyDict_SetItemString(this->p, key, value)); - } - - void SetItem(const PyObjectPointer<>& key, PyObject* value) - { - Require(PyDict_SetItem(this->p, key.borrow_o(), value)); - } - }; - - template - class _OwnedGreenlet: public OwnedReference - { - private: - protected: - _OwnedGreenlet(T* it) : OwnedReference(it) - {} - - public: - _OwnedGreenlet() : OwnedReference() - {} - - _OwnedGreenlet(const _OwnedGreenlet& other) : OwnedReference(other) - { - } - _OwnedGreenlet(OwnedMainGreenlet& other) : - OwnedReference(reinterpret_cast(other.acquire())) - { - } - _OwnedGreenlet(const BorrowedGreenlet& other); - // Steals a reference. - static _OwnedGreenlet consuming(PyGreenlet* it) - { - return _OwnedGreenlet(reinterpret_cast(it)); - } - - inline _OwnedGreenlet& operator=(const OwnedGreenlet& other) - { - return this->operator=(other.borrow()); - } - - inline _OwnedGreenlet& operator=(const BorrowedGreenlet& other); - - _OwnedGreenlet& operator=(const OwnedMainGreenlet& other) - { - PyGreenlet* owned = other.acquire(); - Py_XDECREF(this->p); - this->p = reinterpret_cast(owned); - return *this; - } - - _OwnedGreenlet& operator=(T* const other) - { - OwnedReference::operator=(other); - return *this; - } - - T* relinquish_ownership() - { - T* result = this->p; - this->p = nullptr; - return result; - } - - PyObject* relinquish_ownership_o() - { - return reinterpret_cast(relinquish_ownership()); - } - - inline Greenlet* operator->() const noexcept; - inline operator Greenlet*() const noexcept; - }; - - template - class BorrowedReference : public PyObjectPointer - { - public: - // Allow implicit creation from PyObject* pointers as we - // transition to using these classes. Also allow automatic - // conversion to PyObject* for passing to C API calls and even - // for Py_INCREF/DECREF, because we ourselves do no memory management. - BorrowedReference(T* it) : PyObjectPointer(it) - {} - - BorrowedReference(const PyObjectPointer& ref) : PyObjectPointer(ref.borrow()) - {} - - BorrowedReference() : PyObjectPointer(nullptr) - {} - - operator T*() const - { - return this->p; - } - }; - - typedef BorrowedReference BorrowedObject; - //typedef BorrowedReference BorrowedGreenlet; - - template - class _BorrowedGreenlet : public BorrowedReference - { - public: - _BorrowedGreenlet() : - BorrowedReference(nullptr) - {} - - _BorrowedGreenlet(T* it) : - BorrowedReference(it) - {} - - _BorrowedGreenlet(const BorrowedObject& it); - - _BorrowedGreenlet(const OwnedGreenlet& it) : - BorrowedReference(it.borrow()) - {} - - _BorrowedGreenlet& operator=(const BorrowedObject& other); - - // We get one of these for PyGreenlet, but one for PyObject - // is handy as well - operator PyObject*() const - { - return reinterpret_cast(this->p); - } - Greenlet* operator->() const noexcept; - operator Greenlet*() const noexcept; - }; - - typedef _BorrowedGreenlet BorrowedGreenlet; - - template - _OwnedGreenlet::_OwnedGreenlet(const BorrowedGreenlet& other) - : OwnedReference(reinterpret_cast(other.borrow())) - { - Py_XINCREF(this->p); - } - - - class BorrowedMainGreenlet - : public _BorrowedGreenlet - { - public: - BorrowedMainGreenlet(const OwnedMainGreenlet& it) : - _BorrowedGreenlet(it.borrow()) - {} - BorrowedMainGreenlet(PyGreenlet* it=nullptr) - : _BorrowedGreenlet(it) - {} - }; - - template - _OwnedGreenlet& _OwnedGreenlet::operator=(const BorrowedGreenlet& other) - { - return this->operator=(other.borrow()); - } - - - class ImmortalObject : public PyObjectPointer<> - { - private: - G_NO_ASSIGNMENT_OF_CLS(ImmortalObject); - public: - explicit ImmortalObject(PyObject* it) : PyObjectPointer<>(it) - { - } - - ImmortalObject(const ImmortalObject& other) - : PyObjectPointer<>(other.p) - { - - } - - /** - * Become the new owner of the object. Does not change the - * reference count. - */ - ImmortalObject& operator=(PyObject* it) - { - assert(this->p == nullptr); - this->p = it; - return *this; - } - - static ImmortalObject consuming(PyObject* it) - { - return ImmortalObject(it); - } - - inline operator PyObject*() const - { - return this->p; - } - }; - - class ImmortalString : public ImmortalObject - { - private: - G_NO_COPIES_OF_CLS(ImmortalString); - const char* str; - public: - ImmortalString(const char* const str) : - ImmortalObject(str ? Require(PyUnicode_InternFromString(str)) : nullptr) - { - this->str = str; - } - - inline ImmortalString& operator=(const char* const str) - { - if (!this->p) { - this->p = Require(PyUnicode_InternFromString(str)); - this->str = str; - } - else { - assert(this->str == str); - } - return *this; - } - - inline operator std::string() const - { - return this->str; - } - - }; - - class ImmortalEventName : public ImmortalString - { - private: - G_NO_COPIES_OF_CLS(ImmortalEventName); - public: - ImmortalEventName(const char* const str) : ImmortalString(str) - {} - }; - - class ImmortalException : public ImmortalObject - { - private: - G_NO_COPIES_OF_CLS(ImmortalException); - public: - ImmortalException(const char* const name, PyObject* base=nullptr) : - ImmortalObject(name - // Python 2.7 isn't const correct - ? Require(PyErr_NewException((char*)name, base, nullptr)) - : nullptr) - {} - - inline bool PyExceptionMatches() const - { - return PyErr_ExceptionMatches(this->p) > 0; - } - - }; - - template - inline OwnedObject PyObjectPointer::PyStr() const noexcept - { - if (!this->p) { - return OwnedObject(); - } - return OwnedObject::consuming(PyObject_Str(reinterpret_cast(this->p))); - } - - template - inline const std::string PyObjectPointer::as_str() const noexcept - { - // NOTE: This is not Python exception safe. - if (this->p) { - // The Python APIs return a cached char* value that's only valid - // as long as the original object stays around, and we're - // about to (probably) toss it. Hence the copy to std::string. - OwnedObject py_str = this->PyStr(); - if (!py_str) { - return "(nil)"; - } - return PyUnicode_AsUTF8(py_str.borrow()); - } - return "(nil)"; - } - - template - inline OwnedObject PyObjectPointer::PyGetAttr(const ImmortalObject& name) const noexcept - { - assert(this->p); - return OwnedObject::consuming(PyObject_GetAttr(reinterpret_cast(this->p), name)); - } - - template - inline OwnedObject PyObjectPointer::PyRequireAttr(const char* const name) const - { - assert(this->p); - return OwnedObject::consuming(Require(PyObject_GetAttrString(this->p, name), name)); - } - - template - inline OwnedObject PyObjectPointer::PyRequireAttr(const ImmortalString& name) const - { - assert(this->p); - return OwnedObject::consuming(Require( - PyObject_GetAttr( - reinterpret_cast(this->p), - name - ), - name - )); - } - - template - inline OwnedObject PyObjectPointer::PyCall(const BorrowedObject& arg) const - { - return this->PyCall(arg.borrow()); - } - - template - inline OwnedObject PyObjectPointer::PyCall(PyGreenlet* arg) const - { - return this->PyCall(reinterpret_cast(arg)); - } - - template - inline OwnedObject PyObjectPointer::PyCall(PyObject* arg) const - { - assert(this->p); - return OwnedObject::consuming(PyObject_CallFunctionObjArgs(this->p, arg, NULL)); - } - - template - inline OwnedObject PyObjectPointer::PyCall(const BorrowedObject args, - const BorrowedObject kwargs) const - { - assert(this->p); - return OwnedObject::consuming(PyObject_Call(this->p, args, kwargs)); - } - - template - inline OwnedObject PyObjectPointer::PyCall(const OwnedObject& args, - const OwnedObject& kwargs) const - { - assert(this->p); - return OwnedObject::consuming(PyObject_Call(this->p, args.borrow(), kwargs.borrow())); - } - - inline void - ListChecker(void * p) - { - if (!p) { - return; - } - if (!PyList_Check(p)) { - throw TypeError("Expected a list"); - } - } - - class OwnedList : public OwnedReference - { - private: - G_NO_ASSIGNMENT_OF_CLS(OwnedList); - public: - // TODO: Would like to use move. - explicit OwnedList(const OwnedObject& other) - : OwnedReference(other) - { - } - - OwnedList& operator=(const OwnedObject& other) - { - if (other && PyList_Check(other.p)) { - // Valid list. Own a new reference to it, discard the - // reference to what we did own. - PyObject* new_ptr = other.p; - Py_INCREF(new_ptr); - Py_XDECREF(this->p); - this->p = new_ptr; - } - else { - // Either the other object was NULL (an error) or it - // wasn't a list. Either way, we're now invalidated. - Py_XDECREF(this->p); - this->p = nullptr; - } - return *this; - } - - inline bool empty() const - { - return PyList_GET_SIZE(p) == 0; - } - - inline Py_ssize_t size() const - { - return PyList_GET_SIZE(p); - } - - inline BorrowedObject at(const Py_ssize_t index) const - { - return PyList_GET_ITEM(p, index); - } - - inline void clear() - { - PyList_SetSlice(p, 0, PyList_GET_SIZE(p), NULL); - } - }; - - // Use this to represent the module object used at module init - // time. - // This could either be a borrowed (Py2) or new (Py3) reference; - // either way, we don't want to do any memory management - // on it here, Python itself will handle that. - // XXX: Actually, that's not quite right. On Python 3, if an - // exception occurs before we return to the interpreter, this will - // leak; but all previous versions also had that problem. - class CreatedModule : public PyObjectPointer<> - { - private: - G_NO_COPIES_OF_CLS(CreatedModule); - public: - CreatedModule(PyModuleDef& mod_def) : PyObjectPointer<>( - Require(PyModule_Create(&mod_def))) - { - } - - // PyAddObject(): Add a reference to the object to the module. - // On return, the reference count of the object is unchanged. - // - // The docs warn that PyModule_AddObject only steals the - // reference on success, so if it fails after we've incref'd - // or allocated, we're responsible for the decref. - void PyAddObject(const char* name, const long new_bool) - { - OwnedObject p = OwnedObject::consuming(Require(PyBool_FromLong(new_bool))); - this->PyAddObject(name, p); - } - - void PyAddObject(const char* name, const OwnedObject& new_object) - { - // The caller already owns a reference they will decref - // when their variable goes out of scope, we still need to - // incref/decref. - this->PyAddObject(name, new_object.borrow()); - } - - void PyAddObject(const char* name, const ImmortalObject& new_object) - { - this->PyAddObject(name, new_object.borrow()); - } - - void PyAddObject(const char* name, PyTypeObject& type) - { - this->PyAddObject(name, reinterpret_cast(&type)); - } - - void PyAddObject(const char* name, PyObject* new_object) - { - Py_INCREF(new_object); - try { - Require(PyModule_AddObject(this->p, name, new_object)); - } - catch (const PyErrOccurred&) { - Py_DECREF(p); - throw; - } - } - }; - - class PyErrFetchParam : public PyObjectPointer<> - { - // Not an owned object, because we can't be initialized with - // one, and we only sometimes acquire ownership. - private: - G_NO_COPIES_OF_CLS(PyErrFetchParam); - public: - // To allow declaring these and passing them to - // PyErr_Fetch we implement the empty constructor, - // and the address operator. - PyErrFetchParam() : PyObjectPointer<>(nullptr) - { - } - - PyObject** operator&() - { - return &this->p; - } - - // This allows us to pass one directly without the &, - // BUT it has higher precedence than the bool operator - // if it's not explicit. - operator PyObject**() - { - return &this->p; - } - - // We don't want to be able to pass these to Py_DECREF and - // such so we don't have the implicit PyObject* conversion. - - inline PyObject* relinquish_ownership() - { - PyObject* result = this->p; - this->p = nullptr; - return result; - } - - ~PyErrFetchParam() - { - Py_XDECREF(p); - } - }; - - class OwnedErrPiece : public OwnedObject - { - private: - - public: - // Unlike OwnedObject, this increments the refcount. - OwnedErrPiece(PyObject* p=nullptr) : OwnedObject(p) - { - this->acquire(); - } - - PyObject** operator&() - { - return &this->p; - } - - inline operator PyObject*() const - { - return this->p; - } - - operator PyTypeObject*() const - { - return reinterpret_cast(this->p); - } - }; - - class PyErrPieces - { - private: - OwnedErrPiece type; - OwnedErrPiece instance; - OwnedErrPiece traceback; - bool restored; - public: - // Takes new references; if we're destroyed before - // restoring the error, we drop the references. - PyErrPieces(PyObject* t, PyObject* v, PyObject* tb) : - type(t), - instance(v), - traceback(tb), - restored(0) - { - this->normalize(); - } - - PyErrPieces() : - restored(0) - { - // PyErr_Fetch transfers ownership to us, so - // we don't actually need to INCREF; but we *do* - // need to DECREF if we're not restored. - PyErrFetchParam t, v, tb; - PyErr_Fetch(&t, &v, &tb); - type.steal(t.relinquish_ownership()); - instance.steal(v.relinquish_ownership()); - traceback.steal(tb.relinquish_ownership()); - } - - void PyErrRestore() - { - // can only do this once - assert(!this->restored); - this->restored = true; - PyErr_Restore( - this->type.relinquish_ownership(), - this->instance.relinquish_ownership(), - this->traceback.relinquish_ownership()); - assert(!this->type && !this->instance && !this->traceback); - } - - private: - void normalize() - { - // First, check the traceback argument, replacing None, - // with NULL - if (traceback.is_None()) { - traceback = nullptr; - } - - if (traceback && !PyTraceBack_Check(traceback.borrow())) { - throw PyErrOccurred(PyExc_TypeError, - "throw() third argument must be a traceback object"); - } - - if (PyExceptionClass_Check(type)) { - // If we just had a type, we'll now have a type and - // instance. - // The type's refcount will have gone up by one - // because of the instance and the instance will have - // a refcount of one. Either way, we owned, and still - // do own, exactly one reference. - PyErr_NormalizeException(&type, &instance, &traceback); - - } - else if (PyExceptionInstance_Check(type)) { - /* Raising an instance --- usually that means an - object that is a subclass of BaseException, but on - Python 2, that can also mean an arbitrary old-style - object. The value should be a dummy. */ - if (instance && !instance.is_None()) { - throw PyErrOccurred( - PyExc_TypeError, - "instance exception may not have a separate value"); - } - /* Normalize to raise , */ - this->instance = this->type; - this->type = PyExceptionInstance_Class(instance.borrow()); - - /* - It would be tempting to do this: - - Py_ssize_t type_count = Py_REFCNT(Py_TYPE(instance.borrow())); - this->type = PyExceptionInstance_Class(instance.borrow()); - assert(this->type.REFCNT() == type_count + 1); - - But that doesn't work on Python 2 in the case of - old-style instances: The result of Py_TYPE is going to - be the global shared that all - old-style classes have, while the return of Instance_Class() - will be the Python-level class object. The two are unrelated. - */ - } - else { - /* Not something you can raise. throw() fails. */ - PyErr_Format(PyExc_TypeError, - "exceptions must be classes, or instances, not %s", - Py_TYPE(type.borrow())->tp_name); - throw PyErrOccurred(); - } - } - }; - - // PyArg_Parse's O argument returns a borrowed reference. - class PyArgParseParam : public BorrowedObject - { - private: - G_NO_COPIES_OF_CLS(PyArgParseParam); - public: - explicit PyArgParseParam(PyObject* p=nullptr) : BorrowedObject(p) - { - } - - inline PyObject** operator&() - { - return &this->p; - } - }; - -};}; - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_slp_switch.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_slp_switch.hpp deleted file mode 100644 index bd4b7ae..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_slp_switch.hpp +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef GREENLET_SLP_SWITCH_HPP -#define GREENLET_SLP_SWITCH_HPP - -#include "greenlet_compiler_compat.hpp" -#include "greenlet_refs.hpp" - -/* - * the following macros are spliced into the OS/compiler - * specific code, in order to simplify maintenance. - */ -// We can save about 10% of the time it takes to switch greenlets if -// we thread the thread state through the slp_save_state() and the -// following slp_restore_state() calls from -// slp_switch()->g_switchstack() (which already needs to access it). -// -// However: -// -// that requires changing the prototypes and implementations of the -// switching functions. If we just change the prototype of -// slp_switch() to accept the argument and update the macros, without -// changing the implementation of slp_switch(), we get crashes on -// 64-bit Linux and 32-bit x86 (for reasons that aren't 100% clear); -// on the other hand, 64-bit macOS seems to be fine. Also, 64-bit -// windows is an issue because slp_switch is written fully in assembly -// and currently ignores its argument so some code would have to be -// adjusted there to pass the argument on to the -// ``slp_save_state_asm()`` function (but interestingly, because of -// the calling convention, the extra argument is just ignored and -// things function fine, albeit slower, if we just modify -// ``slp_save_state_asm`()` to fetch the pointer to pass to the -// macro.) -// -// Our compromise is to use a *glabal*, untracked, weak, pointer -// to the necessary thread state during the process of switching only. -// This is safe because we're protected by the GIL, and if we're -// running this code, the thread isn't exiting. This also nets us a -// 10-12% speed improvement. - -static greenlet::Greenlet* volatile switching_thread_state = nullptr; - - -extern "C" { -static int GREENLET_NOINLINE(slp_save_state_trampoline)(char* stackref); -static void GREENLET_NOINLINE(slp_restore_state_trampoline)(); -} - - -#define SLP_SAVE_STATE(stackref, stsizediff) \ -do { \ - assert(switching_thread_state); \ - stackref += STACK_MAGIC; \ - if (slp_save_state_trampoline((char*)stackref)) \ - return -1; \ - if (!switching_thread_state->active()) \ - return 1; \ - stsizediff = switching_thread_state->stack_start() - (char*)stackref; \ -} while (0) - -#define SLP_RESTORE_STATE() slp_restore_state_trampoline() - -#define SLP_EVAL -extern "C" { -#define slp_switch GREENLET_NOINLINE(slp_switch) -#include "slp_platformselect.h" -} -#undef slp_switch - -#ifndef STACK_MAGIC -# error \ - "greenlet needs to be ported to this platform, or taught how to detect your compiler properly." -#endif /* !STACK_MAGIC */ - - - -#ifdef EXTERNAL_ASM -/* CCP addition: Make these functions, to be called from assembler. - * The token include file for the given platform should enable the - * EXTERNAL_ASM define so that this is included. - */ -extern "C" { -intptr_t -slp_save_state_asm(intptr_t* ref) -{ - intptr_t diff; - SLP_SAVE_STATE(ref, diff); - return diff; -} - -void -slp_restore_state_asm(void) -{ - SLP_RESTORE_STATE(); -} - -extern int slp_switch(void); -}; -#endif - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/greenlet_thread_support.hpp b/port/lib/python3.11/site-packages/greenlet/greenlet_thread_support.hpp deleted file mode 100644 index 3ded7d2..0000000 --- a/port/lib/python3.11/site-packages/greenlet/greenlet_thread_support.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef GREENLET_THREAD_SUPPORT_HPP -#define GREENLET_THREAD_SUPPORT_HPP - -/** - * Defines various utility functions to help greenlet integrate well - * with threads. This used to be needed when we supported Python - * 2.7 on Windows, which used a very old compiler. We wrote an - * alternative implementation using Python APIs and POSIX or Windows - * APIs, but that's no longer needed. So this file is a shadow of its - * former self --- but may be needed in the future. - */ - -#include -#include -#include - -#include "greenlet_compiler_compat.hpp" - -namespace greenlet { - typedef std::mutex Mutex; - typedef std::lock_guard LockGuard; - class LockInitError : public std::runtime_error - { - public: - LockInitError(const char* what) : std::runtime_error(what) - {}; - }; -}; - - -#endif /* GREENLET_THREAD_SUPPORT_HPP */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/__init__.py b/port/lib/python3.11/site-packages/greenlet/platform/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/greenlet/platform/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/platform/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index dfe31fc2a6f531c5aac88bd72036479ea2fdd058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmZ3^%ge<81g$oI(?RrO5CH>>P{wCAAY(d13PUi1CZpdLVv&A% zdAWW-eo;wUeokh-egTlBpOcxSUrfpP83g5+AQuQ2C3)CO1E&G$+-rh!toB$PvZ-K;i>4BO~Jn1{hJq H3={(ZI3F - * Add support for strange GCC caller-save decisions - * (ported from switch_aarch64_gcc.h) - * 18-Aug-11 Alexey Borzenkov - * Correctly save rbp, csr and cw - * 01-Apr-04 Hye-Shik Chang - * Ported from i386 to amd64. - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for spark - * 31-Avr-02 Armin Rigo - * Added ebx, esi and edi register-saves. - * 01-Mar-02 Samual M. Rushing - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -/* #define STACK_MAGIC 3 */ -/* the above works fine with gcc 2.96, but 2.95.3 wants this */ -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "r12", "r13", "r14", "r15" - -static int -slp_switch(void) -{ - int err; - void* rbp; - void* rbx; - unsigned int csr; - unsigned short cw; - /* This used to be declared 'register', but that does nothing in - modern compilers and is explicitly forbidden in some new - standards. */ - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("fstcw %0" : "=m" (cw)); - __asm__ volatile ("stmxcsr %0" : "=m" (csr)); - __asm__ volatile ("movq %%rbp, %0" : "=m" (rbp)); - __asm__ volatile ("movq %%rbx, %0" : "=m" (rbx)); - __asm__ ("movq %%rsp, %0" : "=g" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addq %0, %%rsp\n" - "addq %0, %%rbp\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - __asm__ volatile ("xorq %%rax, %%rax" : "=a" (err)); - } - __asm__ volatile ("movq %0, %%rbx" : : "m" (rbx)); - __asm__ volatile ("movq %0, %%rbp" : : "m" (rbp)); - __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); - __asm__ volatile ("fldcw %0" : : "m" (cw)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_gcc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_gcc.h deleted file mode 100644 index 655003a..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_gcc.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 14-Aug-06 File creation. Ported from Arm Thumb. Sylvain Baro - * 3-Sep-06 Commented out saving of r1-r3 (r4 already commented out) as I - * read that these do not need to be saved. Also added notes and - * errors related to the frame pointer. Richard Tew. - * - * NOTES - * - * It is not possible to detect if fp is used or not, so the supplied - * switch function needs to support it, so that you can remove it if - * it does not apply to you. - * - * POSSIBLE ERRORS - * - * "fp cannot be used in asm here" - * - * - Try commenting out "fp" in REGS_TO_SAVE. - * - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 -#define REG_SP "sp" -#define REG_SPSP "sp,sp" -#ifdef __thumb__ -#define REG_FP "r7" -#define REG_FPFP "r7,r7" -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r9", "r10", "r11", "lr" -#else -#define REG_FP "fp" -#define REG_FPFP "fp,fp" -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr" -#endif -#if defined(__SOFTFP__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL -#elif defined(__VFP_FP__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ - "d12", "d13", "d14", "d15" -#elif defined(__MAVERICK__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "mvf4", "mvf5", "mvf6", "mvf7", \ - "mvf8", "mvf9", "mvf10", "mvf11", \ - "mvf12", "mvf13", "mvf14", "mvf15" -#else -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "f4", "f5", "f6", "f7" -#endif - -static int -#ifdef __GNUC__ -__attribute__((optimize("no-omit-frame-pointer"))) -#endif -slp_switch(void) -{ - void *fp; - int *stackref, stsizediff; - int result; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("mov r0," REG_FP "\n\tstr r0,%0" : "=m" (fp) : : "r0"); - __asm__ ("mov %0," REG_SP : "=r" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add " REG_SPSP ",%0\n" - "add " REG_FPFP ",%0\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("ldr r0,%1\n\tmov " REG_FP ",r0\n\tmov %0, #0" : "=r" (result) : "m" (fp) : "r0"); - __asm__ volatile ("" : : : REGS_TO_SAVE); - return result; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_ios.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_ios.h deleted file mode 100644 index 9e640e1..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm32_ios.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 31-May-15 iOS support. Ported from arm32. Proton - * - * NOTES - * - * It is not possible to detect if fp is used or not, so the supplied - * switch function needs to support it, so that you can remove it if - * it does not apply to you. - * - * POSSIBLE ERRORS - * - * "fp cannot be used in asm here" - * - * - Try commenting out "fp" in REGS_TO_SAVE. - * - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 -#define REG_SP "sp" -#define REG_SPSP "sp,sp" -#define REG_FP "r7" -#define REG_FPFP "r7,r7" -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r8", "r10", "r11", "lr" -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "d8", "d9", "d10", "d11", \ - "d12", "d13", "d14", "d15" - -static int -#ifdef __GNUC__ -__attribute__((optimize("no-omit-frame-pointer"))) -#endif -slp_switch(void) -{ - void *fp; - int *stackref, stsizediff, result; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("str " REG_FP ",%0" : "=m" (fp)); - __asm__ ("mov %0," REG_SP : "=r" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add " REG_SPSP ",%0\n" - "add " REG_FPFP ",%0\n" - : - : "r" (stsizediff) - : REGS_TO_SAVE /* Clobber registers, force compiler to - * recalculate address of void *fp from REG_SP or REG_FP */ - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ( - "ldr " REG_FP ", %1\n\t" - "mov %0, #0" - : "=r" (result) - : "m" (fp) - : REGS_TO_SAVE /* Force compiler to restore saved registers after this */ - ); - return result; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_masm.asm b/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_masm.asm deleted file mode 100644 index 29f9c22..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_masm.asm +++ /dev/null @@ -1,53 +0,0 @@ - AREA switch_arm64_masm, CODE, READONLY; - GLOBAL slp_switch [FUNC] - EXTERN slp_save_state_asm - EXTERN slp_restore_state_asm - -slp_switch - ; push callee saved registers to stack - stp x19, x20, [sp, #-16]! - stp x21, x22, [sp, #-16]! - stp x23, x24, [sp, #-16]! - stp x25, x26, [sp, #-16]! - stp x27, x28, [sp, #-16]! - stp x29, x30, [sp, #-16]! - stp d8, d9, [sp, #-16]! - stp d10, d11, [sp, #-16]! - stp d12, d13, [sp, #-16]! - stp d14, d15, [sp, #-16]! - - ; call slp_save_state_asm with stack pointer - mov x0, sp - bl slp_save_state_asm - - ; early return for return value of 1 and -1 - cmp x0, #-1 - b.eq RETURN - cmp x0, #1 - b.eq RETURN - - ; increment stack and frame pointer - add sp, sp, x0 - add x29, x29, x0 - - bl slp_restore_state_asm - - ; store return value for successful completion of routine - mov x0, #0 - -RETURN - ; pop registers from stack - ldp d14, d15, [sp], #16 - ldp d12, d13, [sp], #16 - ldp d10, d11, [sp], #16 - ldp d8, d9, [sp], #16 - ldp x29, x30, [sp], #16 - ldp x27, x28, [sp], #16 - ldp x25, x26, [sp], #16 - ldp x23, x24, [sp], #16 - ldp x21, x22, [sp], #16 - ldp x19, x20, [sp], #16 - - ret - - END diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_masm.obj b/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_masm.obj deleted file mode 100644 index f6f220e4310baaa9756110685ce7d6a2bdf90c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcma)4PiqrF6n~qoo~*PNZ{i+=wji4b#Xu2~wiJpGk)*AMF07NyB(9n1#+i+!)I;v| zBKQG3?t1eB$T(lYgGb4+lu{_QmQrebldQB_4?cMF-uu0IZ{DA2e8@rZ+e^~30488W z`B{KPh%yV{HEIpyeum^wI#7P*HfX)ux?9U&c!SFK-$o|OFtKn{Q|a-#N>2inp0-tb zCRKXAtg2SolaoLv$Ll&ds_Epj?SH+8K{t?XSjKaFsEy%yh}=V70BaHj zEY5kWk_zcJo{$SSUL~=K(zW|tnhm$rA z<%dZ$q?>RX*18r{!azhaYR1lVb;g;mR-6h!#F>|p@;aje%0a|CZrE7s+SXuT>MS=Y ziQPiMY-5DD&5+S7^H03fy7qt7ir}L34kK|h68s-MU>{lXOqlr?!Y=`~WwviNenFS_ zZalVSHh-0FU4lj#X8u5`ODn6@#{f?dHE&%XdP~_I3;$RS9-(z*>>ydkm*f@oWlUn~ Qn+^;lsEi}=H#!Q3U&UU-WdHyG diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_msvc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_msvc.h deleted file mode 100644 index 7ab7f45..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_arm64_msvc.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 21-Oct-21 Niyas Sait - * First version to enable win/arm64 support. - */ - -#define STACK_REFPLUS 1 -#define STACK_MAGIC 0 - -/* Use the generic support for an external assembly language slp_switch function. */ -#define EXTERNAL_ASM - -#ifdef SLP_EVAL -/* This always uses the external masm assembly file. */ -#endif \ No newline at end of file diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_csky_gcc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_csky_gcc.h deleted file mode 100644 index ac469d3..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_csky_gcc.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifdef SLP_EVAL -#define STACK_MAGIC 0 -#define REG_FP "r8" -#ifdef __CSKYABIV2__ -#define REGS_TO_SAVE_GENERAL "r4", "r5", "r6", "r7", "r9", "r10", "r11", "r15",\ - "r16", "r17", "r18", "r19", "r20", "r21", "r22",\ - "r23", "r24", "r25" - -#if defined (__CSKY_HARD_FLOAT__) || (__CSKY_VDSP__) -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL, "vr8", "vr9", "vr10", "vr11", "vr12",\ - "vr13", "vr14", "vr15" -#else -#define REGS_TO_SAVE REGS_TO_SAVE_GENERAL -#endif -#else -#define REGS_TO_SAVE "r9", "r10", "r11", "r12", "r13", "r15" -#endif - - -static int -#ifdef __GNUC__ -__attribute__((optimize("no-omit-frame-pointer"))) -#endif -slp_switch(void) -{ - int *stackref, stsizediff; - int result; - - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mov %0, sp" : "=r" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addu sp,%0\n" - "addu "REG_FP",%0\n" - : - : "r" (stsizediff) - ); - - SLP_RESTORE_STATE(); - } - __asm__ volatile ("movi %0, 0" : "=r" (result)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - - return result; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_loongarch64_linux.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_loongarch64_linux.h deleted file mode 100644 index 9eaf34e..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_loongarch64_linux.h +++ /dev/null @@ -1,31 +0,0 @@ -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "s0", "s1", "s2", "s3", "s4", "s5", \ - "s6", "s7", "s8", "fp", \ - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31" - -static int -slp_switch(void) -{ - int ret; - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("move %0, $sp" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add.d $sp, $sp, %0\n\t" - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("move %0, $zero" : "=r" (ret) : ); - return ret; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_m68k_gcc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_m68k_gcc.h deleted file mode 100644 index da761c2..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_m68k_gcc.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 2014-01-06 Andreas Schwab - * File created. - */ - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \ - "%a2", "%a3", "%a4" - -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - void *fp, *a5; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("move.l %%fp, %0" : "=m"(fp)); - __asm__ volatile ("move.l %%a5, %0" : "=m"(a5)); - __asm__ ("move.l %%sp, %0" : "=r"(stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ("add.l %0, %%sp; add.l %0, %%fp" : : "r"(stsizediff)); - SLP_RESTORE_STATE(); - __asm__ volatile ("clr.l %0" : "=g" (err)); - } - __asm__ volatile ("move.l %0, %%a5" : : "m"(a5)); - __asm__ volatile ("move.l %0, %%fp" : : "m"(fp)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - return err; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_mips_unix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_mips_unix.h deleted file mode 100644 index b9003e9..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_mips_unix.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 20-Sep-14 Matt Madison - * Re-code the saving of the gp register for MIPS64. - * 05-Jan-08 Thiemo Seufer - * Ported from ppc. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "$16", "$17", "$18", "$19", "$20", "$21", "$22", \ - "$23", "$30" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; -#ifdef __mips64 - uint64_t gpsave; -#endif - __asm__ __volatile__ ("" : : : REGS_TO_SAVE); -#ifdef __mips64 - __asm__ __volatile__ ("sd $28,%0" : "=m" (gpsave) : : ); -#endif - __asm__ ("move %0, $29" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ __volatile__ ( -#ifdef __mips64 - "daddu $29, %0\n" -#else - "addu $29, %0\n" -#endif - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } -#ifdef __mips64 - __asm__ __volatile__ ("ld $28,%0" : : "m" (gpsave) : ); -#endif - __asm__ __volatile__ ("" : : : REGS_TO_SAVE); - __asm__ __volatile__ ("move %0, $0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_aix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_aix.h deleted file mode 100644 index e7e0b87..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_aix.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 16-Oct-20 Jesse Gorzinski - * Copied from Linux PPC64 implementation - * 04-Sep-18 Alexey Borzenkov - * Workaround a gcc bug using manual save/restore of r30 - * 21-Mar-18 Tulio Magno Quites Machado Filho - * Added r30 to the list of saved registers in order to fully comply with - * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this - * register as a nonvolatile register used for local variables. - * 21-Mar-18 Laszlo Boszormenyi - * Save r2 (TOC pointer) manually. - * 10-Dec-13 Ulrich Weigand - * Support ELFv2 ABI. Save float/vector registers. - * 09-Mar-12 Michael Ellerman - * 64-bit implementation, copied from 32-bit. - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - * 31-Jul-12 Trevor Bowen - * Changed memory constraints to register only. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 6 - -#if defined(__ALTIVEC__) -#define ALTIVEC_REGS \ - "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ - "v28", "v29", "v30", "v31", -#else -#define ALTIVEC_REGS -#endif - -#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "r31", \ - "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ - "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ - "fr30", "fr31", \ - ALTIVEC_REGS \ - "cr2", "cr3", "cr4" - -static int -slp_switch(void) -{ - int err; - long *stackref, stsizediff; - void * toc; - void * r30; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("std 2, %0" : "=m" (toc)); - __asm__ volatile ("std 30, %0" : "=m" (r30)); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("ld 30, %0" : : "m" (r30)); - __asm__ volatile ("ld 2, %0" : : "m" (toc)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_linux.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_linux.h deleted file mode 100644 index 3c324d0..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc64_linux.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 04-Sep-18 Alexey Borzenkov - * Workaround a gcc bug using manual save/restore of r30 - * 21-Mar-18 Tulio Magno Quites Machado Filho - * Added r30 to the list of saved registers in order to fully comply with - * both ppc64 ELFv1 ABI and the ppc64le ELFv2 ABI, that classify this - * register as a nonvolatile register used for local variables. - * 21-Mar-18 Laszlo Boszormenyi - * Save r2 (TOC pointer) manually. - * 10-Dec-13 Ulrich Weigand - * Support ELFv2 ABI. Save float/vector registers. - * 09-Mar-12 Michael Ellerman - * 64-bit implementation, copied from 32-bit. - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - * 31-Jul-12 Trevor Bowen - * Changed memory constraints to register only. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#if _CALL_ELF == 2 -#define STACK_MAGIC 4 -#else -#define STACK_MAGIC 6 -#endif - -#if defined(__ALTIVEC__) -#define ALTIVEC_REGS \ - "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", \ - "v28", "v29", "v30", "v31", -#else -#define ALTIVEC_REGS -#endif - -#define REGS_TO_SAVE "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "r31", \ - "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", \ - "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", \ - "fr30", "fr31", \ - ALTIVEC_REGS \ - "cr2", "cr3", "cr4" - -static int -slp_switch(void) -{ - int err; - long *stackref, stsizediff; - void * toc; - void * r30; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("std 2, %0" : "=m" (toc)); - __asm__ volatile ("std 30, %0" : "=m" (r30)); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("ld 30, %0" : : "m" (r30)); - __asm__ volatile ("ld 2, %0" : : "m" (toc)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_aix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_aix.h deleted file mode 100644 index 6d93c13..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_aix.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Mar-11 Floris Bruynooghe - * Do not add stsizediff to general purpose - * register (GPR) 30 as this is a non-volatile and - * unused by the PowerOpen Environment, therefore - * this was modifying a user register instead of the - * frame pointer (which does not seem to exist). - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_linux.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_linux.h deleted file mode 100644 index e83ad70..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_linux.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - * 31-Jul-12 Trevor Bowen - * Changed memory constraints to register only. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - "add 30, 30, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_macosx.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_macosx.h deleted file mode 100644 index bd414c6..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_macosx.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" - -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("; asm block 2\n\tmr %0, r1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "; asm block 3\n" - "\tmr r11, %0\n" - "\tadd r1, r1, r11\n" - "\tadd r30, r30, r11\n" - : /* no outputs */ - : "r" (stsizediff) - : "r11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_unix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_unix.h deleted file mode 100644 index bb18808..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_ppc_unix.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'r31' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 14-Jan-04 Bob Ippolito - * added cr2-cr4 to the registers to be saved. - * Open questions: Should we save FP registers? - * What about vector registers? - * Differences between darwin and unix? - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 04-Oct-02 Gustavo Niemeyer - * Ported from MacOS version. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 29-Jun-02 Christian Tismer - * Added register 13-29, 31 saves. The same way as - * Armin Rigo did for the x86_unix version. - * This seems to be now fully functional! - * 04-Mar-02 Hye-Shik Chang - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 3 - -/* !!!!WARNING!!!! need to add "r31" in the next line if this header file - * is meant to be compiled non-dynamically! - */ -#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \ - "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \ - "cr2", "cr3", "cr4" -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ ("mr %0, 1" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "mr 11, %0\n" - "add 1, 1, 11\n" - "add 30, 30, 11\n" - : /* no outputs */ - : "r" (stsizediff) - : "11" - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("li %0, 0" : "=r" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_riscv_unix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_riscv_unix.h deleted file mode 100644 index e74f37a..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_riscv_unix.h +++ /dev/null @@ -1,36 +0,0 @@ -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "s1", "s2", "s3", "s4", "s5", \ - "s6", "s7", "s8", "s9", "s10", "s11", "fs0", "fs1", \ - "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", \ - "fs10", "fs11" - -static int -slp_switch(void) -{ - long fp; - int ret; - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("mv %0, fp" : "=r" (fp) : ); - __asm__ volatile ("mv %0, sp" : "=r" (stackref) : ); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "add sp, sp, %0\n\t" - "add fp, fp, %0\n\t" - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("ld fp, %0" : : "m" (fp)); - __asm__ volatile ("mv %0, zero" : "=r" (ret) : ); - return ret; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_s390_unix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_s390_unix.h deleted file mode 100644 index 9199367..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_s390_unix.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 25-Jan-12 Alexey Borzenkov - * Fixed Linux/S390 port to work correctly with - * different optimization options both on 31-bit - * and 64-bit. Thanks to Stefan Raabe for lots - * of testing. - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 06-Oct-02 Gustavo Niemeyer - * Ported to Linux/S390. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#ifdef __s390x__ -#define STACK_MAGIC 20 /* 20 * 8 = 160 bytes of function call area */ -#else -#define STACK_MAGIC 24 /* 24 * 4 = 96 bytes of function call area */ -#endif - -/* Technically, r11-r13 also need saving, but function prolog starts - with stm(g) and since there are so many saved registers already - it won't be optimized, resulting in all r6-r15 being saved */ -#define REGS_TO_SAVE "r6", "r7", "r8", "r9", "r10", "r14", \ - "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ - "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15" - -static int -slp_switch(void) -{ - int ret; - long *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); -#ifdef __s390x__ - __asm__ volatile ("lgr %0, 15" : "=r" (stackref) : ); -#else - __asm__ volatile ("lr %0, 15" : "=r" (stackref) : ); -#endif - { - SLP_SAVE_STATE(stackref, stsizediff); -/* N.B. - r11 may be used as the frame pointer, and in that case it cannot be - clobbered and needs offsetting just like the stack pointer (but in cases - where frame pointer isn't used we might clobber it accidentally). What's - scary is that r11 is 2nd (and even 1st when GOT is used) callee saved - register that gcc would chose for surviving function calls. However, - since r6-r10 are clobbered above, their cost for reuse is reduced, so - gcc IRA will chose them over r11 (not seeing r11 is implicitly saved), - making it relatively safe to offset in all cases. :) */ - __asm__ volatile ( -#ifdef __s390x__ - "agr 15, %0\n\t" - "agr 11, %0" -#else - "ar 15, %0\n\t" - "ar 11, %0" -#endif - : /* no outputs */ - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("lhi %0, 0" : "=r" (ret) : ); - return ret; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_sh_gcc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_sh_gcc.h deleted file mode 100644 index 5ecc3b3..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_sh_gcc.h +++ /dev/null @@ -1,36 +0,0 @@ -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL -#define STACK_MAGIC 0 -#define REGS_TO_SAVE "r8", "r9", "r10", "r11", "r13", \ - "fr12", "fr13", "fr14", "fr15" - -// r12 Global context pointer, GP -// r14 Frame pointer, FP -// r15 Stack pointer, SP - -static int -slp_switch(void) -{ - int err; - void* fp; - int *stackref, stsizediff; - __asm__ volatile("" : : : REGS_TO_SAVE); - __asm__ volatile("mov.l r14, %0" : "=m"(fp) : :); - __asm__("mov r15, %0" : "=r"(stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile( - "add %0, r15\n" - "add %0, r14\n" - : /* no outputs */ - : "r"(stsizediff)); - SLP_RESTORE_STATE(); - __asm__ volatile("mov r0, %0" : "=r"(err) : :); - } - __asm__ volatile("mov.l %0, r14" : : "m"(fp) :); - __asm__ volatile("" : : : REGS_TO_SAVE); - return err; -} - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_sparc_sun_gcc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_sparc_sun_gcc.h deleted file mode 100644 index 96990c3..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_sparc_sun_gcc.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 16-May-15 Alexey Borzenkov - * Move stack spilling code inside save/restore functions - * 30-Aug-13 Floris Bruynooghe - Clean the register windows again before returning. - This does not clobber the PIC register as it leaves - the current window intact and is required for multi- - threaded code to work correctly. - * 08-Mar-11 Floris Bruynooghe - * No need to set return value register explicitly - * before the stack and framepointer are adjusted - * as none of the other registers are influenced by - * this. Also don't needlessly clean the windows - * ('ta %0" :: "i" (ST_CLEAN_WINDOWS)') as that - * clobbers the gcc PIC register (%l7). - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * added support for SunOS sparc with gcc - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - - -#define STACK_MAGIC 0 - - -#if defined(__sparcv9) -#define SLP_FLUSHW __asm__ volatile ("flushw") -#else -#define SLP_FLUSHW __asm__ volatile ("ta 3") /* ST_FLUSH_WINDOWS */ -#endif - -/* On sparc we need to spill register windows inside save/restore functions */ -#define SLP_BEFORE_SAVE_STATE() SLP_FLUSHW -#define SLP_BEFORE_RESTORE_STATE() SLP_FLUSHW - - -static int -slp_switch(void) -{ - int err; - int *stackref, stsizediff; - - /* Put current stack pointer into stackref. - * Register spilling is done in save/restore. - */ - __asm__ volatile ("mov %%sp, %0" : "=r" (stackref)); - - { - /* Thou shalt put SLP_SAVE_STATE into a local block */ - /* Copy the current stack onto the heap */ - SLP_SAVE_STATE(stackref, stsizediff); - - /* Increment stack and frame pointer by stsizediff */ - __asm__ volatile ( - "add %0, %%sp, %%sp\n\t" - "add %0, %%fp, %%fp" - : : "r" (stsizediff)); - - /* Copy new stack from it's save store on the heap */ - SLP_RESTORE_STATE(); - - __asm__ volatile ("mov %1, %0" : "=r" (err) : "i" (0)); - return err; - } -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_x32_unix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_x32_unix.h deleted file mode 100644 index 893369c..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_x32_unix.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 17-Aug-12 Fantix King - * Ported from amd64. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -#define REGS_TO_SAVE "r12", "r13", "r14", "r15" - - -static int -slp_switch(void) -{ - void* ebp; - void* ebx; - unsigned int csr; - unsigned short cw; - int err; - int *stackref, stsizediff; - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("fstcw %0" : "=m" (cw)); - __asm__ volatile ("stmxcsr %0" : "=m" (csr)); - __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); - __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); - __asm__ ("movl %%esp, %0" : "=g" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addl %0, %%esp\n" - "addl %0, %%ebp\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - } - __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); - __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); - __asm__ volatile ("ldmxcsr %0" : : "m" (csr)); - __asm__ volatile ("fldcw %0" : : "m" (cw)); - __asm__ volatile ("" : : : REGS_TO_SAVE); - __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_masm.asm b/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_masm.asm deleted file mode 100644 index f5c72a2..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_masm.asm +++ /dev/null @@ -1,111 +0,0 @@ -; -; stack switching code for MASM on x641 -; Kristjan Valur Jonsson, sept 2005 -; - - -;prototypes for our calls -slp_save_state_asm PROTO -slp_restore_state_asm PROTO - - -pushxmm MACRO reg - sub rsp, 16 - .allocstack 16 - movaps [rsp], reg ; faster than movups, but we must be aligned - ; .savexmm128 reg, offset (don't know what offset is, no documentation) -ENDM -popxmm MACRO reg - movaps reg, [rsp] ; faster than movups, but we must be aligned - add rsp, 16 -ENDM - -pushreg MACRO reg - push reg - .pushreg reg -ENDM -popreg MACRO reg - pop reg -ENDM - - -.code -slp_switch PROC FRAME - ;realign stack to 16 bytes after return address push, makes the following faster - sub rsp,8 - .allocstack 8 - - pushxmm xmm15 - pushxmm xmm14 - pushxmm xmm13 - pushxmm xmm12 - pushxmm xmm11 - pushxmm xmm10 - pushxmm xmm9 - pushxmm xmm8 - pushxmm xmm7 - pushxmm xmm6 - - pushreg r15 - pushreg r14 - pushreg r13 - pushreg r12 - - pushreg rbp - pushreg rbx - pushreg rdi - pushreg rsi - - sub rsp, 10h ;allocate the singlefunction argument (must be multiple of 16) - .allocstack 10h -.endprolog - - lea rcx, [rsp+10h] ;load stack base that we are saving - call slp_save_state_asm ;pass stackpointer, return offset in eax - cmp rax, 1 - je EXIT1 - cmp rax, -1 - je EXIT2 - ;actual stack switch: - add rsp, rax - call slp_restore_state_asm - xor rax, rax ;return 0 - -EXIT: - - add rsp, 10h - popreg rsi - popreg rdi - popreg rbx - popreg rbp - - popreg r12 - popreg r13 - popreg r14 - popreg r15 - - popxmm xmm6 - popxmm xmm7 - popxmm xmm8 - popxmm xmm9 - popxmm xmm10 - popxmm xmm11 - popxmm xmm12 - popxmm xmm13 - popxmm xmm14 - popxmm xmm15 - - add rsp, 8 - ret - -EXIT1: - mov rax, 1 - jmp EXIT - -EXIT2: - sar rax, 1 - jmp EXIT - -slp_switch ENDP - -END \ No newline at end of file diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_masm.obj b/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_masm.obj deleted file mode 100644 index 64e3e6b898ec765d4e37075f7b1635ad24c9efa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmZ{j&ubG=5XWb`DJB@*%~BA=L%=;Gk}d_~52VO$4J4q2U~MY6&1RFl{E&?scGnt@ zn(9GNy!ihFEO@PV4?T&H9`x2*oO!!jlNJZwd!P4xlX&_;U$Bg3z>p zje>}2kp+MsxE|w5hOUr>YC~(=fz6fwPdZd5+Hlb^P3{;ZO@Yuv96GG&+Gx?QfclNd zhy2KN&~>fNnlHQRR;U1cMyQ?hlQ$~k<0KBbB<0uD2#PTjVo+na7Q;#m=@=3m;xJOa zs2V#)&Db`cY;WzTF9)11;SjkVQWE!?bPTC%x3h3^F2;aBns5!i%m4&-*h69;~AUpZR%rDpm!zuXY+kc zFCz-n*^4&c)5~}y3e?r-Evy*n*(lp9r%ti58Y#l5&)rDjx5EbRd}nC+_8znRzz&#& XZ_Fi+`GM=5Rl{n4%KxAK>jC@)Nz=zi diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_msvc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_msvc.h deleted file mode 100644 index 601ea56..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_x64_msvc.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 26-Sep-02 Christian Tismer - * again as a result of virtualized stack access, - * the compiler used less registers. Needed to - * explicit mention registers in order to get them saved. - * Thanks to Jeff Senn for pointing this out and help. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 01-Mar-02 Christian Tismer - * Initial final version after lots of iterations for i386. - */ - -/* Avoid alloca redefined warning on mingw64 */ -#ifndef alloca -#define alloca _alloca -#endif - -#define STACK_REFPLUS 1 -#define STACK_MAGIC 0 - -/* Use the generic support for an external assembly language slp_switch function. */ -#define EXTERNAL_ASM - -#ifdef SLP_EVAL -/* This always uses the external masm assembly file. */ -#endif - -/* - * further self-processing support - */ - -/* we have IsBadReadPtr available, so we can peek at objects */ -/* -#define STACKLESS_SPY - -#ifdef IMPLEMENT_STACKLESSMODULE -#include "Windows.h" -#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) - -static int IS_ON_STACK(void*p) -{ - int stackref; - intptr_t stackbase = ((intptr_t)&stackref) & 0xfffff000; - return (intptr_t)p >= stackbase && (intptr_t)p < stackbase + 0x00100000; -} - -#endif -*/ \ No newline at end of file diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_x86_msvc.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_x86_msvc.h deleted file mode 100644 index 0f3a59f..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_x86_msvc.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 26-Sep-02 Christian Tismer - * again as a result of virtualized stack access, - * the compiler used less registers. Needed to - * explicit mention registers in order to get them saved. - * Thanks to Jeff Senn for pointing this out and help. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for sparc - * 01-Mar-02 Christian Tismer - * Initial final version after lots of iterations for i386. - */ - -#define alloca _alloca - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -#define STACK_MAGIC 0 - -/* Some magic to quell warnings and keep slp_switch() from crashing when built - with VC90. Disable global optimizations, and the warning: frame pointer - register 'ebp' modified by inline assembly code. - - We used to just disable global optimizations ("g") but upstream stackless - Python, as well as stackman, turn off all optimizations. - -References: -https://github.com/stackless-dev/stackman/blob/dbc72fe5207a2055e658c819fdeab9731dee78b9/stackman/platforms/switch_x86_msvc.h -https://github.com/stackless-dev/stackless/blob/main-slp/Stackless/platf/switch_x86_msvc.h -*/ -#define WIN32_LEAN_AND_MEAN -#include - -#pragma optimize("", off) /* so that autos are stored on the stack */ -#pragma warning(disable:4731) -#pragma warning(disable:4733) /* disable warning about modifying FS[0] */ - -/** - * Most modern compilers and environments handle C++ exceptions without any - * special help from us. MSVC on 32-bit windows is an exception. There, C++ - * exceptions are dealt with using Windows' Structured Exception Handling - * (SEH). - * - * SEH is implemented as a singly linked list of nodes. The - * head of this list is stored in the Thread Information Block, which itself - * is pointed to from the FS register. It's the first field in the structure, - * or offset 0, so we can access it using assembly FS:[0], or the compiler - * intrinsics and field offset information from the headers (as we do below). - * Somewhat unusually, the tail of the list doesn't have prev == NULL, it has - * prev == 0xFFFFFFFF. - * - * SEH was designed for C, and traditionally uses the MSVC compiler - * intrinsincs __try{}/__except{}. It is also utilized for C++ exceptions by - * MSVC; there, every throw of a C++ exception raises a SEH error with the - * ExceptionCode 0xE06D7363; the SEH handler list is then traversed to - * deal with the exception. - * - * If the SEH list is corrupt, then when a C++ exception is thrown the program - * will abruptly exit with exit code 1. This does not use std::terminate(), so - * std::set_terminate() is useless to debug this. - * - * The SEH list is closely tied to the call stack; entering a function that - * uses __try{} or most C++ functions will push a new handler onto the front - * of the list. Returning from the function will remove the handler. Saving - * and restoring the head node of the SEH list (FS:[0]) per-greenlet is NOT - * ENOUGH to make SEH or exceptions work. - * - * Stack switching breaks SEH because the call stack no longer necessarily - * matches the SEH list. For example, given greenlet A that switches to - * greenlet B, at the moment of entering greenlet B, we will have any SEH - * handlers from greenlet A on the SEH list; greenlet B can then add its own - * handlers to the SEH list. When greenlet B switches back to greenlet A, - * greenlet B's handlers would still be on the SEH stack, but when switch() - * returns control to greenlet A, we have replaced the contents of the stack - * in memory, so all the address that greenlet B added to the SEH list are now - * invalid: part of the call stack has been unwound, but the SEH list was out - * of sync with the call stack. The net effect is that exception handling - * stops working. - * - * Thus, when switching greenlets, we need to be sure that the SEH list - * matches the effective call stack, "cutting out" any handlers that were - * pushed by the greenlet that switched out and which are no longer valid. - * - * The easiest way to do this is to capture the SEH list at the time the main - * greenlet for a thread is created, and, when initially starting a greenlet, - * start a new SEH list for it, which contains nothing but the handler - * established for the new greenlet itself, with the tail being the handlers - * for the main greenlet. If we then save and restore the SEH per-greenlet, - * they won't interfere with each others SEH lists. (No greenlet can unwind - * the call stack past the handlers established by the main greenlet). - * - * By observation, a new thread starts with three SEH handlers on the list. By - * the time we get around to creating the main greenlet, though, there can be - * many more, established by transient calls that lead to the creation of the - * main greenlet. Therefore, 3 is a magic constant telling us when to perform - * the initial slice. - * - * All of this can be debugged using a vectored exception handler, which - * operates independently of the SEH handler list, and is called first. - * Walking the SEH list at key points can also be helpful. - * - * References: - * https://en.wikipedia.org/wiki/Win32_Thread_Information_Block - * https://devblogs.microsoft.com/oldnewthing/20100730-00/?p=13273 - * https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement?view=msvc-160 - * https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-160 - * https://docs.microsoft.com/en-us/windows/win32/debug/structured-exception-handling - * https://docs.microsoft.com/en-us/windows/win32/debug/using-a-vectored-exception-handler - * https://bytepointer.com/resources/pietrek_crash_course_depths_of_win32_seh.htm - */ -#define GREENLET_NEEDS_EXCEPTION_STATE_SAVED - - -typedef struct _GExceptionRegistration { - struct _GExceptionRegistration* prev; - void* handler_f; -} GExceptionRegistration; - -static void -slp_set_exception_state(const void *const seh_state) -{ - // Because the stack from from which we do this is ALSO a handler, and - // that one we want to keep, we need to relink the current SEH handler - // frame to point to this one, cutting out the middle men, as it were. - // - // Entering a try block doesn't change the SEH frame, but entering a - // function containing a try block does. - GExceptionRegistration* current_seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - current_seh_state->prev = (GExceptionRegistration*)seh_state; -} - - -static GExceptionRegistration* -x86_slp_get_third_oldest_handler() -{ - GExceptionRegistration* a = NULL; /* Closest to the top */ - GExceptionRegistration* b = NULL; /* second */ - GExceptionRegistration* c = NULL; - GExceptionRegistration* seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - a = b = c = seh_state; - - while (seh_state && seh_state != (GExceptionRegistration*)0xFFFFFFFF) { - if ((void*)seh_state->prev < (void*)100) { - fprintf(stderr, "\tERROR: Broken SEH chain.\n"); - return NULL; - } - a = b; - b = c; - c = seh_state; - - seh_state = seh_state->prev; - } - return a ? a : (b ? b : c); -} - - -static void* -slp_get_exception_state() -{ - // XXX: There appear to be three SEH handlers on the stack already at the - // start of the thread. Is that a guarantee? Almost certainly not. Yet in - // all observed cases it has been three. This is consistent with - // faulthandler off or on, and optimizations off or on. It may not be - // consistent with other operating system versions, though: we only have - // CI on one or two versions (don't ask what there are). - // In theory we could capture the number of handlers on the chain when - // PyInit__greenlet is called: there are probably only the default - // handlers at that point (unless we're embedded and people have used - // __try/__except or a C++ handler)? - return x86_slp_get_third_oldest_handler(); -} - -static int -slp_switch(void) -{ - /* MASM syntax is typically reversed from other assemblers. - It is usually - */ - int *stackref, stsizediff; - /* store the structured exception state for this stack */ - DWORD seh_state = __readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - __asm mov stackref, esp; - /* modify EBX, ESI and EDI in order to get them preserved */ - __asm mov ebx, ebx; - __asm xchg esi, edi; - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm { - mov eax, stsizediff - add esp, eax - add ebp, eax - } - SLP_RESTORE_STATE(); - } - __writefsdword(FIELD_OFFSET(NT_TIB, ExceptionList), seh_state); - return 0; -} - -/* re-enable ebp warning and global optimizations. */ -#pragma optimize("", on) -#pragma warning(default:4731) -#pragma warning(default:4733) /* disable warning about modifying FS[0] */ - - -#endif - -/* - * further self-processing support - */ - -/* we have IsBadReadPtr available, so we can peek at objects */ -#define STACKLESS_SPY - -#ifdef GREENLET_DEBUG - -#define CANNOT_READ_MEM(p, bytes) IsBadReadPtr(p, bytes) - -static int IS_ON_STACK(void*p) -{ - int stackref; - int stackbase = ((int)&stackref) & 0xfffff000; - return (int)p >= stackbase && (int)p < stackbase + 0x00100000; -} - -static void -x86_slp_show_seh_chain() -{ - GExceptionRegistration* seh_state = (GExceptionRegistration*)__readfsdword(FIELD_OFFSET(NT_TIB, ExceptionList)); - fprintf(stderr, "====== SEH Chain ======\n"); - while (seh_state && seh_state != (GExceptionRegistration*)0xFFFFFFFF) { - fprintf(stderr, "\tSEH_chain addr: %p handler: %p prev: %p\n", - seh_state, - seh_state->handler_f, seh_state->prev); - if ((void*)seh_state->prev < (void*)100) { - fprintf(stderr, "\tERROR: Broken chain.\n"); - break; - } - seh_state = seh_state->prev; - } - fprintf(stderr, "====== End SEH Chain ======\n"); - fflush(NULL); - return; -} - -//addVectoredExceptionHandler constants: -//CALL_FIRST means call this exception handler first; -//CALL_LAST means call this exception handler last -#define CALL_FIRST 1 -#define CALL_LAST 0 - -LONG WINAPI -GreenletVectorHandler(PEXCEPTION_POINTERS ExceptionInfo) -{ - // We get one of these for every C++ exception, with code - // E06D7363 - // This is a special value that means "C++ exception from MSVC" - // https://devblogs.microsoft.com/oldnewthing/20100730-00/?p=13273 - // - // Install in the module init function with: - // AddVectoredExceptionHandler(CALL_FIRST, GreenletVectorHandler); - PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord; - - fprintf(stderr, - "GOT VECTORED EXCEPTION:\n" - "\tExceptionCode : %p\n" - "\tExceptionFlags : %p\n" - "\tExceptionAddr : %p\n" - "\tNumberparams : %ld\n", - ExceptionRecord->ExceptionCode, - ExceptionRecord->ExceptionFlags, - ExceptionRecord->ExceptionAddress, - ExceptionRecord->NumberParameters - ); - if (ExceptionRecord->ExceptionFlags & 1) { - fprintf(stderr, "\t\tEH_NONCONTINUABLE\n" ); - } - if (ExceptionRecord->ExceptionFlags & 2) { - fprintf(stderr, "\t\tEH_UNWINDING\n" ); - } - if (ExceptionRecord->ExceptionFlags & 4) { - fprintf(stderr, "\t\tEH_EXIT_UNWIND\n" ); - } - if (ExceptionRecord->ExceptionFlags & 8) { - fprintf(stderr, "\t\tEH_STACK_INVALID\n" ); - } - if (ExceptionRecord->ExceptionFlags & 0x10) { - fprintf(stderr, "\t\tEH_NESTED_CALL\n" ); - } - if (ExceptionRecord->ExceptionFlags & 0x20) { - fprintf(stderr, "\t\tEH_TARGET_UNWIND\n" ); - } - if (ExceptionRecord->ExceptionFlags & 0x40) { - fprintf(stderr, "\t\tEH_COLLIDED_UNWIND\n" ); - } - fprintf(stderr, "\n"); - fflush(NULL); - for(DWORD i = 0; i < ExceptionRecord->NumberParameters; i++) { - fprintf(stderr, "\t\t\tParam %ld: %lX\n", i, ExceptionRecord->ExceptionInformation[i]); - } - - if (ExceptionRecord->NumberParameters == 3) { - fprintf(stderr, "\tAbout to traverse SEH chain\n"); - // C++ Exception records have 3 params. - x86_slp_show_seh_chain(); - } - - return EXCEPTION_CONTINUE_SEARCH; -} - - - - -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/platform/switch_x86_unix.h b/port/lib/python3.11/site-packages/greenlet/platform/switch_x86_unix.h deleted file mode 100644 index 493fa6b..0000000 --- a/port/lib/python3.11/site-packages/greenlet/platform/switch_x86_unix.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * this is the internal transfer function. - * - * HISTORY - * 3-May-13 Ralf Schmitt - * Add support for strange GCC caller-save decisions - * (ported from switch_aarch64_gcc.h) - * 19-Aug-11 Alexey Borzenkov - * Correctly save ebp, ebx and cw - * 07-Sep-05 (py-dev mailing list discussion) - * removed 'ebx' from the register-saved. !!!! WARNING !!!! - * It means that this file can no longer be compiled statically! - * It is now only suitable as part of a dynamic library! - * 24-Nov-02 Christian Tismer - * needed to add another magic constant to insure - * that f in slp_eval_frame(PyFrameObject *f) - * STACK_REFPLUS will probably be 1 in most cases. - * gets included into the saved stack area. - * 17-Sep-02 Christian Tismer - * after virtualizing stack save/restore, the - * stack size shrunk a bit. Needed to introduce - * an adjustment STACK_MAGIC per platform. - * 15-Sep-02 Gerd Woetzel - * slightly changed framework for spark - * 31-Avr-02 Armin Rigo - * Added ebx, esi and edi register-saves. - * 01-Mar-02 Samual M. Rushing - * Ported from i386. - */ - -#define STACK_REFPLUS 1 - -#ifdef SLP_EVAL - -/* #define STACK_MAGIC 3 */ -/* the above works fine with gcc 2.96, but 2.95.3 wants this */ -#define STACK_MAGIC 0 - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) -# define ATTR_NOCLONE __attribute__((noclone)) -#else -# define ATTR_NOCLONE -#endif - -static int -slp_switch(void) -{ - int err; -#ifdef _WIN32 - void *seh; -#endif - void *ebp, *ebx; - unsigned short cw; - int *stackref, stsizediff; - __asm__ volatile ("" : : : "esi", "edi"); - __asm__ volatile ("fstcw %0" : "=m" (cw)); - __asm__ volatile ("movl %%ebp, %0" : "=m" (ebp)); - __asm__ volatile ("movl %%ebx, %0" : "=m" (ebx)); -#ifdef _WIN32 - __asm__ volatile ( - "movl %%fs:0x0, %%eax\n" - "movl %%eax, %0\n" - : "=m" (seh) - : - : "eax"); -#endif - __asm__ ("movl %%esp, %0" : "=g" (stackref)); - { - SLP_SAVE_STATE(stackref, stsizediff); - __asm__ volatile ( - "addl %0, %%esp\n" - "addl %0, %%ebp\n" - : - : "r" (stsizediff) - ); - SLP_RESTORE_STATE(); - __asm__ volatile ("xorl %%eax, %%eax" : "=a" (err)); - } -#ifdef _WIN32 - __asm__ volatile ( - "movl %0, %%eax\n" - "movl %%eax, %%fs:0x0\n" - : - : "m" (seh) - : "eax"); -#endif - __asm__ volatile ("movl %0, %%ebx" : : "m" (ebx)); - __asm__ volatile ("movl %0, %%ebp" : : "m" (ebp)); - __asm__ volatile ("fldcw %0" : : "m" (cw)); - __asm__ volatile ("" : : : "esi", "edi"); - return err; -} - -#endif - -/* - * further self-processing support - */ - -/* - * if you want to add self-inspection tools, place them - * here. See the x86_msvc for the necessary defines. - * These features are highly experimental und not - * essential yet. - */ diff --git a/port/lib/python3.11/site-packages/greenlet/slp_platformselect.h b/port/lib/python3.11/site-packages/greenlet/slp_platformselect.h deleted file mode 100644 index 4945648..0000000 --- a/port/lib/python3.11/site-packages/greenlet/slp_platformselect.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Platform Selection for Stackless Python - */ -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MS_WIN32) && !defined(MS_WIN64) && defined(_M_IX86) && defined(_MSC_VER) -# include "platform/switch_x86_msvc.h" /* MS Visual Studio on X86 */ -#elif defined(MS_WIN64) && defined(_M_X64) && defined(_MSC_VER) || defined(__MINGW64__) -# include "platform/switch_x64_msvc.h" /* MS Visual Studio on X64 */ -#elif defined(MS_WIN64) && defined(_M_ARM64) -# include "platform/switch_arm64_msvc.h" /* MS Visual Studio on ARM64 */ -#elif defined(__GNUC__) && defined(__amd64__) && defined(__ILP32__) -# include "platform/switch_x32_unix.h" /* gcc on amd64 with x32 ABI */ -#elif defined(__GNUC__) && defined(__amd64__) -# include "platform/switch_amd64_unix.h" /* gcc on amd64 */ -#elif defined(__GNUC__) && defined(__i386__) -# include "platform/switch_x86_unix.h" /* gcc on X86 */ -#elif defined(__GNUC__) && defined(__powerpc64__) && (defined(__linux__) || defined(__FreeBSD__)) -# include "platform/switch_ppc64_linux.h" /* gcc on PowerPC 64-bit */ -#elif defined(__GNUC__) && defined(__PPC__) && (defined(__linux__) || defined(__FreeBSD__)) -# include "platform/switch_ppc_linux.h" /* gcc on PowerPC */ -#elif defined(__GNUC__) && defined(__POWERPC__) && defined(__APPLE__) -# include "platform/switch_ppc_macosx.h" /* Apple MacOS X on 32-bit PowerPC */ -#elif defined(__GNUC__) && defined(__powerpc64__) && defined(_AIX) -# include "platform/switch_ppc64_aix.h" /* gcc on AIX/PowerPC 64-bit */ -#elif defined(__GNUC__) && defined(_ARCH_PPC) && defined(_AIX) -# include "platform/switch_ppc_aix.h" /* gcc on AIX/PowerPC */ -#elif defined(__GNUC__) && defined(__powerpc__) && defined(__NetBSD__) -#include "platform/switch_ppc_unix.h" /* gcc on NetBSD/powerpc */ -#elif defined(__GNUC__) && defined(sparc) -# include "platform/switch_sparc_sun_gcc.h" /* SunOS sparc with gcc */ -#elif defined(__SUNPRO_C) && defined(sparc) && defined(sun) -# iiclude "platform/switch_sparc_sun_gcc.h" /* SunStudio on amd64 */ -#elif defined(__SUNPRO_C) && defined(__amd64__) && defined(sun) -# include "platform/switch_amd64_unix.h" /* SunStudio on amd64 */ -#elif defined(__SUNPRO_C) && defined(__i386__) && defined(sun) -# include "platform/switch_x86_unix.h" /* SunStudio on x86 */ -#elif defined(__GNUC__) && defined(__s390__) && defined(__linux__) -# include "platform/switch_s390_unix.h" /* Linux/S390 */ -#elif defined(__GNUC__) && defined(__s390x__) && defined(__linux__) -# include "platform/switch_s390_unix.h" /* Linux/S390 zSeries (64-bit) */ -#elif defined(__GNUC__) && defined(__arm__) -# ifdef __APPLE__ -# include -# endif -# if TARGET_OS_IPHONE -# include "platform/switch_arm32_ios.h" /* iPhone OS on arm32 */ -# else -# include "platform/switch_arm32_gcc.h" /* gcc using arm32 */ -# endif -#elif defined(__GNUC__) && defined(__mips__) && defined(__linux__) -# include "platform/switch_mips_unix.h" /* Linux/MIPS */ -#elif defined(__GNUC__) && defined(__aarch64__) -# include "platform/switch_aarch64_gcc.h" /* Aarch64 ABI */ -#elif defined(__GNUC__) && defined(__mc68000__) -# include "platform/switch_m68k_gcc.h" /* gcc on m68k */ -#elif defined(__GNUC__) && defined(__csky__) -#include "platform/switch_csky_gcc.h" /* gcc on csky */ -# elif defined(__GNUC__) && defined(__riscv) -# include "platform/switch_riscv_unix.h" /* gcc on RISC-V */ -#elif defined(__GNUC__) && defined(__alpha__) -# include "platform/switch_alpha_unix.h" /* gcc on DEC Alpha */ -#elif defined(MS_WIN32) && defined(__llvm__) && defined(__aarch64__) -# include "platform/switch_aarch64_gcc.h" /* LLVM Aarch64 ABI for Windows */ -#elif defined(__GNUC__) && defined(__loongarch64) && defined(__linux__) -# include "platform/switch_loongarch64_linux.h" /* LoongArch64 */ -#elif defined(__GNUC__) && defined(__sh__) -# include "platform/switch_sh_gcc.h" /* SuperH */ -#endif - -#ifdef __cplusplus -}; -#endif diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__init__.py b/port/lib/python3.11/site-packages/greenlet/tests/__init__.py deleted file mode 100644 index e69392e..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/__init__.py +++ /dev/null @@ -1,240 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tests for greenlet. - -""" -import os -import sys -import unittest - -from gc import collect -from gc import get_objects -from threading import active_count as active_thread_count -from time import sleep -from time import time - -import psutil - -from greenlet import greenlet as RawGreenlet -from greenlet import getcurrent - -from greenlet._greenlet import get_pending_cleanup_count -from greenlet._greenlet import get_total_main_greenlets - -from . import leakcheck - -PY312 = sys.version_info[:2] >= (3, 12) -PY313 = sys.version_info[:2] >= (3, 13) - -WIN = sys.platform.startswith("win") -RUNNING_ON_GITHUB_ACTIONS = os.environ.get('GITHUB_ACTIONS') -RUNNING_ON_TRAVIS = os.environ.get('TRAVIS') or RUNNING_ON_GITHUB_ACTIONS -RUNNING_ON_APPVEYOR = os.environ.get('APPVEYOR') -RUNNING_ON_CI = RUNNING_ON_TRAVIS or RUNNING_ON_APPVEYOR -RUNNING_ON_MANYLINUX = os.environ.get('GREENLET_MANYLINUX') - -class TestCaseMetaClass(type): - # wrap each test method with - # a) leak checks - def __new__(cls, classname, bases, classDict): - # pylint and pep8 fight over what this should be called (mcs or cls). - # pylint gets it right, but we can't scope disable pep8, so we go with - # its convention. - # pylint: disable=bad-mcs-classmethod-argument - check_totalrefcount = True - - # Python 3: must copy, we mutate the classDict. Interestingly enough, - # it doesn't actually error out, but under 3.6 we wind up wrapping - # and re-wrapping the same items over and over and over. - for key, value in list(classDict.items()): - if key.startswith('test') and callable(value): - classDict.pop(key) - if check_totalrefcount: - value = leakcheck.wrap_refcount(value) - classDict[key] = value - return type.__new__(cls, classname, bases, classDict) - - -class TestCase(TestCaseMetaClass( - "NewBase", - (unittest.TestCase,), - {})): - - cleanup_attempt_sleep_duration = 0.001 - cleanup_max_sleep_seconds = 1 - - def wait_for_pending_cleanups(self, - initial_active_threads=None, - initial_main_greenlets=None): - initial_active_threads = initial_active_threads or self.threads_before_test - initial_main_greenlets = initial_main_greenlets or self.main_greenlets_before_test - sleep_time = self.cleanup_attempt_sleep_duration - # NOTE: This is racy! A Python-level thread object may be dead - # and gone, but the C thread may not yet have fired its - # destructors and added to the queue. There's no particular - # way to know that's about to happen. We try to watch the - # Python threads to make sure they, at least, have gone away. - # Counting the main greenlets, which we can easily do deterministically, - # also helps. - - # Always sleep at least once to let other threads run - sleep(sleep_time) - quit_after = time() + self.cleanup_max_sleep_seconds - # TODO: We could add an API that calls us back when a particular main greenlet is deleted? - # It would have to drop the GIL - while ( - get_pending_cleanup_count() - or active_thread_count() > initial_active_threads - or (not self.expect_greenlet_leak - and get_total_main_greenlets() > initial_main_greenlets)): - sleep(sleep_time) - if time() > quit_after: - print("Time limit exceeded.") - print("Threads: Waiting for only", initial_active_threads, - "-->", active_thread_count()) - print("MGlets : Waiting for only", initial_main_greenlets, - "-->", get_total_main_greenlets()) - break - collect() - - def count_objects(self, kind=list, exact_kind=True): - # pylint:disable=unidiomatic-typecheck - # Collect the garbage. - for _ in range(3): - collect() - if exact_kind: - return sum( - 1 - for x in get_objects() - if type(x) is kind - ) - # instances - return sum( - 1 - for x in get_objects() - if isinstance(x, kind) - ) - - greenlets_before_test = 0 - threads_before_test = 0 - main_greenlets_before_test = 0 - expect_greenlet_leak = False - - def count_greenlets(self): - """ - Find all the greenlets and subclasses tracked by the GC. - """ - return self.count_objects(RawGreenlet, False) - - def setUp(self): - # Ensure the main greenlet exists, otherwise the first test - # gets a false positive leak - super().setUp() - getcurrent() - self.threads_before_test = active_thread_count() - self.main_greenlets_before_test = get_total_main_greenlets() - self.wait_for_pending_cleanups(self.threads_before_test, self.main_greenlets_before_test) - self.greenlets_before_test = self.count_greenlets() - - def tearDown(self): - if getattr(self, 'skipTearDown', False): - return - - self.wait_for_pending_cleanups(self.threads_before_test, self.main_greenlets_before_test) - super().tearDown() - - def get_expected_returncodes_for_aborted_process(self): - import signal - # The child should be aborted in an unusual way. On POSIX - # platforms, this is done with abort() and signal.SIGABRT, - # which is reflected in a negative return value; however, on - # Windows, even though we observe the child print "Fatal - # Python error: Aborted" and in older versions of the C - # runtime "This application has requested the Runtime to - # terminate it in an unusual way," it always has an exit code - # of 3. This is interesting because 3 is the error code for - # ERROR_PATH_NOT_FOUND; BUT: the C runtime abort() function - # also uses this code. - # - # If we link to the static C library on Windows, the error - # code changes to '0xc0000409' (hex(3221226505)), which - # apparently is STATUS_STACK_BUFFER_OVERRUN; but "What this - # means is that nowadays when you get a - # STATUS_STACK_BUFFER_OVERRUN, it doesn’t actually mean that - # there is a stack buffer overrun. It just means that the - # application decided to terminate itself with great haste." - # - # - # On windows, we've also seen '0xc0000005' (hex(3221225477)). - # That's "Access Violation" - # - # See - # https://devblogs.microsoft.com/oldnewthing/20110519-00/?p=10623 - # and - # https://docs.microsoft.com/en-us/previous-versions/k089yyh0(v=vs.140)?redirectedfrom=MSDN - # and - # https://devblogs.microsoft.com/oldnewthing/20190108-00/?p=100655 - expected_exit = ( - -signal.SIGABRT, - # But beginning on Python 3.11, the faulthandler - # that prints the C backtraces sometimes segfaults after - # reporting the exception but before printing the stack. - # This has only been seen on linux/gcc. - -signal.SIGSEGV, - ) if not WIN else ( - 3, - 0xc0000409, - 0xc0000005, - ) - return expected_exit - - def get_process_uss(self): - """ - Return the current process's USS in bytes. - - uss is available on Linux, macOS, Windows. Also known as - "Unique Set Size", this is the memory which is unique to a - process and which would be freed if the process was terminated - right now. - - If this is not supported by ``psutil``, this raises the - :exc:`unittest.SkipTest` exception. - """ - try: - return psutil.Process().memory_full_info().uss - except AttributeError as e: - raise unittest.SkipTest("uss not supported") from e - - def run_script(self, script_name, show_output=True): - import subprocess - script = os.path.join( - os.path.dirname(__file__), - script_name, - ) - - try: - return subprocess.check_output([sys.executable, script], - encoding='utf-8', - stderr=subprocess.STDOUT) - except subprocess.CalledProcessError as ex: - if show_output: - print('-----') - print('Failed to run script', script) - print('~~~~~') - print(ex.output) - print('------') - raise - - - def assertScriptRaises(self, script_name, exitcodes=None): - import subprocess - with self.assertRaises(subprocess.CalledProcessError) as exc: - output = self.run_script(script_name, show_output=False) - __traceback_info__ = output - # We're going to fail the assertion if we get here, at least - # preserve the output in the traceback. - - if exitcodes is None: - exitcodes = self.get_expected_returncodes_for_aborted_process() - self.assertIn(exc.exception.returncode, exitcodes) - return exc.exception diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1c686d02ddbbd086cff7e7072635a17d4e613878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10157 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 WU)9haCwMU)=PT0en{67CJ@dc5!XA$R diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_clearing_run_switches.cpython-311.pyc deleted file mode 100644 index 437e383fb5394d5d79182842f2a9e8473464ccfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2395 zcmbVO-)q}O9KVw#OO+ivYtnUT`*7Pr9FH!hDTAf7gEB_jF}%`rd+>`QOJ~Q8B6+8C z(}X^#AzMmb+PCb{PuWKI$H>F5AP5xpw5PeGPldt0Cr3^kk5P7(KDuAuANT!!zL)$o zHl`zJ-(UZ`{+EoA#_FE+#uPCsR1|6Wi-}XS;i-E?9YO7nQqJbS1-t@4AJ&<}akgP~l zYM)8;ocs<;RdlMfGbh)RzO7NcCJk%F2<&F9GN}8tcQ=4#)@MTIY&-FQLS=?g;9-nez`owf~ zlXKRnwm7{^0EIH!a|^I)@fN6BCoP|X29uN7Dz!{8T3RxUI^_dN!&q9qp^noW=KmfPU# z1a_0V>wMXRb9y%T6>p!@^*=>6%2tvS@l8^EI0=JYL=lh=RU{h&HBxa1Q&Hw#%l-T) zU{)d^gawzxd*}k}A`Y0e_Q`$8B=Gw*12|Mg(%M4TNV7*+VJrPjhI(a3X)coHqPFH+zeMRI|oXN3RB_3G=NAG39hwV zD@uFS2h`%x_-P^Fskjm&S!BT%=Od&a{`a8&Z)T=o-d_L+(0(TW{F9vXy0-IA#8cR@#_P;pJdXb|($ z{)=t#UIHEeA^?<-oY^jKmcxnJj$G`@#V~ndzcywWR9aH;5w1r%FvMyx25vI(7qaiC;9DHi*fA#l z35f8cK4p|9gRB44Dc)$;`$hX1n}*GznEXk=UJ7H}lhau4Aptpr$Ai51y_B^8@2eMr zM_u(oN4?ZlF9q^TJsYS!S;kPgqwq@1y*^&Zr7QNQ(^MNIs6BQRR`k$ diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_cpp_exception.cpython-311.pyc deleted file mode 100644 index 467e349ecc09a5ee098f64751dd4850c9962ea59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1711 zcma)6-D}%c6hBv%ZAo?CD zmEpedBPNF^hEd{aPMLgT~+6&pjb&LFNzj^-M}@i(+W9>Fr$VjDIR%g`oKED}`= z`6p!$^RkbpzoIymJ$%`ZuK=SIzJy|C>sw`>T20E-n!{9&x}Is*RbBn;(j}E{RB6*Q z9b5HQnbTJF6^D5)zEHKvoGNwQlAYt&U8o2ojix7MlceHcmD`Z`seTEy2{b~UnN z+UoSWV@%)GxF?Nnc+_^$fmUrc@2Z}oR&~oNDK9w8#UcquUn93wsOhG~HBdhWXu2wE z**0RYo`i@DPXRxNUm?MEAlvW&ypvJ`H1NK^?!#cZACUXxyMIZ>asX!%37AM>@r>h9 zR5`qX--S?6B@LW3Im1du3-|1#Q`7 zv0^F8d%qKsO=j9&gfkS;-n~%fgQoGx3)5&`_dFJg{4UI0N8Vg%dGvF}92QDiB!*7j zd~L5_qlBc+ctM!N3D0zt!&lM_PH@YjvrNT19-fQ;q|i$cLVBV|#2#>>0Ll0Y-vJE! z(GH;08T_RuYutS33{O$%9{aqS5I_eFh(Ib53fu#JTZ$2J-y3~R30~qhZ gI5Git%xUAN4xDuK)l5 diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_initialstub_already_started.cpython-311.pyc deleted file mode 100644 index 66569d90d4881de7337b15fb1e5c4697075f1d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3871 zcmcIm&2JmW6`xrS$>o=5iLUI(V!AeBNjzADWh71tJB4I5rR|nzY8NPUS**AtnhH&_ zvm+}eRA4QrFe3<%ZuX%EqG+8MPJ#XbJrrm!y)BC^Dl8yCK#@alG?Y_-0)4Z~<%g&w zDvAzg9%tUXdGF1eH^13W6NxB-@~a#FF1`#S^iMJHi`?lP?MMhcLpoYQI@YB!UIMx# zK?^`55~6rD=r4K!omc(JI;j}?P!j8k2q9~Wqim#UT7=)Xk3@&!L^;-5f+{6|Oc19^rx zP`@<0S>toWzm7N1@OkP8yp!_v@B%HCD$0CDa>9%nYh`XYA+1)U6+MF;qOqc32(`*r z#q1-EW!Kl&vp=aazEUlhs@WR!vgOipw)U7ms8+7cUcH(%N}OJ)X@!rpA~mu_Mrox? zd6q*IjO>b5Dyw~gP&=DfJDZ=aJ$8bc%GN4OT^C3u;9jQ1p4Qo86r7MbkK>}do7Z- zN!lXm0}_0i+srk7-Xh~R8Mnx|FY|7TOxk49@~f+SAf$eF9SJMX5JiBl2+$RaOmgsi z{$;?CRkfl$q^jyfRrO(2Un`4#TvdOurj@-JCeW$pIuoGal1bb{Um{rvxxJ!3`I`6P+pvD2e%{L?#lv**MF1HpvaIt8EDWGO z5i@SmWF&SGY&!w*LiZ=e8^Ep0kQi=$UV)LZ2m~GjIk`KsJ@P!#yk?!7ZpkyYJY&f- z9kzAuYD=E8WfA2AIldd)j_u`Ia@v;DmS5fI=QANMe^a29iCf7g1W^PL#*gFsxZnvQ zfZDhY#O(g|lV{CbTZ#p*wNaN$1cGn2(J=8I0-@>Thv4LA=~kYN!jj`&O$(kNbI=U& zA>8K`k(;wXX z*^lnu`(9?u39G7JEvPEH0ID6Vc{q@U0TT}(drJ@^h(KT_Hsw8$ZX8{=J<#yJ*1WF* zBFs9$8Y@-!v7LS;-|*hy_t`Ay5_iY=E6{cTW89V`Oxj2g8R0W#Qv42K`*^=c!V~7l zc6g!{p0vZ0CTYh}EMbP*M8Z>IX@^7uI1Q)flPJO$Eu?g7L$>8NT1c^7UYm?zIOAdB zioF&SU-o8aFpdDy43Um7OaK~nW)DfwoHyx{+*VF(0tSr_&AU(TZr$w+P1^X-8^V^O zvEB3A=RcX)nJ`29DExF}b7U{^{E?NMYN2TxO9(JT6&#(Ua zo#uO=X`iqBq4cNGzl>YSTnpW{(QOOeZikQ@*?MFq#BV<=ce}Cp&N~(w_3B|HI&3}J j1Whw7l(A99LYc$f;zJZPgXZeqbPG+`Xu|TVo2dT*LUZQR diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/fail_slp_switch.cpython-311.pyc deleted file mode 100644 index 0e583252a49e92773dd6df460abc6927e6c6389c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1422 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 diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_contextvars.cpython-311.pyc deleted file mode 100644 index 99d70f3bb1f0812519a2d0556d80e595933dc684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18601 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 diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_cpp.cpython-311.pyc deleted file mode 100644 index 04dc79de0d673de820eef95badd62dc182902c71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4557 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 diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_gc.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_gc.cpython-311.pyc deleted file mode 100644 index 2ace73956291faad52fd46f4b1421b9038acfc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5508 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 Y?~d;x$H6q~%fj>%R`T?Ka<&Hl1mBHXQUCw| diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_generator.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_generator.cpython-311.pyc deleted file mode 100644 index 59c2b63af2319ddedbb896ea2d4f2615decbe9ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3530 zcma)8>uVHO6u)`m1cbI9@@*vwMJV)~c_ou*@y^U|?(>{`p7;J1 zjkXdf-w*zqYw(2pi4C_1PG#*XR2GO#WLh9&WQ0&6b8?_S$G8!W5{{fDGCxgZK_N>4 zLLR|qmyv)RoF*f@+yW?A^F){zQn*d?f^zF6k_xZlvJ^GN98(mvpy;dA>A0+D`bkMs zvNmBGaS+Se0KfuK$Ox6m2q#nE%UOH_$QSoE5|jnN7NuoGlqv8En!%jKVmRxPK~fxi zZSbwV0kA+Sv_djavrC18mN#1_m&ijpoZ?JgVmZy^Z;Z=YDq!-OQW#~ZRTc)&P#ei) z^2O)rTM|o;kB_H6DKdSuSjZRCC8(tf`K#&DZT(tNJu-0ka9Ydj%E6M9y&>fkE$wO| zt%C+M3p22Bg-Lpm4U}%1VkVPU^Li#T(Pj%Y;C6_}Jq|EM8u4y}pA9)bBV>fupr80e zM{DC=*9HMVbaEa3cKI5Fo}`?mj_aNR@;C<-W|d#*j}-g@l)^&L0gB*8)pa$bI2M6! z)&Zd5qGXaq;b#U|S)FKgwhncirM(3JyN-3v=4Jv0*AQC`&NwxDz9#lB#((O8-^Q1r z#eA~h9xYjdP(fLoT|ETvvi70j3}*+ZL0w^f4O$)TFiC3xfW5SBGs0ULp(GZg5>yt5 z?kR_mbww?~*dzGt0zTv^twJ8)>Mg~;ViLTNaTRb|9c}8AJJeRRz>tIqD%7)O#uQaI zgC)uSYvXx6d(Dhq(u<|@Ad;l#i>hM^GsqOJT+n^i09~lccYbfOJGKE6?HzzAvXaoGq5JJwqhdo8u4Lg=chG^S)S zW@{!hR+P&HtVc4Ln`NnBkFajwz+woU2wey}0ZbmZ!O)#8a+dQjw2cL5XYC7sDeq}S zJEqPwIZo(l5)VX9coUlrh*XHfZe0ilg`G{}K|6`Wr%vHxvqWw_H{+qhvi@ICc|Ge- zQr%6fu%<$F+__Vhz%L$ozM&ng(5W^ZgUKl}T>}4lg zTu!hv;^$?Dc8VLGNZigV1vyzP>snq`l2X!+-BgR^hip60FkAClUe$C-%_^38%*bbD zRnLzprx`0U+sHjI5t65HODdEVljeMWD13!X*j|{k3qEZO031(juZz9QVqabCn;Ke) zbuV`Od}cY;Uyt=SNkHgogd@hWmCjwY-S01V9<6sCtwoMDBGK7%27TT_+IlukZ;C_+ zPM^Db@y^BS>1BRLo!?P&->sqU3&pHd(2ftBb<_WFif4VWnxTr=ZUjuPaDeio zWi@N%xG6i!hP*{A1ylCJry=8iHpEM;)A$n7EIhWmAFyay_JfpxDVbrHWv6eQ+!^xr z$KHmqeK`IB0MKo6ROrIsdNtfX^AyLQd6S-m<262R>mI0h#Zwl>|GKI`^90X&)UFxx zM8wO2<_lDGaVt>kP`S%5kR17eH+b825I8P<7_DpyG8n~`PLVl(Sezo??3v{7WRwG2 zMz&7|X7~qQK)W>XU)eO9lG*Ory{|eBW_X#)!5!-tIssnjPZLgH3jTWxW+u$oYv`8f zT|N;v#Wo1BcaqL<4>qU)mN{j!LMZWPFu&L!$i9u20D(zrPBDX0sidfOK!dHQYSKL3 zloZvuAK8A&_5jm~{eDXh;MHftrN;||+!2_q9R~n+Tj|=dczEv0{1r&=QB3*Ko+@p$ z#}~r)!iz(5vH4gvw$k2JmFC2Gu?kO9aOYY6wu)9>#UM|$GPIcus7QveYV{q(=6f!z zTBFCH36Y5Y&kiGCf-u99rYTH6jb~d*urEI-ok=q$z0Tf+s)pR)YMA`U4$_!k(22hP z)x#mAum}LcH`+Q3zR3qdAox~zE|O@XD$QJ&y}wBko_+29$FSp)Ws7u_qEjek{pHk zVe>(bH+Y7ShEK!vw4RunTv#|so8;wa=PFz}>>NQRVW?R9a)2j@Z5oRO<_~)XUOr!l zgZ4G#IQtNq=>FPc01%VXC#0|Df1i*<&Hpy}E(#ZjtzcYvioMU)hYkg4FWfC$=nPQE XiypK`D2n)UtO79{dG?BNOQ8P%P4vVj diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_generator_nested.cpython-311.pyc deleted file mode 100644 index d5339991004625887f25fed5f29253be4c10e34a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9384 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 diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_greenlet.cpython-311.pyc deleted file mode 100644 index ca876793f8833fd011e652bdf17470a9284eba8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86955 zcmdSC3w%^pdM8+K-I8uerS}t5l0YEDOT1skh^N6uZrijUbi2z!RRS3y;ai0PMRY42 zCoXA}AUtxA6PQ%@4?7UM6Ef*eyqU}|!QGw5Zg!?hxf8Ut!wi|(&M!_T30~U2cs)Cr z{eS1&_q`=b*zRPHN?+Z&_uTV7-}%n>I=>nU6}u3AcE|rX{?2c?T>q7RsKKvX+#hti zT$f!jSIj-=I?BJ@N8RkV=ctE$dyjhAx9_MA-=0DLsld^Io8o$LU39dFUAqT`qXO>v z28C0?(ID>mV}ZfqQzb`B*mV)E#iJs-7H}Op8e-SM!O~M@N6XwUkL!RdR{WYPRuT`t z<8`^-#Xk>6%VXkeuA>#P5MU*XSBiLL@e)hCD)ualXXUnM)$CaXo>khO)v#w(cvfwD zR?D8%;90HhSzWw7R(H}vrIgA&uDI{z2BpZZcX08p`oo2qx}RbH9rYj5-JTA2uBdzW zp2P8EFD^@ak0p{)Z(s6MJb7X`hC9M>DIOmhj3+-t2f66Rk$57xr#BJDb=A{f?&&$$ zb0GR;PxNqi&kIi+?D_KZxbOec3+ubq^l+fJK3j|1Q(Pbh5Mxd zmtAoe^*8z&CG7Czg3k<}itm%8VX5baHz!1+L%pZs(P*wX8a*`}J2ObvVl?{7nchME z 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%0D!-%)+3CfGLEVc1S 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 diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_throw.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_throw.cpython-311.pyc deleted file mode 100644 index d0d3489b8b378c868dc265eb03608e67f30f312c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8924 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 diff --git a/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-311.pyc b/port/lib/python3.11/site-packages/greenlet/tests/__pycache__/test_weakref.cpython-311.pyc deleted file mode 100644 index 7ab0dc57a2a19230472cf59cd748a829845b5eba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3070 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 S;v!+jyRMS_aTkNDDE=S+lgd8; diff --git a/port/lib/python3.11/site-packages/greenlet/tests/_test_extension_cpp.cpp b/port/lib/python3.11/site-packages/greenlet/tests/_test_extension_cpp.cpp deleted file mode 100644 index 5cbe6a7..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/_test_extension_cpp.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* This is a set of functions used to test C++ exceptions are not - * broken during greenlet switches - */ - -#include "../greenlet.h" -#include "../greenlet_compiler_compat.hpp" -#include -#include - -struct exception_t { - int depth; - exception_t(int depth) : depth(depth) {} -}; - -/* Functions are called via pointers to prevent inlining */ -static void (*p_test_exception_throw_nonstd)(int depth); -static void (*p_test_exception_throw_std)(); -static PyObject* (*p_test_exception_switch_recurse)(int depth, int left); - -static void -test_exception_throw_nonstd(int depth) -{ - throw exception_t(depth); -} - -static void -test_exception_throw_std() -{ - throw std::runtime_error("Thrown from an extension."); -} - -static PyObject* -test_exception_switch_recurse(int depth, int left) -{ - if (left > 0) { - return p_test_exception_switch_recurse(depth, left - 1); - } - - PyObject* result = NULL; - PyGreenlet* self = PyGreenlet_GetCurrent(); - if (self == NULL) - return NULL; - - try { - if (PyGreenlet_Switch(PyGreenlet_GET_PARENT(self), NULL, NULL) == NULL) { - Py_DECREF(self); - return NULL; - } - p_test_exception_throw_nonstd(depth); - PyErr_SetString(PyExc_RuntimeError, - "throwing C++ exception didn't work"); - } - catch (const exception_t& e) { - if (e.depth != depth) - PyErr_SetString(PyExc_AssertionError, "depth mismatch"); - else - result = PyLong_FromLong(depth); - } - catch (...) { - PyErr_SetString(PyExc_RuntimeError, "unexpected C++ exception"); - } - - Py_DECREF(self); - return result; -} - -/* test_exception_switch(int depth) - * - recurses depth times - * - switches to parent inside try/catch block - * - throws an exception that (expected to be caught in the same function) - * - verifies depth matches (exceptions shouldn't be caught in other greenlets) - */ -static PyObject* -test_exception_switch(PyObject* UNUSED(self), PyObject* args) -{ - int depth; - if (!PyArg_ParseTuple(args, "i", &depth)) - return NULL; - return p_test_exception_switch_recurse(depth, depth); -} - - -static PyObject* -py_test_exception_throw_nonstd(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - p_test_exception_throw_nonstd(0); - PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); - return NULL; -} - -static PyObject* -py_test_exception_throw_std(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - p_test_exception_throw_std(); - PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); - return NULL; -} - -static PyObject* -py_test_call(PyObject* self, PyObject* arg) -{ - PyObject* noargs = PyTuple_New(0); - PyObject* ret = PyObject_Call(arg, noargs, nullptr); - Py_DECREF(noargs); - return ret; -} - - - -/* test_exception_switch_and_do_in_g2(g2func) - * - creates new greenlet g2 to run g2func - * - switches to g2 inside try/catch block - * - verifies that no exception has been caught - * - * it is used together with test_exception_throw to verify that unhandled - * exceptions thrown in one greenlet do not propagate to other greenlet nor - * segfault the process. - */ -static PyObject* -test_exception_switch_and_do_in_g2(PyObject* self, PyObject* args) -{ - PyObject* g2func = NULL; - PyObject* result = NULL; - - if (!PyArg_ParseTuple(args, "O", &g2func)) - return NULL; - PyGreenlet* g2 = PyGreenlet_New(g2func, NULL); - if (!g2) { - return NULL; - } - - try { - result = PyGreenlet_Switch(g2, NULL, NULL); - if (!result) { - return NULL; - } - } - catch (const exception_t& e) { - /* if we are here the memory can be already corrupted and the program - * might crash before below py-level exception might become printed. - * -> print something to stderr to make it clear that we had entered - * this catch block. - * See comments in inner_bootstrap() - */ -#if defined(WIN32) || defined(_WIN32) - fprintf(stderr, "C++ exception unexpectedly caught in g1\n"); - PyErr_SetString(PyExc_AssertionError, "C++ exception unexpectedly caught in g1"); - Py_XDECREF(result); - return NULL; -#else - throw; -#endif - } - - Py_XDECREF(result); - Py_RETURN_NONE; -} - -static PyMethodDef test_methods[] = { - {"test_exception_switch", - (PyCFunction)&test_exception_switch, - METH_VARARGS, - "Switches to parent twice, to test exception handling and greenlet " - "switching."}, - {"test_exception_switch_and_do_in_g2", - (PyCFunction)&test_exception_switch_and_do_in_g2, - METH_VARARGS, - "Creates new greenlet g2 to run g2func and switches to it inside try/catch " - "block. Used together with test_exception_throw to verify that unhandled " - "C++ exceptions thrown in a greenlet doe not corrupt memory."}, - {"test_exception_throw_nonstd", - (PyCFunction)&py_test_exception_throw_nonstd, - METH_VARARGS, - "Throws non-standard C++ exception. Calling this function directly should abort the process." - }, - {"test_exception_throw_std", - (PyCFunction)&py_test_exception_throw_std, - METH_VARARGS, - "Throws standard C++ exception. Calling this function directly should abort the process." - }, - {"test_call", - (PyCFunction)&py_test_call, - METH_O, - "Call the given callable. Unlike calling it directly, this creates a " - "new C-level stack frame, which may be helpful in testing." - }, - {NULL, NULL, 0, NULL} -}; - - -static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, - "greenlet.tests._test_extension_cpp", - NULL, - 0, - test_methods, - NULL, - NULL, - NULL, - NULL}; - -PyMODINIT_FUNC -PyInit__test_extension_cpp(void) -{ - PyObject* module = NULL; - - module = PyModule_Create(&moduledef); - - if (module == NULL) { - return NULL; - } - - PyGreenlet_Import(); - if (_PyGreenlet_API == NULL) { - return NULL; - } - - p_test_exception_throw_nonstd = test_exception_throw_nonstd; - p_test_exception_throw_std = test_exception_throw_std; - p_test_exception_switch_recurse = test_exception_switch_recurse; - - return module; -} diff --git a/port/lib/python3.11/site-packages/greenlet/tests/_test_extension_cpp.cpython-311-x86_64-linux-gnu.so b/port/lib/python3.11/site-packages/greenlet/tests/_test_extension_cpp.cpython-311-x86_64-linux-gnu.so deleted file mode 100755 index bb955f7d5067b75f8d516f1d4a23a13871213844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57288 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 L{{Pi4LDl>X3$sLp diff --git a/port/lib/python3.11/site-packages/greenlet/tests/fail_clearing_run_switches.py b/port/lib/python3.11/site-packages/greenlet/tests/fail_clearing_run_switches.py deleted file mode 100644 index 6dd1492..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/fail_clearing_run_switches.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -""" -If we have a run callable passed to the constructor or set as an -attribute, but we don't actually use that (because ``__getattribute__`` -or the like interferes), then when we clear callable before beginning -to run, there's an opportunity for Python code to run. - -""" -import greenlet - -g = None -main = greenlet.getcurrent() - -results = [] - -class RunCallable: - - def __del__(self): - results.append(('RunCallable', '__del__')) - main.switch('from RunCallable') - - -class G(greenlet.greenlet): - - def __getattribute__(self, name): - if name == 'run': - results.append(('G.__getattribute__', 'run')) - return run_func - return object.__getattribute__(self, name) - - -def run_func(): - results.append(('run_func', 'enter')) - - -g = G(RunCallable()) -# Try to start G. It will get to the point where it deletes -# its run callable C++ variable in inner_bootstrap. That triggers -# the __del__ method, which switches back to main before g -# actually even starts running. -x = g.switch() -results.append(('main: g.switch()', x)) -# In the C++ code, this results in g->g_switch() appearing to return, even though -# it has yet to run. -print('In main with', x, flush=True) -g.switch() -print('RESULTS', results) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/fail_cpp_exception.py b/port/lib/python3.11/site-packages/greenlet/tests/fail_cpp_exception.py deleted file mode 100644 index fa4dc2e..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/fail_cpp_exception.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Helper for testing a C++ exception throw aborts the process. - -Takes one argument, the name of the function in :mod:`_test_extension_cpp` to call. -""" -import sys -import greenlet -from greenlet.tests import _test_extension_cpp -print('fail_cpp_exception is running') - -def run_unhandled_exception_in_greenlet_aborts(): - def _(): - _test_extension_cpp.test_exception_switch_and_do_in_g2( - _test_extension_cpp.test_exception_throw_nonstd - ) - g1 = greenlet.greenlet(_) - g1.switch() - - -func_name = sys.argv[1] -try: - func = getattr(_test_extension_cpp, func_name) -except AttributeError: - if func_name == run_unhandled_exception_in_greenlet_aborts.__name__: - func = run_unhandled_exception_in_greenlet_aborts - elif func_name == 'run_as_greenlet_target': - g = greenlet.greenlet(_test_extension_cpp.test_exception_throw_std) - func = g.switch - else: - raise -print('raising', func, flush=True) -func() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/fail_initialstub_already_started.py b/port/lib/python3.11/site-packages/greenlet/tests/fail_initialstub_already_started.py deleted file mode 100644 index c1a44ef..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/fail_initialstub_already_started.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Testing initialstub throwing an already started exception. -""" - -import greenlet - -a = None -b = None -c = None -main = greenlet.getcurrent() - -# If we switch into a dead greenlet, -# we go looking for its parents. -# if a parent is not yet started, we start it. - -results = [] - -def a_run(*args): - #results.append('A') - results.append(('Begin A', args)) - - -def c_run(): - results.append('Begin C') - b.switch('From C') - results.append('C done') - -class A(greenlet.greenlet): pass - -class B(greenlet.greenlet): - doing_it = False - def __getattribute__(self, name): - if name == 'run' and not self.doing_it: - assert greenlet.getcurrent() is c - self.doing_it = True - results.append('Switch to b from B.__getattribute__ in ' - + type(greenlet.getcurrent()).__name__) - b.switch() - results.append('B.__getattribute__ back from main in ' - + type(greenlet.getcurrent()).__name__) - if name == 'run': - name = '_B_run' - return object.__getattribute__(self, name) - - def _B_run(self, *arg): - results.append(('Begin B', arg)) - results.append('_B_run switching to main') - main.switch('From B') - -class C(greenlet.greenlet): - pass -a = A(a_run) -b = B(parent=a) -c = C(c_run, b) - -# Start a child; while running, it will start B, -# but starting B will ALSO start B. -result = c.switch() -results.append(('main from c', result)) - -# Switch back to C, which was in the middle of switching -# already. This will throw the ``GreenletStartedWhileInPython`` -# exception, which results in parent A getting started (B is finished) -c.switch() - -results.append(('A dead?', a.dead, 'B dead?', b.dead, 'C dead?', c.dead)) - -# A and B should both be dead now. -assert a.dead -assert b.dead -assert not c.dead - -result = c.switch() -results.append(('main from c.2', result)) -# Now C is dead -assert c.dead - -print("RESULTS:", results) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/fail_slp_switch.py b/port/lib/python3.11/site-packages/greenlet/tests/fail_slp_switch.py deleted file mode 100644 index 0990526..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/fail_slp_switch.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -""" -A test helper for seeing what happens when slp_switch() -fails. -""" -# pragma: no cover - -import greenlet - - -print('fail_slp_switch is running', flush=True) - -runs = [] -def func(): - runs.append(1) - greenlet.getcurrent().parent.switch() - runs.append(2) - greenlet.getcurrent().parent.switch() - runs.append(3) - -g = greenlet._greenlet.UnswitchableGreenlet(func) -g.switch() -assert runs == [1] -g.switch() -assert runs == [1, 2] -g.force_slp_switch_error = True - -# This should crash. -g.switch() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets.py b/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets.py deleted file mode 100644 index e151b19..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -Uses a trace function to switch greenlets at unexpected times. - -In the trace function, we switch from the current greenlet to another -greenlet, which switches -""" -import greenlet - -g1 = None -g2 = None - -switch_to_g2 = False - -def tracefunc(*args): - print('TRACE', *args) - global switch_to_g2 - if switch_to_g2: - switch_to_g2 = False - g2.switch() - print('\tLEAVE TRACE', *args) - -def g1_run(): - print('In g1_run') - global switch_to_g2 - switch_to_g2 = True - from_parent = greenlet.getcurrent().parent.switch() - print('Return to g1_run') - print('From parent', from_parent) - -def g2_run(): - #g1.switch() - greenlet.getcurrent().parent.switch() - -greenlet.settrace(tracefunc) - -g1 = greenlet.greenlet(g1_run) -g2 = greenlet.greenlet(g2_run) - -# This switch didn't actually finish! -# And if it did, it would raise TypeError -# because g1_run() doesn't take any arguments. -g1.switch(1) -print('Back in main') -g1.switch(2) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets2.py b/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets2.py deleted file mode 100644 index 1f6b66b..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_three_greenlets2.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -Like fail_switch_three_greenlets, but the call into g1_run would actually be -valid. -""" -import greenlet - -g1 = None -g2 = None - -switch_to_g2 = True - -results = [] - -def tracefunc(*args): - results.append(('trace', args[0])) - print('TRACE', *args) - global switch_to_g2 - if switch_to_g2: - switch_to_g2 = False - g2.switch('g2 from tracefunc') - print('\tLEAVE TRACE', *args) - -def g1_run(arg): - results.append(('g1 arg', arg)) - print('In g1_run') - from_parent = greenlet.getcurrent().parent.switch('from g1_run') - results.append(('g1 from parent', from_parent)) - return 'g1 done' - -def g2_run(arg): - #g1.switch() - results.append(('g2 arg', arg)) - parent = greenlet.getcurrent().parent.switch('from g2_run') - global switch_to_g2 - switch_to_g2 = False - results.append(('g2 from parent', parent)) - return 'g2 done' - - -greenlet.settrace(tracefunc) - -g1 = greenlet.greenlet(g1_run) -g2 = greenlet.greenlet(g2_run) - -x = g1.switch('g1 from main') -results.append(('main g1', x)) -print('Back in main', x) -x = g1.switch('g2 from main') -results.append(('main g2', x)) -print('back in amain again', x) -x = g1.switch('g1 from main 2') -results.append(('main g1.2', x)) -x = g2.switch() -results.append(('main g2.2', x)) -print("RESULTS:", results) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_two_greenlets.py b/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_two_greenlets.py deleted file mode 100644 index 3e52345..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/fail_switch_two_greenlets.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Uses a trace function to switch greenlets at unexpected times. - -In the trace function, we switch from the current greenlet to another -greenlet, which switches -""" -import greenlet - -g1 = None -g2 = None - -switch_to_g2 = False - -def tracefunc(*args): - print('TRACE', *args) - global switch_to_g2 - if switch_to_g2: - switch_to_g2 = False - g2.switch() - print('\tLEAVE TRACE', *args) - -def g1_run(): - print('In g1_run') - global switch_to_g2 - switch_to_g2 = True - greenlet.getcurrent().parent.switch() - print('Return to g1_run') - print('Falling off end of g1_run') - -def g2_run(): - g1.switch() - print('Falling off end of g2') - -greenlet.settrace(tracefunc) - -g1 = greenlet.greenlet(g1_run) -g2 = greenlet.greenlet(g2_run) - -g1.switch() -print('Falling off end of main') -g2.switch() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/leakcheck.py b/port/lib/python3.11/site-packages/greenlet/tests/leakcheck.py deleted file mode 100644 index a5152fb..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/leakcheck.py +++ /dev/null @@ -1,319 +0,0 @@ -# Copyright (c) 2018 gevent community -# Copyright (c) 2021 greenlet community -# -# This was originally part of gevent's test suite. The main author -# (Jason Madden) vendored a copy of it into greenlet. -# -# 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 print_function - -import os -import sys -import gc - -from functools import wraps -import unittest - - -import objgraph - -# graphviz 0.18 (Nov 7 2021), available only on Python 3.6 and newer, -# has added type hints (sigh). It wants to use ``typing.Literal`` for -# some stuff, but that's only available on Python 3.9+. If that's not -# found, it creates a ``unittest.mock.MagicMock`` object and annotates -# with that. These are GC'able objects, and doing almost *anything* -# with them results in an explosion of objects. For example, trying to -# compare them for equality creates new objects. This causes our -# leakchecks to fail, with reports like: -# -# greenlet.tests.leakcheck.LeakCheckError: refcount increased by [337, 1333, 343, 430, 530, 643, 769] -# _Call 1820 +546 -# dict 4094 +76 -# MagicProxy 585 +73 -# tuple 2693 +66 -# _CallList 24 +3 -# weakref 1441 +1 -# function 5996 +1 -# type 736 +1 -# cell 592 +1 -# MagicMock 8 +1 -# -# To avoid this, we *could* filter this type of object out early. In -# principle it could leak, but we don't use mocks in greenlet, so it -# doesn't leak from us. However, a further issue is that ``MagicMock`` -# objects have subobjects that are also GC'able, like ``_Call``, and -# those create new mocks of their own too. So we'd have to filter them -# as well, and they're not public. That's OK, we can workaround the -# problem by being very careful to never compare by equality or other -# user-defined operators, only using object identity or other builtin -# functions. - -RUNNING_ON_GITHUB_ACTIONS = os.environ.get('GITHUB_ACTIONS') -RUNNING_ON_TRAVIS = os.environ.get('TRAVIS') or RUNNING_ON_GITHUB_ACTIONS -RUNNING_ON_APPVEYOR = os.environ.get('APPVEYOR') -RUNNING_ON_CI = RUNNING_ON_TRAVIS or RUNNING_ON_APPVEYOR -RUNNING_ON_MANYLINUX = os.environ.get('GREENLET_MANYLINUX') -SKIP_LEAKCHECKS = RUNNING_ON_MANYLINUX or os.environ.get('GREENLET_SKIP_LEAKCHECKS') -SKIP_FAILING_LEAKCHECKS = os.environ.get('GREENLET_SKIP_FAILING_LEAKCHECKS') -ONLY_FAILING_LEAKCHECKS = os.environ.get('GREENLET_ONLY_FAILING_LEAKCHECKS') - -def ignores_leakcheck(func): - """ - Ignore the given object during leakchecks. - - Can be applied to a method, in which case the method will run, but - will not be subject to leak checks. - - If applied to a class, the entire class will be skipped during leakchecks. This - is intended to be used for classes that are very slow and cause problems such as - test timeouts; typically it will be used for classes that are subclasses of a base - class and specify variants of behaviour (such as pool sizes). - """ - func.ignore_leakcheck = True - return func - -def fails_leakcheck(func): - """ - Mark that the function is known to leak. - """ - func.fails_leakcheck = True - if SKIP_FAILING_LEAKCHECKS: - func = unittest.skip("Skipping known failures")(func) - return func - -class LeakCheckError(AssertionError): - pass - -if hasattr(sys, 'getobjects'): - # In a Python build with ``--with-trace-refs``, make objgraph - # trace *all* the objects, not just those that are tracked by the - # GC - class _MockGC(object): - def get_objects(self): - return sys.getobjects(0) # pylint:disable=no-member - def __getattr__(self, name): - return getattr(gc, name) - objgraph.gc = _MockGC() - fails_strict_leakcheck = fails_leakcheck -else: - def fails_strict_leakcheck(func): - """ - Decorator for a function that is known to fail when running - strict (``sys.getobjects()``) leakchecks. - - This type of leakcheck finds all objects, even those, such as - strings, which are not tracked by the garbage collector. - """ - return func - -class ignores_types_in_strict_leakcheck(object): - def __init__(self, types): - self.types = types - def __call__(self, func): - func.leakcheck_ignore_types = self.types - return func - -class _RefCountChecker(object): - - # Some builtin things that we ignore - # XXX: Those things were ignored by gevent, but they're important here, - # presumably. - IGNORED_TYPES = () #(tuple, dict, types.FrameType, types.TracebackType) - - def __init__(self, testcase, function): - self.testcase = testcase - self.function = function - self.deltas = [] - self.peak_stats = {} - self.ignored_types = () - - # The very first time we are called, we have already been - # self.setUp() by the test runner, so we don't need to do it again. - self.needs_setUp = False - - def _include_object_p(self, obj): - # pylint:disable=too-many-return-statements - # - # See the comment block at the top. We must be careful to - # avoid invoking user-defined operations. - if obj is self: - return False - kind = type(obj) - # ``self._include_object_p == obj`` returns NotImplemented - # for non-function objects, which causes the interpreter - # to try to reverse the order of arguments...which leads - # to the explosion of mock objects. We don't want that, so we implement - # the check manually. - if kind == type(self._include_object_p): - try: - # pylint:disable=not-callable - exact_method_equals = self._include_object_p.__eq__(obj) - except AttributeError: - # Python 2.7 methods may only have __cmp__, and that raises a - # TypeError for non-method arguments - # pylint:disable=no-member - exact_method_equals = self._include_object_p.__cmp__(obj) == 0 - - if exact_method_equals is not NotImplemented and exact_method_equals: - return False - - # Similarly, we need to check identity in our __dict__ to avoid mock explosions. - for x in self.__dict__.values(): - if obj is x: - return False - - - if kind in self.ignored_types or kind in self.IGNORED_TYPES: - return False - - return True - - def _growth(self): - return objgraph.growth(limit=None, peak_stats=self.peak_stats, - filter=self._include_object_p) - - def _report_diff(self, growth): - if not growth: - return "" - - lines = [] - width = max(len(name) for name, _, _ in growth) - for name, count, delta in growth: - lines.append('%-*s%9d %+9d' % (width, name, count, delta)) - - diff = '\n'.join(lines) - return diff - - - def _run_test(self, args, kwargs): - gc_enabled = gc.isenabled() - gc.disable() - - if self.needs_setUp: - self.testcase.setUp() - self.testcase.skipTearDown = False - try: - self.function(self.testcase, *args, **kwargs) - finally: - self.testcase.tearDown() - self.testcase.doCleanups() - self.testcase.skipTearDown = True - self.needs_setUp = True - if gc_enabled: - gc.enable() - - def _growth_after(self): - # Grab post snapshot - # pylint:disable=no-member - if 'urlparse' in sys.modules: - sys.modules['urlparse'].clear_cache() - if 'urllib.parse' in sys.modules: - sys.modules['urllib.parse'].clear_cache() - - return self._growth() - - def _check_deltas(self, growth): - # Return false when we have decided there is no leak, - # true if we should keep looping, raises an assertion - # if we have decided there is a leak. - - deltas = self.deltas - if not deltas: - # We haven't run yet, no data, keep looping - return True - - if gc.garbage: - raise LeakCheckError("Generated uncollectable garbage %r" % (gc.garbage,)) - - - # the following configurations are classified as "no leak" - # [0, 0] - # [x, 0, 0] - # [... a, b, c, d] where a+b+c+d = 0 - # - # the following configurations are classified as "leak" - # [... z, z, z] where z > 0 - - if deltas[-2:] == [0, 0] and len(deltas) in (2, 3): - return False - - if deltas[-3:] == [0, 0, 0]: - return False - - if len(deltas) >= 4 and sum(deltas[-4:]) == 0: - return False - - if len(deltas) >= 3 and deltas[-1] > 0 and deltas[-1] == deltas[-2] and deltas[-2] == deltas[-3]: - diff = self._report_diff(growth) - raise LeakCheckError('refcount increased by %r\n%s' % (deltas, diff)) - - # OK, we don't know for sure yet. Let's search for more - if sum(deltas[-3:]) <= 0 or sum(deltas[-4:]) <= 0 or deltas[-4:].count(0) >= 2: - # this is suspicious, so give a few more runs - limit = 11 - else: - limit = 7 - if len(deltas) >= limit: - raise LeakCheckError('refcount increased by %r\n%s' - % (deltas, - self._report_diff(growth))) - - # We couldn't decide yet, keep going - return True - - def __call__(self, args, kwargs): - for _ in range(3): - gc.collect() - - expect_failure = getattr(self.function, 'fails_leakcheck', False) - if expect_failure: - self.testcase.expect_greenlet_leak = True - self.ignored_types = getattr(self.function, "leakcheck_ignore_types", ()) - - # Capture state before; the incremental will be - # updated by each call to _growth_after - growth = self._growth() - - try: - while self._check_deltas(growth): - self._run_test(args, kwargs) - - growth = self._growth_after() - - self.deltas.append(sum((stat[2] for stat in growth))) - except LeakCheckError: - if not expect_failure: - raise - else: - if expect_failure: - raise LeakCheckError("Expected %s to leak but it did not." % (self.function,)) - -def wrap_refcount(method): - if getattr(method, 'ignore_leakcheck', False) or SKIP_LEAKCHECKS: - return method - - @wraps(method) - def wrapper(self, *args, **kwargs): # pylint:disable=too-many-branches - if getattr(self, 'ignore_leakcheck', False): - raise unittest.SkipTest("This class ignored during leakchecks") - if ONLY_FAILING_LEAKCHECKS and not getattr(method, 'fails_leakcheck', False): - raise unittest.SkipTest("Only running tests that fail leakchecks.") - return _RefCountChecker(self, method)(args, kwargs) - - return wrapper diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_contextvars.py b/port/lib/python3.11/site-packages/greenlet/tests/test_contextvars.py deleted file mode 100644 index 9a16f67..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_contextvars.py +++ /dev/null @@ -1,310 +0,0 @@ -from __future__ import print_function - -import gc -import sys -import unittest - -from functools import partial -from unittest import skipUnless -from unittest import skipIf - -from greenlet import greenlet -from greenlet import getcurrent -from . import TestCase - - -try: - from contextvars import Context - from contextvars import ContextVar - from contextvars import copy_context - # From the documentation: - # - # Important: Context Variables should be created at the top module - # level and never in closures. Context objects hold strong - # references to context variables which prevents context variables - # from being properly garbage collected. - ID_VAR = ContextVar("id", default=None) - VAR_VAR = ContextVar("var", default=None) - ContextVar = None -except ImportError: - Context = ContextVar = copy_context = None - -# We don't support testing if greenlet's built-in context var support is disabled. -@skipUnless(Context is not None, "ContextVar not supported") -class ContextVarsTests(TestCase): - def _new_ctx_run(self, *args, **kwargs): - return copy_context().run(*args, **kwargs) - - def _increment(self, greenlet_id, callback, counts, expect): - ctx_var = ID_VAR - if expect is None: - self.assertIsNone(ctx_var.get()) - else: - self.assertEqual(ctx_var.get(), expect) - ctx_var.set(greenlet_id) - for _ in range(2): - counts[ctx_var.get()] += 1 - callback() - - def _test_context(self, propagate_by): - # pylint:disable=too-many-branches - ID_VAR.set(0) - - callback = getcurrent().switch - counts = dict((i, 0) for i in range(5)) - - lets = [ - greenlet(partial( - partial( - copy_context().run, - self._increment - ) if propagate_by == "run" else self._increment, - greenlet_id=i, - callback=callback, - counts=counts, - expect=( - i - 1 if propagate_by == "share" else - 0 if propagate_by in ("set", "run") else None - ) - )) - for i in range(1, 5) - ] - - for let in lets: - if propagate_by == "set": - let.gr_context = copy_context() - elif propagate_by == "share": - let.gr_context = getcurrent().gr_context - - for i in range(2): - counts[ID_VAR.get()] += 1 - for let in lets: - let.switch() - - if propagate_by == "run": - # Must leave each context.run() in reverse order of entry - for let in reversed(lets): - let.switch() - else: - # No context.run(), so fine to exit in any order. - for let in lets: - let.switch() - - for let in lets: - self.assertTrue(let.dead) - # When using run(), we leave the run() as the greenlet dies, - # and there's no context "underneath". When not using run(), - # gr_context still reflects the context the greenlet was - # running in. - if propagate_by == 'run': - self.assertIsNone(let.gr_context) - else: - self.assertIsNotNone(let.gr_context) - - - if propagate_by == "share": - self.assertEqual(counts, {0: 1, 1: 1, 2: 1, 3: 1, 4: 6}) - else: - self.assertEqual(set(counts.values()), set([2])) - - def test_context_propagated_by_context_run(self): - self._new_ctx_run(self._test_context, "run") - - def test_context_propagated_by_setting_attribute(self): - self._new_ctx_run(self._test_context, "set") - - def test_context_not_propagated(self): - self._new_ctx_run(self._test_context, None) - - def test_context_shared(self): - self._new_ctx_run(self._test_context, "share") - - def test_break_ctxvars(self): - let1 = greenlet(copy_context().run) - let2 = greenlet(copy_context().run) - let1.switch(getcurrent().switch) - let2.switch(getcurrent().switch) - # Since let2 entered the current context and let1 exits its own, the - # interpreter emits: - # RuntimeError: cannot exit context: thread state references a different context object - let1.switch() - - def test_not_broken_if_using_attribute_instead_of_context_run(self): - let1 = greenlet(getcurrent().switch) - let2 = greenlet(getcurrent().switch) - let1.gr_context = copy_context() - let2.gr_context = copy_context() - let1.switch() - let2.switch() - let1.switch() - let2.switch() - - def test_context_assignment_while_running(self): - # pylint:disable=too-many-statements - ID_VAR.set(None) - - def target(): - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - - # Context is created on first use - ID_VAR.set(1) - self.assertIsInstance(gr.gr_context, Context) - self.assertEqual(ID_VAR.get(), 1) - self.assertEqual(gr.gr_context[ID_VAR], 1) - - # Clearing the context makes it get re-created as another - # empty context when next used - old_context = gr.gr_context - gr.gr_context = None # assign None while running - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - ID_VAR.set(2) - self.assertIsInstance(gr.gr_context, Context) - self.assertEqual(ID_VAR.get(), 2) - self.assertEqual(gr.gr_context[ID_VAR], 2) - - new_context = gr.gr_context - getcurrent().parent.switch((old_context, new_context)) - # parent switches us back to old_context - - self.assertEqual(ID_VAR.get(), 1) - gr.gr_context = new_context # assign non-None while running - self.assertEqual(ID_VAR.get(), 2) - - getcurrent().parent.switch() - # parent switches us back to no context - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - gr.gr_context = old_context - self.assertEqual(ID_VAR.get(), 1) - - getcurrent().parent.switch() - # parent switches us back to no context - self.assertIsNone(ID_VAR.get()) - self.assertIsNone(gr.gr_context) - - gr = greenlet(target) - - with self.assertRaisesRegex(AttributeError, "can't delete context attribute"): - del gr.gr_context - - self.assertIsNone(gr.gr_context) - old_context, new_context = gr.switch() - self.assertIs(new_context, gr.gr_context) - self.assertEqual(old_context[ID_VAR], 1) - self.assertEqual(new_context[ID_VAR], 2) - self.assertEqual(new_context.run(ID_VAR.get), 2) - gr.gr_context = old_context # assign non-None while suspended - gr.switch() - self.assertIs(gr.gr_context, new_context) - gr.gr_context = None # assign None while suspended - gr.switch() - self.assertIs(gr.gr_context, old_context) - gr.gr_context = None - gr.switch() - self.assertIsNone(gr.gr_context) - - # Make sure there are no reference leaks - gr = None - gc.collect() - self.assertEqual(sys.getrefcount(old_context), 2) - self.assertEqual(sys.getrefcount(new_context), 2) - - def test_context_assignment_different_thread(self): - import threading - VAR_VAR.set(None) - ctx = Context() - - is_running = threading.Event() - should_suspend = threading.Event() - did_suspend = threading.Event() - should_exit = threading.Event() - holder = [] - - def greenlet_in_thread_fn(): - VAR_VAR.set(1) - is_running.set() - should_suspend.wait(10) - VAR_VAR.set(2) - getcurrent().parent.switch() - holder.append(VAR_VAR.get()) - - def thread_fn(): - gr = greenlet(greenlet_in_thread_fn) - gr.gr_context = ctx - holder.append(gr) - gr.switch() - did_suspend.set() - should_exit.wait(10) - gr.switch() - del gr - greenlet() # trigger cleanup - - thread = threading.Thread(target=thread_fn, daemon=True) - thread.start() - is_running.wait(10) - gr = holder[0] - - # Can't access or modify context if the greenlet is running - # in a different thread - with self.assertRaisesRegex(ValueError, "running in a different"): - getattr(gr, 'gr_context') - with self.assertRaisesRegex(ValueError, "running in a different"): - gr.gr_context = None - - should_suspend.set() - did_suspend.wait(10) - - # OK to access and modify context if greenlet is suspended - self.assertIs(gr.gr_context, ctx) - self.assertEqual(gr.gr_context[VAR_VAR], 2) - gr.gr_context = None - - should_exit.set() - thread.join(10) - - self.assertEqual(holder, [gr, None]) - - # Context can still be accessed/modified when greenlet is dead: - self.assertIsNone(gr.gr_context) - gr.gr_context = ctx - self.assertIs(gr.gr_context, ctx) - - # Otherwise we leak greenlets on some platforms. - # XXX: Should be able to do this automatically - del holder[:] - gr = None - thread = None - - def test_context_assignment_wrong_type(self): - g = greenlet() - with self.assertRaisesRegex(TypeError, - "greenlet context must be a contextvars.Context or None"): - g.gr_context = self - - -@skipIf(Context is not None, "ContextVar supported") -class NoContextVarsTests(TestCase): - def test_contextvars_errors(self): - let1 = greenlet(getcurrent().switch) - self.assertFalse(hasattr(let1, 'gr_context')) - with self.assertRaises(AttributeError): - getattr(let1, 'gr_context') - - with self.assertRaises(AttributeError): - let1.gr_context = None - - let1.switch() - - with self.assertRaises(AttributeError): - getattr(let1, 'gr_context') - - with self.assertRaises(AttributeError): - let1.gr_context = None - - del let1 - - -if __name__ == '__main__': - unittest.main() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_cpp.py b/port/lib/python3.11/site-packages/greenlet/tests/test_cpp.py deleted file mode 100644 index 2d0cc9c..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_cpp.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import - -import subprocess -import unittest - -import greenlet -from . import _test_extension_cpp -from . import TestCase -from . import WIN - -class CPPTests(TestCase): - def test_exception_switch(self): - greenlets = [] - for i in range(4): - g = greenlet.greenlet(_test_extension_cpp.test_exception_switch) - g.switch(i) - greenlets.append(g) - for i, g in enumerate(greenlets): - self.assertEqual(g.switch(), i) - - def _do_test_unhandled_exception(self, target): - import os - import sys - script = os.path.join( - os.path.dirname(__file__), - 'fail_cpp_exception.py', - ) - args = [sys.executable, script, target.__name__ if not isinstance(target, str) else target] - __traceback_info__ = args - with self.assertRaises(subprocess.CalledProcessError) as exc: - subprocess.check_output( - args, - encoding='utf-8', - stderr=subprocess.STDOUT - ) - - ex = exc.exception - expected_exit = self.get_expected_returncodes_for_aborted_process() - self.assertIn(ex.returncode, expected_exit) - self.assertIn('fail_cpp_exception is running', ex.output) - return ex.output - - - def test_unhandled_nonstd_exception_aborts(self): - # verify that plain unhandled throw aborts - self._do_test_unhandled_exception(_test_extension_cpp.test_exception_throw_nonstd) - - def test_unhandled_std_exception_aborts(self): - # verify that plain unhandled throw aborts - self._do_test_unhandled_exception(_test_extension_cpp.test_exception_throw_std) - - @unittest.skipIf(WIN, "XXX: This does not crash on Windows") - # Meaning the exception is getting lost somewhere... - def test_unhandled_std_exception_as_greenlet_function_aborts(self): - # verify that plain unhandled throw aborts - output = self._do_test_unhandled_exception('run_as_greenlet_target') - self.assertIn( - # We really expect this to be prefixed with "greenlet: Unhandled C++ exception:" - # as added by our handler for std::exception (see TUserGreenlet.cpp), but - # that's not correct everywhere --- our handler never runs before std::terminate - # gets called (for example, on arm32). - 'Thrown from an extension.', - output - ) - - def test_unhandled_exception_in_greenlet_aborts(self): - # verify that unhandled throw called in greenlet aborts too - self._do_test_unhandled_exception('run_unhandled_exception_in_greenlet_aborts') - - -if __name__ == '__main__': - unittest.main() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_extension_interface.py b/port/lib/python3.11/site-packages/greenlet/tests/test_extension_interface.py deleted file mode 100644 index 34b6656..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_extension_interface.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import print_function -from __future__ import absolute_import - -import sys - -import greenlet -from . import _test_extension -from . import TestCase - -# pylint:disable=c-extension-no-member - -class CAPITests(TestCase): - def test_switch(self): - self.assertEqual( - 50, _test_extension.test_switch(greenlet.greenlet(lambda: 50))) - - def test_switch_kwargs(self): - def adder(x, y): - return x * y - g = greenlet.greenlet(adder) - self.assertEqual(6, _test_extension.test_switch_kwargs(g, x=3, y=2)) - - def test_setparent(self): - # pylint:disable=disallowed-name - def foo(): - def bar(): - greenlet.getcurrent().parent.switch() - - # This final switch should go back to the main greenlet, since - # the test_setparent() function in the C extension should have - # reparented this greenlet. - greenlet.getcurrent().parent.switch() - raise AssertionError("Should never have reached this code") - child = greenlet.greenlet(bar) - child.switch() - greenlet.getcurrent().parent.switch(child) - greenlet.getcurrent().parent.throw( - AssertionError("Should never reach this code")) - foo_child = greenlet.greenlet(foo).switch() - self.assertEqual(None, _test_extension.test_setparent(foo_child)) - - def test_getcurrent(self): - _test_extension.test_getcurrent() - - def test_new_greenlet(self): - self.assertEqual(-15, _test_extension.test_new_greenlet(lambda: -15)) - - def test_raise_greenlet_dead(self): - self.assertRaises( - greenlet.GreenletExit, _test_extension.test_raise_dead_greenlet) - - def test_raise_greenlet_error(self): - self.assertRaises( - greenlet.error, _test_extension.test_raise_greenlet_error) - - def test_throw(self): - seen = [] - - def foo(): # pylint:disable=disallowed-name - try: - greenlet.getcurrent().parent.switch() - except ValueError: - seen.append(sys.exc_info()[1]) - except greenlet.GreenletExit: - raise AssertionError - g = greenlet.greenlet(foo) - g.switch() - _test_extension.test_throw(g) - self.assertEqual(len(seen), 1) - self.assertTrue( - isinstance(seen[0], ValueError), - "ValueError was not raised in foo()") - self.assertEqual( - str(seen[0]), - 'take that sucka!', - "message doesn't match") - - def test_non_traceback_param(self): - with self.assertRaises(TypeError) as exc: - _test_extension.test_throw_exact( - greenlet.getcurrent(), - Exception, - Exception(), - self - ) - self.assertEqual(str(exc.exception), - "throw() third argument must be a traceback object") - - def test_instance_of_wrong_type(self): - with self.assertRaises(TypeError) as exc: - _test_extension.test_throw_exact( - greenlet.getcurrent(), - Exception(), - BaseException(), - None, - ) - - self.assertEqual(str(exc.exception), - "instance exception may not have a separate value") - - def test_not_throwable(self): - with self.assertRaises(TypeError) as exc: - _test_extension.test_throw_exact( - greenlet.getcurrent(), - "abc", - None, - None, - ) - self.assertEqual(str(exc.exception), - "exceptions must be classes, or instances, not str") - - -if __name__ == '__main__': - import unittest - unittest.main() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_gc.py b/port/lib/python3.11/site-packages/greenlet/tests/test_gc.py deleted file mode 100644 index 994addb..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_gc.py +++ /dev/null @@ -1,86 +0,0 @@ -import gc - -import weakref - -import greenlet - - -from . import TestCase -from .leakcheck import fails_leakcheck -# These only work with greenlet gc support -# which is no longer optional. -assert greenlet.GREENLET_USE_GC - -class GCTests(TestCase): - def test_dead_circular_ref(self): - o = weakref.ref(greenlet.greenlet(greenlet.getcurrent).switch()) - gc.collect() - if o() is not None: - import sys - print("O IS NOT NONE.", sys.getrefcount(o())) - self.assertIsNone(o()) - self.assertFalse(gc.garbage, gc.garbage) - - def test_circular_greenlet(self): - class circular_greenlet(greenlet.greenlet): - self = None - o = circular_greenlet() - o.self = o - o = weakref.ref(o) - gc.collect() - self.assertIsNone(o()) - self.assertFalse(gc.garbage, gc.garbage) - - def test_inactive_ref(self): - class inactive_greenlet(greenlet.greenlet): - def __init__(self): - greenlet.greenlet.__init__(self, run=self.run) - - def run(self): - pass - o = inactive_greenlet() - o = weakref.ref(o) - gc.collect() - self.assertIsNone(o()) - self.assertFalse(gc.garbage, gc.garbage) - - @fails_leakcheck - def test_finalizer_crash(self): - # This test is designed to crash when active greenlets - # are made garbage collectable, until the underlying - # problem is resolved. How does it work: - # - order of object creation is important - # - array is created first, so it is moved to unreachable first - # - we create a cycle between a greenlet and this array - # - we create an object that participates in gc, is only - # referenced by a greenlet, and would corrupt gc lists - # on destruction, the easiest is to use an object with - # a finalizer - # - because array is the first object in unreachable it is - # cleared first, which causes all references to greenlet - # to disappear and causes greenlet to be destroyed, but since - # it is still live it causes a switch during gc, which causes - # an object with finalizer to be destroyed, which causes stack - # corruption and then a crash - - class object_with_finalizer(object): - def __del__(self): - pass - array = [] - parent = greenlet.getcurrent() - def greenlet_body(): - greenlet.getcurrent().object = object_with_finalizer() - try: - parent.switch() - except greenlet.GreenletExit: - print("Got greenlet exit!") - finally: - del greenlet.getcurrent().object - g = greenlet.greenlet(greenlet_body) - g.array = array - array.append(g) - g.switch() - del array - del g - greenlet.getcurrent() - gc.collect() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_generator.py b/port/lib/python3.11/site-packages/greenlet/tests/test_generator.py deleted file mode 100644 index ca4a644..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_generator.py +++ /dev/null @@ -1,59 +0,0 @@ - -from greenlet import greenlet - -from . import TestCase - -class genlet(greenlet): - parent = None - def __init__(self, *args, **kwds): - self.args = args - self.kwds = kwds - - def run(self): - fn, = self.fn - fn(*self.args, **self.kwds) - - def __iter__(self): - return self - - def __next__(self): - self.parent = greenlet.getcurrent() - result = self.switch() - if self: - return result - - raise StopIteration - - next = __next__ - - -def Yield(value): - g = greenlet.getcurrent() - while not isinstance(g, genlet): - if g is None: - raise RuntimeError('yield outside a genlet') - g = g.parent - g.parent.switch(value) - - -def generator(func): - class Generator(genlet): - fn = (func,) - return Generator - -# ____________________________________________________________ - - -class GeneratorTests(TestCase): - def test_generator(self): - seen = [] - - def g(n): - for i in range(n): - seen.append(i) - Yield(i) - g = generator(g) - for _ in range(3): - for j in g(5): - seen.append(j) - self.assertEqual(seen, 3 * [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_generator_nested.py b/port/lib/python3.11/site-packages/greenlet/tests/test_generator_nested.py deleted file mode 100644 index 8d752a6..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_generator_nested.py +++ /dev/null @@ -1,168 +0,0 @@ - -from greenlet import greenlet -from . import TestCase -from .leakcheck import fails_leakcheck - -class genlet(greenlet): - parent = None - def __init__(self, *args, **kwds): - self.args = args - self.kwds = kwds - self.child = None - - def run(self): - # Note the function is packed in a tuple - # to avoid creating a bound method for it. - fn, = self.fn - fn(*self.args, **self.kwds) - - def __iter__(self): - return self - - def set_child(self, child): - self.child = child - - def __next__(self): - if self.child: - child = self.child - while child.child: - tmp = child - child = child.child - tmp.child = None - - result = child.switch() - else: - self.parent = greenlet.getcurrent() - result = self.switch() - - if self: - return result - - raise StopIteration - - next = __next__ - -def Yield(value, level=1): - g = greenlet.getcurrent() - - while level != 0: - if not isinstance(g, genlet): - raise RuntimeError('yield outside a genlet') - if level > 1: - g.parent.set_child(g) - g = g.parent - level -= 1 - - g.switch(value) - - -def Genlet(func): - class TheGenlet(genlet): - fn = (func,) - return TheGenlet - -# ____________________________________________________________ - - -def g1(n, seen): - for i in range(n): - seen.append(i + 1) - yield i - - -def g2(n, seen): - for i in range(n): - seen.append(i + 1) - Yield(i) - -g2 = Genlet(g2) - - -def nested(i): - Yield(i) - - -def g3(n, seen): - for i in range(n): - seen.append(i + 1) - nested(i) -g3 = Genlet(g3) - - -def a(n): - if n == 0: - return - for ii in ax(n - 1): - Yield(ii) - Yield(n) -ax = Genlet(a) - - -def perms(l): - if len(l) > 1: - for e in l: - # No syntactical sugar for generator expressions - x = [Yield([e] + p) for p in perms([x for x in l if x != e])] - assert x - else: - Yield(l) -perms = Genlet(perms) - - -def gr1(n): - for ii in range(1, n): - Yield(ii) - Yield(ii * ii, 2) - -gr1 = Genlet(gr1) - - -def gr2(n, seen): - for ii in gr1(n): - seen.append(ii) - -gr2 = Genlet(gr2) - - -class NestedGeneratorTests(TestCase): - def test_layered_genlets(self): - seen = [] - for ii in gr2(5, seen): - seen.append(ii) - self.assertEqual(seen, [1, 1, 2, 4, 3, 9, 4, 16]) - - @fails_leakcheck - def test_permutations(self): - gen_perms = perms(list(range(4))) - permutations = list(gen_perms) - self.assertEqual(len(permutations), 4 * 3 * 2 * 1) - self.assertIn([0, 1, 2, 3], permutations) - self.assertIn([3, 2, 1, 0], permutations) - res = [] - for ii in zip(perms(list(range(4))), perms(list(range(3)))): - res.append(ii) - self.assertEqual( - res, - [([0, 1, 2, 3], [0, 1, 2]), ([0, 1, 3, 2], [0, 2, 1]), - ([0, 2, 1, 3], [1, 0, 2]), ([0, 2, 3, 1], [1, 2, 0]), - ([0, 3, 1, 2], [2, 0, 1]), ([0, 3, 2, 1], [2, 1, 0])]) - # XXX Test to make sure we are working as a generator expression - - def test_genlet_simple(self): - for g in g1, g2, g3: - seen = [] - for _ in range(3): - for j in g(5, seen): - seen.append(j) - self.assertEqual(seen, 3 * [1, 0, 2, 1, 3, 2, 4, 3, 5, 4]) - - def test_genlet_bad(self): - try: - Yield(10) - except RuntimeError: - pass - - def test_nested_genlets(self): - seen = [] - for ii in ax(5): - seen.append(ii) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_greenlet.py b/port/lib/python3.11/site-packages/greenlet/tests/test_greenlet.py deleted file mode 100644 index c4aabea..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_greenlet.py +++ /dev/null @@ -1,1324 +0,0 @@ -import gc -import sys -import time -import threading -import unittest - -from abc import ABCMeta -from abc import abstractmethod - -import greenlet -from greenlet import greenlet as RawGreenlet -from . import TestCase -from . import RUNNING_ON_MANYLINUX -from . import PY313 -from .leakcheck import fails_leakcheck - - -# We manually manage locks in many tests -# pylint:disable=consider-using-with -# pylint:disable=too-many-public-methods -# This module is quite large. -# TODO: Refactor into separate test files. For example, -# put all the regression tests that used to produce -# crashes in test_greenlet_no_crash; put tests that DO deliberately crash -# the interpreter into test_greenlet_crash. -# pylint:disable=too-many-lines - -class SomeError(Exception): - pass - - -def fmain(seen): - try: - greenlet.getcurrent().parent.switch() - except: - seen.append(sys.exc_info()[0]) - raise - raise SomeError - - -def send_exception(g, exc): - # note: send_exception(g, exc) can be now done with g.throw(exc). - # the purpose of this test is to explicitly check the propagation rules. - def crasher(exc): - raise exc - g1 = RawGreenlet(crasher, parent=g) - g1.switch(exc) - - -class TestGreenlet(TestCase): - - def _do_simple_test(self): - lst = [] - - def f(): - lst.append(1) - greenlet.getcurrent().parent.switch() - lst.append(3) - g = RawGreenlet(f) - lst.append(0) - g.switch() - lst.append(2) - g.switch() - lst.append(4) - self.assertEqual(lst, list(range(5))) - - def test_simple(self): - self._do_simple_test() - - def test_switch_no_run_raises_AttributeError(self): - g = RawGreenlet() - with self.assertRaises(AttributeError) as exc: - g.switch() - - self.assertIn("run", str(exc.exception)) - - def test_throw_no_run_raises_AttributeError(self): - g = RawGreenlet() - with self.assertRaises(AttributeError) as exc: - g.throw(SomeError) - - self.assertIn("run", str(exc.exception)) - - def test_parent_equals_None(self): - g = RawGreenlet(parent=None) - self.assertIsNotNone(g) - self.assertIs(g.parent, greenlet.getcurrent()) - - def test_run_equals_None(self): - g = RawGreenlet(run=None) - self.assertIsNotNone(g) - self.assertIsNone(g.run) - - def test_two_children(self): - lst = [] - - def f(): - lst.append(1) - greenlet.getcurrent().parent.switch() - lst.extend([1, 1]) - g = RawGreenlet(f) - h = RawGreenlet(f) - g.switch() - self.assertEqual(len(lst), 1) - h.switch() - self.assertEqual(len(lst), 2) - h.switch() - self.assertEqual(len(lst), 4) - self.assertEqual(h.dead, True) - g.switch() - self.assertEqual(len(lst), 6) - self.assertEqual(g.dead, True) - - def test_two_recursive_children(self): - lst = [] - - def f(): - lst.append('b') - greenlet.getcurrent().parent.switch() - - def g(): - lst.append('a') - g = RawGreenlet(f) - g.switch() - lst.append('c') - - g = RawGreenlet(g) - self.assertEqual(sys.getrefcount(g), 2) - g.switch() - self.assertEqual(lst, ['a', 'b', 'c']) - # Just the one in this frame, plus the one on the stack we pass to the function - self.assertEqual(sys.getrefcount(g), 2) - - def test_threads(self): - success = [] - - def f(): - self._do_simple_test() - success.append(True) - ths = [threading.Thread(target=f) for i in range(10)] - for th in ths: - th.start() - for th in ths: - th.join(10) - self.assertEqual(len(success), len(ths)) - - def test_exception(self): - seen = [] - g1 = RawGreenlet(fmain) - g2 = RawGreenlet(fmain) - g1.switch(seen) - g2.switch(seen) - g2.parent = g1 - - self.assertEqual(seen, []) - #with self.assertRaises(SomeError): - # p("***Switching back") - # g2.switch() - # Creating this as a bound method can reveal bugs that - # are hidden on newer versions of Python that avoid creating - # bound methods for direct expressions; IOW, don't use the `with` - # form! - self.assertRaises(SomeError, g2.switch) - self.assertEqual(seen, [SomeError]) - - value = g2.switch() - self.assertEqual(value, ()) - self.assertEqual(seen, [SomeError]) - - value = g2.switch(25) - self.assertEqual(value, 25) - self.assertEqual(seen, [SomeError]) - - - def test_send_exception(self): - seen = [] - g1 = RawGreenlet(fmain) - g1.switch(seen) - self.assertRaises(KeyError, send_exception, g1, KeyError) - self.assertEqual(seen, [KeyError]) - - def test_dealloc(self): - seen = [] - g1 = RawGreenlet(fmain) - g2 = RawGreenlet(fmain) - g1.switch(seen) - g2.switch(seen) - self.assertEqual(seen, []) - del g1 - gc.collect() - self.assertEqual(seen, [greenlet.GreenletExit]) - del g2 - gc.collect() - self.assertEqual(seen, [greenlet.GreenletExit, greenlet.GreenletExit]) - - def test_dealloc_catches_GreenletExit_throws_other(self): - def run(): - try: - greenlet.getcurrent().parent.switch() - except greenlet.GreenletExit: - raise SomeError from None - - g = RawGreenlet(run) - g.switch() - # Destroying the only reference to the greenlet causes it - # to get GreenletExit; when it in turn raises, even though we're the parent - # we don't get the exception, it just gets printed. - # When we run on 3.8 only, we can use sys.unraisablehook - oldstderr = sys.stderr - from io import StringIO - stderr = sys.stderr = StringIO() - try: - del g - finally: - sys.stderr = oldstderr - - v = stderr.getvalue() - self.assertIn("Exception", v) - self.assertIn('ignored', v) - self.assertIn("SomeError", v) - - - @unittest.skipIf( - PY313 and RUNNING_ON_MANYLINUX, - "Sometimes flaky (getting one GreenletExit in the second list)" - # Probably due to funky timing interactions? - # TODO: FIXME Make that work. - ) - - def test_dealloc_other_thread(self): - seen = [] - someref = [] - - bg_glet_created_running_and_no_longer_ref_in_bg = threading.Event() - fg_ref_released = threading.Event() - bg_should_be_clear = threading.Event() - ok_to_exit_bg_thread = threading.Event() - - def f(): - g1 = RawGreenlet(fmain) - g1.switch(seen) - someref.append(g1) - del g1 - gc.collect() - - bg_glet_created_running_and_no_longer_ref_in_bg.set() - fg_ref_released.wait(3) - - RawGreenlet() # trigger release - bg_should_be_clear.set() - ok_to_exit_bg_thread.wait(3) - RawGreenlet() # One more time - - t = threading.Thread(target=f) - t.start() - bg_glet_created_running_and_no_longer_ref_in_bg.wait(10) - - self.assertEqual(seen, []) - self.assertEqual(len(someref), 1) - del someref[:] - gc.collect() - # g1 is not released immediately because it's from another thread - self.assertEqual(seen, []) - fg_ref_released.set() - bg_should_be_clear.wait(3) - try: - self.assertEqual(seen, [greenlet.GreenletExit]) - finally: - ok_to_exit_bg_thread.set() - t.join(10) - del seen[:] - del someref[:] - - def test_frame(self): - def f1(): - f = sys._getframe(0) # pylint:disable=protected-access - self.assertEqual(f.f_back, None) - greenlet.getcurrent().parent.switch(f) - return "meaning of life" - g = RawGreenlet(f1) - frame = g.switch() - self.assertTrue(frame is g.gr_frame) - self.assertTrue(g) - - from_g = g.switch() - self.assertFalse(g) - self.assertEqual(from_g, 'meaning of life') - self.assertEqual(g.gr_frame, None) - - def test_thread_bug(self): - def runner(x): - g = RawGreenlet(lambda: time.sleep(x)) - g.switch() - t1 = threading.Thread(target=runner, args=(0.2,)) - t2 = threading.Thread(target=runner, args=(0.3,)) - t1.start() - t2.start() - t1.join(10) - t2.join(10) - - def test_switch_kwargs(self): - def run(a, b): - self.assertEqual(a, 4) - self.assertEqual(b, 2) - return 42 - x = RawGreenlet(run).switch(a=4, b=2) - self.assertEqual(x, 42) - - def test_switch_kwargs_to_parent(self): - def run(x): - greenlet.getcurrent().parent.switch(x=x) - greenlet.getcurrent().parent.switch(2, x=3) - return x, x ** 2 - g = RawGreenlet(run) - self.assertEqual({'x': 3}, g.switch(3)) - self.assertEqual(((2,), {'x': 3}), g.switch()) - self.assertEqual((3, 9), g.switch()) - - def test_switch_to_another_thread(self): - data = {} - created_event = threading.Event() - done_event = threading.Event() - - def run(): - data['g'] = RawGreenlet(lambda: None) - created_event.set() - done_event.wait(10) - thread = threading.Thread(target=run) - thread.start() - created_event.wait(10) - with self.assertRaises(greenlet.error): - data['g'].switch() - done_event.set() - thread.join(10) - # XXX: Should handle this automatically - data.clear() - - def test_exc_state(self): - def f(): - try: - raise ValueError('fun') - except: # pylint:disable=bare-except - exc_info = sys.exc_info() - RawGreenlet(h).switch() - self.assertEqual(exc_info, sys.exc_info()) - - def h(): - self.assertEqual(sys.exc_info(), (None, None, None)) - - RawGreenlet(f).switch() - - def test_instance_dict(self): - def f(): - greenlet.getcurrent().test = 42 - def deldict(g): - del g.__dict__ - def setdict(g, value): - g.__dict__ = value - g = RawGreenlet(f) - self.assertEqual(g.__dict__, {}) - g.switch() - self.assertEqual(g.test, 42) - self.assertEqual(g.__dict__, {'test': 42}) - g.__dict__ = g.__dict__ - self.assertEqual(g.__dict__, {'test': 42}) - self.assertRaises(TypeError, deldict, g) - self.assertRaises(TypeError, setdict, g, 42) - - def test_running_greenlet_has_no_run(self): - has_run = [] - def func(): - has_run.append( - hasattr(greenlet.getcurrent(), 'run') - ) - - g = RawGreenlet(func) - g.switch() - self.assertEqual(has_run, [False]) - - def test_deepcopy(self): - import copy - self.assertRaises(TypeError, copy.copy, RawGreenlet()) - self.assertRaises(TypeError, copy.deepcopy, RawGreenlet()) - - def test_parent_restored_on_kill(self): - hub = RawGreenlet(lambda: None) - main = greenlet.getcurrent() - result = [] - def worker(): - try: - # Wait to be killed by going back to the test. - main.switch() - except greenlet.GreenletExit: - # Resurrect and switch to parent - result.append(greenlet.getcurrent().parent) - result.append(greenlet.getcurrent()) - hub.switch() - g = RawGreenlet(worker, parent=hub) - g.switch() - # delete the only reference, thereby raising GreenletExit - del g - self.assertTrue(result) - self.assertIs(result[0], main) - self.assertIs(result[1].parent, hub) - # Delete them, thereby breaking the cycle between the greenlet - # and the frame, which otherwise would never be collectable - # XXX: We should be able to automatically fix this. - del result[:] - hub = None - main = None - - def test_parent_return_failure(self): - # No run causes AttributeError on switch - g1 = RawGreenlet() - # Greenlet that implicitly switches to parent - g2 = RawGreenlet(lambda: None, parent=g1) - # AttributeError should propagate to us, no fatal errors - with self.assertRaises(AttributeError): - g2.switch() - - def test_throw_exception_not_lost(self): - class mygreenlet(RawGreenlet): - def __getattribute__(self, name): - try: - raise Exception # pylint:disable=broad-exception-raised - except: # pylint:disable=bare-except - pass - return RawGreenlet.__getattribute__(self, name) - g = mygreenlet(lambda: None) - self.assertRaises(SomeError, g.throw, SomeError()) - - @fails_leakcheck - def _do_test_throw_to_dead_thread_doesnt_crash(self, wait_for_cleanup=False): - result = [] - def worker(): - greenlet.getcurrent().parent.switch() - - def creator(): - g = RawGreenlet(worker) - g.switch() - result.append(g) - if wait_for_cleanup: - # Let this greenlet eventually be cleaned up. - g.switch() - greenlet.getcurrent() - t = threading.Thread(target=creator) - t.start() - t.join(10) - del t - # But, depending on the operating system, the thread - # deallocator may not actually have run yet! So we can't be - # sure about the error message unless we wait. - if wait_for_cleanup: - self.wait_for_pending_cleanups() - with self.assertRaises(greenlet.error) as exc: - result[0].throw(SomeError) - - if not wait_for_cleanup: - s = str(exc.exception) - self.assertTrue( - s == "cannot switch to a different thread (which happens to have exited)" - or 'Cannot switch' in s - ) - else: - self.assertEqual( - str(exc.exception), - "cannot switch to a different thread (which happens to have exited)", - ) - - if hasattr(result[0].gr_frame, 'clear'): - # The frame is actually executing (it thinks), we can't clear it. - with self.assertRaises(RuntimeError): - result[0].gr_frame.clear() - # Unfortunately, this doesn't actually clear the references, they're in the - # fast local array. - if not wait_for_cleanup: - # f_locals has no clear method in Python 3.13 - if hasattr(result[0].gr_frame.f_locals, 'clear'): - result[0].gr_frame.f_locals.clear() - else: - self.assertIsNone(result[0].gr_frame) - - del creator - worker = None - del result[:] - # XXX: we ought to be able to automatically fix this. - # See issue 252 - self.expect_greenlet_leak = True # direct us not to wait for it to go away - - @fails_leakcheck - def test_throw_to_dead_thread_doesnt_crash(self): - self._do_test_throw_to_dead_thread_doesnt_crash() - - def test_throw_to_dead_thread_doesnt_crash_wait(self): - self._do_test_throw_to_dead_thread_doesnt_crash(True) - - @fails_leakcheck - def test_recursive_startup(self): - class convoluted(RawGreenlet): - def __init__(self): - RawGreenlet.__init__(self) - self.count = 0 - def __getattribute__(self, name): - if name == 'run' and self.count == 0: - self.count = 1 - self.switch(43) - return RawGreenlet.__getattribute__(self, name) - def run(self, value): - while True: - self.parent.switch(value) - g = convoluted() - self.assertEqual(g.switch(42), 43) - # Exits the running greenlet, otherwise it leaks - # XXX: We should be able to automatically fix this - #g.throw(greenlet.GreenletExit) - #del g - self.expect_greenlet_leak = True - - def test_threaded_updatecurrent(self): - # released when main thread should execute - lock1 = threading.Lock() - lock1.acquire() - # released when another thread should execute - lock2 = threading.Lock() - lock2.acquire() - class finalized(object): - def __del__(self): - # happens while in green_updatecurrent() in main greenlet - # should be very careful not to accidentally call it again - # at the same time we must make sure another thread executes - lock2.release() - lock1.acquire() - # now ts_current belongs to another thread - def deallocator(): - greenlet.getcurrent().parent.switch() - def fthread(): - lock2.acquire() - greenlet.getcurrent() - del g[0] - lock1.release() - lock2.acquire() - greenlet.getcurrent() - lock1.release() - main = greenlet.getcurrent() - g = [RawGreenlet(deallocator)] - g[0].bomb = finalized() - g[0].switch() - t = threading.Thread(target=fthread) - t.start() - # let another thread grab ts_current and deallocate g[0] - lock2.release() - lock1.acquire() - # this is the corner stone - # getcurrent() will notice that ts_current belongs to another thread - # and start the update process, which would notice that g[0] should - # be deallocated, and that will execute an object's finalizer. Now, - # that object will let another thread run so it can grab ts_current - # again, which would likely crash the interpreter if there's no - # check for this case at the end of green_updatecurrent(). This test - # passes if getcurrent() returns correct result, but it's likely - # to randomly crash if it's not anyway. - self.assertEqual(greenlet.getcurrent(), main) - # wait for another thread to complete, just in case - t.join(10) - - def test_dealloc_switch_args_not_lost(self): - seen = [] - def worker(): - # wait for the value - value = greenlet.getcurrent().parent.switch() - # delete all references to ourself - del worker[0] - initiator.parent = greenlet.getcurrent().parent - # switch to main with the value, but because - # ts_current is the last reference to us we - # return here immediately, where we resurrect ourself. - try: - greenlet.getcurrent().parent.switch(value) - finally: - seen.append(greenlet.getcurrent()) - def initiator(): - return 42 # implicitly falls thru to parent - - worker = [RawGreenlet(worker)] - - worker[0].switch() # prime worker - initiator = RawGreenlet(initiator, worker[0]) - value = initiator.switch() - self.assertTrue(seen) - self.assertEqual(value, 42) - - def test_tuple_subclass(self): - # The point of this test is to see what happens when a custom - # tuple subclass is used as an object passed directly to the C - # function ``green_switch``; part of ``green_switch`` checks - # the ``len()`` of the ``args`` tuple, and that can call back - # into Python. Here, when it calls back into Python, we - # recursively enter ``green_switch`` again. - - # This test is really only relevant on Python 2. The builtin - # `apply` function directly passes the given args tuple object - # to the underlying function, whereas the Python 3 version - # unpacks and repacks into an actual tuple. This could still - # happen using the C API on Python 3 though. We should write a - # builtin version of apply() ourself. - def _apply(func, a, k): - func(*a, **k) - - class mytuple(tuple): - def __len__(self): - greenlet.getcurrent().switch() - return tuple.__len__(self) - args = mytuple() - kwargs = dict(a=42) - def switchapply(): - _apply(greenlet.getcurrent().parent.switch, args, kwargs) - g = RawGreenlet(switchapply) - self.assertEqual(g.switch(), kwargs) - - def test_abstract_subclasses(self): - AbstractSubclass = ABCMeta( - 'AbstractSubclass', - (RawGreenlet,), - {'run': abstractmethod(lambda self: None)}) - - class BadSubclass(AbstractSubclass): - pass - - class GoodSubclass(AbstractSubclass): - def run(self): - pass - - GoodSubclass() # should not raise - self.assertRaises(TypeError, BadSubclass) - - def test_implicit_parent_with_threads(self): - if not gc.isenabled(): - return # cannot test with disabled gc - N = gc.get_threshold()[0] - if N < 50: - return # cannot test with such a small N - def attempt(): - lock1 = threading.Lock() - lock1.acquire() - lock2 = threading.Lock() - lock2.acquire() - recycled = [False] - def another_thread(): - lock1.acquire() # wait for gc - greenlet.getcurrent() # update ts_current - lock2.release() # release gc - t = threading.Thread(target=another_thread) - t.start() - class gc_callback(object): - def __del__(self): - lock1.release() - lock2.acquire() - recycled[0] = True - class garbage(object): - def __init__(self): - self.cycle = self - self.callback = gc_callback() - l = [] - x = range(N*2) - current = greenlet.getcurrent() - g = garbage() - for _ in x: - g = None # lose reference to garbage - if recycled[0]: - # gc callback called prematurely - t.join(10) - return False - last = RawGreenlet() - if recycled[0]: - break # yes! gc called in green_new - l.append(last) # increase allocation counter - else: - # gc callback not called when expected - gc.collect() - if recycled[0]: - t.join(10) - return False - self.assertEqual(last.parent, current) - for g in l: - self.assertEqual(g.parent, current) - return True - for _ in range(5): - if attempt(): - break - - def test_issue_245_reference_counting_subclass_no_threads(self): - # https://github.com/python-greenlet/greenlet/issues/245 - # Before the fix, this crashed pretty reliably on - # Python 3.10, at least on macOS; but much less reliably on other - # interpreters (memory layout must have changed). - # The threaded test crashed more reliably on more interpreters. - from greenlet import getcurrent - from greenlet import GreenletExit - - class Greenlet(RawGreenlet): - pass - - initial_refs = sys.getrefcount(Greenlet) - # This has to be an instance variable because - # Python 2 raises a SyntaxError if we delete a local - # variable referenced in an inner scope. - self.glets = [] # pylint:disable=attribute-defined-outside-init - - def greenlet_main(): - try: - getcurrent().parent.switch() - except GreenletExit: - self.glets.append(getcurrent()) - - # Before the - for _ in range(10): - Greenlet(greenlet_main).switch() - - del self.glets - self.assertEqual(sys.getrefcount(Greenlet), initial_refs) - - @unittest.skipIf( - PY313 and RUNNING_ON_MANYLINUX, - "The manylinux images appear to hang on this test on 3.13rc2" - # Or perhaps I just got tired of waiting for the 450s timeout. - # Still, it shouldn't take anywhere near that long. Does not reproduce in - # Ubuntu images, on macOS or Windows. - ) - def test_issue_245_reference_counting_subclass_threads(self): - # https://github.com/python-greenlet/greenlet/issues/245 - from threading import Thread - from threading import Event - - from greenlet import getcurrent - - class MyGreenlet(RawGreenlet): - pass - - glets = [] - ref_cleared = Event() - - def greenlet_main(): - getcurrent().parent.switch() - - def thread_main(greenlet_running_event): - mine = MyGreenlet(greenlet_main) - glets.append(mine) - # The greenlets being deleted must be active - mine.switch() - # Don't keep any reference to it in this thread - del mine - # Let main know we published our greenlet. - greenlet_running_event.set() - # Wait for main to let us know the references are - # gone and the greenlet objects no longer reachable - ref_cleared.wait(10) - # The creating thread must call getcurrent() (or a few other - # greenlet APIs) because that's when the thread-local list of dead - # greenlets gets cleared. - getcurrent() - - # We start with 3 references to the subclass: - # - This module - # - Its __mro__ - # - The __subclassess__ attribute of greenlet - # - (If we call gc.get_referents(), we find four entries, including - # some other tuple ``(greenlet)`` that I'm not sure about but must be part - # of the machinery.) - # - # On Python 3.10 it's often enough to just run 3 threads; on Python 2.7, - # more threads are needed, and the results are still - # non-deterministic. Presumably the memory layouts are different - initial_refs = sys.getrefcount(MyGreenlet) - thread_ready_events = [] - for _ in range( - initial_refs + 45 - ): - event = Event() - thread = Thread(target=thread_main, args=(event,)) - thread_ready_events.append(event) - thread.start() - - - for done_event in thread_ready_events: - done_event.wait(10) - - - del glets[:] - ref_cleared.set() - # Let any other thread run; it will crash the interpreter - # if not fixed (or silently corrupt memory and we possibly crash - # later). - self.wait_for_pending_cleanups() - self.assertEqual(sys.getrefcount(MyGreenlet), initial_refs) - - def test_falling_off_end_switches_to_unstarted_parent_raises_error(self): - def no_args(): - return 13 - - parent_never_started = RawGreenlet(no_args) - - def leaf(): - return 42 - - child = RawGreenlet(leaf, parent_never_started) - - # Because the run function takes to arguments - with self.assertRaises(TypeError): - child.switch() - - def test_falling_off_end_switches_to_unstarted_parent_works(self): - def one_arg(x): - return (x, 24) - - parent_never_started = RawGreenlet(one_arg) - - def leaf(): - return 42 - - child = RawGreenlet(leaf, parent_never_started) - - result = child.switch() - self.assertEqual(result, (42, 24)) - - def test_switch_to_dead_greenlet_with_unstarted_perverse_parent(self): - class Parent(RawGreenlet): - def __getattribute__(self, name): - if name == 'run': - raise SomeError - - - parent_never_started = Parent() - seen = [] - child = RawGreenlet(lambda: seen.append(42), parent_never_started) - # Because we automatically start the parent when the child is - # finished - with self.assertRaises(SomeError): - child.switch() - - self.assertEqual(seen, [42]) - - with self.assertRaises(SomeError): - child.switch() - self.assertEqual(seen, [42]) - - def test_switch_to_dead_greenlet_reparent(self): - seen = [] - parent_never_started = RawGreenlet(lambda: seen.append(24)) - child = RawGreenlet(lambda: seen.append(42)) - - child.switch() - self.assertEqual(seen, [42]) - - child.parent = parent_never_started - # This actually is the same as switching to the parent. - result = child.switch() - self.assertIsNone(result) - self.assertEqual(seen, [42, 24]) - - def test_can_access_f_back_of_suspended_greenlet(self): - # This tests our frame rewriting to work around Python 3.12+ having - # some interpreter frames on the C stack. It will crash in the absence - # of that logic. - main = greenlet.getcurrent() - - def outer(): - inner() - - def inner(): - main.switch(sys._getframe(0)) - - hub = RawGreenlet(outer) - # start it - hub.switch() - - # start another greenlet to make sure we aren't relying on - # anything in `hub` still being on the C stack - unrelated = RawGreenlet(lambda: None) - unrelated.switch() - - # now it is suspended - self.assertIsNotNone(hub.gr_frame) - self.assertEqual(hub.gr_frame.f_code.co_name, "inner") - self.assertIsNotNone(hub.gr_frame.f_back) - self.assertEqual(hub.gr_frame.f_back.f_code.co_name, "outer") - # The next line is what would crash - self.assertIsNone(hub.gr_frame.f_back.f_back) - - def test_get_stack_with_nested_c_calls(self): - from functools import partial - from . import _test_extension_cpp - - def recurse(v): - if v > 0: - return v * _test_extension_cpp.test_call(partial(recurse, v - 1)) - return greenlet.getcurrent().parent.switch() - - gr = RawGreenlet(recurse) - gr.switch(5) - frame = gr.gr_frame - for i in range(5): - self.assertEqual(frame.f_locals["v"], i) - frame = frame.f_back - self.assertEqual(frame.f_locals["v"], 5) - self.assertIsNone(frame.f_back) - self.assertEqual(gr.switch(10), 1200) # 1200 = 5! * 10 - - def test_frames_always_exposed(self): - # On Python 3.12 this will crash if we don't set the - # gr_frames_always_exposed attribute. More background: - # https://github.com/python-greenlet/greenlet/issues/388 - main = greenlet.getcurrent() - - def outer(): - inner(sys._getframe(0)) - - def inner(frame): - main.switch(frame) - - gr = RawGreenlet(outer) - frame = gr.switch() - - # Do something else to clobber the part of the C stack used by `gr`, - # so we can't skate by on "it just happened to still be there" - unrelated = RawGreenlet(lambda: None) - unrelated.switch() - - self.assertEqual(frame.f_code.co_name, "outer") - # The next line crashes on 3.12 if we haven't exposed the frames. - self.assertIsNone(frame.f_back) - - -class TestGreenletSetParentErrors(TestCase): - def test_threaded_reparent(self): - data = {} - created_event = threading.Event() - done_event = threading.Event() - - def run(): - data['g'] = RawGreenlet(lambda: None) - created_event.set() - done_event.wait(10) - - def blank(): - greenlet.getcurrent().parent.switch() - - thread = threading.Thread(target=run) - thread.start() - created_event.wait(10) - g = RawGreenlet(blank) - g.switch() - with self.assertRaises(ValueError) as exc: - g.parent = data['g'] - done_event.set() - thread.join(10) - - self.assertEqual(str(exc.exception), "parent cannot be on a different thread") - - def test_unexpected_reparenting(self): - another = [] - def worker(): - g = RawGreenlet(lambda: None) - another.append(g) - g.switch() - t = threading.Thread(target=worker) - t.start() - t.join(10) - # The first time we switch (running g_initialstub(), which is - # when we look up the run attribute) we attempt to change the - # parent to one from another thread (which also happens to be - # dead). ``g_initialstub()`` should detect this and raise a - # greenlet error. - # - # EXCEPT: With the fix for #252, this is actually detected - # sooner, when setting the parent itself. Prior to that fix, - # the main greenlet from the background thread kept a valid - # value for ``run_info``, and appeared to be a valid parent - # until we actually started the greenlet. But now that it's - # cleared, this test is catching whether ``green_setparent`` - # can detect the dead thread. - # - # Further refactoring once again changes this back to a greenlet.error - # - # We need to wait for the cleanup to happen, but we're - # deliberately leaking a main greenlet here. - self.wait_for_pending_cleanups(initial_main_greenlets=self.main_greenlets_before_test + 1) - - class convoluted(RawGreenlet): - def __getattribute__(self, name): - if name == 'run': - self.parent = another[0] # pylint:disable=attribute-defined-outside-init - return RawGreenlet.__getattribute__(self, name) - g = convoluted(lambda: None) - with self.assertRaises(greenlet.error) as exc: - g.switch() - self.assertEqual(str(exc.exception), - "cannot switch to a different thread (which happens to have exited)") - del another[:] - - def test_unexpected_reparenting_thread_running(self): - # Like ``test_unexpected_reparenting``, except the background thread is - # actually still alive. - another = [] - switched_to_greenlet = threading.Event() - keep_main_alive = threading.Event() - def worker(): - g = RawGreenlet(lambda: None) - another.append(g) - g.switch() - switched_to_greenlet.set() - keep_main_alive.wait(10) - class convoluted(RawGreenlet): - def __getattribute__(self, name): - if name == 'run': - self.parent = another[0] # pylint:disable=attribute-defined-outside-init - return RawGreenlet.__getattribute__(self, name) - - t = threading.Thread(target=worker) - t.start() - - switched_to_greenlet.wait(10) - try: - g = convoluted(lambda: None) - - with self.assertRaises(greenlet.error) as exc: - g.switch() - self.assertIn("Cannot switch to a different thread", str(exc.exception)) - self.assertIn("Expected", str(exc.exception)) - self.assertIn("Current", str(exc.exception)) - finally: - keep_main_alive.set() - t.join(10) - # XXX: Should handle this automatically. - del another[:] - - def test_cannot_delete_parent(self): - worker = RawGreenlet(lambda: None) - self.assertIs(worker.parent, greenlet.getcurrent()) - - with self.assertRaises(AttributeError) as exc: - del worker.parent - self.assertEqual(str(exc.exception), "can't delete attribute") - - def test_cannot_delete_parent_of_main(self): - with self.assertRaises(AttributeError) as exc: - del greenlet.getcurrent().parent - self.assertEqual(str(exc.exception), "can't delete attribute") - - - def test_main_greenlet_parent_is_none(self): - # assuming we're in a main greenlet here. - self.assertIsNone(greenlet.getcurrent().parent) - - def test_set_parent_wrong_types(self): - def bg(): - # Go back to main. - greenlet.getcurrent().parent.switch() - - def check(glet): - for p in None, 1, self, "42": - with self.assertRaises(TypeError) as exc: - glet.parent = p - - self.assertEqual( - str(exc.exception), - "GreenletChecker: Expected any type of greenlet, not " + type(p).__name__) - - # First, not running - g = RawGreenlet(bg) - self.assertFalse(g) - check(g) - - # Then when running. - g.switch() - self.assertTrue(g) - check(g) - - # Let it finish - g.switch() - - - def test_trivial_cycle(self): - glet = RawGreenlet(lambda: None) - with self.assertRaises(ValueError) as exc: - glet.parent = glet - self.assertEqual(str(exc.exception), "cyclic parent chain") - - def test_trivial_cycle_main(self): - # This used to produce a ValueError, but we catch it earlier than that now. - with self.assertRaises(AttributeError) as exc: - greenlet.getcurrent().parent = greenlet.getcurrent() - self.assertEqual(str(exc.exception), "cannot set the parent of a main greenlet") - - def test_deeper_cycle(self): - g1 = RawGreenlet(lambda: None) - g2 = RawGreenlet(lambda: None) - g3 = RawGreenlet(lambda: None) - - g1.parent = g2 - g2.parent = g3 - with self.assertRaises(ValueError) as exc: - g3.parent = g1 - self.assertEqual(str(exc.exception), "cyclic parent chain") - - -class TestRepr(TestCase): - - def assertEndsWith(self, got, suffix): - self.assertTrue(got.endswith(suffix), (got, suffix)) - - def test_main_while_running(self): - r = repr(greenlet.getcurrent()) - self.assertEndsWith(r, " current active started main>") - - def test_main_in_background(self): - main = greenlet.getcurrent() - def run(): - return repr(main) - - g = RawGreenlet(run) - r = g.switch() - self.assertEndsWith(r, ' suspended active started main>') - - def test_initial(self): - r = repr(RawGreenlet()) - self.assertEndsWith(r, ' pending>') - - def test_main_from_other_thread(self): - main = greenlet.getcurrent() - - class T(threading.Thread): - original_main = thread_main = None - main_glet = None - def run(self): - self.original_main = repr(main) - self.main_glet = greenlet.getcurrent() - self.thread_main = repr(self.main_glet) - - t = T() - t.start() - t.join(10) - - self.assertEndsWith(t.original_main, ' suspended active started main>') - self.assertEndsWith(t.thread_main, ' current active started main>') - # give the machinery time to notice the death of the thread, - # and clean it up. Note that we don't use - # ``expect_greenlet_leak`` or wait_for_pending_cleanups, - # because at this point we know we have an extra greenlet - # still reachable. - for _ in range(3): - time.sleep(0.001) - - # In the past, main greenlets, even from dead threads, never - # really appear dead. We have fixed that, and we also report - # that the thread is dead in the repr. (Do this multiple times - # to make sure that we don't self-modify and forget our state - # in the C++ code). - for _ in range(3): - self.assertTrue(t.main_glet.dead) - r = repr(t.main_glet) - self.assertEndsWith(r, ' (thread exited) dead>') - - def test_dead(self): - g = RawGreenlet(lambda: None) - g.switch() - self.assertEndsWith(repr(g), ' dead>') - self.assertNotIn('suspended', repr(g)) - self.assertNotIn('started', repr(g)) - self.assertNotIn('active', repr(g)) - - def test_formatting_produces_native_str(self): - # https://github.com/python-greenlet/greenlet/issues/218 - # %s formatting on Python 2 was producing unicode, not str. - - g_dead = RawGreenlet(lambda: None) - g_not_started = RawGreenlet(lambda: None) - g_cur = greenlet.getcurrent() - - for g in g_dead, g_not_started, g_cur: - - self.assertIsInstance( - '%s' % (g,), - str - ) - self.assertIsInstance( - '%r' % (g,), - str, - ) - - -class TestMainGreenlet(TestCase): - # Tests some implementation details, and relies on some - # implementation details. - - def _check_current_is_main(self): - # implementation detail - assert 'main' in repr(greenlet.getcurrent()) - - t = type(greenlet.getcurrent()) - assert 'main' not in repr(t) - return t - - def test_main_greenlet_type_can_be_subclassed(self): - main_type = self._check_current_is_main() - subclass = type('subclass', (main_type,), {}) - self.assertIsNotNone(subclass) - - def test_main_greenlet_is_greenlet(self): - self._check_current_is_main() - self.assertIsInstance(greenlet.getcurrent(), RawGreenlet) - - - -class TestBrokenGreenlets(TestCase): - # Tests for things that used to, or still do, terminate the interpreter. - # This often means doing unsavory things. - - def test_failed_to_initialstub(self): - def func(): - raise AssertionError("Never get here") - - - g = greenlet._greenlet.UnswitchableGreenlet(func) - g.force_switch_error = True - - with self.assertRaisesRegex(SystemError, - "Failed to switch stacks into a greenlet for the first time."): - g.switch() - - def test_failed_to_switch_into_running(self): - runs = [] - def func(): - runs.append(1) - greenlet.getcurrent().parent.switch() - runs.append(2) - greenlet.getcurrent().parent.switch() - runs.append(3) # pragma: no cover - - g = greenlet._greenlet.UnswitchableGreenlet(func) - g.switch() - self.assertEqual(runs, [1]) - g.switch() - self.assertEqual(runs, [1, 2]) - g.force_switch_error = True - - with self.assertRaisesRegex(SystemError, - "Failed to switch stacks into a running greenlet."): - g.switch() - - # If we stopped here, we would fail the leakcheck, because we've left - # the ``inner_bootstrap()`` C frame and its descendents hanging around, - # which have a bunch of Python references. They'll never get cleaned up - # if we don't let the greenlet finish. - g.force_switch_error = False - g.switch() - self.assertEqual(runs, [1, 2, 3]) - - def test_failed_to_slp_switch_into_running(self): - ex = self.assertScriptRaises('fail_slp_switch.py') - - self.assertIn('fail_slp_switch is running', ex.output) - self.assertIn(ex.returncode, self.get_expected_returncodes_for_aborted_process()) - - def test_reentrant_switch_two_greenlets(self): - # Before we started capturing the arguments in g_switch_finish, this could crash. - output = self.run_script('fail_switch_two_greenlets.py') - self.assertIn('In g1_run', output) - self.assertIn('TRACE', output) - self.assertIn('LEAVE TRACE', output) - self.assertIn('Falling off end of main', output) - self.assertIn('Falling off end of g1_run', output) - self.assertIn('Falling off end of g2', output) - - def test_reentrant_switch_three_greenlets(self): - # On debug builds of greenlet, this used to crash with an assertion error; - # on non-debug versions, it ran fine (which it should not do!). - # Now it always crashes correctly with a TypeError - ex = self.assertScriptRaises('fail_switch_three_greenlets.py', exitcodes=(1,)) - - self.assertIn('TypeError', ex.output) - self.assertIn('positional arguments', ex.output) - - def test_reentrant_switch_three_greenlets2(self): - # This actually passed on debug and non-debug builds. It - # should probably have been triggering some debug assertions - # but it didn't. - # - # I think the fixes for the above test also kicked in here. - output = self.run_script('fail_switch_three_greenlets2.py') - self.assertIn( - "RESULTS: [('trace', 'switch'), " - "('trace', 'switch'), ('g2 arg', 'g2 from tracefunc'), " - "('trace', 'switch'), ('main g1', 'from g2_run'), ('trace', 'switch'), " - "('g1 arg', 'g1 from main'), ('trace', 'switch'), ('main g2', 'from g1_run'), " - "('trace', 'switch'), ('g1 from parent', 'g1 from main 2'), ('trace', 'switch'), " - "('main g1.2', 'g1 done'), ('trace', 'switch'), ('g2 from parent', ()), " - "('trace', 'switch'), ('main g2.2', 'g2 done')]", - output - ) - - def test_reentrant_switch_GreenletAlreadyStartedInPython(self): - output = self.run_script('fail_initialstub_already_started.py') - - self.assertIn( - "RESULTS: ['Begin C', 'Switch to b from B.__getattribute__ in C', " - "('Begin B', ()), '_B_run switching to main', ('main from c', 'From B'), " - "'B.__getattribute__ back from main in C', ('Begin A', (None,)), " - "('A dead?', True, 'B dead?', True, 'C dead?', False), " - "'C done', ('main from c.2', None)]", - output - ) - - def test_reentrant_switch_run_callable_has_del(self): - output = self.run_script('fail_clearing_run_switches.py') - self.assertIn( - "RESULTS [" - "('G.__getattribute__', 'run'), ('RunCallable', '__del__'), " - "('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')" - "]", - output - ) - -if __name__ == '__main__': - unittest.main() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_greenlet_trash.py b/port/lib/python3.11/site-packages/greenlet/tests/test_greenlet_trash.py deleted file mode 100644 index c1fc137..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_greenlet_trash.py +++ /dev/null @@ -1,187 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tests for greenlets interacting with the CPython trash can API. - -The CPython trash can API is not designed to be re-entered from a -single thread. But this can happen using greenlets, if something -during the object deallocation process switches greenlets, and this second -greenlet then causes the trash can to get entered again. Here, we do this -very explicitly, but in other cases (like gevent) it could be arbitrarily more -complicated: for example, a weakref callback might try to acquire a lock that's -already held by another greenlet; that would allow a greenlet switch to occur. - -See https://github.com/gevent/gevent/issues/1909 - -This test is fragile and relies on details of the CPython -implementation (like most of the rest of this package): - - - We enter the trashcan and deferred deallocation after - ``_PyTrash_UNWIND_LEVEL`` calls. This constant, defined in - CPython's object.c, is generally 50. That's basically how many objects are required to - get us into the deferred deallocation situation. - - - The test fails by hitting an ``assert()`` in object.c; if the - build didn't enable assert, then we don't catch this. - - - If the test fails in that way, the interpreter crashes. -""" -from __future__ import print_function, absolute_import, division - -import unittest - - -class TestTrashCanReEnter(unittest.TestCase): - - def test_it(self): - try: - # pylint:disable-next=no-name-in-module - from greenlet._greenlet import get_tstate_trash_delete_nesting # pylint:disable=unused-import - except ImportError: - import sys - # Python 3.13 has not "trash delete nesting" anymore (but "delete later") - assert sys.version_info[:2] >= (3, 13) - self.skipTest("get_tstate_trash_delete_nesting is not available.") - - # Try several times to trigger it, because it isn't 100% - # reliable. - for _ in range(10): - self.check_it() - - def check_it(self): # pylint:disable=too-many-statements - import greenlet - from greenlet._greenlet import get_tstate_trash_delete_nesting # pylint:disable=no-name-in-module - main = greenlet.getcurrent() - - assert get_tstate_trash_delete_nesting() == 0 - - # We expect to be in deferred deallocation after this many - # deallocations have occurred. TODO: I wish we had a better way to do - # this --- that was before get_tstate_trash_delete_nesting; perhaps - # we can use that API to do better? - TRASH_UNWIND_LEVEL = 50 - # How many objects to put in a container; it's the container that - # queues objects for deferred deallocation. - OBJECTS_PER_CONTAINER = 500 - - class Dealloc: # define the class here because we alter class variables each time we run. - """ - An object with a ``__del__`` method. When it starts getting deallocated - from a deferred trash can run, it switches greenlets, allocates more objects - which then also go in the trash can. If we don't save state appropriately, - nesting gets out of order and we can crash the interpreter. - """ - - #: Has our deallocation actually run and switched greenlets? - #: When it does, this will be set to the current greenlet. This should - #: be happening in the main greenlet, so we check that down below. - SPAWNED = False - - #: Has the background greenlet run? - BG_RAN = False - - BG_GLET = None - - #: How many of these things have ever been allocated. - CREATED = 0 - - #: How many of these things have ever been deallocated. - DESTROYED = 0 - - #: How many were destroyed not in the main greenlet. There should always - #: be some. - #: If the test is broken or things change in the trashcan implementation, - #: this may not be correct. - DESTROYED_BG = 0 - - def __init__(self, sequence_number): - """ - :param sequence_number: The ordinal of this object during - one particular creation run. This is used to detect (guess, really) - when we have entered the trash can's deferred deallocation. - """ - self.i = sequence_number - Dealloc.CREATED += 1 - - def __del__(self): - if self.i == TRASH_UNWIND_LEVEL and not self.SPAWNED: - Dealloc.SPAWNED = greenlet.getcurrent() - other = Dealloc.BG_GLET = greenlet.greenlet(background_greenlet) - x = other.switch() - assert x == 42 - # It's important that we don't switch back to the greenlet, - # we leave it hanging there in an incomplete state. But we don't let it - # get collected, either. If we complete it now, while we're still - # in the scope of the initial trash can, things work out and we - # don't see the problem. We need this greenlet to complete - # at some point in the future, after we've exited this trash can invocation. - del other - elif self.i == 40 and greenlet.getcurrent() is not main: - Dealloc.BG_RAN = True - try: - main.switch(42) - except greenlet.GreenletExit as ex: - # We expect this; all references to us go away - # while we're still running, and we need to finish deleting - # ourself. - Dealloc.BG_RAN = type(ex) - del ex - - # Record the fact that we're dead last of all. This ensures that - # we actually get returned too. - Dealloc.DESTROYED += 1 - if greenlet.getcurrent() is not main: - Dealloc.DESTROYED_BG += 1 - - - def background_greenlet(): - # We direct through a second function, instead of - # directly calling ``make_some()``, so that we have complete - # control over when these objects are destroyed: we need them - # to be destroyed in the context of the background greenlet - t = make_some() - del t # Triggere deletion. - - def make_some(): - t = () - i = OBJECTS_PER_CONTAINER - while i: - # Nest the tuples; it's the recursion that gets us - # into trash. - t = (Dealloc(i), t) - i -= 1 - return t - - - some = make_some() - self.assertEqual(Dealloc.CREATED, OBJECTS_PER_CONTAINER) - self.assertEqual(Dealloc.DESTROYED, 0) - - # If we're going to crash, it should be on the following line. - # We only crash if ``assert()`` is enabled, of course. - del some - - # For non-debug builds of CPython, we won't crash. The best we can do is check - # the nesting level explicitly. - self.assertEqual(0, get_tstate_trash_delete_nesting()) - - # Discard this, raising GreenletExit into where it is waiting. - Dealloc.BG_GLET = None - # The same nesting level maintains. - self.assertEqual(0, get_tstate_trash_delete_nesting()) - - # We definitely cleaned some up in the background - self.assertGreater(Dealloc.DESTROYED_BG, 0) - - # Make sure all the cleanups happened. - self.assertIs(Dealloc.SPAWNED, main) - self.assertTrue(Dealloc.BG_RAN) - self.assertEqual(Dealloc.BG_RAN, greenlet.GreenletExit) - self.assertEqual(Dealloc.CREATED, Dealloc.DESTROYED ) - self.assertEqual(Dealloc.CREATED, OBJECTS_PER_CONTAINER * 2) - - import gc - gc.collect() - - -if __name__ == '__main__': - unittest.main() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_leaks.py b/port/lib/python3.11/site-packages/greenlet/tests/test_leaks.py deleted file mode 100644 index ed1fa71..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_leaks.py +++ /dev/null @@ -1,443 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Testing scenarios that may have leaked. -""" -from __future__ import print_function, absolute_import, division - -import sys -import gc - -import time -import weakref -import threading - - -import greenlet -from . import TestCase -from .leakcheck import fails_leakcheck -from .leakcheck import ignores_leakcheck -from .leakcheck import RUNNING_ON_MANYLINUX - -# pylint:disable=protected-access - -assert greenlet.GREENLET_USE_GC # Option to disable this was removed in 1.0 - -class HasFinalizerTracksInstances(object): - EXTANT_INSTANCES = set() - def __init__(self, msg): - self.msg = sys.intern(msg) - self.EXTANT_INSTANCES.add(id(self)) - def __del__(self): - self.EXTANT_INSTANCES.remove(id(self)) - def __repr__(self): - return "" % ( - id(self), self.msg - ) - @classmethod - def reset(cls): - cls.EXTANT_INSTANCES.clear() - - -class TestLeaks(TestCase): - - def test_arg_refs(self): - args = ('a', 'b', 'c') - refcount_before = sys.getrefcount(args) - # pylint:disable=unnecessary-lambda - g = greenlet.greenlet( - lambda *args: greenlet.getcurrent().parent.switch(*args)) - for _ in range(100): - g.switch(*args) - self.assertEqual(sys.getrefcount(args), refcount_before) - - def test_kwarg_refs(self): - kwargs = {} - # pylint:disable=unnecessary-lambda - g = greenlet.greenlet( - lambda **kwargs: greenlet.getcurrent().parent.switch(**kwargs)) - for _ in range(100): - g.switch(**kwargs) - self.assertEqual(sys.getrefcount(kwargs), 2) - - - @staticmethod - def __recycle_threads(): - # By introducing a thread that does sleep we allow other threads, - # that have triggered their __block condition, but did not have a - # chance to deallocate their thread state yet, to finally do so. - # The way it works is by requiring a GIL switch (different thread), - # which does a GIL release (sleep), which might do a GIL switch - # to finished threads and allow them to clean up. - def worker(): - time.sleep(0.001) - t = threading.Thread(target=worker) - t.start() - time.sleep(0.001) - t.join(10) - - def test_threaded_leak(self): - gg = [] - def worker(): - # only main greenlet present - gg.append(weakref.ref(greenlet.getcurrent())) - for _ in range(2): - t = threading.Thread(target=worker) - t.start() - t.join(10) - del t - greenlet.getcurrent() # update ts_current - self.__recycle_threads() - greenlet.getcurrent() # update ts_current - gc.collect() - greenlet.getcurrent() # update ts_current - for g in gg: - self.assertIsNone(g()) - - def test_threaded_adv_leak(self): - gg = [] - def worker(): - # main and additional *finished* greenlets - ll = greenlet.getcurrent().ll = [] - def additional(): - ll.append(greenlet.getcurrent()) - for _ in range(2): - greenlet.greenlet(additional).switch() - gg.append(weakref.ref(greenlet.getcurrent())) - for _ in range(2): - t = threading.Thread(target=worker) - t.start() - t.join(10) - del t - greenlet.getcurrent() # update ts_current - self.__recycle_threads() - greenlet.getcurrent() # update ts_current - gc.collect() - greenlet.getcurrent() # update ts_current - for g in gg: - self.assertIsNone(g()) - - def assertClocksUsed(self): - used = greenlet._greenlet.get_clocks_used_doing_optional_cleanup() - self.assertGreaterEqual(used, 0) - # we don't lose the value - greenlet._greenlet.enable_optional_cleanup(True) - used2 = greenlet._greenlet.get_clocks_used_doing_optional_cleanup() - self.assertEqual(used, used2) - self.assertGreater(greenlet._greenlet.CLOCKS_PER_SEC, 1) - - def _check_issue251(self, - manually_collect_background=True, - explicit_reference_to_switch=False): - # See https://github.com/python-greenlet/greenlet/issues/251 - # Killing a greenlet (probably not the main one) - # in one thread from another thread would - # result in leaking a list (the ts_delkey list). - # We no longer use lists to hold that stuff, though. - - # For the test to be valid, even empty lists have to be tracked by the - # GC - - assert gc.is_tracked([]) - HasFinalizerTracksInstances.reset() - greenlet.getcurrent() - greenlets_before = self.count_objects(greenlet.greenlet, exact_kind=False) - - background_glet_running = threading.Event() - background_glet_killed = threading.Event() - background_greenlets = [] - - # XXX: Switching this to a greenlet subclass that overrides - # run results in all callers failing the leaktest; that - # greenlet instance is leaked. There's a bound method for - # run() living on the stack of the greenlet in g_initialstub, - # and since we don't manually switch back to the background - # greenlet to let it "fall off the end" and exit the - # g_initialstub function, it never gets cleaned up. Making the - # garbage collector aware of this bound method (making it an - # attribute of the greenlet structure and traversing into it) - # doesn't help, for some reason. - def background_greenlet(): - # Throw control back to the main greenlet. - jd = HasFinalizerTracksInstances("DELETING STACK OBJECT") - greenlet._greenlet.set_thread_local( - 'test_leaks_key', - HasFinalizerTracksInstances("DELETING THREAD STATE")) - # Explicitly keeping 'switch' in a local variable - # breaks this test in all versions - if explicit_reference_to_switch: - s = greenlet.getcurrent().parent.switch - s([jd]) - else: - greenlet.getcurrent().parent.switch([jd]) - - bg_main_wrefs = [] - - def background_thread(): - glet = greenlet.greenlet(background_greenlet) - bg_main_wrefs.append(weakref.ref(glet.parent)) - - background_greenlets.append(glet) - glet.switch() # Be sure it's active. - # Control is ours again. - del glet # Delete one reference from the thread it runs in. - background_glet_running.set() - background_glet_killed.wait(10) - - # To trigger the background collection of the dead - # greenlet, thus clearing out the contents of the list, we - # need to run some APIs. See issue 252. - if manually_collect_background: - greenlet.getcurrent() - - - t = threading.Thread(target=background_thread) - t.start() - background_glet_running.wait(10) - greenlet.getcurrent() - lists_before = self.count_objects(list, exact_kind=True) - - assert len(background_greenlets) == 1 - self.assertFalse(background_greenlets[0].dead) - # Delete the last reference to the background greenlet - # from a different thread. This puts it in the background thread's - # ts_delkey list. - del background_greenlets[:] - background_glet_killed.set() - - # Now wait for the background thread to die. - t.join(10) - del t - # As part of the fix for 252, we need to cycle the ceval.c - # interpreter loop to be sure it has had a chance to process - # the pending call. - self.wait_for_pending_cleanups() - - lists_after = self.count_objects(list, exact_kind=True) - greenlets_after = self.count_objects(greenlet.greenlet, exact_kind=False) - - # On 2.7, we observe that lists_after is smaller than - # lists_before. No idea what lists got cleaned up. All the - # Python 3 versions match exactly. - self.assertLessEqual(lists_after, lists_before) - # On versions after 3.6, we've successfully cleaned up the - # greenlet references thanks to the internal "vectorcall" - # protocol; prior to that, there is a reference path through - # the ``greenlet.switch`` method still on the stack that we - # can't reach to clean up. The C code goes through terrific - # lengths to clean that up. - if not explicit_reference_to_switch \ - and greenlet._greenlet.get_clocks_used_doing_optional_cleanup() is not None: - # If cleanup was disabled, though, we may not find it. - self.assertEqual(greenlets_after, greenlets_before) - if manually_collect_background: - # TODO: Figure out how to make this work! - # The one on the stack is still leaking somehow - # in the non-manually-collect state. - self.assertEqual(HasFinalizerTracksInstances.EXTANT_INSTANCES, set()) - else: - # The explicit reference prevents us from collecting it - # and it isn't always found by the GC either for some - # reason. The entire frame is leaked somehow, on some - # platforms (e.g., MacPorts builds of Python (all - # versions!)), but not on other platforms (the linux and - # windows builds on GitHub actions and Appveyor). So we'd - # like to write a test that proves that the main greenlet - # sticks around, and we can on my machine (macOS 11.6, - # MacPorts builds of everything) but we can't write that - # same test on other platforms. However, hopefully iteration - # done by leakcheck will find it. - pass - - if greenlet._greenlet.get_clocks_used_doing_optional_cleanup() is not None: - self.assertClocksUsed() - - def test_issue251_killing_cross_thread_leaks_list(self): - self._check_issue251() - - def test_issue251_with_cleanup_disabled(self): - greenlet._greenlet.enable_optional_cleanup(False) - try: - self._check_issue251() - finally: - greenlet._greenlet.enable_optional_cleanup(True) - - @fails_leakcheck - def test_issue251_issue252_need_to_collect_in_background(self): - # Between greenlet 1.1.2 and the next version, this was still - # failing because the leak of the list still exists when we - # don't call a greenlet API before exiting the thread. The - # proximate cause is that neither of the two greenlets from - # the background thread are actually being destroyed, even - # though the GC is in fact visiting both objects. It's not - # clear where that leak is? For some reason the thread-local - # dict holding it isn't being cleaned up. - # - # The leak, I think, is in the CPYthon internal function that - # calls into green_switch(). The argument tuple is still on - # the C stack somewhere and can't be reached? That doesn't - # make sense, because the tuple should be collectable when - # this object goes away. - # - # Note that this test sometimes spuriously passes on Linux, - # for some reason, but I've never seen it pass on macOS. - self._check_issue251(manually_collect_background=False) - - @fails_leakcheck - def test_issue251_issue252_need_to_collect_in_background_cleanup_disabled(self): - self.expect_greenlet_leak = True - greenlet._greenlet.enable_optional_cleanup(False) - try: - self._check_issue251(manually_collect_background=False) - finally: - greenlet._greenlet.enable_optional_cleanup(True) - - @fails_leakcheck - def test_issue251_issue252_explicit_reference_not_collectable(self): - self._check_issue251( - manually_collect_background=False, - explicit_reference_to_switch=True) - - UNTRACK_ATTEMPTS = 100 - - def _only_test_some_versions(self): - # We're only looking for this problem specifically on 3.11, - # and this set of tests is relatively fragile, depending on - # OS and memory management details. So we want to run it on 3.11+ - # (obviously) but not every older 3.x version in order to reduce - # false negatives. At the moment, those false results seem to have - # resolved, so we are actually running this on 3.8+ - assert sys.version_info[0] >= 3 - if sys.version_info[:2] < (3, 8): - self.skipTest('Only observed on 3.11') - if RUNNING_ON_MANYLINUX: - self.skipTest("Slow and not worth repeating here") - - @ignores_leakcheck - # Because we're just trying to track raw memory, not objects, and running - # the leakcheck makes an already slow test slower. - def test_untracked_memory_doesnt_increase(self): - # See https://github.com/gevent/gevent/issues/1924 - # and https://github.com/python-greenlet/greenlet/issues/328 - self._only_test_some_versions() - def f(): - return 1 - - ITER = 10000 - def run_it(): - for _ in range(ITER): - greenlet.greenlet(f).switch() - - # Establish baseline - for _ in range(3): - run_it() - - # uss: (Linux, macOS, Windows): aka "Unique Set Size", this is - # the memory which is unique to a process and which would be - # freed if the process was terminated right now. - uss_before = self.get_process_uss() - - for count in range(self.UNTRACK_ATTEMPTS): - uss_before = max(uss_before, self.get_process_uss()) - run_it() - - uss_after = self.get_process_uss() - if uss_after <= uss_before and count > 1: - break - - self.assertLessEqual(uss_after, uss_before) - - def _check_untracked_memory_thread(self, deallocate_in_thread=True): - self._only_test_some_versions() - # Like the above test, but what if there are a bunch of - # unfinished greenlets in a thread that dies? - # Does it matter if we deallocate in the thread or not? - EXIT_COUNT = [0] - - def f(): - try: - greenlet.getcurrent().parent.switch() - except greenlet.GreenletExit: - EXIT_COUNT[0] += 1 - raise - return 1 - - ITER = 10000 - def run_it(): - glets = [] - for _ in range(ITER): - # Greenlet starts, switches back to us. - # We keep a strong reference to the greenlet though so it doesn't - # get a GreenletExit exception. - g = greenlet.greenlet(f) - glets.append(g) - g.switch() - - return glets - - test = self - - class ThreadFunc: - uss_before = uss_after = 0 - glets = () - ITER = 2 - def __call__(self): - self.uss_before = test.get_process_uss() - - for _ in range(self.ITER): - self.glets += tuple(run_it()) - - for g in self.glets: - test.assertIn('suspended active', str(g)) - # Drop them. - if deallocate_in_thread: - self.glets = () - self.uss_after = test.get_process_uss() - - # Establish baseline - uss_before = uss_after = None - for count in range(self.UNTRACK_ATTEMPTS): - EXIT_COUNT[0] = 0 - thread_func = ThreadFunc() - t = threading.Thread(target=thread_func) - t.start() - t.join(30) - self.assertFalse(t.is_alive()) - - if uss_before is None: - uss_before = thread_func.uss_before - - uss_before = max(uss_before, thread_func.uss_before) - if deallocate_in_thread: - self.assertEqual(thread_func.glets, ()) - self.assertEqual(EXIT_COUNT[0], ITER * thread_func.ITER) - - del thread_func # Deallocate the greenlets; but this won't raise into them - del t - if not deallocate_in_thread: - self.assertEqual(EXIT_COUNT[0], 0) - if deallocate_in_thread: - self.wait_for_pending_cleanups() - - uss_after = self.get_process_uss() - # See if we achieve a non-growth state at some point. Break when we do. - if uss_after <= uss_before and count > 1: - break - - self.wait_for_pending_cleanups() - uss_after = self.get_process_uss() - self.assertLessEqual(uss_after, uss_before, "after attempts %d" % (count,)) - - @ignores_leakcheck - # Because we're just trying to track raw memory, not objects, and running - # the leakcheck makes an already slow test slower. - def test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread(self): - self._check_untracked_memory_thread(deallocate_in_thread=True) - - @ignores_leakcheck - # Because the main greenlets from the background threads do not exit in a timely fashion, - # we fail the object-based leakchecks. - def test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main(self): - self._check_untracked_memory_thread(deallocate_in_thread=False) - -if __name__ == '__main__': - __import__('unittest').main() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_stack_saved.py b/port/lib/python3.11/site-packages/greenlet/tests/test_stack_saved.py deleted file mode 100644 index b362bf9..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_stack_saved.py +++ /dev/null @@ -1,19 +0,0 @@ -import greenlet -from . import TestCase - - -class Test(TestCase): - - def test_stack_saved(self): - main = greenlet.getcurrent() - self.assertEqual(main._stack_saved, 0) - - def func(): - main.switch(main._stack_saved) - - g = greenlet.greenlet(func) - x = g.switch() - self.assertGreater(x, 0) - self.assertGreater(g._stack_saved, 0) - g.switch() - self.assertEqual(g._stack_saved, 0) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_throw.py b/port/lib/python3.11/site-packages/greenlet/tests/test_throw.py deleted file mode 100644 index f4f9a14..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_throw.py +++ /dev/null @@ -1,128 +0,0 @@ -import sys - - -from greenlet import greenlet -from . import TestCase - -def switch(*args): - return greenlet.getcurrent().parent.switch(*args) - - -class ThrowTests(TestCase): - def test_class(self): - def f(): - try: - switch("ok") - except RuntimeError: - switch("ok") - return - switch("fail") - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw(RuntimeError) - self.assertEqual(res, "ok") - - def test_val(self): - def f(): - try: - switch("ok") - except RuntimeError: - val = sys.exc_info()[1] - if str(val) == "ciao": - switch("ok") - return - switch("fail") - - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw(RuntimeError("ciao")) - self.assertEqual(res, "ok") - - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw(RuntimeError, "ciao") - self.assertEqual(res, "ok") - - def test_kill(self): - def f(): - switch("ok") - switch("fail") - g = greenlet(f) - res = g.switch() - self.assertEqual(res, "ok") - res = g.throw() - self.assertTrue(isinstance(res, greenlet.GreenletExit)) - self.assertTrue(g.dead) - res = g.throw() # immediately eaten by the already-dead greenlet - self.assertTrue(isinstance(res, greenlet.GreenletExit)) - - def test_throw_goes_to_original_parent(self): - main = greenlet.getcurrent() - - def f1(): - try: - main.switch("f1 ready to catch") - except IndexError: - return "caught" - return "normal exit" - - def f2(): - main.switch("from f2") - - g1 = greenlet(f1) - g2 = greenlet(f2, parent=g1) - with self.assertRaises(IndexError): - g2.throw(IndexError) - self.assertTrue(g2.dead) - self.assertTrue(g1.dead) - - g1 = greenlet(f1) - g2 = greenlet(f2, parent=g1) - res = g1.switch() - self.assertEqual(res, "f1 ready to catch") - res = g2.throw(IndexError) - self.assertEqual(res, "caught") - self.assertTrue(g2.dead) - self.assertTrue(g1.dead) - - g1 = greenlet(f1) - g2 = greenlet(f2, parent=g1) - res = g1.switch() - self.assertEqual(res, "f1 ready to catch") - res = g2.switch() - self.assertEqual(res, "from f2") - res = g2.throw(IndexError) - self.assertEqual(res, "caught") - self.assertTrue(g2.dead) - self.assertTrue(g1.dead) - - def test_non_traceback_param(self): - with self.assertRaises(TypeError) as exc: - greenlet.getcurrent().throw( - Exception, - Exception(), - self - ) - self.assertEqual(str(exc.exception), - "throw() third argument must be a traceback object") - - def test_instance_of_wrong_type(self): - with self.assertRaises(TypeError) as exc: - greenlet.getcurrent().throw( - Exception(), - BaseException() - ) - - self.assertEqual(str(exc.exception), - "instance exception may not have a separate value") - - def test_not_throwable(self): - with self.assertRaises(TypeError) as exc: - greenlet.getcurrent().throw( - "abc" - ) - self.assertEqual(str(exc.exception), - "exceptions must be classes, or instances, not str") diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_tracing.py b/port/lib/python3.11/site-packages/greenlet/tests/test_tracing.py deleted file mode 100644 index c044d4b..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_tracing.py +++ /dev/null @@ -1,291 +0,0 @@ -from __future__ import print_function -import sys -import greenlet -import unittest - -from . import TestCase -from . import PY312 - -# https://discuss.python.org/t/cpython-3-12-greenlet-and-tracing-profiling-how-to-not-crash-and-get-correct-results/33144/2 -DEBUG_BUILD_PY312 = ( - PY312 and hasattr(sys, 'gettotalrefcount'), - "Broken on debug builds of Python 3.12" -) - -class SomeError(Exception): - pass - -class GreenletTracer(object): - oldtrace = None - - def __init__(self, error_on_trace=False): - self.actions = [] - self.error_on_trace = error_on_trace - - def __call__(self, *args): - self.actions.append(args) - if self.error_on_trace: - raise SomeError - - def __enter__(self): - self.oldtrace = greenlet.settrace(self) - return self.actions - - def __exit__(self, *args): - greenlet.settrace(self.oldtrace) - - -class TestGreenletTracing(TestCase): - """ - Tests of ``greenlet.settrace()`` - """ - - def test_a_greenlet_tracing(self): - main = greenlet.getcurrent() - def dummy(): - pass - def dummyexc(): - raise SomeError() - - with GreenletTracer() as actions: - g1 = greenlet.greenlet(dummy) - g1.switch() - g2 = greenlet.greenlet(dummyexc) - self.assertRaises(SomeError, g2.switch) - - self.assertEqual(actions, [ - ('switch', (main, g1)), - ('switch', (g1, main)), - ('switch', (main, g2)), - ('throw', (g2, main)), - ]) - - def test_b_exception_disables_tracing(self): - main = greenlet.getcurrent() - def dummy(): - main.switch() - g = greenlet.greenlet(dummy) - g.switch() - with GreenletTracer(error_on_trace=True) as actions: - self.assertRaises(SomeError, g.switch) - self.assertEqual(greenlet.gettrace(), None) - - self.assertEqual(actions, [ - ('switch', (main, g)), - ]) - - def test_set_same_tracer_twice(self): - # https://github.com/python-greenlet/greenlet/issues/332 - # Our logic in asserting that the tracefunction should - # gain a reference was incorrect if the same tracefunction was set - # twice. - tracer = GreenletTracer() - with tracer: - greenlet.settrace(tracer) - - -class PythonTracer(object): - oldtrace = None - - def __init__(self): - self.actions = [] - - def __call__(self, frame, event, arg): - # Record the co_name so we have an idea what function we're in. - self.actions.append((event, frame.f_code.co_name)) - - def __enter__(self): - self.oldtrace = sys.setprofile(self) - return self.actions - - def __exit__(self, *args): - sys.setprofile(self.oldtrace) - -def tpt_callback(): - return 42 - -class TestPythonTracing(TestCase): - """ - Tests of the interaction of ``sys.settrace()`` - with greenlet facilities. - - NOTE: Most of this is probably CPython specific. - """ - - maxDiff = None - - def test_trace_events_trivial(self): - with PythonTracer() as actions: - tpt_callback() - # If we use the sys.settrace instead of setprofile, we get - # this: - - # self.assertEqual(actions, [ - # ('call', 'tpt_callback'), - # ('call', '__exit__'), - # ]) - - self.assertEqual(actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - def _trace_switch(self, glet): - with PythonTracer() as actions: - glet.switch() - return actions - - def _check_trace_events_func_already_set(self, glet): - actions = self._trace_switch(glet) - self.assertEqual(actions, [ - ('return', '__enter__'), - ('c_call', '_trace_switch'), - ('call', 'run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('return', 'run'), - ('c_return', '_trace_switch'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - def test_trace_events_into_greenlet_func_already_set(self): - def run(): - return tpt_callback() - - self._check_trace_events_func_already_set(greenlet.greenlet(run)) - - def test_trace_events_into_greenlet_subclass_already_set(self): - class X(greenlet.greenlet): - def run(self): - return tpt_callback() - self._check_trace_events_func_already_set(X()) - - def _check_trace_events_from_greenlet_sets_profiler(self, g, tracer): - g.switch() - tpt_callback() - tracer.__exit__() - self.assertEqual(tracer.actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('return', 'run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - - def test_trace_events_from_greenlet_func_sets_profiler(self): - tracer = PythonTracer() - def run(): - tracer.__enter__() - return tpt_callback() - - self._check_trace_events_from_greenlet_sets_profiler(greenlet.greenlet(run), - tracer) - - def test_trace_events_from_greenlet_subclass_sets_profiler(self): - tracer = PythonTracer() - class X(greenlet.greenlet): - def run(self): - tracer.__enter__() - return tpt_callback() - - self._check_trace_events_from_greenlet_sets_profiler(X(), tracer) - - @unittest.skipIf(*DEBUG_BUILD_PY312) - def test_trace_events_multiple_greenlets_switching(self): - tracer = PythonTracer() - - g1 = None - g2 = None - - def g1_run(): - tracer.__enter__() - tpt_callback() - g2.switch() - tpt_callback() - return 42 - - def g2_run(): - tpt_callback() - tracer.__exit__() - tpt_callback() - g1.switch() - - g1 = greenlet.greenlet(g1_run) - g2 = greenlet.greenlet(g2_run) - - x = g1.switch() - self.assertEqual(x, 42) - tpt_callback() # ensure not in the trace - self.assertEqual(tracer.actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('c_call', 'g1_run'), - ('call', 'g2_run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - @unittest.skipIf(*DEBUG_BUILD_PY312) - def test_trace_events_multiple_greenlets_switching_siblings(self): - # Like the first version, but get both greenlets running first - # as "siblings" and then establish the tracing. - tracer = PythonTracer() - - g1 = None - g2 = None - - def g1_run(): - greenlet.getcurrent().parent.switch() - tracer.__enter__() - tpt_callback() - g2.switch() - tpt_callback() - return 42 - - def g2_run(): - greenlet.getcurrent().parent.switch() - - tpt_callback() - tracer.__exit__() - tpt_callback() - g1.switch() - - g1 = greenlet.greenlet(g1_run) - g2 = greenlet.greenlet(g2_run) - - # Start g1 - g1.switch() - # And it immediately returns control to us. - # Start g2 - g2.switch() - # Which also returns. Now kick of the real part of the - # test. - x = g1.switch() - self.assertEqual(x, 42) - - tpt_callback() # ensure not in the trace - self.assertEqual(tracer.actions, [ - ('return', '__enter__'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('c_call', 'g1_run'), - ('call', 'tpt_callback'), - ('return', 'tpt_callback'), - ('call', '__exit__'), - ('c_call', '__exit__'), - ]) - - -if __name__ == '__main__': - unittest.main() diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_version.py b/port/lib/python3.11/site-packages/greenlet/tests/test_version.py deleted file mode 100644 index 96c17cf..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_version.py +++ /dev/null @@ -1,41 +0,0 @@ -#! /usr/bin/env python -from __future__ import absolute_import -from __future__ import print_function - -import sys -import os -from unittest import TestCase as NonLeakingTestCase - -import greenlet - -# No reason to run this multiple times under leakchecks, -# it doesn't do anything. -class VersionTests(NonLeakingTestCase): - def test_version(self): - def find_dominating_file(name): - if os.path.exists(name): - return name - - tried = [] - here = os.path.abspath(os.path.dirname(__file__)) - for i in range(10): - up = ['..'] * i - path = [here] + up + [name] - fname = os.path.join(*path) - fname = os.path.abspath(fname) - tried.append(fname) - if os.path.exists(fname): - return fname - raise AssertionError("Could not find file " + name + "; checked " + str(tried)) - - try: - setup_py = find_dominating_file('setup.py') - except AssertionError as e: - self.skipTest("Unable to find setup.py; must be out of tree. " + str(e)) - - - invoke_setup = "%s %s --version" % (sys.executable, setup_py) - with os.popen(invoke_setup) as f: - sversion = f.read().strip() - - self.assertEqual(sversion, greenlet.__version__) diff --git a/port/lib/python3.11/site-packages/greenlet/tests/test_weakref.py b/port/lib/python3.11/site-packages/greenlet/tests/test_weakref.py deleted file mode 100644 index 05a38a7..0000000 --- a/port/lib/python3.11/site-packages/greenlet/tests/test_weakref.py +++ /dev/null @@ -1,35 +0,0 @@ -import gc -import weakref - - -import greenlet -from . import TestCase - -class WeakRefTests(TestCase): - def test_dead_weakref(self): - def _dead_greenlet(): - g = greenlet.greenlet(lambda: None) - g.switch() - return g - o = weakref.ref(_dead_greenlet()) - gc.collect() - self.assertEqual(o(), None) - - def test_inactive_weakref(self): - o = weakref.ref(greenlet.greenlet()) - gc.collect() - self.assertEqual(o(), None) - - def test_dealloc_weakref(self): - seen = [] - def worker(): - try: - greenlet.getcurrent().parent.switch() - finally: - seen.append(g()) - g = greenlet.greenlet(worker) - g.switch() - g2 = greenlet.greenlet(lambda: None, g) - g = weakref.ref(g2) - g2 = None - self.assertEqual(seen, [None]) diff --git a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/INSTALLER b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/LICENSE b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/LICENSE deleted file mode 100644 index 0dca6e1..0000000 --- a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -2009-2024 (c) Benoît Chesneau -2009-2015 (c) Paul J. Davis - -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/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/METADATA b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/METADATA deleted file mode 100644 index 550aef2..0000000 --- a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/METADATA +++ /dev/null @@ -1,130 +0,0 @@ -Metadata-Version: 2.1 -Name: gunicorn -Version: 23.0.0 -Summary: WSGI HTTP Server for UNIX -Author-email: Benoit Chesneau -License: MIT -Project-URL: Homepage, https://gunicorn.org -Project-URL: Documentation, https://docs.gunicorn.org -Project-URL: Issue tracker, https://github.com/benoitc/gunicorn/issues -Project-URL: Source code, https://github.com/benoitc/gunicorn -Project-URL: Changelog, https://docs.gunicorn.org/en/stable/news.html -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Other Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: POSIX -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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 :: Only -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet -Classifier: Topic :: Utilities -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: packaging -Requires-Dist: importlib-metadata ; python_version < "3.8" -Provides-Extra: eventlet -Requires-Dist: eventlet !=0.36.0,>=0.24.1 ; extra == 'eventlet' -Provides-Extra: gevent -Requires-Dist: gevent >=1.4.0 ; extra == 'gevent' -Provides-Extra: gthread -Provides-Extra: setproctitle -Requires-Dist: setproctitle ; extra == 'setproctitle' -Provides-Extra: testing -Requires-Dist: gevent ; extra == 'testing' -Requires-Dist: eventlet ; extra == 'testing' -Requires-Dist: coverage ; extra == 'testing' -Requires-Dist: pytest ; extra == 'testing' -Requires-Dist: pytest-cov ; extra == 'testing' -Provides-Extra: tornado -Requires-Dist: tornado >=0.2 ; extra == 'tornado' - -Gunicorn --------- - -.. image:: https://img.shields.io/pypi/v/gunicorn.svg?style=flat - :alt: PyPI version - :target: https://pypi.python.org/pypi/gunicorn - -.. image:: https://img.shields.io/pypi/pyversions/gunicorn.svg - :alt: Supported Python versions - :target: https://pypi.python.org/pypi/gunicorn - -.. image:: https://github.com/benoitc/gunicorn/actions/workflows/tox.yml/badge.svg - :alt: Build Status - :target: https://github.com/benoitc/gunicorn/actions/workflows/tox.yml - -.. image:: https://github.com/benoitc/gunicorn/actions/workflows/lint.yml/badge.svg - :alt: Lint Status - :target: https://github.com/benoitc/gunicorn/actions/workflows/lint.yml - -Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork -worker model ported from Ruby's Unicorn_ project. The Gunicorn server is broadly -compatible with various web frameworks, simply implemented, light on server -resource usage, and fairly speedy. - -Feel free to join us in `#gunicorn`_ on `Libera.chat`_. - -Documentation -------------- - -The documentation is hosted at https://docs.gunicorn.org. - -Installation ------------- - -Gunicorn requires **Python 3.x >= 3.7**. - -Install from PyPI:: - - $ pip install gunicorn - - -Usage ------ - -Basic usage:: - - $ gunicorn [OPTIONS] APP_MODULE - -Where ``APP_MODULE`` is of the pattern ``$(MODULE_NAME):$(VARIABLE_NAME)``. The -module name can be a full dotted path. The variable name refers to a WSGI -callable that should be found in the specified module. - -Example with test app:: - - $ cd examples - $ gunicorn --workers=2 test:app - - -Contributing ------------- - -See `our complete contributor's guide `_ for more details. - - -License -------- - -Gunicorn is released under the MIT License. See the LICENSE_ file for more -details. - -.. _Unicorn: https://bogomips.org/unicorn/ -.. _`#gunicorn`: https://web.libera.chat/?channels=#gunicorn -.. _`Libera.chat`: https://libera.chat/ -.. _LICENSE: https://github.com/benoitc/gunicorn/blob/master/LICENSE diff --git a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/RECORD b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/RECORD deleted file mode 100644 index 6cd2426..0000000 --- a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/RECORD +++ /dev/null @@ -1,77 +0,0 @@ -../../../bin/gunicorn,sha256=7lYbkJRP-c4ddopkOLmqgHRlY0j5GUcEkSCrNRDKAjs,236 -gunicorn-23.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -gunicorn-23.0.0.dist-info/LICENSE,sha256=ZkbNu6LpnjQh3RjCIXNXmh_eNH6DHa5q3ugO7-Mx6VE,1136 -gunicorn-23.0.0.dist-info/METADATA,sha256=KhY-mRcAcWCLIbXIHihsUNKWB5fGDOrsbq-JKQTBHY4,4421 -gunicorn-23.0.0.dist-info/RECORD,, -gunicorn-23.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -gunicorn-23.0.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91 -gunicorn-23.0.0.dist-info/entry_points.txt,sha256=bF8VNiG4H8W83JfEBcqcPMydv9hl04CS4kwh1KOYrFY,113 -gunicorn-23.0.0.dist-info/top_level.txt,sha256=cdMaa2yhxb8do-WioY9qRHUCfwf55YztjwQCncaInoE,9 -gunicorn/__init__.py,sha256=NaLW_JTiKLgqMXipjqzxFn-1wdiptlO2WxOB_KKwx94,257 -gunicorn/__main__.py,sha256=tviepyuwKyB6SPV28t2eZy_5PcCpT56z7QZjzbMpkQw,338 -gunicorn/__pycache__/__init__.cpython-311.pyc,, -gunicorn/__pycache__/__main__.cpython-311.pyc,, -gunicorn/__pycache__/arbiter.cpython-311.pyc,, -gunicorn/__pycache__/config.cpython-311.pyc,, -gunicorn/__pycache__/debug.cpython-311.pyc,, -gunicorn/__pycache__/errors.cpython-311.pyc,, -gunicorn/__pycache__/glogging.cpython-311.pyc,, -gunicorn/__pycache__/pidfile.cpython-311.pyc,, -gunicorn/__pycache__/reloader.cpython-311.pyc,, -gunicorn/__pycache__/sock.cpython-311.pyc,, -gunicorn/__pycache__/systemd.cpython-311.pyc,, -gunicorn/__pycache__/util.cpython-311.pyc,, -gunicorn/app/__init__.py,sha256=8m9lIbhRssnbGuBeQUA-vNSNbMeNju9Q_PUnnNfqOYU,105 -gunicorn/app/__pycache__/__init__.cpython-311.pyc,, -gunicorn/app/__pycache__/base.cpython-311.pyc,, -gunicorn/app/__pycache__/pasterapp.cpython-311.pyc,, -gunicorn/app/__pycache__/wsgiapp.cpython-311.pyc,, -gunicorn/app/base.py,sha256=KV2aIO50JTlakHL82q9zu3LhCJrDmUmaViwSy14Gk6U,7370 -gunicorn/app/pasterapp.py,sha256=BIa0mz_J86NuObUw2UIyjLYKUm8V3b034pJrTkvF-sA,2016 -gunicorn/app/wsgiapp.py,sha256=gVBgUc_3uSK0QzXYQ1XbutacEGjf44CgxAaYkgwfucY,1924 -gunicorn/arbiter.py,sha256=xcHpv8bsrYpIpu9q7YK4ue11f9kmz80dr7BUwKX3oxk,21470 -gunicorn/config.py,sha256=t3BChwMoBZwfV05Iy_n3oh232xvi1SORkOJfHFL_c-8,70318 -gunicorn/debug.py,sha256=c8cQv_g3d22JE6A4hv7FNmMhm4wq6iB_E-toorpqJcw,2263 -gunicorn/errors.py,sha256=iLTJQC4SVSRoygIGGHXvEp0d8UdzpeqmMRqUcF0JI14,897 -gunicorn/glogging.py,sha256=76MlUUc82FqdeD3R4qC8NeUHt8vxa3IBSxmeBtbZKtE,15273 -gunicorn/http/__init__.py,sha256=1k_WWvjT9eDDRDOutzXCebvYKm_qzaQA3GuLk0VkbJI,255 -gunicorn/http/__pycache__/__init__.cpython-311.pyc,, -gunicorn/http/__pycache__/body.cpython-311.pyc,, -gunicorn/http/__pycache__/errors.cpython-311.pyc,, -gunicorn/http/__pycache__/message.cpython-311.pyc,, -gunicorn/http/__pycache__/parser.cpython-311.pyc,, -gunicorn/http/__pycache__/unreader.cpython-311.pyc,, -gunicorn/http/__pycache__/wsgi.cpython-311.pyc,, -gunicorn/http/body.py,sha256=sQgp_hJUjx8DK6LYzklMTl-xKcX8efsbreCKzowCGmo,7600 -gunicorn/http/errors.py,sha256=6tcG9pCvRiooXpfudQBILzUPx3ertuQ5utjZeUNMUqA,3437 -gunicorn/http/message.py,sha256=ok4xnqWhntIn21gcPa1KYZWRYTbwsECpot-Eac47qFs,17632 -gunicorn/http/parser.py,sha256=wayoAFjQYERSwE4YGwI2AYSNGZ2eTNbGUtoqqQFph5U,1334 -gunicorn/http/unreader.py,sha256=D7bluz62A1aLZQ9XbpX0-nDBal9KPtp_pjokk2YNY8E,1913 -gunicorn/http/wsgi.py,sha256=x-zTT7gvRF4wipmvoVePz1qO407JZCU_sNU8yjcl_R4,12811 -gunicorn/instrument/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -gunicorn/instrument/__pycache__/__init__.cpython-311.pyc,, -gunicorn/instrument/__pycache__/statsd.cpython-311.pyc,, -gunicorn/instrument/statsd.py,sha256=ghmaniNEjMMLvvdQkDPpB_u9a8z4FBfWUE_C9O1KIYQ,4750 -gunicorn/pidfile.py,sha256=HntiveG8eJmwB8_D3o5cBXRuGKnC0cvWxg90MWh1hUc,2327 -gunicorn/reloader.py,sha256=oDuK2PWGyIMm0_vc1y196Z1EggOvBi-Iz_2UbRY7PsQ,3761 -gunicorn/sock.py,sha256=VVF2eeoxQEJ2OEoZoek3BFZTqj7wXvQql7jpdFAjVTI,6834 -gunicorn/systemd.py,sha256=DmWbcqeRyHdAIy70UCEg2J93v6PpESp3EFTNm0Djgyg,2498 -gunicorn/util.py,sha256=YqC4E3RxhFNH-W4LOqy1RtxcHRy9hRyYND92ZSNXEwc,19095 -gunicorn/workers/__init__.py,sha256=Y0Z6WhXKY6PuTbFkOkeEBzIfhDDg5FeqVg8aJp6lIZA,572 -gunicorn/workers/__pycache__/__init__.cpython-311.pyc,, -gunicorn/workers/__pycache__/base.cpython-311.pyc,, -gunicorn/workers/__pycache__/base_async.cpython-311.pyc,, -gunicorn/workers/__pycache__/geventlet.cpython-311.pyc,, -gunicorn/workers/__pycache__/ggevent.cpython-311.pyc,, -gunicorn/workers/__pycache__/gthread.cpython-311.pyc,, -gunicorn/workers/__pycache__/gtornado.cpython-311.pyc,, -gunicorn/workers/__pycache__/sync.cpython-311.pyc,, -gunicorn/workers/__pycache__/workertmp.cpython-311.pyc,, -gunicorn/workers/base.py,sha256=eM9MTLP9PdWL0Pm5V5byyBli-r8zF2MSEGjefr3y92M,9763 -gunicorn/workers/base_async.py,sha256=Oc-rSV81uHqvEqww2PM6tz75qNR07ChuqM6IkTOpzlk,5627 -gunicorn/workers/geventlet.py,sha256=s_I-gKYgDJnlAHdCxN_wfglODnDE1eJaZJZCJyNYg-4,6069 -gunicorn/workers/ggevent.py,sha256=OEhj-bFVBGQ-jbjr5S3gSvixJTa-YOQYht7fYTOCyt4,6030 -gunicorn/workers/gthread.py,sha256=moycCQoJS602u3U7gZEooYxqRP86Tq5bmQnipL4a4_c,12500 -gunicorn/workers/gtornado.py,sha256=zCHbxs5JeE9rtZa5mXlhftBlNlwp_tBWXuTQwqgv1so,5811 -gunicorn/workers/sync.py,sha256=mOY84VHbAx62lmo2DLuifkK9d6anEgvC7LAuYVJyRM4,7204 -gunicorn/workers/workertmp.py,sha256=bswGosCIDb_wBfdGaFqHopgxbmJ6rgVXYlVhJDWZKIc,1604 diff --git a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/REQUESTED b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/WHEEL b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/WHEEL deleted file mode 100644 index 1a9c535..0000000 --- a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (72.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt deleted file mode 100644 index fd14749..0000000 --- a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/entry_points.txt +++ /dev/null @@ -1,5 +0,0 @@ -[console_scripts] -gunicorn = gunicorn.app.wsgiapp:run - -[paste.server_runner] -main = gunicorn.app.pasterapp:serve diff --git a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/top_level.txt b/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/top_level.txt deleted file mode 100644 index 8f22dcc..0000000 --- a/port/lib/python3.11/site-packages/gunicorn-23.0.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -gunicorn diff --git a/port/lib/python3.11/site-packages/gunicorn/__init__.py b/port/lib/python3.11/site-packages/gunicorn/__init__.py deleted file mode 100644 index cdcd135..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -version_info = (23, 0, 0) -__version__ = ".".join([str(v) for v in version_info]) -SERVER = "gunicorn" -SERVER_SOFTWARE = "%s/%s" % (SERVER, __version__) diff --git a/port/lib/python3.11/site-packages/gunicorn/__main__.py b/port/lib/python3.11/site-packages/gunicorn/__main__.py deleted file mode 100644 index ceb44d0..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/__main__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -from gunicorn.app.wsgiapp import run - -if __name__ == "__main__": - # see config.py - argparse defaults to basename(argv[0]) == "__main__.py" - # todo: let runpy.run_module take care of argv[0] rewriting - run(prog="gunicorn") diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b30fd0ea09bdf477d2d5794727d18a92122aa0c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmZ3^%ge<81j}vyrZX}!FgylvV1Nb6_#6dfOlL@8h+;@#TmV#s2~wC^7*ZKr7?uI0 zR>P&20oAUCtB+zzVUA)>WuDEL!jj4~n{h646iW(gFoPzWCi6>ipr)4~jYZ5r;uoV{ zGF%^!&kDpK@y|LyVmd=QLk&Z$U@c<_lA0PuRNE#p^#}zstYpw+yv1BxQl!ari%HMm z7Gqg46VM0+glr20r^EGY56&s`T7MwmVQoVl72yDNk)F2v7Vu!esN|= zs%}AIa&}^RYO#KLXeo>x&e0*kJW=VX!UP0wAE}NXp;*#Y2+yc8IZlLLGKwK;b zBpMhlh?_#t0>in?GaP5K&0&KJeFmyvxWxf8@)x7NpC;=qp0d=U;>`R!p!sR}w^*|B zGxKh7$H&7&<8QGAy9R~12HoO^(DA|kZXw~0L9Rt0Ym0b51Sm>>aoFVMrC%vKX5S!NHy@>;1lf6=*ob&Xax_Dz9?>b1xWIlUEwop;J(2r+`x82 XR(VF)jIagK3!*Ow88+~PAlMoJ>fww{ diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/__main__.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index e35d84df046d44d3bd4450d20c41438cb125f19e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmZ3^%ge<81j}vyrUx-HFgylvV1OCQ_-qAaOlL@8NMX!j$YqRTWMoKXN@2=o0?8Ng zF)^evrZBHzSq9X<8i*l)ks*aO7>qU9UV?-)8E-KcmFC^zh>y=r%*>0Azr~SWnwOcJ zUz7)wVks!fPxsSgz9j+^)JrTV&?_%a&jiv%Ag6$I<|XE)#>cN@_zW`fm#2PNVv&A% zdAWW-eo;wUeokh-egTlBpOcxSUr|JE|@*OI~1>{J_S* h%F*E55p{t@;v$R06&48~1A;!VGq6Yjl@x&j835*(V+{ZR diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/arbiter.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/arbiter.cpython-311.pyc deleted file mode 100644 index 20c662b1164e9425bf262f296f230ccc0fac1b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34568 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%0A$ypv<vK}K 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 diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/debug.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/debug.cpython-311.pyc deleted file mode 100644 index 99944af5551d99ed25e0f1805d4825088d105432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3371 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 diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/glogging.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/glogging.cpython-311.pyc deleted file mode 100644 index 718646d48f8bea7a08dfcd0ea802a7026b741723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23926 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 diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/pidfile.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/pidfile.cpython-311.pyc deleted file mode 100644 index afb3cdad54fd33654735a91b384ca0498e53ae78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4805 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 M8I`|yO)H)Me=LvhumAu6 diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/reloader.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/reloader.cpython-311.pyc deleted file mode 100644 index 6879fe9a6cc341acfcffb413ae4632f1aadb5dc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7144 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 P^k~3-W{7+AG6VGAV_MMv diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/sock.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/sock.cpython-311.pyc deleted file mode 100644 index 5315a96534b5369dd6d01345ea8873a521dd7f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13025 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 F^S|9uv4{Ww diff --git a/port/lib/python3.11/site-packages/gunicorn/__pycache__/util.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/__pycache__/util.cpython-311.pyc deleted file mode 100644 index f31e86e7b0de9bad694d706cee0759f235d7d74b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26824 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 z zf=-^tk-s{yai9eb-52Wa33X6-6Pi^43U6(E&6=sn3>7dV=;e7cJB*|dSYW`iJheEu zX0h;S2pxE>d?{GoIZ)9+oofV#1%4aQ*&J}0$fW~^NNuVEx1FzCKQJ&z9;T@StURz* z9hfYH#BKlt1fdS7Fr$u~4oU@TDkE^&sW?VZQ^A88(?Mr7?}3tC4(xrJCuaeiFgeLb z2MuPblM$5iJRKaD1GY0f-@3-FgVQFF2Rm5@ZZl8Zzyerm<#8g55mY#+19VX5pnB>6 zuPB`k>g+svRtI=R!x}-2z{3<=2QHrPBbMZbP&+x;ZRx4x?p8W`T7lr20r^EGY56&s`T7MwmVQoVl72yDNk)F2v7Vu!esN|=s%}AIa&}^RYO#KLX zeo>x&VnKm^e0*kJW=VX!UP0wA4x8Nkl+v73yCPPg=^*=y`GLd-W=2NF4-7D(h#4pb E0B@WxbN~PV diff --git a/port/lib/python3.11/site-packages/gunicorn/app/__pycache__/base.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/app/__pycache__/base.cpython-311.pyc deleted file mode 100644 index f38a2c4ee50bf7f794917df52e253e63628b9c5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12586 zcmd5?Yit`=cAnw;F%rijWxXtUEK9cOhm_b!Y|D>CmhITFEoIkE6Kj)YXwFEYOp)4| zk!3Md)(ujW_NoXSXlo_)A`D<>oyLo%e~JM8)6HfV+x#=Sleew%wvXG%w`1Hv-p+9+yln~BjCX?(` z33$7Q#Vc`H5W_arHIhnB#3$9ZNkNYA!bEf~AxB~)EHV*K2$0&z3s>eQW0gY5ORxU% zOYnJz5=f`VZ9EN~WqA9$G<4SSE(Kk60(D`-$KAXesE3E9j(d48P#^CD>gWAH8Qum> zZBhd#qLMH?JDZ5dqH;WyOwao`aKlM1S`FmlNof5BbW%|5v58656N@Gi(JKi-b4;+RUdSI0BVf4BJ(QBqSz8 z21*nIKqPDqjOn*$2VrCe=jZ1KUrvegL@E(a4bFmZFcH5pIJ+QErIH5*o_=}|hD_Ku z8;xCsx~0L%xnw++5|e{4A%j<7wgzSwR8J%lPsZg)B;8&!fdhI>D^`6B$PKF0+L?7M z`AWeyczH_gTj14H3bn(_TiT3q{*s4T^K`9xx{97|#nWBTpT|%D6*C4KKHTspQ*#1B z?@(Ttj64L@yV_xebmnr547KTa$3<#8B^%R5QGJv+wMffYbH(wr?A84gm7za@l0P#_ zPrE2eCTv7YGY#LGduX$6XL^Hlc~f0_UW%%1sqC-DO?z}dZ@0FFrY=*wW08KF#-3@u zd3v6@Zof>;(_v>iOf~>+yYsM)Bo6nGzQ@R>G~&}f-ziZ{i9=k!^eONcJYBSf`l84k45>AUz%JdbP9SXCf!0aF) zTUMDZMW#n#dJ6jU&3d4{Oxe9Avd(PE?YqA{AN_d8y&c7tUB8eXrVGqakr`5$A@Hm- zfu)z$7)xOob|&||o9C9!Wi7vNz?I!lKD;H|B=79nOFi_R=&}FPaQBH0`4-!7cU37z5Z{Ak$Y||QO3@^m|=?03sAep!Wh-v6l2aZyG ztr+?grXN5;hU1BA3)AV}82j?lR9xa_1mNI22fjH;;5j)(fU$lz1M;P2xKvW$081s| znjl6KfUvW3@-8W?fgz69$ebiYx{=h(3<24AQrK%{3mk6$YKF_HIc_R?O~9H{P^uW` z!EbI^l3Pg40e&ZQaC{aL-uW}2 zqPnZ9drE9ILqIjWmMtTG>@<@k) z0Gif8Wyv2{I<$1GOwryB;8ja6-8{c^K1+UOJA{#l`t@ZD&dX3P4$d^ZHFu-q$U)LEj4+W-*h?rMSlOi&8}sJ<1{pQiXhQ2Gf*;gM1R0v(zJbFOHEoD{ z4RF65SB~M|>p8x@1wmH4+>r60r z^5%u53u{dGD$`wLwkpilg8l#)cQpXx!TfNsrT-Tr4__)U2aC)>g*gbG|0N7>>!h(6WWz9!e8L@6R+;V=C?kQ>IYY_mH(FcLsKE@w}f zvJ%$k1bM|E?KbCgWy&BP+Sv;{KqoH4N5Wh#j4%jmcLKvOh|liq#?K1zxv-*oLiQnP zd<@!cI9(ojd;)_08n$Cqbp$2Q&f9=GK!HTn(E-#&6i7EwAU#=Xf(9khGw#h&*XeN| zNG%@KZ&DT;3rW9&s;oj%m6@AGq-v;@C(y_V^@f|oE7`O+r*Vf6ca0YJHjZhm?D3#V zHY(jJu4zgjf(WcY5gP;Ape-e-&e#+m7YUk>jR?wMRGv~@@g&GSaxJQeBakz_$uwjG zB>zPSmXH8;x+t%I$&(8$w=ee;J)Gj<3LdWPq8Ju1<@o*Jz4n4X3=a`#-y6F%wlcgT z-@ShK?IJUvFarhsDcdP#H>A@zvN3*8iNTRi0$;X@b=5h@n{z-W&DCmFQi~aaVJr#H zwa(u=v{`U8)nLq-UOK*OYv66j12wm3^Mbi%(VnsKj%&c~8tZh8b+wEgN`^jFO*e~< zdE#tKIqDC_`w9Pz(PovXGQOQy=hwNf2yJQP9rQJ*T4}@)O-c6ry}Z9Uz6FNr1=@ z;db!^v_w3K&2f>YN#bGr@JL|hlc8kQ8=pbL6WEZ?=TCgOZ!3zAsb*MlK62YuX zX`&2=ab8&j%i$%55b;$zcEn$)oP?lsA5-l! z(xmFv1}p+!DPBTR4^=93ni|@U=GV$Z8QsQ0(tT!Ty-}*yp+IQ{WLMCz1DlrS-+TMk z+bdJWz)mHw6NUZb>n%Nntxtb`rnvQJvE`W3a;(4{`?{H3np|t{S#9oFxn6AEr8Mt) zut{m&leL!}ELcc7cVy3%0xh{zAb5#V%sI9?NZK>b3EGo z{hWQB4J~_Dw%=}EZq7BYcWzfY_pNmvU+p~p#aq8UQ|x?2>3k*Ut|_AMdaTfPtk}jY zZG6tL-qN)^u-5YQYRl7~_Z3?XDlG@IBc+|Y|7K+A+={=*^nrn9>D(H#eU;gsA1N}s z6lPa}Jeq~ZffgE_fYwuJ+5h=#(Ai&)d<9bBSdkf1m@)9IGp!&|7MX1dv#r2vdmVN9 z;;J%0Edp8jg04x~#aAGwcn*l#q-~$ddJbz=GVwKtGRxp(-?VP_xz5QYX+OF9o9^^UJGoQnH0 zw0V$f<9XX(S>PFzRP)dq6=Z6d>!Lk*a>F*%m`la>nl{wL*R;Wrv}Nc;2eiaAxkf_( za_>=-Z-m(Uoz6$cW2|xT-N3L{EAtga+_x>;}S!GjCEi z^^$50${ANJI4+F<+#29X4B=pPmrbz8J2K9{qj_h>1=RI3r)&Tmz$qR<5cja=6bs5| zm@aRK2zpL@TStbb-l24u%-B&UNdL+(gdrw0Fkn{@3Ju%HztKh(<+KwI60ny`L7X@r zmjq6XB8?_Fv*v45U|6t;@k~z568jn)$ly^E7oTWkZo?XZ*UM25(xF~y0le2aFp#Ch zsue8l*4i^Pns#Cvhte%)lNuxgozqUf(zYS)TUyiA!_BHslB1$5&Bs9lumdcKZ^CGa zZvau90JJlbW_9vNf-J)UnFN-0K~|lK)I3yPMM0}VA9h!eP6uJaSTv2}FR*C(s!Csz z(Ck0}O^38y2zeGvGjWkfN+ifmAnqA6>v`f_P@i;&Kwg=ln9!QPXVu@cvQYGg6@R!) zdAviV&ffb6@(Ujyzjr+UeExZ*^8f%^%jUI~{i}ctM~W@aD=p7wN3tW20&Q!7-qk>F z{$Me%M+xi!1-GfM)V2No$OHGs=kJ}*U&vojy7uQhInSf6?KuxAWpK4+@N-YG<*?Fn z7|IB>-8uXI+1uxq&y^{!cQYY3PiBX+KYA2kR~&aeN_)5vz^BBvgQ=rwa|tlhbBB4K zS^3^auYUOI2bb?&en1!5-3q(AK%Q^bgIlmEP?%2E+18x%^C;>?wv%zKG8q2M+T#@Zn*xmx$TVh+`kfCWafLPf_vB9iQ!oBt7Q~O4GY`^Lm zW=`&QT3`#g7ycikEqY^1X@-WA1(=1;;IBENqQY5196sTdz*hy4aJg6zskLslajB=b zedmI}BzLeR6mY>H7znNfj;;od{>xM$aI_d0QvzcJ&)9bu0=EFawVF4d#O${S%4K78 zvGSuuIPu+p_tS71Y^$0IYLqKG;H*Q10~?KurA|X-HJSk)YkRFL36RbPa zpjQd>W*uPf3k2Vb--@re@{T-zFJ5eZN@;!yR6{TiHofP&<-5r&F5Qd*AE(J6F?}C+m0Nad-_k}+@oN}TCi_5*q6U_@3po5k=6c@V*e?n|5Pz} zS_z)cdLF@{&yh0a_8uXp^gC9W9eMfQTSex8!W<}&r_|KC6e&|qbCT=#ery~DzszSoQ?4g41xyW^NlTGkWQuU>FRq z!TB1Vx>nq@0Yz434(z#MX^m~Hb$Lz7%CrGgjZWcAcD=@VYLvv9aW>j02F)zFs$SK$ z%rYB>jaB@CjF&R>F~LJ7;_{}E(!(f7een zw6kh^wSZ*JSQx6O_#;bhBRp?XEcJSzH(u*X2BFOc!qV8H-7+S421;DsWbf6(07`32 z0igCfEGx*!52`uWI3{lrEvhAh8ttePvtE{;t){Tfao!|WY?MYjLkjyw(>t_tUT%I0 zRZ*0|@#-XM!_n#`%OTSdFgbBjn?}bjojrXya&c_r+^I|HH(mu>EMy$QTO1YJFKUI{;NIk;!b~d39pf&EbHbZY8{D)^MCX!dyPf2&EP&=KfmX_MsIYQxURszHAaOD! zL+&>(fzp73P7JT#(tE>OH071iOtKX)#RF)SiA@Qys})sKJ6a{mY*mlNqb>20UYd49 zeE>g^VW=*xp~OtBx&d$FBHT!`1B`3dXs;F@PYY^0*m~j0Wdts##Zz$Q5sUc)5OS~Dh39WzyK=9hsrj(?F^l>f2}w0^S%Omu*e=%*n{Bt8sK?!<(a#O zl&+&i=9t2u5xjD+srcat-RV65mr$3_D50Hep?#~NeGg*A(0(PfKYOawj_2J?2M7UM zb@$f0uYMHyF!JD1v3tMLy*~$+S-bCFy!TomxDTH7P}}mEJ7e#U<%jcWt&Bow|2JQI znr^z6-0%5s`ENEYHD$?9LVMajhlW||m+bJ~6VKbfJWc}*`^6!M5RV`^iev-{8gn$W zP6B;In8dwLmXz95Sv4^sk%&Y<`+gUq$i=f4w6*gBCPgv|f9Y?5zMZC_iSphczY^uU zL4GBQE$Gi9s-s|iN>pFL`jn_6g+`CL7OlFn>j({}BK71C81~0%M23FDM#Jnhrn$jC NkeEMi5KqSBzX1>xGS>hA diff --git a/port/lib/python3.11/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-311.pyc deleted file mode 100644 index 774847e404157adf03bb2293b757041e50e636a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3548 zcmb7G-ESMm5#PPr<2NhHqAbd?1lo=aQnpCRuH{B?6dQ44r&0+Qeki~=U})ZnrhVkG zdz4fQRKXMmL>WP&1UBR*ZNnC=tX6&KpK=sfh&UjCfWi-bW1ti;1Qh7(9!Zn2l_q<4 zb9*~8d$TjYot>v%uM0tYdg;IEJv&1GVjrz0G&}n-=xiVv$yh~k>y6_Wz6Djtig6LM zF;OL1DK7CoQEgd!+zx$*EIq(+hirR*;!fEP)FtDaDD3<-fArd`#Nax$NXZqLte zUVHaSKCfm{$wEfU!O%cjDI{cNKDnS45-BY=pGha?Gpdpjo5r!14IcKre+vj0ii>Cw zQ%M$zXc>4bsDOddY(-SWg%0hzt!1K3kl1dCp`!42ag)FZJXQmF}Q_ytN28&58$)MzFE@gpcsDrT`%{A&e zlMV)h2eIg4l17)7mZCQ_TA0_=j26v9FREs4NAvd!ceLF3$mC>H&lHsLd@^+}nO5{@ zdLfrdX*3rFk4E!Jy`WI&Me_Ge5A)=bp3Wp-fcoGsKY&NS45WnWcGvotVLuLcy+2r) zuJ(_YUC-P{>W(9IZ||4>qmSPGWcJZ)-G98{lsvYt5Rk7KX&_0m?ZX@>)!}0v4IYtS z0cWGj|99JR-Tq#|MOb;J51R7uLF`%Y3%=t_zsP%z!iP%+e*HcL-ub_RpA2VUk8CeMD5 z$)%eRrN@B59{oo^O6W`PV9k5F>J8Prq0&2b;#!^k_3Zl4y0=P3YGlM9BXxK0u6uaL zJ^Un7b%$#1kU>JU7nD<-E@41-!?S-2T(OE)g;m?CeFK~!<3Sj<+C$r#P-%U1y=6fb zH(|c*_M8vxhsqLJ>Xuy*50$mOBuk1S^%esxhD2kPK zKs(Kpo!ud9X$j~WDxVnq^AQR;@+t0B`Z1360s z(0G>r2AeQ=C3u7Fq2N^|uWI+RO0EzD*eohENEdQBg+^R1CidfBCbM}}30hEDpgem` zTRg^p&r+JsCNsJBxdt0u(3RkuK_#7@ZtdDrOrXubqv-_@m^^neG6C0Qo59imFfL3? zOz<(&k>E)&kuYtR2{Dr}Z4;S<2~$Yz(7m0>$p`pss?*yohwX=8^fB2$3Sy}}E|hUu zD2wx=j2}4SVj0b2S%4nl?jZ-K`H~`+R4tWM^_d9w6TQiu(~-ivvVsJ^=!0kf4-ojr zA^;cNZQF7P81NeDh9O1;Hcztw7v|b-1BniOhdG6p=UkKM(IR>^K-Q%0e_)gwEjU{i z0Pvvu;@n_)?8E-U<|=+8KVh_Ht8}dAuvxF7_kVZ`w(W|rA{NCD$N&E-i$aB^izZ>CWtD2YLI9rdpO` zlCs5_5*$)l-IP>qNui)hbVZ#vkGFo%!hc(vbqR? zT{igrEc#A0dc79CZurjD`=UnQ8+CtR*B{yOM~vuf)jwDB&l&!?y}-%cKxiirss_et zfw2Y>yira*A?tX3vfk%ke-jiRUEi4dbgt6-bl^_|e;oYt;MSF@KT?CK{E_Dksik8b zE$v+c%Vd4NH(5FI7;m68R;J~exoi2%_wemCm`7(nU{38j zTK);QBNmoe24et&4CYECvYNc0vc4yg_{Bm}wK()VDAJ2S!i2K$aBR>?);kA8XJ-M# zziHjTAsLCj24WYO{Lg@ZA+4(+^f6t}kDK?7RM@v`huNbns z8%UJK*9m{sLua=LT=JG|44*H%)~BkDV}|2c-RT84NaOY46JNwXi*Jd)P5ds=WH(5k z1Wx)Mz^wk|(dcQVm57zoc&_55G0$k+%alRI3M#Ai4jh*(bk5MX z;gjte{Wm}wBF4DkLfCJhKI^U{XNg~XC}?!wduYPwzU%0`(S0{;P7LLBHwlP141sA8 O&lrBKfnFxu-v0q>&_5&q diff --git a/port/lib/python3.11/site-packages/gunicorn/app/__pycache__/wsgiapp.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/app/__pycache__/wsgiapp.cpython-311.pyc deleted file mode 100644 index 465d4e691fc0f34718ade3ddd365e9a6f9909d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3704 zcma(U?`s>$bymA8t?l*6v0Mk+4PIa3I7%ETxj0VFO`MpsI9 ztD9ZbIiXOe7^*uA4M&PYG1Q-O2}vQ8`*0uoC#=ju#KM80IaNBj1tP z)tfhO-oAPBe$D9H?(R+m?b~brOKt}c`WG408ec_T=K$G7DpDB(#Yyion3ON>V+hU~ zY>JC>6z2>+<&XOrjV&qe~{XS4~4VqZz=WhJGiS`O;o9)0ZL_FGelh z*3M^?#DVNpu}+is!K@u32@ zBOZ1Icc#iH*byp;mz~!4)xgl+@xKlKb@)l&^TFc4ggY=%_;qRU)XTxM2ZLvyTq+Jm z-NEP!#vS~i@S9hmUp&0BJN?b{{<&f(;)Wt+#B|?ee&`?BkG%L*@%`yy{|&eQhSPK7 zQ0&?H_|FSpFE|6^Pd19;lq*g-;#6s9v@pA~a2OnMf+HX#7;%GC$dyu0-$P+n{6>6q z`^mXt&!pQk>GVtMkHmq(_19n!l&Dt>7!WVhiuDgb{=)1cyJ@zy2=6z|0CTmq@<7(2^?D9( zMPNjv)3#o(l=nkN(;++R-_jgysue2pc2%Ld zMxbi*RyG6i+GUuET1_nc9%zO80eAulCz<31Q8w(uq&9dRvYap!%aUb_XeDjoVd(HF z0J)*J!>vj1C@@&d0RFp$eh|993hV@43PT6NP*FJH3MU-l1c}0HPSFjD>3bw8A{@0Tz6ofJR6hqxDiw8s;6vpb=9I3(8mth^k4tsYxh5gi!9p zkv6GKUxa0>3jm-b3Fn;Fw-g*IiK70md!yL^V90VMb?cj3+oCVMvEgUgT zdu=Av%Y?OR2uO#kJJU|rXeo63WoYyuG+GRexuG#f96KbGQwO0_#n5RtblMS5Q$vJ1 zJVB<%o-BKvvRuh|z(ra9BC8nWK$K-H5v54NR@9@4egH$SyPDex%`jv+%;3{NrJCQY zWH~vnFaaW&$OC|Eu03U6KYy}}>fl0vzr~c%PrzP=KM$uv4fuWhA}}{Wf#b)@=;r|4 zGgYT0_v9mI7Qi3Hz$)*!)aC4F7t4Fo8soQIvL`YHtEpE)WuS)f1b*xS$n%`02Iz`;+2{k$`$yD=- zwwGY`DXK&QIf&i}*D6szjc>w`)M)GP0Lm=GFt8V0pw7w-Y;IzJF z|9J+2vK>6w_&1^cr!lp{_?eF(qT66E;>1GkfE{qyff5(k`sn`L_S_bI$}HjrflRma Ee;nsFWdHyG diff --git a/port/lib/python3.11/site-packages/gunicorn/app/base.py b/port/lib/python3.11/site-packages/gunicorn/app/base.py deleted file mode 100644 index 9bf7a4f..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/app/base.py +++ /dev/null @@ -1,235 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. -import importlib.util -import importlib.machinery -import os -import sys -import traceback - -from gunicorn import util -from gunicorn.arbiter import Arbiter -from gunicorn.config import Config, get_default_config_file -from gunicorn import debug - - -class BaseApplication: - """ - An application interface for configuring and loading - the various necessities for any given web framework. - """ - def __init__(self, usage=None, prog=None): - self.usage = usage - self.cfg = None - self.callable = None - self.prog = prog - self.logger = None - self.do_load_config() - - def do_load_config(self): - """ - Loads the configuration - """ - try: - self.load_default_config() - self.load_config() - except Exception as e: - print("\nError: %s" % str(e), file=sys.stderr) - sys.stderr.flush() - sys.exit(1) - - def load_default_config(self): - # init configuration - self.cfg = Config(self.usage, prog=self.prog) - - def init(self, parser, opts, args): - raise NotImplementedError - - def load(self): - raise NotImplementedError - - def load_config(self): - """ - This method is used to load the configuration from one or several input(s). - Custom Command line, configuration file. - You have to override this method in your class. - """ - raise NotImplementedError - - def reload(self): - self.do_load_config() - if self.cfg.spew: - debug.spew() - - def wsgi(self): - if self.callable is None: - self.callable = self.load() - return self.callable - - def run(self): - try: - Arbiter(self).run() - except RuntimeError as e: - print("\nError: %s\n" % e, file=sys.stderr) - sys.stderr.flush() - sys.exit(1) - - -class Application(BaseApplication): - - # 'init' and 'load' methods are implemented by WSGIApplication. - # pylint: disable=abstract-method - - def chdir(self): - # chdir to the configured path before loading, - # default is the current dir - os.chdir(self.cfg.chdir) - - # add the path to sys.path - if self.cfg.chdir not in sys.path: - sys.path.insert(0, self.cfg.chdir) - - def get_config_from_filename(self, filename): - - if not os.path.exists(filename): - raise RuntimeError("%r doesn't exist" % filename) - - ext = os.path.splitext(filename)[1] - - try: - module_name = '__config__' - if ext in [".py", ".pyc"]: - spec = importlib.util.spec_from_file_location(module_name, filename) - else: - msg = "configuration file should have a valid Python extension.\n" - util.warn(msg) - loader_ = importlib.machinery.SourceFileLoader(module_name, filename) - spec = importlib.util.spec_from_file_location(module_name, filename, loader=loader_) - mod = importlib.util.module_from_spec(spec) - sys.modules[module_name] = mod - spec.loader.exec_module(mod) - except Exception: - print("Failed to read config file: %s" % filename, file=sys.stderr) - traceback.print_exc() - sys.stderr.flush() - sys.exit(1) - - return vars(mod) - - def get_config_from_module_name(self, module_name): - return vars(importlib.import_module(module_name)) - - def load_config_from_module_name_or_filename(self, location): - """ - Loads the configuration file: the file is a python file, otherwise raise an RuntimeError - Exception or stop the process if the configuration file contains a syntax error. - """ - - if location.startswith("python:"): - module_name = location[len("python:"):] - cfg = self.get_config_from_module_name(module_name) - else: - if location.startswith("file:"): - filename = location[len("file:"):] - else: - filename = location - cfg = self.get_config_from_filename(filename) - - for k, v in cfg.items(): - # Ignore unknown names - if k not in self.cfg.settings: - continue - try: - self.cfg.set(k.lower(), v) - except Exception: - print("Invalid value for %s: %s\n" % (k, v), file=sys.stderr) - sys.stderr.flush() - raise - - return cfg - - def load_config_from_file(self, filename): - return self.load_config_from_module_name_or_filename(location=filename) - - def load_config(self): - # parse console args - parser = self.cfg.parser() - args = parser.parse_args() - - # optional settings from apps - cfg = self.init(parser, args, args.args) - - # set up import paths and follow symlinks - self.chdir() - - # Load up the any app specific configuration - if cfg: - for k, v in cfg.items(): - self.cfg.set(k.lower(), v) - - env_args = parser.parse_args(self.cfg.get_cmd_args_from_env()) - - if args.config: - self.load_config_from_file(args.config) - elif env_args.config: - self.load_config_from_file(env_args.config) - else: - default_config = get_default_config_file() - if default_config is not None: - self.load_config_from_file(default_config) - - # Load up environment configuration - for k, v in vars(env_args).items(): - if v is None: - continue - if k == "args": - continue - self.cfg.set(k.lower(), v) - - # Lastly, update the configuration with any command line settings. - for k, v in vars(args).items(): - if v is None: - continue - if k == "args": - continue - self.cfg.set(k.lower(), v) - - # current directory might be changed by the config now - # set up import paths and follow symlinks - self.chdir() - - def run(self): - if self.cfg.print_config: - print(self.cfg) - - if self.cfg.print_config or self.cfg.check_config: - try: - self.load() - except Exception: - msg = "\nError while loading the application:\n" - print(msg, file=sys.stderr) - traceback.print_exc() - sys.stderr.flush() - sys.exit(1) - sys.exit(0) - - if self.cfg.spew: - debug.spew() - - if self.cfg.daemon: - if os.environ.get('NOTIFY_SOCKET'): - msg = "Warning: you shouldn't specify `daemon = True`" \ - " when launching by systemd with `Type = notify`" - print(msg, file=sys.stderr, flush=True) - - util.daemonize(self.cfg.enable_stdio_inheritance) - - # set python paths - if self.cfg.pythonpath: - paths = self.cfg.pythonpath.split(",") - for path in paths: - pythonpath = os.path.abspath(path) - if pythonpath not in sys.path: - sys.path.insert(0, pythonpath) - - super().run() diff --git a/port/lib/python3.11/site-packages/gunicorn/app/pasterapp.py b/port/lib/python3.11/site-packages/gunicorn/app/pasterapp.py deleted file mode 100644 index b1738f2..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/app/pasterapp.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import configparser -import os - -from paste.deploy import loadapp - -from gunicorn.app.wsgiapp import WSGIApplication -from gunicorn.config import get_default_config_file - - -def get_wsgi_app(config_uri, name=None, defaults=None): - if ':' not in config_uri: - config_uri = "config:%s" % config_uri - - return loadapp( - config_uri, - name=name, - relative_to=os.getcwd(), - global_conf=defaults, - ) - - -def has_logging_config(config_file): - parser = configparser.ConfigParser() - parser.read([config_file]) - return parser.has_section('loggers') - - -def serve(app, global_conf, **local_conf): - """\ - A Paste Deployment server runner. - - Example configuration: - - [server:main] - use = egg:gunicorn#main - host = 127.0.0.1 - port = 5000 - """ - config_file = global_conf['__file__'] - gunicorn_config_file = local_conf.pop('config', None) - - host = local_conf.pop('host', '') - port = local_conf.pop('port', '') - if host and port: - local_conf['bind'] = '%s:%s' % (host, port) - elif host: - local_conf['bind'] = host.split(',') - - class PasterServerApplication(WSGIApplication): - def load_config(self): - self.cfg.set("default_proc_name", config_file) - - if has_logging_config(config_file): - self.cfg.set("logconfig", config_file) - - if gunicorn_config_file: - self.load_config_from_file(gunicorn_config_file) - else: - default_gunicorn_config_file = get_default_config_file() - if default_gunicorn_config_file is not None: - self.load_config_from_file(default_gunicorn_config_file) - - for k, v in local_conf.items(): - if v is not None: - self.cfg.set(k.lower(), v) - - def load(self): - return app - - PasterServerApplication().run() diff --git a/port/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py b/port/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py deleted file mode 100644 index 1b0ba96..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py +++ /dev/null @@ -1,70 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import os - -from gunicorn.errors import ConfigError -from gunicorn.app.base import Application -from gunicorn import util - - -class WSGIApplication(Application): - def init(self, parser, opts, args): - self.app_uri = None - - if opts.paste: - from .pasterapp import has_logging_config - - config_uri = os.path.abspath(opts.paste) - config_file = config_uri.split('#')[0] - - if not os.path.exists(config_file): - raise ConfigError("%r not found" % config_file) - - self.cfg.set("default_proc_name", config_file) - self.app_uri = config_uri - - if has_logging_config(config_file): - self.cfg.set("logconfig", config_file) - - return - - if len(args) > 0: - self.cfg.set("default_proc_name", args[0]) - self.app_uri = args[0] - - def load_config(self): - super().load_config() - - if self.app_uri is None: - if self.cfg.wsgi_app is not None: - self.app_uri = self.cfg.wsgi_app - else: - raise ConfigError("No application module specified.") - - def load_wsgiapp(self): - return util.import_app(self.app_uri) - - def load_pasteapp(self): - from .pasterapp import get_wsgi_app - return get_wsgi_app(self.app_uri, defaults=self.cfg.paste_global_conf) - - def load(self): - if self.cfg.paste is not None: - return self.load_pasteapp() - else: - return self.load_wsgiapp() - - -def run(prog=None): - """\ - The ``gunicorn`` command line runner for launching Gunicorn with - generic WSGI applications. - """ - from gunicorn.app.wsgiapp import WSGIApplication - WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]", prog=prog).run() - - -if __name__ == '__main__': - run() diff --git a/port/lib/python3.11/site-packages/gunicorn/arbiter.py b/port/lib/python3.11/site-packages/gunicorn/arbiter.py deleted file mode 100644 index 1eaf453..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/arbiter.py +++ /dev/null @@ -1,671 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. -import errno -import os -import random -import select -import signal -import sys -import time -import traceback - -from gunicorn.errors import HaltServer, AppImportError -from gunicorn.pidfile import Pidfile -from gunicorn import sock, systemd, util - -from gunicorn import __version__, SERVER_SOFTWARE - - -class Arbiter: - """ - Arbiter maintain the workers processes alive. It launches or - kills them if needed. It also manages application reloading - via SIGHUP/USR2. - """ - - # A flag indicating if a worker failed to - # to boot. If a worker process exist with - # this error code, the arbiter will terminate. - WORKER_BOOT_ERROR = 3 - - # A flag indicating if an application failed to be loaded - APP_LOAD_ERROR = 4 - - START_CTX = {} - - LISTENERS = [] - WORKERS = {} - PIPE = [] - - # I love dynamic languages - SIG_QUEUE = [] - SIGNALS = [getattr(signal, "SIG%s" % x) - for x in "HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCH".split()] - SIG_NAMES = dict( - (getattr(signal, name), name[3:].lower()) for name in dir(signal) - if name[:3] == "SIG" and name[3] != "_" - ) - - def __init__(self, app): - os.environ["SERVER_SOFTWARE"] = SERVER_SOFTWARE - - self._num_workers = None - self._last_logged_active_worker_count = None - self.log = None - - self.setup(app) - - self.pidfile = None - self.systemd = False - self.worker_age = 0 - self.reexec_pid = 0 - self.master_pid = 0 - self.master_name = "Master" - - cwd = util.getcwd() - - args = sys.argv[:] - args.insert(0, sys.executable) - - # init start context - self.START_CTX = { - "args": args, - "cwd": cwd, - 0: sys.executable - } - - def _get_num_workers(self): - return self._num_workers - - def _set_num_workers(self, value): - old_value = self._num_workers - self._num_workers = value - self.cfg.nworkers_changed(self, value, old_value) - num_workers = property(_get_num_workers, _set_num_workers) - - def setup(self, app): - self.app = app - self.cfg = app.cfg - - if self.log is None: - self.log = self.cfg.logger_class(app.cfg) - - # reopen files - if 'GUNICORN_PID' in os.environ: - self.log.reopen_files() - - self.worker_class = self.cfg.worker_class - self.address = self.cfg.address - self.num_workers = self.cfg.workers - self.timeout = self.cfg.timeout - self.proc_name = self.cfg.proc_name - - self.log.debug('Current configuration:\n{0}'.format( - '\n'.join( - ' {0}: {1}'.format(config, value.value) - for config, value - in sorted(self.cfg.settings.items(), - key=lambda setting: setting[1])))) - - # set environment' variables - if self.cfg.env: - for k, v in self.cfg.env.items(): - os.environ[k] = v - - if self.cfg.preload_app: - self.app.wsgi() - - def start(self): - """\ - Initialize the arbiter. Start listening and set pidfile if needed. - """ - self.log.info("Starting gunicorn %s", __version__) - - if 'GUNICORN_PID' in os.environ: - self.master_pid = int(os.environ.get('GUNICORN_PID')) - self.proc_name = self.proc_name + ".2" - self.master_name = "Master.2" - - self.pid = os.getpid() - if self.cfg.pidfile is not None: - pidname = self.cfg.pidfile - if self.master_pid != 0: - pidname += ".2" - self.pidfile = Pidfile(pidname) - self.pidfile.create(self.pid) - self.cfg.on_starting(self) - - self.init_signals() - - if not self.LISTENERS: - fds = None - listen_fds = systemd.listen_fds() - if listen_fds: - self.systemd = True - fds = range(systemd.SD_LISTEN_FDS_START, - systemd.SD_LISTEN_FDS_START + listen_fds) - - elif self.master_pid: - fds = [] - for fd in os.environ.pop('GUNICORN_FD').split(','): - fds.append(int(fd)) - - self.LISTENERS = sock.create_sockets(self.cfg, self.log, fds) - - listeners_str = ",".join([str(lnr) for lnr in self.LISTENERS]) - self.log.debug("Arbiter booted") - self.log.info("Listening at: %s (%s)", listeners_str, self.pid) - self.log.info("Using worker: %s", self.cfg.worker_class_str) - systemd.sd_notify("READY=1\nSTATUS=Gunicorn arbiter booted", self.log) - - # check worker class requirements - if hasattr(self.worker_class, "check_config"): - self.worker_class.check_config(self.cfg, self.log) - - self.cfg.when_ready(self) - - def init_signals(self): - """\ - Initialize master signal handling. Most of the signals - are queued. Child signals only wake up the master. - """ - # close old PIPE - for p in self.PIPE: - os.close(p) - - # initialize the pipe - self.PIPE = pair = os.pipe() - for p in pair: - util.set_non_blocking(p) - util.close_on_exec(p) - - self.log.close_on_exec() - - # initialize all signals - for s in self.SIGNALS: - signal.signal(s, self.signal) - signal.signal(signal.SIGCHLD, self.handle_chld) - - def signal(self, sig, frame): - if len(self.SIG_QUEUE) < 5: - self.SIG_QUEUE.append(sig) - self.wakeup() - - def run(self): - "Main master loop." - self.start() - util._setproctitle("master [%s]" % self.proc_name) - - try: - self.manage_workers() - - while True: - self.maybe_promote_master() - - sig = self.SIG_QUEUE.pop(0) if self.SIG_QUEUE else None - if sig is None: - self.sleep() - self.murder_workers() - self.manage_workers() - continue - - if sig not in self.SIG_NAMES: - self.log.info("Ignoring unknown signal: %s", sig) - continue - - signame = self.SIG_NAMES.get(sig) - handler = getattr(self, "handle_%s" % signame, None) - if not handler: - self.log.error("Unhandled signal: %s", signame) - continue - self.log.info("Handling signal: %s", signame) - handler() - self.wakeup() - except (StopIteration, KeyboardInterrupt): - self.halt() - except HaltServer as inst: - self.halt(reason=inst.reason, exit_status=inst.exit_status) - except SystemExit: - raise - except Exception: - self.log.error("Unhandled exception in main loop", - exc_info=True) - self.stop(False) - if self.pidfile is not None: - self.pidfile.unlink() - sys.exit(-1) - - def handle_chld(self, sig, frame): - "SIGCHLD handling" - self.reap_workers() - self.wakeup() - - def handle_hup(self): - """\ - HUP handling. - - Reload configuration - - Start the new worker processes with a new configuration - - Gracefully shutdown the old worker processes - """ - self.log.info("Hang up: %s", self.master_name) - self.reload() - - def handle_term(self): - "SIGTERM handling" - raise StopIteration - - def handle_int(self): - "SIGINT handling" - self.stop(False) - raise StopIteration - - def handle_quit(self): - "SIGQUIT handling" - self.stop(False) - raise StopIteration - - def handle_ttin(self): - """\ - SIGTTIN handling. - Increases the number of workers by one. - """ - self.num_workers += 1 - self.manage_workers() - - def handle_ttou(self): - """\ - SIGTTOU handling. - Decreases the number of workers by one. - """ - if self.num_workers <= 1: - return - self.num_workers -= 1 - self.manage_workers() - - def handle_usr1(self): - """\ - SIGUSR1 handling. - Kill all workers by sending them a SIGUSR1 - """ - self.log.reopen_files() - self.kill_workers(signal.SIGUSR1) - - def handle_usr2(self): - """\ - SIGUSR2 handling. - Creates a new arbiter/worker set as a fork of the current - arbiter without affecting old workers. Use this to do live - deployment with the ability to backout a change. - """ - self.reexec() - - def handle_winch(self): - """SIGWINCH handling""" - if self.cfg.daemon: - self.log.info("graceful stop of workers") - self.num_workers = 0 - self.kill_workers(signal.SIGTERM) - else: - self.log.debug("SIGWINCH ignored. Not daemonized") - - def maybe_promote_master(self): - if self.master_pid == 0: - return - - if self.master_pid != os.getppid(): - self.log.info("Master has been promoted.") - # reset master infos - self.master_name = "Master" - self.master_pid = 0 - self.proc_name = self.cfg.proc_name - del os.environ['GUNICORN_PID'] - # rename the pidfile - if self.pidfile is not None: - self.pidfile.rename(self.cfg.pidfile) - # reset proctitle - util._setproctitle("master [%s]" % self.proc_name) - - def wakeup(self): - """\ - Wake up the arbiter by writing to the PIPE - """ - try: - os.write(self.PIPE[1], b'.') - except OSError as e: - if e.errno not in [errno.EAGAIN, errno.EINTR]: - raise - - def halt(self, reason=None, exit_status=0): - """ halt arbiter """ - self.stop() - - log_func = self.log.info if exit_status == 0 else self.log.error - log_func("Shutting down: %s", self.master_name) - if reason is not None: - log_func("Reason: %s", reason) - - if self.pidfile is not None: - self.pidfile.unlink() - self.cfg.on_exit(self) - sys.exit(exit_status) - - def sleep(self): - """\ - Sleep until PIPE is readable or we timeout. - A readable PIPE means a signal occurred. - """ - try: - ready = select.select([self.PIPE[0]], [], [], 1.0) - if not ready[0]: - return - while os.read(self.PIPE[0], 1): - pass - except OSError as e: - # TODO: select.error is a subclass of OSError since Python 3.3. - error_number = getattr(e, 'errno', e.args[0]) - if error_number not in [errno.EAGAIN, errno.EINTR]: - raise - except KeyboardInterrupt: - sys.exit() - - def stop(self, graceful=True): - """\ - Stop workers - - :attr graceful: boolean, If True (the default) workers will be - killed gracefully (ie. trying to wait for the current connection) - """ - unlink = ( - self.reexec_pid == self.master_pid == 0 - and not self.systemd - and not self.cfg.reuse_port - ) - sock.close_sockets(self.LISTENERS, unlink) - - self.LISTENERS = [] - sig = signal.SIGTERM - if not graceful: - sig = signal.SIGQUIT - limit = time.time() + self.cfg.graceful_timeout - # instruct the workers to exit - self.kill_workers(sig) - # wait until the graceful timeout - while self.WORKERS and time.time() < limit: - time.sleep(0.1) - - self.kill_workers(signal.SIGKILL) - - def reexec(self): - """\ - Relaunch the master and workers. - """ - if self.reexec_pid != 0: - self.log.warning("USR2 signal ignored. Child exists.") - return - - if self.master_pid != 0: - self.log.warning("USR2 signal ignored. Parent exists.") - return - - master_pid = os.getpid() - self.reexec_pid = os.fork() - if self.reexec_pid != 0: - return - - self.cfg.pre_exec(self) - - environ = self.cfg.env_orig.copy() - environ['GUNICORN_PID'] = str(master_pid) - - if self.systemd: - environ['LISTEN_PID'] = str(os.getpid()) - environ['LISTEN_FDS'] = str(len(self.LISTENERS)) - else: - environ['GUNICORN_FD'] = ','.join( - str(lnr.fileno()) for lnr in self.LISTENERS) - - os.chdir(self.START_CTX['cwd']) - - # exec the process using the original environment - os.execvpe(self.START_CTX[0], self.START_CTX['args'], environ) - - def reload(self): - old_address = self.cfg.address - - # reset old environment - for k in self.cfg.env: - if k in self.cfg.env_orig: - # reset the key to the value it had before - # we launched gunicorn - os.environ[k] = self.cfg.env_orig[k] - else: - # delete the value set by gunicorn - try: - del os.environ[k] - except KeyError: - pass - - # reload conf - self.app.reload() - self.setup(self.app) - - # reopen log files - self.log.reopen_files() - - # do we need to change listener ? - if old_address != self.cfg.address: - # close all listeners - for lnr in self.LISTENERS: - lnr.close() - # init new listeners - self.LISTENERS = sock.create_sockets(self.cfg, self.log) - listeners_str = ",".join([str(lnr) for lnr in self.LISTENERS]) - self.log.info("Listening at: %s", listeners_str) - - # do some actions on reload - self.cfg.on_reload(self) - - # unlink pidfile - if self.pidfile is not None: - self.pidfile.unlink() - - # create new pidfile - if self.cfg.pidfile is not None: - self.pidfile = Pidfile(self.cfg.pidfile) - self.pidfile.create(self.pid) - - # set new proc_name - util._setproctitle("master [%s]" % self.proc_name) - - # spawn new workers - for _ in range(self.cfg.workers): - self.spawn_worker() - - # manage workers - self.manage_workers() - - def murder_workers(self): - """\ - Kill unused/idle workers - """ - if not self.timeout: - return - workers = list(self.WORKERS.items()) - for (pid, worker) in workers: - try: - if time.monotonic() - worker.tmp.last_update() <= self.timeout: - continue - except (OSError, ValueError): - continue - - if not worker.aborted: - self.log.critical("WORKER TIMEOUT (pid:%s)", pid) - worker.aborted = True - self.kill_worker(pid, signal.SIGABRT) - else: - self.kill_worker(pid, signal.SIGKILL) - - def reap_workers(self): - """\ - Reap workers to avoid zombie processes - """ - try: - while True: - wpid, status = os.waitpid(-1, os.WNOHANG) - if not wpid: - break - if self.reexec_pid == wpid: - self.reexec_pid = 0 - else: - # A worker was terminated. If the termination reason was - # that it could not boot, we'll shut it down to avoid - # infinite start/stop cycles. - exitcode = status >> 8 - if exitcode != 0: - self.log.error('Worker (pid:%s) exited with code %s', wpid, exitcode) - if exitcode == self.WORKER_BOOT_ERROR: - reason = "Worker failed to boot." - raise HaltServer(reason, self.WORKER_BOOT_ERROR) - if exitcode == self.APP_LOAD_ERROR: - reason = "App failed to load." - raise HaltServer(reason, self.APP_LOAD_ERROR) - - if exitcode > 0: - # If the exit code of the worker is greater than 0, - # let the user know. - self.log.error("Worker (pid:%s) exited with code %s.", - wpid, exitcode) - elif status > 0: - # If the exit code of the worker is 0 and the status - # is greater than 0, then it was most likely killed - # via a signal. - try: - sig_name = signal.Signals(status).name - except ValueError: - sig_name = "code {}".format(status) - msg = "Worker (pid:{}) was sent {}!".format( - wpid, sig_name) - - # Additional hint for SIGKILL - if status == signal.SIGKILL: - msg += " Perhaps out of memory?" - self.log.error(msg) - - worker = self.WORKERS.pop(wpid, None) - if not worker: - continue - worker.tmp.close() - self.cfg.child_exit(self, worker) - except OSError as e: - if e.errno != errno.ECHILD: - raise - - def manage_workers(self): - """\ - Maintain the number of workers by spawning or killing - as required. - """ - if len(self.WORKERS) < self.num_workers: - self.spawn_workers() - - workers = self.WORKERS.items() - workers = sorted(workers, key=lambda w: w[1].age) - while len(workers) > self.num_workers: - (pid, _) = workers.pop(0) - self.kill_worker(pid, signal.SIGTERM) - - active_worker_count = len(workers) - if self._last_logged_active_worker_count != active_worker_count: - self._last_logged_active_worker_count = active_worker_count - self.log.debug("{0} workers".format(active_worker_count), - extra={"metric": "gunicorn.workers", - "value": active_worker_count, - "mtype": "gauge"}) - - def spawn_worker(self): - self.worker_age += 1 - worker = self.worker_class(self.worker_age, self.pid, self.LISTENERS, - self.app, self.timeout / 2.0, - self.cfg, self.log) - self.cfg.pre_fork(self, worker) - pid = os.fork() - if pid != 0: - worker.pid = pid - self.WORKERS[pid] = worker - return pid - - # Do not inherit the temporary files of other workers - for sibling in self.WORKERS.values(): - sibling.tmp.close() - - # Process Child - worker.pid = os.getpid() - try: - util._setproctitle("worker [%s]" % self.proc_name) - self.log.info("Booting worker with pid: %s", worker.pid) - self.cfg.post_fork(self, worker) - worker.init_process() - sys.exit(0) - except SystemExit: - raise - except AppImportError as e: - self.log.debug("Exception while loading the application", - exc_info=True) - print("%s" % e, file=sys.stderr) - sys.stderr.flush() - sys.exit(self.APP_LOAD_ERROR) - except Exception: - self.log.exception("Exception in worker process") - if not worker.booted: - sys.exit(self.WORKER_BOOT_ERROR) - sys.exit(-1) - finally: - self.log.info("Worker exiting (pid: %s)", worker.pid) - try: - worker.tmp.close() - self.cfg.worker_exit(self, worker) - except Exception: - self.log.warning("Exception during worker exit:\n%s", - traceback.format_exc()) - - def spawn_workers(self): - """\ - Spawn new workers as needed. - - This is where a worker process leaves the main loop - of the master process. - """ - - for _ in range(self.num_workers - len(self.WORKERS)): - self.spawn_worker() - time.sleep(0.1 * random.random()) - - def kill_workers(self, sig): - """\ - Kill all workers with the signal `sig` - :attr sig: `signal.SIG*` value - """ - worker_pids = list(self.WORKERS.keys()) - for pid in worker_pids: - self.kill_worker(pid, sig) - - def kill_worker(self, pid, sig): - """\ - Kill a worker - - :attr pid: int, worker pid - :attr sig: `signal.SIG*` value - """ - try: - os.kill(pid, sig) - except OSError as e: - if e.errno == errno.ESRCH: - try: - worker = self.WORKERS.pop(pid) - worker.tmp.close() - self.cfg.worker_exit(self, worker) - return - except (KeyError, OSError): - return - raise diff --git a/port/lib/python3.11/site-packages/gunicorn/config.py b/port/lib/python3.11/site-packages/gunicorn/config.py deleted file mode 100644 index 402a26b..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/config.py +++ /dev/null @@ -1,2442 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -# Please remember to run "make -C docs html" after update "desc" attributes. - -import argparse -import copy -import grp -import inspect -import ipaddress -import os -import pwd -import re -import shlex -import ssl -import sys -import textwrap - -from gunicorn import __version__, util -from gunicorn.errors import ConfigError -from gunicorn.reloader import reloader_engines - -KNOWN_SETTINGS = [] -PLATFORM = sys.platform - - -def make_settings(ignore=None): - settings = {} - ignore = ignore or () - for s in KNOWN_SETTINGS: - setting = s() - if setting.name in ignore: - continue - settings[setting.name] = setting.copy() - return settings - - -def auto_int(_, x): - # for compatible with octal numbers in python3 - if re.match(r'0(\d)', x, re.IGNORECASE): - x = x.replace('0', '0o', 1) - return int(x, 0) - - -class Config: - - def __init__(self, usage=None, prog=None): - self.settings = make_settings() - self.usage = usage - self.prog = prog or os.path.basename(sys.argv[0]) - self.env_orig = os.environ.copy() - - def __str__(self): - lines = [] - kmax = max(len(k) for k in self.settings) - for k in sorted(self.settings): - v = self.settings[k].value - if callable(v): - v = "<{}()>".format(v.__qualname__) - lines.append("{k:{kmax}} = {v}".format(k=k, v=v, kmax=kmax)) - return "\n".join(lines) - - def __getattr__(self, name): - if name not in self.settings: - raise AttributeError("No configuration setting for: %s" % name) - return self.settings[name].get() - - def __setattr__(self, name, value): - if name != "settings" and name in self.settings: - raise AttributeError("Invalid access!") - super().__setattr__(name, value) - - def set(self, name, value): - if name not in self.settings: - raise AttributeError("No configuration setting for: %s" % name) - self.settings[name].set(value) - - def get_cmd_args_from_env(self): - if 'GUNICORN_CMD_ARGS' in self.env_orig: - return shlex.split(self.env_orig['GUNICORN_CMD_ARGS']) - return [] - - def parser(self): - kwargs = { - "usage": self.usage, - "prog": self.prog - } - parser = argparse.ArgumentParser(**kwargs) - parser.add_argument("-v", "--version", - action="version", default=argparse.SUPPRESS, - version="%(prog)s (version " + __version__ + ")\n", - help="show program's version number and exit") - parser.add_argument("args", nargs="*", help=argparse.SUPPRESS) - - keys = sorted(self.settings, key=self.settings.__getitem__) - for k in keys: - self.settings[k].add_option(parser) - - return parser - - @property - def worker_class_str(self): - uri = self.settings['worker_class'].get() - - if isinstance(uri, str): - # are we using a threaded worker? - is_sync = uri.endswith('SyncWorker') or uri == 'sync' - if is_sync and self.threads > 1: - return "gthread" - return uri - return uri.__name__ - - @property - def worker_class(self): - uri = self.settings['worker_class'].get() - - # are we using a threaded worker? - is_sync = isinstance(uri, str) and (uri.endswith('SyncWorker') or uri == 'sync') - if is_sync and self.threads > 1: - uri = "gunicorn.workers.gthread.ThreadWorker" - - worker_class = util.load_class(uri) - if hasattr(worker_class, "setup"): - worker_class.setup() - return worker_class - - @property - def address(self): - s = self.settings['bind'].get() - return [util.parse_address(util.bytes_to_str(bind)) for bind in s] - - @property - def uid(self): - return self.settings['user'].get() - - @property - def gid(self): - return self.settings['group'].get() - - @property - def proc_name(self): - pn = self.settings['proc_name'].get() - if pn is not None: - return pn - else: - return self.settings['default_proc_name'].get() - - @property - def logger_class(self): - uri = self.settings['logger_class'].get() - if uri == "simple": - # support the default - uri = LoggerClass.default - - # if default logger is in use, and statsd is on, automagically switch - # to the statsd logger - if uri == LoggerClass.default: - if 'statsd_host' in self.settings and self.settings['statsd_host'].value is not None: - uri = "gunicorn.instrument.statsd.Statsd" - - logger_class = util.load_class( - uri, - default="gunicorn.glogging.Logger", - section="gunicorn.loggers") - - if hasattr(logger_class, "install"): - logger_class.install() - return logger_class - - @property - def is_ssl(self): - return self.certfile or self.keyfile - - @property - def ssl_options(self): - opts = {} - for name, value in self.settings.items(): - if value.section == 'SSL': - opts[name] = value.get() - return opts - - @property - def env(self): - raw_env = self.settings['raw_env'].get() - env = {} - - if not raw_env: - return env - - for e in raw_env: - s = util.bytes_to_str(e) - try: - k, v = s.split('=', 1) - except ValueError: - raise RuntimeError("environment setting %r invalid" % s) - - env[k] = v - - return env - - @property - def sendfile(self): - if self.settings['sendfile'].get() is not None: - return False - - if 'SENDFILE' in os.environ: - sendfile = os.environ['SENDFILE'].lower() - return sendfile in ['y', '1', 'yes', 'true'] - - return True - - @property - def reuse_port(self): - return self.settings['reuse_port'].get() - - @property - def paste_global_conf(self): - raw_global_conf = self.settings['raw_paste_global_conf'].get() - if raw_global_conf is None: - return None - - global_conf = {} - for e in raw_global_conf: - s = util.bytes_to_str(e) - try: - k, v = re.split(r'(?" % ( - self.__class__.__module__, - self.__class__.__name__, - id(self), - self.value, - ) - - -Setting = SettingMeta('Setting', (Setting,), {}) - - -def validate_bool(val): - if val is None: - return - - if isinstance(val, bool): - return val - if not isinstance(val, str): - raise TypeError("Invalid type for casting: %s" % val) - if val.lower().strip() == "true": - return True - elif val.lower().strip() == "false": - return False - else: - raise ValueError("Invalid boolean: %s" % val) - - -def validate_dict(val): - if not isinstance(val, dict): - raise TypeError("Value is not a dictionary: %s " % val) - return val - - -def validate_pos_int(val): - if not isinstance(val, int): - val = int(val, 0) - else: - # Booleans are ints! - val = int(val) - if val < 0: - raise ValueError("Value must be positive: %s" % val) - return val - - -def validate_ssl_version(val): - if val != SSLVersion.default: - sys.stderr.write("Warning: option `ssl_version` is deprecated and it is ignored. Use ssl_context instead.\n") - return val - - -def validate_string(val): - if val is None: - return None - if not isinstance(val, str): - raise TypeError("Not a string: %s" % val) - return val.strip() - - -def validate_file_exists(val): - if val is None: - return None - if not os.path.exists(val): - raise ValueError("File %s does not exists." % val) - return val - - -def validate_list_string(val): - if not val: - return [] - - # legacy syntax - if isinstance(val, str): - val = [val] - - return [validate_string(v) for v in val] - - -def validate_list_of_existing_files(val): - return [validate_file_exists(v) for v in validate_list_string(val)] - - -def validate_string_to_addr_list(val): - val = validate_string_to_list(val) - - for addr in val: - if addr == "*": - continue - _vaid_ip = ipaddress.ip_address(addr) - - return val - - -def validate_string_to_list(val): - val = validate_string(val) - - if not val: - return [] - - return [v.strip() for v in val.split(",") if v] - - -def validate_class(val): - if inspect.isfunction(val) or inspect.ismethod(val): - val = val() - if inspect.isclass(val): - return val - return validate_string(val) - - -def validate_callable(arity): - def _validate_callable(val): - if isinstance(val, str): - try: - mod_name, obj_name = val.rsplit(".", 1) - except ValueError: - raise TypeError("Value '%s' is not import string. " - "Format: module[.submodules...].object" % val) - try: - mod = __import__(mod_name, fromlist=[obj_name]) - val = getattr(mod, obj_name) - except ImportError as e: - raise TypeError(str(e)) - except AttributeError: - raise TypeError("Can not load '%s' from '%s'" - "" % (obj_name, mod_name)) - if not callable(val): - raise TypeError("Value is not callable: %s" % val) - if arity != -1 and arity != util.get_arity(val): - raise TypeError("Value must have an arity of: %s" % arity) - return val - return _validate_callable - - -def validate_user(val): - if val is None: - return os.geteuid() - if isinstance(val, int): - return val - elif val.isdigit(): - return int(val) - else: - try: - return pwd.getpwnam(val).pw_uid - except KeyError: - raise ConfigError("No such user: '%s'" % val) - - -def validate_group(val): - if val is None: - return os.getegid() - - if isinstance(val, int): - return val - elif val.isdigit(): - return int(val) - else: - try: - return grp.getgrnam(val).gr_gid - except KeyError: - raise ConfigError("No such group: '%s'" % val) - - -def validate_post_request(val): - val = validate_callable(-1)(val) - - largs = util.get_arity(val) - if largs == 4: - return val - elif largs == 3: - return lambda worker, req, env, _r: val(worker, req, env) - elif largs == 2: - return lambda worker, req, _e, _r: val(worker, req) - else: - raise TypeError("Value must have an arity of: 4") - - -def validate_chdir(val): - # valid if the value is a string - val = validate_string(val) - - # transform relative paths - path = os.path.abspath(os.path.normpath(os.path.join(util.getcwd(), val))) - - # test if the path exists - if not os.path.exists(path): - raise ConfigError("can't chdir to %r" % val) - - return path - - -def validate_statsd_address(val): - val = validate_string(val) - if val is None: - return None - - # As of major release 20, util.parse_address would recognize unix:PORT - # as a UDS address, breaking backwards compatibility. We defend against - # that regression here (this is also unit-tested). - # Feel free to remove in the next major release. - unix_hostname_regression = re.match(r'^unix:(\d+)$', val) - if unix_hostname_regression: - return ('unix', int(unix_hostname_regression.group(1))) - - try: - address = util.parse_address(val, default_port='8125') - except RuntimeError: - raise TypeError("Value must be one of ('host:port', 'unix://PATH')") - - return address - - -def validate_reload_engine(val): - if val not in reloader_engines: - raise ConfigError("Invalid reload_engine: %r" % val) - - return val - - -def get_default_config_file(): - config_path = os.path.join(os.path.abspath(os.getcwd()), - 'gunicorn.conf.py') - if os.path.exists(config_path): - return config_path - return None - - -class ConfigFile(Setting): - name = "config" - section = "Config File" - cli = ["-c", "--config"] - meta = "CONFIG" - validator = validate_string - default = "./gunicorn.conf.py" - desc = """\ - :ref:`The Gunicorn config file`. - - A string of the form ``PATH``, ``file:PATH``, or ``python:MODULE_NAME``. - - Only has an effect when specified on the command line or as part of an - application specific configuration. - - By default, a file named ``gunicorn.conf.py`` will be read from the same - directory where gunicorn is being run. - - .. versionchanged:: 19.4 - Loading the config from a Python module requires the ``python:`` - prefix. - """ - - -class WSGIApp(Setting): - name = "wsgi_app" - section = "Config File" - meta = "STRING" - validator = validate_string - default = None - desc = """\ - A WSGI application path in pattern ``$(MODULE_NAME):$(VARIABLE_NAME)``. - - .. versionadded:: 20.1.0 - """ - - -class Bind(Setting): - name = "bind" - action = "append" - section = "Server Socket" - cli = ["-b", "--bind"] - meta = "ADDRESS" - validator = validate_list_string - - if 'PORT' in os.environ: - default = ['0.0.0.0:{0}'.format(os.environ.get('PORT'))] - else: - default = ['127.0.0.1:8000'] - - desc = """\ - The socket to bind. - - A string of the form: ``HOST``, ``HOST:PORT``, ``unix:PATH``, - ``fd://FD``. An IP is a valid ``HOST``. - - .. versionchanged:: 20.0 - Support for ``fd://FD`` got added. - - Multiple addresses can be bound. ex.:: - - $ gunicorn -b 127.0.0.1:8000 -b [::1]:8000 test:app - - will bind the `test:app` application on localhost both on ipv6 - and ipv4 interfaces. - - If the ``PORT`` environment variable is defined, the default - is ``['0.0.0.0:$PORT']``. If it is not defined, the default - is ``['127.0.0.1:8000']``. - """ - - -class Backlog(Setting): - name = "backlog" - section = "Server Socket" - cli = ["--backlog"] - meta = "INT" - validator = validate_pos_int - type = int - default = 2048 - desc = """\ - The maximum number of pending connections. - - This refers to the number of clients that can be waiting to be served. - Exceeding this number results in the client getting an error when - attempting to connect. It should only affect servers under significant - load. - - Must be a positive integer. Generally set in the 64-2048 range. - """ - - -class Workers(Setting): - name = "workers" - section = "Worker Processes" - cli = ["-w", "--workers"] - meta = "INT" - validator = validate_pos_int - type = int - default = int(os.environ.get("WEB_CONCURRENCY", 1)) - desc = """\ - The number of worker processes for handling requests. - - A positive integer generally in the ``2-4 x $(NUM_CORES)`` range. - You'll want to vary this a bit to find the best for your particular - application's work load. - - By default, the value of the ``WEB_CONCURRENCY`` environment variable, - which is set by some Platform-as-a-Service providers such as Heroku. If - it is not defined, the default is ``1``. - """ - - -class WorkerClass(Setting): - name = "worker_class" - section = "Worker Processes" - cli = ["-k", "--worker-class"] - meta = "STRING" - validator = validate_class - default = "sync" - desc = """\ - The type of workers to use. - - The default class (``sync``) should handle most "normal" types of - workloads. You'll want to read :doc:`design` for information on when - you might want to choose one of the other worker classes. Required - libraries may be installed using setuptools' ``extras_require`` feature. - - A string referring to one of the following bundled classes: - - * ``sync`` - * ``eventlet`` - Requires eventlet >= 0.24.1 (or install it via - ``pip install gunicorn[eventlet]``) - * ``gevent`` - Requires gevent >= 1.4 (or install it via - ``pip install gunicorn[gevent]``) - * ``tornado`` - Requires tornado >= 0.2 (or install it via - ``pip install gunicorn[tornado]``) - * ``gthread`` - Python 2 requires the futures package to be installed - (or install it via ``pip install gunicorn[gthread]``) - - Optionally, you can provide your own worker by giving Gunicorn a - Python path to a subclass of ``gunicorn.workers.base.Worker``. - This alternative syntax will load the gevent class: - ``gunicorn.workers.ggevent.GeventWorker``. - """ - - -class WorkerThreads(Setting): - name = "threads" - section = "Worker Processes" - cli = ["--threads"] - meta = "INT" - validator = validate_pos_int - type = int - default = 1 - desc = """\ - The number of worker threads for handling requests. - - Run each worker with the specified number of threads. - - A positive integer generally in the ``2-4 x $(NUM_CORES)`` range. - You'll want to vary this a bit to find the best for your particular - application's work load. - - If it is not defined, the default is ``1``. - - This setting only affects the Gthread worker type. - - .. note:: - If you try to use the ``sync`` worker type and set the ``threads`` - setting to more than 1, the ``gthread`` worker type will be used - instead. - """ - - -class WorkerConnections(Setting): - name = "worker_connections" - section = "Worker Processes" - cli = ["--worker-connections"] - meta = "INT" - validator = validate_pos_int - type = int - default = 1000 - desc = """\ - The maximum number of simultaneous clients. - - This setting only affects the ``gthread``, ``eventlet`` and ``gevent`` worker types. - """ - - -class MaxRequests(Setting): - name = "max_requests" - section = "Worker Processes" - cli = ["--max-requests"] - meta = "INT" - validator = validate_pos_int - type = int - default = 0 - desc = """\ - The maximum number of requests a worker will process before restarting. - - Any value greater than zero will limit the number of requests a worker - will process before automatically restarting. This is a simple method - to help limit the damage of memory leaks. - - If this is set to zero (the default) then the automatic worker - restarts are disabled. - """ - - -class MaxRequestsJitter(Setting): - name = "max_requests_jitter" - section = "Worker Processes" - cli = ["--max-requests-jitter"] - meta = "INT" - validator = validate_pos_int - type = int - default = 0 - desc = """\ - The maximum jitter to add to the *max_requests* setting. - - The jitter causes the restart per worker to be randomized by - ``randint(0, max_requests_jitter)``. This is intended to stagger worker - restarts to avoid all workers restarting at the same time. - - .. versionadded:: 19.2 - """ - - -class Timeout(Setting): - name = "timeout" - section = "Worker Processes" - cli = ["-t", "--timeout"] - meta = "INT" - validator = validate_pos_int - type = int - default = 30 - desc = """\ - Workers silent for more than this many seconds are killed and restarted. - - Value is a positive number or 0. Setting it to 0 has the effect of - infinite timeouts by disabling timeouts for all workers entirely. - - Generally, the default of thirty seconds should suffice. Only set this - noticeably higher if you're sure of the repercussions for sync workers. - For the non sync workers it just means that the worker process is still - communicating and is not tied to the length of time required to handle a - single request. - """ - - -class GracefulTimeout(Setting): - name = "graceful_timeout" - section = "Worker Processes" - cli = ["--graceful-timeout"] - meta = "INT" - validator = validate_pos_int - type = int - default = 30 - desc = """\ - Timeout for graceful workers restart. - - After receiving a restart signal, workers have this much time to finish - serving requests. Workers still alive after the timeout (starting from - the receipt of the restart signal) are force killed. - """ - - -class Keepalive(Setting): - name = "keepalive" - section = "Worker Processes" - cli = ["--keep-alive"] - meta = "INT" - validator = validate_pos_int - type = int - default = 2 - desc = """\ - The number of seconds to wait for requests on a Keep-Alive connection. - - Generally set in the 1-5 seconds range for servers with direct connection - to the client (e.g. when you don't have separate load balancer). When - Gunicorn is deployed behind a load balancer, it often makes sense to - set this to a higher value. - - .. note:: - ``sync`` worker does not support persistent connections and will - ignore this option. - """ - - -class LimitRequestLine(Setting): - name = "limit_request_line" - section = "Security" - cli = ["--limit-request-line"] - meta = "INT" - validator = validate_pos_int - type = int - default = 4094 - desc = """\ - The maximum size of HTTP request line in bytes. - - This parameter is used to limit the allowed size of a client's - HTTP request-line. Since the request-line consists of the HTTP - method, URI, and protocol version, this directive places a - restriction on the length of a request-URI allowed for a request - on the server. A server needs this value to be large enough to - hold any of its resource names, including any information that - might be passed in the query part of a GET request. Value is a number - from 0 (unlimited) to 8190. - - This parameter can be used to prevent any DDOS attack. - """ - - -class LimitRequestFields(Setting): - name = "limit_request_fields" - section = "Security" - cli = ["--limit-request-fields"] - meta = "INT" - validator = validate_pos_int - type = int - default = 100 - desc = """\ - Limit the number of HTTP headers fields in a request. - - This parameter is used to limit the number of headers in a request to - prevent DDOS attack. Used with the *limit_request_field_size* it allows - more safety. By default this value is 100 and can't be larger than - 32768. - """ - - -class LimitRequestFieldSize(Setting): - name = "limit_request_field_size" - section = "Security" - cli = ["--limit-request-field_size"] - meta = "INT" - validator = validate_pos_int - type = int - default = 8190 - desc = """\ - Limit the allowed size of an HTTP request header field. - - Value is a positive number or 0. Setting it to 0 will allow unlimited - header field sizes. - - .. warning:: - Setting this parameter to a very high or unlimited value can open - up for DDOS attacks. - """ - - -class Reload(Setting): - name = "reload" - section = 'Debugging' - cli = ['--reload'] - validator = validate_bool - action = 'store_true' - default = False - - desc = '''\ - Restart workers when code changes. - - This setting is intended for development. It will cause workers to be - restarted whenever application code changes. - - The reloader is incompatible with application preloading. When using a - paste configuration be sure that the server block does not import any - application code or the reload will not work as designed. - - The default behavior is to attempt inotify with a fallback to file - system polling. Generally, inotify should be preferred if available - because it consumes less system resources. - - .. note:: - In order to use the inotify reloader, you must have the ``inotify`` - package installed. - ''' - - -class ReloadEngine(Setting): - name = "reload_engine" - section = "Debugging" - cli = ["--reload-engine"] - meta = "STRING" - validator = validate_reload_engine - default = "auto" - desc = """\ - The implementation that should be used to power :ref:`reload`. - - Valid engines are: - - * ``'auto'`` - * ``'poll'`` - * ``'inotify'`` (requires inotify) - - .. versionadded:: 19.7 - """ - - -class ReloadExtraFiles(Setting): - name = "reload_extra_files" - action = "append" - section = "Debugging" - cli = ["--reload-extra-file"] - meta = "FILES" - validator = validate_list_of_existing_files - default = [] - desc = """\ - Extends :ref:`reload` option to also watch and reload on additional files - (e.g., templates, configurations, specifications, etc.). - - .. versionadded:: 19.8 - """ - - -class Spew(Setting): - name = "spew" - section = "Debugging" - cli = ["--spew"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Install a trace function that spews every line executed by the server. - - This is the nuclear option. - """ - - -class ConfigCheck(Setting): - name = "check_config" - section = "Debugging" - cli = ["--check-config"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Check the configuration and exit. The exit status is 0 if the - configuration is correct, and 1 if the configuration is incorrect. - """ - - -class PrintConfig(Setting): - name = "print_config" - section = "Debugging" - cli = ["--print-config"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Print the configuration settings as fully resolved. Implies :ref:`check-config`. - """ - - -class PreloadApp(Setting): - name = "preload_app" - section = "Server Mechanics" - cli = ["--preload"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Load application code before the worker processes are forked. - - By preloading an application you can save some RAM resources as well as - speed up server boot times. Although, if you defer application loading - to each worker process, you can reload your application code easily by - restarting workers. - """ - - -class Sendfile(Setting): - name = "sendfile" - section = "Server Mechanics" - cli = ["--no-sendfile"] - validator = validate_bool - action = "store_const" - const = False - - desc = """\ - Disables the use of ``sendfile()``. - - If not set, the value of the ``SENDFILE`` environment variable is used - to enable or disable its usage. - - .. versionadded:: 19.2 - .. versionchanged:: 19.4 - Swapped ``--sendfile`` with ``--no-sendfile`` to actually allow - disabling. - .. versionchanged:: 19.6 - added support for the ``SENDFILE`` environment variable - """ - - -class ReusePort(Setting): - name = "reuse_port" - section = "Server Mechanics" - cli = ["--reuse-port"] - validator = validate_bool - action = "store_true" - default = False - - desc = """\ - Set the ``SO_REUSEPORT`` flag on the listening socket. - - .. versionadded:: 19.8 - """ - - -class Chdir(Setting): - name = "chdir" - section = "Server Mechanics" - cli = ["--chdir"] - validator = validate_chdir - default = util.getcwd() - default_doc = "``'.'``" - desc = """\ - Change directory to specified directory before loading apps. - """ - - -class Daemon(Setting): - name = "daemon" - section = "Server Mechanics" - cli = ["-D", "--daemon"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Daemonize the Gunicorn process. - - Detaches the server from the controlling terminal and enters the - background. - """ - - -class Env(Setting): - name = "raw_env" - action = "append" - section = "Server Mechanics" - cli = ["-e", "--env"] - meta = "ENV" - validator = validate_list_string - default = [] - - desc = """\ - Set environment variables in the execution environment. - - Should be a list of strings in the ``key=value`` format. - - For example on the command line: - - .. code-block:: console - - $ gunicorn -b 127.0.0.1:8000 --env FOO=1 test:app - - Or in the configuration file: - - .. code-block:: python - - raw_env = ["FOO=1"] - """ - - -class Pidfile(Setting): - name = "pidfile" - section = "Server Mechanics" - cli = ["-p", "--pid"] - meta = "FILE" - validator = validate_string - default = None - desc = """\ - A filename to use for the PID file. - - If not set, no PID file will be written. - """ - - -class WorkerTmpDir(Setting): - name = "worker_tmp_dir" - section = "Server Mechanics" - cli = ["--worker-tmp-dir"] - meta = "DIR" - validator = validate_string - default = None - desc = """\ - A directory to use for the worker heartbeat temporary file. - - If not set, the default temporary directory will be used. - - .. note:: - The current heartbeat system involves calling ``os.fchmod`` on - temporary file handlers and may block a worker for arbitrary time - if the directory is on a disk-backed filesystem. - - See :ref:`blocking-os-fchmod` for more detailed information - and a solution for avoiding this problem. - """ - - -class User(Setting): - name = "user" - section = "Server Mechanics" - cli = ["-u", "--user"] - meta = "USER" - validator = validate_user - default = os.geteuid() - default_doc = "``os.geteuid()``" - desc = """\ - Switch worker processes to run as this user. - - A valid user id (as an integer) or the name of a user that can be - retrieved with a call to ``pwd.getpwnam(value)`` or ``None`` to not - change the worker process user. - """ - - -class Group(Setting): - name = "group" - section = "Server Mechanics" - cli = ["-g", "--group"] - meta = "GROUP" - validator = validate_group - default = os.getegid() - default_doc = "``os.getegid()``" - desc = """\ - Switch worker process to run as this group. - - A valid group id (as an integer) or the name of a user that can be - retrieved with a call to ``pwd.getgrnam(value)`` or ``None`` to not - change the worker processes group. - """ - - -class Umask(Setting): - name = "umask" - section = "Server Mechanics" - cli = ["-m", "--umask"] - meta = "INT" - validator = validate_pos_int - type = auto_int - default = 0 - desc = """\ - A bit mask for the file mode on files written by Gunicorn. - - Note that this affects unix socket permissions. - - A valid value for the ``os.umask(mode)`` call or a string compatible - with ``int(value, 0)`` (``0`` means Python guesses the base, so values - like ``0``, ``0xFF``, ``0022`` are valid for decimal, hex, and octal - representations) - """ - - -class Initgroups(Setting): - name = "initgroups" - section = "Server Mechanics" - cli = ["--initgroups"] - validator = validate_bool - action = 'store_true' - default = False - - desc = """\ - If true, set the worker process's group access list with all of the - groups of which the specified username is a member, plus the specified - group id. - - .. versionadded:: 19.7 - """ - - -class TmpUploadDir(Setting): - name = "tmp_upload_dir" - section = "Server Mechanics" - meta = "DIR" - validator = validate_string - default = None - desc = """\ - Directory to store temporary request data as they are read. - - This may disappear in the near future. - - This path should be writable by the process permissions set for Gunicorn - workers. If not specified, Gunicorn will choose a system generated - temporary directory. - """ - - -class SecureSchemeHeader(Setting): - name = "secure_scheme_headers" - section = "Server Mechanics" - validator = validate_dict - default = { - "X-FORWARDED-PROTOCOL": "ssl", - "X-FORWARDED-PROTO": "https", - "X-FORWARDED-SSL": "on" - } - desc = """\ - - A dictionary containing headers and values that the front-end proxy - uses to indicate HTTPS requests. If the source IP is permitted by - :ref:`forwarded-allow-ips` (below), *and* at least one request header matches - a key-value pair listed in this dictionary, then Gunicorn will set - ``wsgi.url_scheme`` to ``https``, so your application can tell that the - request is secure. - - If the other headers listed in this dictionary are not present in the request, they will be ignored, - but if the other headers are present and do not match the provided values, then - the request will fail to parse. See the note below for more detailed examples of this behaviour. - - The dictionary should map upper-case header names to exact string - values. The value comparisons are case-sensitive, unlike the header - names, so make sure they're exactly what your front-end proxy sends - when handling HTTPS requests. - - It is important that your front-end proxy configuration ensures that - the headers defined here can not be passed directly from the client. - """ - - -class ForwardedAllowIPS(Setting): - name = "forwarded_allow_ips" - section = "Server Mechanics" - cli = ["--forwarded-allow-ips"] - meta = "STRING" - validator = validate_string_to_addr_list - default = os.environ.get("FORWARDED_ALLOW_IPS", "127.0.0.1,::1") - desc = """\ - Front-end's IPs from which allowed to handle set secure headers. - (comma separated). - - Set to ``*`` to disable checking of front-end IPs. This is useful for setups - where you don't know in advance the IP address of front-end, but - instead have ensured via other means that only your - authorized front-ends can access Gunicorn. - - By default, the value of the ``FORWARDED_ALLOW_IPS`` environment - variable. If it is not defined, the default is ``"127.0.0.1,::1"``. - - .. note:: - - This option does not affect UNIX socket connections. Connections not associated with - an IP address are treated as allowed, unconditionally. - - .. note:: - - The interplay between the request headers, the value of ``forwarded_allow_ips``, and the value of - ``secure_scheme_headers`` is complex. Various scenarios are documented below to further elaborate. - In each case, we have a request from the remote address 134.213.44.18, and the default value of - ``secure_scheme_headers``: - - .. code:: - - secure_scheme_headers = { - 'X-FORWARDED-PROTOCOL': 'ssl', - 'X-FORWARDED-PROTO': 'https', - 'X-FORWARDED-SSL': 'on' - } - - - .. list-table:: - :header-rows: 1 - :align: center - :widths: auto - - * - ``forwarded-allow-ips`` - - Secure Request Headers - - Result - - Explanation - * - .. code:: - - ["127.0.0.1"] - - .. code:: - - X-Forwarded-Proto: https - - .. code:: - - wsgi.url_scheme = "http" - - IP address was not allowed - * - .. code:: - - "*" - - - - .. code:: - - wsgi.url_scheme = "http" - - IP address allowed, but no secure headers provided - * - .. code:: - - "*" - - .. code:: - - X-Forwarded-Proto: https - - .. code:: - - wsgi.url_scheme = "https" - - IP address allowed, one request header matched - * - .. code:: - - ["134.213.44.18"] - - .. code:: - - X-Forwarded-Ssl: on - X-Forwarded-Proto: http - - ``InvalidSchemeHeaders()`` raised - - IP address allowed, but the two secure headers disagreed on if HTTPS was used - - - """ - - -class AccessLog(Setting): - name = "accesslog" - section = "Logging" - cli = ["--access-logfile"] - meta = "FILE" - validator = validate_string - default = None - desc = """\ - The Access log file to write to. - - ``'-'`` means log to stdout. - """ - - -class DisableRedirectAccessToSyslog(Setting): - name = "disable_redirect_access_to_syslog" - section = "Logging" - cli = ["--disable-redirect-access-to-syslog"] - validator = validate_bool - action = 'store_true' - default = False - desc = """\ - Disable redirect access logs to syslog. - - .. versionadded:: 19.8 - """ - - -class AccessLogFormat(Setting): - name = "access_log_format" - section = "Logging" - cli = ["--access-logformat"] - meta = "STRING" - validator = validate_string - default = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' - desc = """\ - The access log format. - - =========== =========== - Identifier Description - =========== =========== - h remote address - l ``'-'`` - u user name (if HTTP Basic auth used) - t date of the request - r status line (e.g. ``GET / HTTP/1.1``) - m request method - U URL path without query string - q query string - H protocol - s status - B response length - b response length or ``'-'`` (CLF format) - f referrer (note: header is ``referer``) - a user agent - T request time in seconds - M request time in milliseconds - D request time in microseconds - L request time in decimal seconds - p process ID - {header}i request header - {header}o response header - {variable}e environment variable - =========== =========== - - Use lowercase for header and environment variable names, and put - ``{...}x`` names inside ``%(...)s``. For example:: - - %({x-forwarded-for}i)s - """ - - -class ErrorLog(Setting): - name = "errorlog" - section = "Logging" - cli = ["--error-logfile", "--log-file"] - meta = "FILE" - validator = validate_string - default = '-' - desc = """\ - The Error log file to write to. - - Using ``'-'`` for FILE makes gunicorn log to stderr. - - .. versionchanged:: 19.2 - Log to stderr by default. - - """ - - -class Loglevel(Setting): - name = "loglevel" - section = "Logging" - cli = ["--log-level"] - meta = "LEVEL" - validator = validate_string - default = "info" - desc = """\ - The granularity of Error log outputs. - - Valid level names are: - - * ``'debug'`` - * ``'info'`` - * ``'warning'`` - * ``'error'`` - * ``'critical'`` - """ - - -class CaptureOutput(Setting): - name = "capture_output" - section = "Logging" - cli = ["--capture-output"] - validator = validate_bool - action = 'store_true' - default = False - desc = """\ - Redirect stdout/stderr to specified file in :ref:`errorlog`. - - .. versionadded:: 19.6 - """ - - -class LoggerClass(Setting): - name = "logger_class" - section = "Logging" - cli = ["--logger-class"] - meta = "STRING" - validator = validate_class - default = "gunicorn.glogging.Logger" - desc = """\ - The logger you want to use to log events in Gunicorn. - - The default class (``gunicorn.glogging.Logger``) handles most - normal usages in logging. It provides error and access logging. - - You can provide your own logger by giving Gunicorn a Python path to a - class that quacks like ``gunicorn.glogging.Logger``. - """ - - -class LogConfig(Setting): - name = "logconfig" - section = "Logging" - cli = ["--log-config"] - meta = "FILE" - validator = validate_string - default = None - desc = """\ - The log config file to use. - Gunicorn uses the standard Python logging module's Configuration - file format. - """ - - -class LogConfigDict(Setting): - name = "logconfig_dict" - section = "Logging" - validator = validate_dict - default = {} - desc = """\ - The log config dictionary to use, using the standard Python - logging module's dictionary configuration format. This option - takes precedence over the :ref:`logconfig` and :ref:`logconfig-json` options, - which uses the older file configuration format and JSON - respectively. - - Format: https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig - - For more context you can look at the default configuration dictionary for logging, - which can be found at ``gunicorn.glogging.CONFIG_DEFAULTS``. - - .. versionadded:: 19.8 - """ - - -class LogConfigJson(Setting): - name = "logconfig_json" - section = "Logging" - cli = ["--log-config-json"] - meta = "FILE" - validator = validate_string - default = None - desc = """\ - The log config to read config from a JSON file - - Format: https://docs.python.org/3/library/logging.config.html#logging.config.jsonConfig - - .. versionadded:: 20.0 - """ - - -class SyslogTo(Setting): - name = "syslog_addr" - section = "Logging" - cli = ["--log-syslog-to"] - meta = "SYSLOG_ADDR" - validator = validate_string - - if PLATFORM == "darwin": - default = "unix:///var/run/syslog" - elif PLATFORM in ('freebsd', 'dragonfly', ): - default = "unix:///var/run/log" - elif PLATFORM == "openbsd": - default = "unix:///dev/log" - else: - default = "udp://localhost:514" - - desc = """\ - Address to send syslog messages. - - Address is a string of the form: - - * ``unix://PATH#TYPE`` : for unix domain socket. ``TYPE`` can be ``stream`` - for the stream driver or ``dgram`` for the dgram driver. - ``stream`` is the default. - * ``udp://HOST:PORT`` : for UDP sockets - * ``tcp://HOST:PORT`` : for TCP sockets - - """ - - -class Syslog(Setting): - name = "syslog" - section = "Logging" - cli = ["--log-syslog"] - validator = validate_bool - action = 'store_true' - default = False - desc = """\ - Send *Gunicorn* logs to syslog. - - .. versionchanged:: 19.8 - You can now disable sending access logs by using the - :ref:`disable-redirect-access-to-syslog` setting. - """ - - -class SyslogPrefix(Setting): - name = "syslog_prefix" - section = "Logging" - cli = ["--log-syslog-prefix"] - meta = "SYSLOG_PREFIX" - validator = validate_string - default = None - desc = """\ - Makes Gunicorn use the parameter as program-name in the syslog entries. - - All entries will be prefixed by ``gunicorn.``. By default the - program name is the name of the process. - """ - - -class SyslogFacility(Setting): - name = "syslog_facility" - section = "Logging" - cli = ["--log-syslog-facility"] - meta = "SYSLOG_FACILITY" - validator = validate_string - default = "user" - desc = """\ - Syslog facility name - """ - - -class EnableStdioInheritance(Setting): - name = "enable_stdio_inheritance" - section = "Logging" - cli = ["-R", "--enable-stdio-inheritance"] - validator = validate_bool - default = False - action = "store_true" - desc = """\ - Enable stdio inheritance. - - Enable inheritance for stdio file descriptors in daemon mode. - - Note: To disable the Python stdout buffering, you can to set the user - environment variable ``PYTHONUNBUFFERED`` . - """ - - -# statsD monitoring -class StatsdHost(Setting): - name = "statsd_host" - section = "Logging" - cli = ["--statsd-host"] - meta = "STATSD_ADDR" - default = None - validator = validate_statsd_address - desc = """\ - The address of the StatsD server to log to. - - Address is a string of the form: - - * ``unix://PATH`` : for a unix domain socket. - * ``HOST:PORT`` : for a network address - - .. versionadded:: 19.1 - """ - - -# Datadog Statsd (dogstatsd) tags. https://docs.datadoghq.com/developers/dogstatsd/ -class DogstatsdTags(Setting): - name = "dogstatsd_tags" - section = "Logging" - cli = ["--dogstatsd-tags"] - meta = "DOGSTATSD_TAGS" - default = "" - validator = validate_string - desc = """\ - A comma-delimited list of datadog statsd (dogstatsd) tags to append to - statsd metrics. - - .. versionadded:: 20 - """ - - -class StatsdPrefix(Setting): - name = "statsd_prefix" - section = "Logging" - cli = ["--statsd-prefix"] - meta = "STATSD_PREFIX" - default = "" - validator = validate_string - desc = """\ - Prefix to use when emitting statsd metrics (a trailing ``.`` is added, - if not provided). - - .. versionadded:: 19.2 - """ - - -class Procname(Setting): - name = "proc_name" - section = "Process Naming" - cli = ["-n", "--name"] - meta = "STRING" - validator = validate_string - default = None - desc = """\ - A base to use with setproctitle for process naming. - - This affects things like ``ps`` and ``top``. If you're going to be - running more than one instance of Gunicorn you'll probably want to set a - name to tell them apart. This requires that you install the setproctitle - module. - - If not set, the *default_proc_name* setting will be used. - """ - - -class DefaultProcName(Setting): - name = "default_proc_name" - section = "Process Naming" - validator = validate_string - default = "gunicorn" - desc = """\ - Internal setting that is adjusted for each type of application. - """ - - -class PythonPath(Setting): - name = "pythonpath" - section = "Server Mechanics" - cli = ["--pythonpath"] - meta = "STRING" - validator = validate_string - default = None - desc = """\ - A comma-separated list of directories to add to the Python path. - - e.g. - ``'/home/djangoprojects/myproject,/home/python/mylibrary'``. - """ - - -class Paste(Setting): - name = "paste" - section = "Server Mechanics" - cli = ["--paste", "--paster"] - meta = "STRING" - validator = validate_string - default = None - desc = """\ - Load a PasteDeploy config file. The argument may contain a ``#`` - symbol followed by the name of an app section from the config file, - e.g. ``production.ini#admin``. - - At this time, using alternate server blocks is not supported. Use the - command line arguments to control server configuration instead. - """ - - -class OnStarting(Setting): - name = "on_starting" - section = "Server Hooks" - validator = validate_callable(1) - type = callable - - def on_starting(server): - pass - default = staticmethod(on_starting) - desc = """\ - Called just before the master process is initialized. - - The callable needs to accept a single instance variable for the Arbiter. - """ - - -class OnReload(Setting): - name = "on_reload" - section = "Server Hooks" - validator = validate_callable(1) - type = callable - - def on_reload(server): - pass - default = staticmethod(on_reload) - desc = """\ - Called to recycle workers during a reload via SIGHUP. - - The callable needs to accept a single instance variable for the Arbiter. - """ - - -class WhenReady(Setting): - name = "when_ready" - section = "Server Hooks" - validator = validate_callable(1) - type = callable - - def when_ready(server): - pass - default = staticmethod(when_ready) - desc = """\ - Called just after the server is started. - - The callable needs to accept a single instance variable for the Arbiter. - """ - - -class Prefork(Setting): - name = "pre_fork" - section = "Server Hooks" - validator = validate_callable(2) - type = callable - - def pre_fork(server, worker): - pass - default = staticmethod(pre_fork) - desc = """\ - Called just before a worker is forked. - - The callable needs to accept two instance variables for the Arbiter and - new Worker. - """ - - -class Postfork(Setting): - name = "post_fork" - section = "Server Hooks" - validator = validate_callable(2) - type = callable - - def post_fork(server, worker): - pass - default = staticmethod(post_fork) - desc = """\ - Called just after a worker has been forked. - - The callable needs to accept two instance variables for the Arbiter and - new Worker. - """ - - -class PostWorkerInit(Setting): - name = "post_worker_init" - section = "Server Hooks" - validator = validate_callable(1) - type = callable - - def post_worker_init(worker): - pass - - default = staticmethod(post_worker_init) - desc = """\ - Called just after a worker has initialized the application. - - The callable needs to accept one instance variable for the initialized - Worker. - """ - - -class WorkerInt(Setting): - name = "worker_int" - section = "Server Hooks" - validator = validate_callable(1) - type = callable - - def worker_int(worker): - pass - - default = staticmethod(worker_int) - desc = """\ - Called just after a worker exited on SIGINT or SIGQUIT. - - The callable needs to accept one instance variable for the initialized - Worker. - """ - - -class WorkerAbort(Setting): - name = "worker_abort" - section = "Server Hooks" - validator = validate_callable(1) - type = callable - - def worker_abort(worker): - pass - - default = staticmethod(worker_abort) - desc = """\ - Called when a worker received the SIGABRT signal. - - This call generally happens on timeout. - - The callable needs to accept one instance variable for the initialized - Worker. - """ - - -class PreExec(Setting): - name = "pre_exec" - section = "Server Hooks" - validator = validate_callable(1) - type = callable - - def pre_exec(server): - pass - default = staticmethod(pre_exec) - desc = """\ - Called just before a new master process is forked. - - The callable needs to accept a single instance variable for the Arbiter. - """ - - -class PreRequest(Setting): - name = "pre_request" - section = "Server Hooks" - validator = validate_callable(2) - type = callable - - def pre_request(worker, req): - worker.log.debug("%s %s", req.method, req.path) - default = staticmethod(pre_request) - desc = """\ - Called just before a worker processes the request. - - The callable needs to accept two instance variables for the Worker and - the Request. - """ - - -class PostRequest(Setting): - name = "post_request" - section = "Server Hooks" - validator = validate_post_request - type = callable - - def post_request(worker, req, environ, resp): - pass - default = staticmethod(post_request) - desc = """\ - Called after a worker processes the request. - - The callable needs to accept two instance variables for the Worker and - the Request. - """ - - -class ChildExit(Setting): - name = "child_exit" - section = "Server Hooks" - validator = validate_callable(2) - type = callable - - def child_exit(server, worker): - pass - default = staticmethod(child_exit) - desc = """\ - Called just after a worker has been exited, in the master process. - - The callable needs to accept two instance variables for the Arbiter and - the just-exited Worker. - - .. versionadded:: 19.7 - """ - - -class WorkerExit(Setting): - name = "worker_exit" - section = "Server Hooks" - validator = validate_callable(2) - type = callable - - def worker_exit(server, worker): - pass - default = staticmethod(worker_exit) - desc = """\ - Called just after a worker has been exited, in the worker process. - - The callable needs to accept two instance variables for the Arbiter and - the just-exited Worker. - """ - - -class NumWorkersChanged(Setting): - name = "nworkers_changed" - section = "Server Hooks" - validator = validate_callable(3) - type = callable - - def nworkers_changed(server, new_value, old_value): - pass - default = staticmethod(nworkers_changed) - desc = """\ - Called just after *num_workers* has been changed. - - The callable needs to accept an instance variable of the Arbiter and - two integers of number of workers after and before change. - - If the number of workers is set for the first time, *old_value* would - be ``None``. - """ - - -class OnExit(Setting): - name = "on_exit" - section = "Server Hooks" - validator = validate_callable(1) - - def on_exit(server): - pass - - default = staticmethod(on_exit) - desc = """\ - Called just before exiting Gunicorn. - - The callable needs to accept a single instance variable for the Arbiter. - """ - - -class NewSSLContext(Setting): - name = "ssl_context" - section = "Server Hooks" - validator = validate_callable(2) - type = callable - - def ssl_context(config, default_ssl_context_factory): - return default_ssl_context_factory() - - default = staticmethod(ssl_context) - desc = """\ - Called when SSLContext is needed. - - Allows customizing SSL context. - - The callable needs to accept an instance variable for the Config and - a factory function that returns default SSLContext which is initialized - with certificates, private key, cert_reqs, and ciphers according to - config and can be further customized by the callable. - The callable needs to return SSLContext object. - - Following example shows a configuration file that sets the minimum TLS version to 1.3: - - .. code-block:: python - - def ssl_context(conf, default_ssl_context_factory): - import ssl - context = default_ssl_context_factory() - context.minimum_version = ssl.TLSVersion.TLSv1_3 - return context - - .. versionadded:: 21.0 - """ - - -class ProxyProtocol(Setting): - name = "proxy_protocol" - section = "Server Mechanics" - cli = ["--proxy-protocol"] - validator = validate_bool - default = False - action = "store_true" - desc = """\ - Enable detect PROXY protocol (PROXY mode). - - Allow using HTTP and Proxy together. It may be useful for work with - stunnel as HTTPS frontend and Gunicorn as HTTP server. - - PROXY protocol: http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt - - Example for stunnel config:: - - [https] - protocol = proxy - accept = 443 - connect = 80 - cert = /etc/ssl/certs/stunnel.pem - key = /etc/ssl/certs/stunnel.key - """ - - -class ProxyAllowFrom(Setting): - name = "proxy_allow_ips" - section = "Server Mechanics" - cli = ["--proxy-allow-from"] - validator = validate_string_to_addr_list - default = "127.0.0.1,::1" - desc = """\ - Front-end's IPs from which allowed accept proxy requests (comma separated). - - Set to ``*`` to disable checking of front-end IPs. This is useful for setups - where you don't know in advance the IP address of front-end, but - instead have ensured via other means that only your - authorized front-ends can access Gunicorn. - - .. note:: - - This option does not affect UNIX socket connections. Connections not associated with - an IP address are treated as allowed, unconditionally. - """ - - -class KeyFile(Setting): - name = "keyfile" - section = "SSL" - cli = ["--keyfile"] - meta = "FILE" - validator = validate_string - default = None - desc = """\ - SSL key file - """ - - -class CertFile(Setting): - name = "certfile" - section = "SSL" - cli = ["--certfile"] - meta = "FILE" - validator = validate_string - default = None - desc = """\ - SSL certificate file - """ - - -class SSLVersion(Setting): - name = "ssl_version" - section = "SSL" - cli = ["--ssl-version"] - validator = validate_ssl_version - - if hasattr(ssl, "PROTOCOL_TLS"): - default = ssl.PROTOCOL_TLS - else: - default = ssl.PROTOCOL_SSLv23 - - default = ssl.PROTOCOL_SSLv23 - desc = """\ - SSL version to use (see stdlib ssl module's). - - .. deprecated:: 21.0 - The option is deprecated and it is currently ignored. Use :ref:`ssl-context` instead. - - ============= ============ - --ssl-version Description - ============= ============ - SSLv3 SSLv3 is not-secure and is strongly discouraged. - SSLv23 Alias for TLS. Deprecated in Python 3.6, use TLS. - TLS Negotiate highest possible version between client/server. - Can yield SSL. (Python 3.6+) - TLSv1 TLS 1.0 - TLSv1_1 TLS 1.1 (Python 3.4+) - TLSv1_2 TLS 1.2 (Python 3.4+) - TLS_SERVER Auto-negotiate the highest protocol version like TLS, - but only support server-side SSLSocket connections. - (Python 3.6+) - ============= ============ - - .. versionchanged:: 19.7 - The default value has been changed from ``ssl.PROTOCOL_TLSv1`` to - ``ssl.PROTOCOL_SSLv23``. - .. versionchanged:: 20.0 - This setting now accepts string names based on ``ssl.PROTOCOL_`` - constants. - .. versionchanged:: 20.0.1 - The default value has been changed from ``ssl.PROTOCOL_SSLv23`` to - ``ssl.PROTOCOL_TLS`` when Python >= 3.6 . - """ - - -class CertReqs(Setting): - name = "cert_reqs" - section = "SSL" - cli = ["--cert-reqs"] - validator = validate_pos_int - default = ssl.CERT_NONE - desc = """\ - Whether client certificate is required (see stdlib ssl module's) - - =========== =========================== - --cert-reqs Description - =========== =========================== - `0` no client verification - `1` ssl.CERT_OPTIONAL - `2` ssl.CERT_REQUIRED - =========== =========================== - """ - - -class CACerts(Setting): - name = "ca_certs" - section = "SSL" - cli = ["--ca-certs"] - meta = "FILE" - validator = validate_string - default = None - desc = """\ - CA certificates file - """ - - -class SuppressRaggedEOFs(Setting): - name = "suppress_ragged_eofs" - section = "SSL" - cli = ["--suppress-ragged-eofs"] - action = "store_true" - default = True - validator = validate_bool - desc = """\ - Suppress ragged EOFs (see stdlib ssl module's) - """ - - -class DoHandshakeOnConnect(Setting): - name = "do_handshake_on_connect" - section = "SSL" - cli = ["--do-handshake-on-connect"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Whether to perform SSL handshake on socket connect (see stdlib ssl module's) - """ - - -class Ciphers(Setting): - name = "ciphers" - section = "SSL" - cli = ["--ciphers"] - validator = validate_string - default = None - desc = """\ - SSL Cipher suite to use, in the format of an OpenSSL cipher list. - - By default we use the default cipher list from Python's ``ssl`` module, - which contains ciphers considered strong at the time of each Python - release. - - As a recommended alternative, the Open Web App Security Project (OWASP) - offers `a vetted set of strong cipher strings rated A+ to C- - `_. - OWASP provides details on user-agent compatibility at each security level. - - See the `OpenSSL Cipher List Format Documentation - `_ - for details on the format of an OpenSSL cipher list. - """ - - -class PasteGlobalConf(Setting): - name = "raw_paste_global_conf" - action = "append" - section = "Server Mechanics" - cli = ["--paste-global"] - meta = "CONF" - validator = validate_list_string - default = [] - - desc = """\ - Set a PasteDeploy global config variable in ``key=value`` form. - - The option can be specified multiple times. - - The variables are passed to the PasteDeploy entrypoint. Example:: - - $ gunicorn -b 127.0.0.1:8000 --paste development.ini --paste-global FOO=1 --paste-global BAR=2 - - .. versionadded:: 19.7 - """ - - -class PermitObsoleteFolding(Setting): - name = "permit_obsolete_folding" - section = "Server Mechanics" - cli = ["--permit-obsolete-folding"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Permit requests employing obsolete HTTP line folding mechanism - - The folding mechanism was deprecated by rfc7230 Section 3.2.4 and will not be - employed in HTTP request headers from standards-compliant HTTP clients. - - This option is provided to diagnose backwards-incompatible changes. - Use with care and only if necessary. Temporary; the precise effect of this option may - change in a future version, or it may be removed altogether. - - .. versionadded:: 23.0.0 - """ - - -class StripHeaderSpaces(Setting): - name = "strip_header_spaces" - section = "Server Mechanics" - cli = ["--strip-header-spaces"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Strip spaces present between the header name and the the ``:``. - - This is known to induce vulnerabilities and is not compliant with the HTTP/1.1 standard. - See https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn. - - Use with care and only if necessary. Deprecated; scheduled for removal in 25.0.0 - - .. versionadded:: 20.0.1 - """ - - -class PermitUnconventionalHTTPMethod(Setting): - name = "permit_unconventional_http_method" - section = "Server Mechanics" - cli = ["--permit-unconventional-http-method"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Permit HTTP methods not matching conventions, such as IANA registration guidelines - - This permits request methods of length less than 3 or more than 20, - methods with lowercase characters or methods containing the # character. - HTTP methods are case sensitive by definition, and merely uppercase by convention. - - If unset, Gunicorn will apply nonstandard restrictions and cause 400 response status - in cases where otherwise 501 status is expected. While this option does modify that - behaviour, it should not be depended upon to guarantee standards-compliant behaviour. - Rather, it is provided temporarily, to assist in diagnosing backwards-incompatible - changes around the incomplete application of those restrictions. - - Use with care and only if necessary. Temporary; scheduled for removal in 24.0.0 - - .. versionadded:: 22.0.0 - """ - - -class PermitUnconventionalHTTPVersion(Setting): - name = "permit_unconventional_http_version" - section = "Server Mechanics" - cli = ["--permit-unconventional-http-version"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Permit HTTP version not matching conventions of 2023 - - This disables the refusal of likely malformed request lines. - It is unusual to specify HTTP 1 versions other than 1.0 and 1.1. - - This option is provided to diagnose backwards-incompatible changes. - Use with care and only if necessary. Temporary; the precise effect of this option may - change in a future version, or it may be removed altogether. - - .. versionadded:: 22.0.0 - """ - - -class CasefoldHTTPMethod(Setting): - name = "casefold_http_method" - section = "Server Mechanics" - cli = ["--casefold-http-method"] - validator = validate_bool - action = "store_true" - default = False - desc = """\ - Transform received HTTP methods to uppercase - - HTTP methods are case sensitive by definition, and merely uppercase by convention. - - This option is provided because previous versions of gunicorn defaulted to this behaviour. - - Use with care and only if necessary. Deprecated; scheduled for removal in 24.0.0 - - .. versionadded:: 22.0.0 - """ - - -def validate_header_map_behaviour(val): - # FIXME: refactor all of this subclassing stdlib argparse - - if val is None: - return - - if not isinstance(val, str): - raise TypeError("Invalid type for casting: %s" % val) - if val.lower().strip() == "drop": - return "drop" - elif val.lower().strip() == "refuse": - return "refuse" - elif val.lower().strip() == "dangerous": - return "dangerous" - else: - raise ValueError("Invalid header map behaviour: %s" % val) - - -class ForwarderHeaders(Setting): - name = "forwarder_headers" - section = "Server Mechanics" - cli = ["--forwarder-headers"] - validator = validate_string_to_list - default = "SCRIPT_NAME,PATH_INFO" - desc = """\ - - A list containing upper-case header field names that the front-end proxy - (see :ref:`forwarded-allow-ips`) sets, to be used in WSGI environment. - - This option has no effect for headers not present in the request. - - This option can be used to transfer ``SCRIPT_NAME``, ``PATH_INFO`` - and ``REMOTE_USER``. - - It is important that your front-end proxy configuration ensures that - the headers defined here can not be passed directly from the client. - """ - - -class HeaderMap(Setting): - name = "header_map" - section = "Server Mechanics" - cli = ["--header-map"] - validator = validate_header_map_behaviour - default = "drop" - desc = """\ - Configure how header field names are mapped into environ - - Headers containing underscores are permitted by RFC9110, - but gunicorn joining headers of different names into - the same environment variable will dangerously confuse applications as to which is which. - - The safe default ``drop`` is to silently drop headers that cannot be unambiguously mapped. - The value ``refuse`` will return an error if a request contains *any* such header. - The value ``dangerous`` matches the previous, not advisable, behaviour of mapping different - header field names into the same environ name. - - If the source is permitted as explained in :ref:`forwarded-allow-ips`, *and* the header name is - present in :ref:`forwarder-headers`, the header is mapped into environment regardless of - the state of this setting. - - Use with care and only if necessary and after considering if your problem could - instead be solved by specifically renaming or rewriting only the intended headers - on a proxy in front of Gunicorn. - - .. versionadded:: 22.0.0 - """ diff --git a/port/lib/python3.11/site-packages/gunicorn/debug.py b/port/lib/python3.11/site-packages/gunicorn/debug.py deleted file mode 100644 index 5fae0b4..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/debug.py +++ /dev/null @@ -1,68 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -"""The debug module contains utilities and functions for better -debugging Gunicorn.""" - -import sys -import linecache -import re -import inspect - -__all__ = ['spew', 'unspew'] - -_token_spliter = re.compile(r'\W+') - - -class Spew: - - def __init__(self, trace_names=None, show_values=True): - self.trace_names = trace_names - self.show_values = show_values - - def __call__(self, frame, event, arg): - if event == 'line': - lineno = frame.f_lineno - if '__file__' in frame.f_globals: - filename = frame.f_globals['__file__'] - if (filename.endswith('.pyc') or - filename.endswith('.pyo')): - filename = filename[:-1] - name = frame.f_globals['__name__'] - line = linecache.getline(filename, lineno) - else: - name = '[unknown]' - try: - src = inspect.getsourcelines(frame) - line = src[lineno] - except OSError: - line = 'Unknown code named [%s]. VM instruction #%d' % ( - frame.f_code.co_name, frame.f_lasti) - if self.trace_names is None or name in self.trace_names: - print('%s:%s: %s' % (name, lineno, line.rstrip())) - if not self.show_values: - return self - details = [] - tokens = _token_spliter.split(line) - for tok in tokens: - if tok in frame.f_globals: - details.append('%s=%r' % (tok, frame.f_globals[tok])) - if tok in frame.f_locals: - details.append('%s=%r' % (tok, frame.f_locals[tok])) - if details: - print("\t%s" % ' '.join(details)) - return self - - -def spew(trace_names=None, show_values=False): - """Install a trace hook which writes incredibly detailed logs - about what code is being executed to stdout. - """ - sys.settrace(Spew(trace_names, show_values)) - - -def unspew(): - """Remove the trace hook installed by spew. - """ - sys.settrace(None) diff --git a/port/lib/python3.11/site-packages/gunicorn/errors.py b/port/lib/python3.11/site-packages/gunicorn/errors.py deleted file mode 100644 index 1128380..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/errors.py +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -# We don't need to call super() in __init__ methods of our -# BaseException and Exception classes because we also define -# our own __str__ methods so there is no need to pass 'message' -# to the base class to get a meaningful output from 'str(exc)'. -# pylint: disable=super-init-not-called - - -# we inherit from BaseException here to make sure to not be caught -# at application level -class HaltServer(BaseException): - def __init__(self, reason, exit_status=1): - self.reason = reason - self.exit_status = exit_status - - def __str__(self): - return "" % (self.reason, self.exit_status) - - -class ConfigError(Exception): - """ Exception raised on config error """ - - -class AppImportError(Exception): - """ Exception raised when loading an application """ diff --git a/port/lib/python3.11/site-packages/gunicorn/glogging.py b/port/lib/python3.11/site-packages/gunicorn/glogging.py deleted file mode 100644 index e34fcd5..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/glogging.py +++ /dev/null @@ -1,473 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import base64 -import binascii -import json -import time -import logging -logging.Logger.manager.emittedNoHandlerWarning = 1 # noqa -from logging.config import dictConfig -from logging.config import fileConfig -import os -import socket -import sys -import threading -import traceback - -from gunicorn import util - - -# syslog facility codes -SYSLOG_FACILITIES = { - "auth": 4, - "authpriv": 10, - "cron": 9, - "daemon": 3, - "ftp": 11, - "kern": 0, - "lpr": 6, - "mail": 2, - "news": 7, - "security": 4, # DEPRECATED - "syslog": 5, - "user": 1, - "uucp": 8, - "local0": 16, - "local1": 17, - "local2": 18, - "local3": 19, - "local4": 20, - "local5": 21, - "local6": 22, - "local7": 23 -} - -CONFIG_DEFAULTS = { - "version": 1, - "disable_existing_loggers": False, - "root": {"level": "INFO", "handlers": ["console"]}, - "loggers": { - "gunicorn.error": { - "level": "INFO", - "handlers": ["error_console"], - "propagate": True, - "qualname": "gunicorn.error" - }, - - "gunicorn.access": { - "level": "INFO", - "handlers": ["console"], - "propagate": True, - "qualname": "gunicorn.access" - } - }, - "handlers": { - "console": { - "class": "logging.StreamHandler", - "formatter": "generic", - "stream": "ext://sys.stdout" - }, - "error_console": { - "class": "logging.StreamHandler", - "formatter": "generic", - "stream": "ext://sys.stderr" - }, - }, - "formatters": { - "generic": { - "format": "%(asctime)s [%(process)d] [%(levelname)s] %(message)s", - "datefmt": "[%Y-%m-%d %H:%M:%S %z]", - "class": "logging.Formatter" - } - } -} - - -def loggers(): - """ get list of all loggers """ - root = logging.root - existing = list(root.manager.loggerDict.keys()) - return [logging.getLogger(name) for name in existing] - - -class SafeAtoms(dict): - - def __init__(self, atoms): - dict.__init__(self) - for key, value in atoms.items(): - if isinstance(value, str): - self[key] = value.replace('"', '\\"') - else: - self[key] = value - - def __getitem__(self, k): - if k.startswith("{"): - kl = k.lower() - if kl in self: - return super().__getitem__(kl) - else: - return "-" - if k in self: - return super().__getitem__(k) - else: - return '-' - - -def parse_syslog_address(addr): - - # unix domain socket type depends on backend - # SysLogHandler will try both when given None - if addr.startswith("unix://"): - sock_type = None - - # set socket type only if explicitly requested - parts = addr.split("#", 1) - if len(parts) == 2: - addr = parts[0] - if parts[1] == "dgram": - sock_type = socket.SOCK_DGRAM - - return (sock_type, addr.split("unix://")[1]) - - if addr.startswith("udp://"): - addr = addr.split("udp://")[1] - socktype = socket.SOCK_DGRAM - elif addr.startswith("tcp://"): - addr = addr.split("tcp://")[1] - socktype = socket.SOCK_STREAM - else: - raise RuntimeError("invalid syslog address") - - if '[' in addr and ']' in addr: - host = addr.split(']')[0][1:].lower() - elif ':' in addr: - host = addr.split(':')[0].lower() - elif addr == "": - host = "localhost" - else: - host = addr.lower() - - addr = addr.split(']')[-1] - if ":" in addr: - port = addr.split(':', 1)[1] - if not port.isdigit(): - raise RuntimeError("%r is not a valid port number." % port) - port = int(port) - else: - port = 514 - - return (socktype, (host, port)) - - -class Logger: - - LOG_LEVELS = { - "critical": logging.CRITICAL, - "error": logging.ERROR, - "warning": logging.WARNING, - "info": logging.INFO, - "debug": logging.DEBUG - } - loglevel = logging.INFO - - error_fmt = r"%(asctime)s [%(process)d] [%(levelname)s] %(message)s" - datefmt = r"[%Y-%m-%d %H:%M:%S %z]" - - access_fmt = "%(message)s" - syslog_fmt = "[%(process)d] %(message)s" - - atoms_wrapper_class = SafeAtoms - - def __init__(self, cfg): - self.error_log = logging.getLogger("gunicorn.error") - self.error_log.propagate = False - self.access_log = logging.getLogger("gunicorn.access") - self.access_log.propagate = False - self.error_handlers = [] - self.access_handlers = [] - self.logfile = None - self.lock = threading.Lock() - self.cfg = cfg - self.setup(cfg) - - def setup(self, cfg): - self.loglevel = self.LOG_LEVELS.get(cfg.loglevel.lower(), logging.INFO) - self.error_log.setLevel(self.loglevel) - self.access_log.setLevel(logging.INFO) - - # set gunicorn.error handler - if self.cfg.capture_output and cfg.errorlog != "-": - for stream in sys.stdout, sys.stderr: - stream.flush() - - self.logfile = open(cfg.errorlog, 'a+') - os.dup2(self.logfile.fileno(), sys.stdout.fileno()) - os.dup2(self.logfile.fileno(), sys.stderr.fileno()) - - self._set_handler(self.error_log, cfg.errorlog, - logging.Formatter(self.error_fmt, self.datefmt)) - - # set gunicorn.access handler - if cfg.accesslog is not None: - self._set_handler( - self.access_log, cfg.accesslog, - fmt=logging.Formatter(self.access_fmt), stream=sys.stdout - ) - - # set syslog handler - if cfg.syslog: - self._set_syslog_handler( - self.error_log, cfg, self.syslog_fmt, "error" - ) - if not cfg.disable_redirect_access_to_syslog: - self._set_syslog_handler( - self.access_log, cfg, self.syslog_fmt, "access" - ) - - if cfg.logconfig_dict: - config = CONFIG_DEFAULTS.copy() - config.update(cfg.logconfig_dict) - try: - dictConfig(config) - except ( - AttributeError, - ImportError, - ValueError, - TypeError - ) as exc: - raise RuntimeError(str(exc)) - elif cfg.logconfig_json: - config = CONFIG_DEFAULTS.copy() - if os.path.exists(cfg.logconfig_json): - try: - config_json = json.load(open(cfg.logconfig_json)) - config.update(config_json) - dictConfig(config) - except ( - json.JSONDecodeError, - AttributeError, - ImportError, - ValueError, - TypeError - ) as exc: - raise RuntimeError(str(exc)) - elif cfg.logconfig: - if os.path.exists(cfg.logconfig): - defaults = CONFIG_DEFAULTS.copy() - defaults['__file__'] = cfg.logconfig - defaults['here'] = os.path.dirname(cfg.logconfig) - fileConfig(cfg.logconfig, defaults=defaults, - disable_existing_loggers=False) - else: - msg = "Error: log config '%s' not found" - raise RuntimeError(msg % cfg.logconfig) - - def critical(self, msg, *args, **kwargs): - self.error_log.critical(msg, *args, **kwargs) - - def error(self, msg, *args, **kwargs): - self.error_log.error(msg, *args, **kwargs) - - def warning(self, msg, *args, **kwargs): - self.error_log.warning(msg, *args, **kwargs) - - def info(self, msg, *args, **kwargs): - self.error_log.info(msg, *args, **kwargs) - - def debug(self, msg, *args, **kwargs): - self.error_log.debug(msg, *args, **kwargs) - - def exception(self, msg, *args, **kwargs): - self.error_log.exception(msg, *args, **kwargs) - - def log(self, lvl, msg, *args, **kwargs): - if isinstance(lvl, str): - lvl = self.LOG_LEVELS.get(lvl.lower(), logging.INFO) - self.error_log.log(lvl, msg, *args, **kwargs) - - def atoms(self, resp, req, environ, request_time): - """ Gets atoms for log formatting. - """ - status = resp.status - if isinstance(status, str): - status = status.split(None, 1)[0] - atoms = { - 'h': environ.get('REMOTE_ADDR', '-'), - 'l': '-', - 'u': self._get_user(environ) or '-', - 't': self.now(), - 'r': "%s %s %s" % (environ['REQUEST_METHOD'], - environ['RAW_URI'], - environ["SERVER_PROTOCOL"]), - 's': status, - 'm': environ.get('REQUEST_METHOD'), - 'U': environ.get('PATH_INFO'), - 'q': environ.get('QUERY_STRING'), - 'H': environ.get('SERVER_PROTOCOL'), - 'b': getattr(resp, 'sent', None) is not None and str(resp.sent) or '-', - 'B': getattr(resp, 'sent', None), - 'f': environ.get('HTTP_REFERER', '-'), - 'a': environ.get('HTTP_USER_AGENT', '-'), - 'T': request_time.seconds, - 'D': (request_time.seconds * 1000000) + request_time.microseconds, - 'M': (request_time.seconds * 1000) + int(request_time.microseconds / 1000), - 'L': "%d.%06d" % (request_time.seconds, request_time.microseconds), - 'p': "<%s>" % os.getpid() - } - - # add request headers - if hasattr(req, 'headers'): - req_headers = req.headers - else: - req_headers = req - - if hasattr(req_headers, "items"): - req_headers = req_headers.items() - - atoms.update({"{%s}i" % k.lower(): v for k, v in req_headers}) - - resp_headers = resp.headers - if hasattr(resp_headers, "items"): - resp_headers = resp_headers.items() - - # add response headers - atoms.update({"{%s}o" % k.lower(): v for k, v in resp_headers}) - - # add environ variables - environ_variables = environ.items() - atoms.update({"{%s}e" % k.lower(): v for k, v in environ_variables}) - - return atoms - - def access(self, resp, req, environ, request_time): - """ See http://httpd.apache.org/docs/2.0/logs.html#combined - for format details - """ - - if not (self.cfg.accesslog or self.cfg.logconfig or - self.cfg.logconfig_dict or self.cfg.logconfig_json or - (self.cfg.syslog and not self.cfg.disable_redirect_access_to_syslog)): - return - - # wrap atoms: - # - make sure atoms will be test case insensitively - # - if atom doesn't exist replace it by '-' - safe_atoms = self.atoms_wrapper_class( - self.atoms(resp, req, environ, request_time) - ) - - try: - self.access_log.info(self.cfg.access_log_format, safe_atoms) - except Exception: - self.error(traceback.format_exc()) - - def now(self): - """ return date in Apache Common Log Format """ - return time.strftime('[%d/%b/%Y:%H:%M:%S %z]') - - def reopen_files(self): - if self.cfg.capture_output and self.cfg.errorlog != "-": - for stream in sys.stdout, sys.stderr: - stream.flush() - - with self.lock: - if self.logfile is not None: - self.logfile.close() - self.logfile = open(self.cfg.errorlog, 'a+') - os.dup2(self.logfile.fileno(), sys.stdout.fileno()) - os.dup2(self.logfile.fileno(), sys.stderr.fileno()) - - for log in loggers(): - for handler in log.handlers: - if isinstance(handler, logging.FileHandler): - handler.acquire() - try: - if handler.stream: - handler.close() - handler.stream = handler._open() - finally: - handler.release() - - def close_on_exec(self): - for log in loggers(): - for handler in log.handlers: - if isinstance(handler, logging.FileHandler): - handler.acquire() - try: - if handler.stream: - util.close_on_exec(handler.stream.fileno()) - finally: - handler.release() - - def _get_gunicorn_handler(self, log): - for h in log.handlers: - if getattr(h, "_gunicorn", False): - return h - - def _set_handler(self, log, output, fmt, stream=None): - # remove previous gunicorn log handler - h = self._get_gunicorn_handler(log) - if h: - log.handlers.remove(h) - - if output is not None: - if output == "-": - h = logging.StreamHandler(stream) - else: - util.check_is_writable(output) - h = logging.FileHandler(output) - # make sure the user can reopen the file - try: - os.chown(h.baseFilename, self.cfg.user, self.cfg.group) - except OSError: - # it's probably OK there, we assume the user has given - # /dev/null as a parameter. - pass - - h.setFormatter(fmt) - h._gunicorn = True - log.addHandler(h) - - def _set_syslog_handler(self, log, cfg, fmt, name): - # setup format - prefix = cfg.syslog_prefix or cfg.proc_name.replace(":", ".") - - prefix = "gunicorn.%s.%s" % (prefix, name) - - # set format - fmt = logging.Formatter(r"%s: %s" % (prefix, fmt)) - - # syslog facility - try: - facility = SYSLOG_FACILITIES[cfg.syslog_facility.lower()] - except KeyError: - raise RuntimeError("unknown facility name") - - # parse syslog address - socktype, addr = parse_syslog_address(cfg.syslog_addr) - - # finally setup the syslog handler - h = logging.handlers.SysLogHandler(address=addr, - facility=facility, socktype=socktype) - - h.setFormatter(fmt) - h._gunicorn = True - log.addHandler(h) - - def _get_user(self, environ): - user = None - http_auth = environ.get("HTTP_AUTHORIZATION") - if http_auth and http_auth.lower().startswith('basic'): - auth = http_auth.split(" ", 1) - if len(auth) == 2: - try: - # b64decode doesn't accept unicode in Python < 3.3 - # so we need to convert it to a byte string - auth = base64.b64decode(auth[1].strip().encode('utf-8')) - # b64decode returns a byte string - user = auth.split(b":", 1)[0].decode("UTF-8") - except (TypeError, binascii.Error, UnicodeDecodeError) as exc: - self.debug("Couldn't get username: %s", exc) - return user diff --git a/port/lib/python3.11/site-packages/gunicorn/http/__init__.py b/port/lib/python3.11/site-packages/gunicorn/http/__init__.py deleted file mode 100644 index 11473bb..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/http/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -from gunicorn.http.message import Message, Request -from gunicorn.http.parser import RequestParser - -__all__ = ['Message', 'Request', 'RequestParser'] diff --git a/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f157ac2e7e0fac9620a01b95089bb6f527346a04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397 zcmZWm%SyyB6ixcDQtVDYqJj-|wuATs4ukHx33VDf!L*G@YMGsX;oi;Q-*hQi39j4? z%x*w5sWZsn&B@8RaPHwkmQfS}Q_JyJ`EA}0+w98OiuI`x&!7MWWT1i>tenh&ws)9Y zd6@@62@3ZGW`5z_fY|@EgR!H7DnXc8aj zld`SptPyoGSBfXqZ^)lfAMYFZ5H*bJ0OOo7j9~*+U5BQPPcsCiS5k~BqcRPcyn&?O$9tIe1D*nVg#Cpd1E_E= diff --git a/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/body.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/body.cpython-311.pyc deleted file mode 100644 index 31d6e2bbabed0cd5dd7bfa85cf57e875774153c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14306 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 diff --git a/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/message.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/message.cpython-311.pyc deleted file mode 100644 index a55a19255dcacf7a15da8732741b9b6bdcda3689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20197 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 ig=BmBB?TKVlN zj)EFQ$w3EE++wf~J@`-@x9%aw{)6_=gJlF33x+`HAvXo*6ex6NC9S16ltSO`&d%4H znKy6dy@#QYpTKx{3VR$O2k^B<%4JJjAaQH1JsxE6wPkMAvqTc!CrBo!<@rooFKC9D;H$$l2^{n;lnt4kbis@gw+De8bb=#b$C;gr zm_EnoziO&D&#_wKfpT|dsvJ-rha#{je!&u$rrcqe{e;)zmE{%7vnm_1X)=auv%H0N zMj4v5gsf()SOG&XFh!GORb`fsY3q`r7jkAoumnTPEHf++%iU69eLxs!YYfKoPsKYj z6E`+C#6_K%%X%iQi+RArO!}6XFPf`*?%nBRQZ&-0_D)__Zp$m0A+8j1X+>u_an&^Q zV&2|}>3q@hN>VzPHYMp^e`|N9JB$!|{SrW#G{VCbq3S&e3~tWu%+>-E^}s}v@V?|p zd}@ET7Qa-FU#iSi=PUDn#V_m+*Wxqv_zW@{kr9~aYm81-gt~X6=_ap^0;8`2&ncKD zinConAa0ieW_%kq0uoFYegeP-fMcM1j12;`!-n$g4clhKP!l%^!tM`O0xSY}j~ldZ zyZIRmqMJ2fv<7>-o7(LTuA@Ts06TCf*4JHwy|Qnhmb+|!*iEfDwYiHsdu~9jgZHy) z{+gC38~?u+9)X3sbj_)6mAePqtZ-cwPj)ds=LUFoDj#rfM*(oBvjBH2@4>1LoRvY} zbSCuV+xXAfvwJN~#t3ZIBit4qC=<0LtWXpuc*# zNvLmPC-Ot=I3^y Ay_k0ov9$>8hXiCf}fa2z@yIDo3qJdJR4>+;ssy=+ypuwdhPeIc@mD=3QaHZg(`j3zMb)! zcN7t5x9uC>-`Jh|@#B5(YVpuJVs{Fh zVQ?hm1_Iw-9HA+E-rtGD^7EIHJQM v6FPNB65Vfud~o=(x9NV1LblI?r^tJDCRn5#g?%^=Ha~ib+-ENl*_rqUGs@ie diff --git a/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/unreader.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/unreader.cpython-311.pyc deleted file mode 100644 index a456e6fdc51b20eccad1a44aa4a8c2157996b2b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4435 zcmcgv-ESMm5#PNJ>L~L=rW8?;l!UURB&-t?sof$D)Wl6h#CC1EfYKt-%Yo*dB}x>@ z?47KS(19ALD5DB66)=!esEA(bRPalIqW=de5HN9o00Vu>8x8qE2vDFidm?ow%7FtE z-Q&%E%~Ch4-}(KW1j=_~|Cw6qAmrcJX%_jYaWD;yO`;KvX2_&n(@83j4~ZtM z5>0#{5b_XSyG#n4BLPR&g$E+=;637roaX^vM;lMl=md!>-{aIo>SzV8nz9dGhwdiP z$t2atq@dANGAZI7CMC_INvm{H)@0~;G!Z0qSjz9ROiyY$OHqe7l!iMx_$8NSI(Rd! z_5ge#xB9WiMWM>#dlPHuX32$<%CeN;hIt^VxJN$Fi|$ z)6B=_k2JWDU$PWcO=r`lsxF^xDt4hc}VLC8wt6v$M;A*7kV6 z3ugs@z}^Bw)xdBqFkDfF84e{o~ulAgilDHDQ)ZU;;vf_hB|6&?on3fz067dD)SgEoZF>CU+QnYzA$^i+e8= zB(L0XNdxC?()`+P#&EA9y<9{Ew3Y3A>bEdh@S-V%> z6ANf1r&XRqj{=?LBH7Awenl!s#{Wxqr!ENDwo;JX$bqwTuK5Z2{{!@Q;OTkJQ~t^4 z>HNa!`pAHC@<-vtmZoj`$r@n7IRk>HlvsY%NH6P=e3B*SbW>-Mxp~8k+}0z>Y$TmE zBRLkya&)RGc08y9{-IR zPmEiVsb?~lGNqe$lbLy)p^X`ui=D+K@&bbZ8TBwkEC_&ISt8R-i)!`+NlThZ!vow1 zFLo@FF!V3`TcHTM=q<)PM1>VnKNGB+8Ti}vznlM>sE%B&ja-KAerTXFI9?6KYoU0> z7k|v>)PvonPuG@;OZ9Mn$-rK6ZLzpm4-b^2$BJ)Vx$j@|my&-CZ4XqH(V8+^QAS~9 zacpaR`|7th|8n!2TidsaWA#vP`SnMk;l0psH8ffajTS%H55HJm-YAp{#qss4_3qx{ zb=Vcm?CRO<{Hk-qSN0WuUGMHGUVR)0txw;dTbuhbx1QUP_5vf7z(~EPZ}a+B*EepI zZxrM8?!E>Q{R8#h{_^yr-q-eeU#s>;YrWBuxIggH_B-Ef8i@wLr<-8sCa< z#mk>nmEoF#As&qtFMU*suYXoi`Z-8k@g8F=kN2z4fOt=4ptj3SD|RMrQmIqW+pm#6^8!gyv#{OatHGBsu!+wB3|i=WDzcO5Q}6hFp*2m>Soih z-;)T4ZHhwKcn%y$8Z^G9KX#=#9a!$fhY8$y=PL-#B#Jjc`$!~9Hs

<5q{z1iQ34 z<`(&_Co0)Ec>{K2dFPUgDj&AIs+!6q4MSB8v<^h975ilHHgZ@gqn^k+h(0`HyUxf<&UKyOhO%&o8D|Y}?`=2ZrQrWZVD(c5FTk zL6nCedOm}6Quz(^f@c#O>nJ`2Z>uydcYs@VVx1$Mt}4wxFD;~tmhT#*+9u9jv9fh` zd64$MfVlI%d@>q3!G8>Qks$()zz#W?MMXO)E7(ci&giz`ajR}vzu;7>1?mrAp7Apv z&jj^;Pv2JGMxvZRXcysW$Fv0N@q-6hAZ|<>@E37{c!`PpqvFglClNhNoY`fBurrty zz!uHLUzV+q~13O*NAI;1+0;Q zd3bneV3_}N_bcSvvzNqw(n})yISepNM^691zrqa3`^dnpxcozqhcU*t5v4~XUO633Q4G)Ji)Q2$Bd6@2L(57C#8>{;ONt1R*#Q@YVD--_7fa^dJ2nc@L!aLNO1rF diff --git a/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/wsgi.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/http/__pycache__/wsgi.cpython-311.pyc deleted file mode 100644 index a807962331ddeb6b402aa412a0a8c14e34c63ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17200 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 0: - while size > len(rest): - size -= len(rest) - yield rest - rest = unreader.read() - if not rest: - raise NoMoreData() - yield rest[:size] - # Remove \r\n after chunk - rest = rest[size:] - while len(rest) < 2: - new_data = unreader.read() - if not new_data: - break - rest += new_data - if rest[:2] != b'\r\n': - raise ChunkMissingTerminator(rest[:2]) - (size, rest) = self.parse_chunk_size(unreader, data=rest[2:]) - - def parse_chunk_size(self, unreader, data=None): - buf = io.BytesIO() - if data is not None: - buf.write(data) - - idx = buf.getvalue().find(b"\r\n") - while idx < 0: - self.get_data(unreader, buf) - idx = buf.getvalue().find(b"\r\n") - - data = buf.getvalue() - line, rest_chunk = data[:idx], data[idx + 2:] - - # RFC9112 7.1.1: BWS before chunk-ext - but ONLY then - chunk_size, *chunk_ext = line.split(b";", 1) - if chunk_ext: - chunk_size = chunk_size.rstrip(b" \t") - if any(n not in b"0123456789abcdefABCDEF" for n in chunk_size): - raise InvalidChunkSize(chunk_size) - if len(chunk_size) == 0: - raise InvalidChunkSize(chunk_size) - chunk_size = int(chunk_size, 16) - - if chunk_size == 0: - try: - self.parse_trailers(unreader, rest_chunk) - except NoMoreData: - pass - return (0, None) - return (chunk_size, rest_chunk) - - def get_data(self, unreader, buf): - data = unreader.read() - if not data: - raise NoMoreData() - buf.write(data) - - -class LengthReader: - def __init__(self, unreader, length): - self.unreader = unreader - self.length = length - - def read(self, size): - if not isinstance(size, int): - raise TypeError("size must be an integral type") - - size = min(self.length, size) - if size < 0: - raise ValueError("Size must be positive.") - if size == 0: - return b"" - - buf = io.BytesIO() - data = self.unreader.read() - while data: - buf.write(data) - if buf.tell() >= size: - break - data = self.unreader.read() - - buf = buf.getvalue() - ret, rest = buf[:size], buf[size:] - self.unreader.unread(rest) - self.length -= size - return ret - - -class EOFReader: - def __init__(self, unreader): - self.unreader = unreader - self.buf = io.BytesIO() - self.finished = False - - def read(self, size): - if not isinstance(size, int): - raise TypeError("size must be an integral type") - if size < 0: - raise ValueError("Size must be positive.") - if size == 0: - return b"" - - if self.finished: - data = self.buf.getvalue() - ret, rest = data[:size], data[size:] - self.buf = io.BytesIO() - self.buf.write(rest) - return ret - - data = self.unreader.read() - while data: - self.buf.write(data) - if self.buf.tell() > size: - break - data = self.unreader.read() - - if not data: - self.finished = True - - data = self.buf.getvalue() - ret, rest = data[:size], data[size:] - self.buf = io.BytesIO() - self.buf.write(rest) - return ret - - -class Body: - def __init__(self, reader): - self.reader = reader - self.buf = io.BytesIO() - - def __iter__(self): - return self - - def __next__(self): - ret = self.readline() - if not ret: - raise StopIteration() - return ret - - next = __next__ - - def getsize(self, size): - if size is None: - return sys.maxsize - elif not isinstance(size, int): - raise TypeError("size must be an integral type") - elif size < 0: - return sys.maxsize - return size - - def read(self, size=None): - size = self.getsize(size) - if size == 0: - return b"" - - if size < self.buf.tell(): - data = self.buf.getvalue() - ret, rest = data[:size], data[size:] - self.buf = io.BytesIO() - self.buf.write(rest) - return ret - - while size > self.buf.tell(): - data = self.reader.read(1024) - if not data: - break - self.buf.write(data) - - data = self.buf.getvalue() - ret, rest = data[:size], data[size:] - self.buf = io.BytesIO() - self.buf.write(rest) - return ret - - def readline(self, size=None): - size = self.getsize(size) - if size == 0: - return b"" - - data = self.buf.getvalue() - self.buf = io.BytesIO() - - ret = [] - while 1: - idx = data.find(b"\n", 0, size) - idx = idx + 1 if idx >= 0 else size if len(data) >= size else 0 - if idx: - ret.append(data[:idx]) - self.buf.write(data[idx:]) - break - - ret.append(data) - size -= len(data) - data = self.reader.read(min(1024, size)) - if not data: - break - - return b"".join(ret) - - def readlines(self, size=None): - ret = [] - data = self.read() - while data: - pos = data.find(b"\n") - if pos < 0: - ret.append(data) - data = b"" - else: - line, data = data[:pos + 1], data[pos + 1:] - ret.append(line) - return ret diff --git a/port/lib/python3.11/site-packages/gunicorn/http/errors.py b/port/lib/python3.11/site-packages/gunicorn/http/errors.py deleted file mode 100644 index bcb9700..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/http/errors.py +++ /dev/null @@ -1,145 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -# We don't need to call super() in __init__ methods of our -# BaseException and Exception classes because we also define -# our own __str__ methods so there is no need to pass 'message' -# to the base class to get a meaningful output from 'str(exc)'. -# pylint: disable=super-init-not-called - - -class ParseException(Exception): - pass - - -class NoMoreData(IOError): - def __init__(self, buf=None): - self.buf = buf - - def __str__(self): - return "No more data after: %r" % self.buf - - -class ConfigurationProblem(ParseException): - def __init__(self, info): - self.info = info - self.code = 500 - - def __str__(self): - return "Configuration problem: %s" % self.info - - -class InvalidRequestLine(ParseException): - def __init__(self, req): - self.req = req - self.code = 400 - - def __str__(self): - return "Invalid HTTP request line: %r" % self.req - - -class InvalidRequestMethod(ParseException): - def __init__(self, method): - self.method = method - - def __str__(self): - return "Invalid HTTP method: %r" % self.method - - -class InvalidHTTPVersion(ParseException): - def __init__(self, version): - self.version = version - - def __str__(self): - return "Invalid HTTP Version: %r" % (self.version,) - - -class InvalidHeader(ParseException): - def __init__(self, hdr, req=None): - self.hdr = hdr - self.req = req - - def __str__(self): - return "Invalid HTTP Header: %r" % self.hdr - - -class ObsoleteFolding(ParseException): - def __init__(self, hdr): - self.hdr = hdr - - def __str__(self): - return "Obsolete line folding is unacceptable: %r" % (self.hdr, ) - - -class InvalidHeaderName(ParseException): - def __init__(self, hdr): - self.hdr = hdr - - def __str__(self): - return "Invalid HTTP header name: %r" % self.hdr - - -class UnsupportedTransferCoding(ParseException): - def __init__(self, hdr): - self.hdr = hdr - self.code = 501 - - def __str__(self): - return "Unsupported transfer coding: %r" % self.hdr - - -class InvalidChunkSize(IOError): - def __init__(self, data): - self.data = data - - def __str__(self): - return "Invalid chunk size: %r" % self.data - - -class ChunkMissingTerminator(IOError): - def __init__(self, term): - self.term = term - - def __str__(self): - return "Invalid chunk terminator is not '\\r\\n': %r" % self.term - - -class LimitRequestLine(ParseException): - def __init__(self, size, max_size): - self.size = size - self.max_size = max_size - - def __str__(self): - return "Request Line is too large (%s > %s)" % (self.size, self.max_size) - - -class LimitRequestHeaders(ParseException): - def __init__(self, msg): - self.msg = msg - - def __str__(self): - return self.msg - - -class InvalidProxyLine(ParseException): - def __init__(self, line): - self.line = line - self.code = 400 - - def __str__(self): - return "Invalid PROXY line: %r" % self.line - - -class ForbiddenProxyRequest(ParseException): - def __init__(self, host): - self.host = host - self.code = 403 - - def __str__(self): - return "Proxy request from %r not allowed" % self.host - - -class InvalidSchemeHeaders(ParseException): - def __str__(self): - return "Contradictory scheme headers" diff --git a/port/lib/python3.11/site-packages/gunicorn/http/message.py b/port/lib/python3.11/site-packages/gunicorn/http/message.py deleted file mode 100644 index 59ce0bf..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/http/message.py +++ /dev/null @@ -1,463 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import io -import re -import socket - -from gunicorn.http.body import ChunkedReader, LengthReader, EOFReader, Body -from gunicorn.http.errors import ( - InvalidHeader, InvalidHeaderName, NoMoreData, - InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, - LimitRequestLine, LimitRequestHeaders, - UnsupportedTransferCoding, ObsoleteFolding, -) -from gunicorn.http.errors import InvalidProxyLine, ForbiddenProxyRequest -from gunicorn.http.errors import InvalidSchemeHeaders -from gunicorn.util import bytes_to_str, split_request_uri - -MAX_REQUEST_LINE = 8190 -MAX_HEADERS = 32768 -DEFAULT_MAX_HEADERFIELD_SIZE = 8190 - -# verbosely on purpose, avoid backslash ambiguity -RFC9110_5_6_2_TOKEN_SPECIALS = r"!#$%&'*+-.^_`|~" -TOKEN_RE = re.compile(r"[%s0-9a-zA-Z]+" % (re.escape(RFC9110_5_6_2_TOKEN_SPECIALS))) -METHOD_BADCHAR_RE = re.compile("[a-z#]") -# usually 1.0 or 1.1 - RFC9112 permits restricting to single-digit versions -VERSION_RE = re.compile(r"HTTP/(\d)\.(\d)") -RFC9110_5_5_INVALID_AND_DANGEROUS = re.compile(r"[\0\r\n]") - - -class Message: - def __init__(self, cfg, unreader, peer_addr): - self.cfg = cfg - self.unreader = unreader - self.peer_addr = peer_addr - self.remote_addr = peer_addr - self.version = None - self.headers = [] - self.trailers = [] - self.body = None - self.scheme = "https" if cfg.is_ssl else "http" - self.must_close = False - - # set headers limits - self.limit_request_fields = cfg.limit_request_fields - if (self.limit_request_fields <= 0 - or self.limit_request_fields > MAX_HEADERS): - self.limit_request_fields = MAX_HEADERS - self.limit_request_field_size = cfg.limit_request_field_size - if self.limit_request_field_size < 0: - self.limit_request_field_size = DEFAULT_MAX_HEADERFIELD_SIZE - - # set max header buffer size - max_header_field_size = self.limit_request_field_size or DEFAULT_MAX_HEADERFIELD_SIZE - self.max_buffer_headers = self.limit_request_fields * \ - (max_header_field_size + 2) + 4 - - unused = self.parse(self.unreader) - self.unreader.unread(unused) - self.set_body_reader() - - def force_close(self): - self.must_close = True - - def parse(self, unreader): - raise NotImplementedError() - - def parse_headers(self, data, from_trailer=False): - cfg = self.cfg - headers = [] - - # Split lines on \r\n - lines = [bytes_to_str(line) for line in data.split(b"\r\n")] - - # handle scheme headers - scheme_header = False - secure_scheme_headers = {} - forwarder_headers = [] - if from_trailer: - # nonsense. either a request is https from the beginning - # .. or we are just behind a proxy who does not remove conflicting trailers - pass - elif ('*' in cfg.forwarded_allow_ips or - not isinstance(self.peer_addr, tuple) - or self.peer_addr[0] in cfg.forwarded_allow_ips): - secure_scheme_headers = cfg.secure_scheme_headers - forwarder_headers = cfg.forwarder_headers - - # Parse headers into key/value pairs paying attention - # to continuation lines. - while lines: - if len(headers) >= self.limit_request_fields: - raise LimitRequestHeaders("limit request headers fields") - - # Parse initial header name: value pair. - curr = lines.pop(0) - header_length = len(curr) + len("\r\n") - if curr.find(":") <= 0: - raise InvalidHeader(curr) - name, value = curr.split(":", 1) - if self.cfg.strip_header_spaces: - name = name.rstrip(" \t") - if not TOKEN_RE.fullmatch(name): - raise InvalidHeaderName(name) - - # this is still a dangerous place to do this - # but it is more correct than doing it before the pattern match: - # after we entered Unicode wonderland, 8bits could case-shift into ASCII: - # b"\xDF".decode("latin-1").upper().encode("ascii") == b"SS" - name = name.upper() - - value = [value.strip(" \t")] - - # Consume value continuation lines.. - while lines and lines[0].startswith((" ", "\t")): - # .. which is obsolete here, and no longer done by default - if not self.cfg.permit_obsolete_folding: - raise ObsoleteFolding(name) - curr = lines.pop(0) - header_length += len(curr) + len("\r\n") - if header_length > self.limit_request_field_size > 0: - raise LimitRequestHeaders("limit request headers " - "fields size") - value.append(curr.strip("\t ")) - value = " ".join(value) - - if RFC9110_5_5_INVALID_AND_DANGEROUS.search(value): - raise InvalidHeader(name) - - if header_length > self.limit_request_field_size > 0: - raise LimitRequestHeaders("limit request headers fields size") - - if name in secure_scheme_headers: - secure = value == secure_scheme_headers[name] - scheme = "https" if secure else "http" - if scheme_header: - if scheme != self.scheme: - raise InvalidSchemeHeaders() - else: - scheme_header = True - self.scheme = scheme - - # ambiguous mapping allows fooling downstream, e.g. merging non-identical headers: - # X-Forwarded-For: 2001:db8::ha:cc:ed - # X_Forwarded_For: 127.0.0.1,::1 - # HTTP_X_FORWARDED_FOR = 2001:db8::ha:cc:ed,127.0.0.1,::1 - # Only modify after fixing *ALL* header transformations; network to wsgi env - if "_" in name: - if name in forwarder_headers or "*" in forwarder_headers: - # This forwarder may override our environment - pass - elif self.cfg.header_map == "dangerous": - # as if we did not know we cannot safely map this - pass - elif self.cfg.header_map == "drop": - # almost as if it never had been there - # but still counts against resource limits - continue - else: - # fail-safe fallthrough: refuse - raise InvalidHeaderName(name) - - headers.append((name, value)) - - return headers - - def set_body_reader(self): - chunked = False - content_length = None - - for (name, value) in self.headers: - if name == "CONTENT-LENGTH": - if content_length is not None: - raise InvalidHeader("CONTENT-LENGTH", req=self) - content_length = value - elif name == "TRANSFER-ENCODING": - # T-E can be a list - # https://datatracker.ietf.org/doc/html/rfc9112#name-transfer-encoding - vals = [v.strip() for v in value.split(',')] - for val in vals: - if val.lower() == "chunked": - # DANGER: transfer codings stack, and stacked chunking is never intended - if chunked: - raise InvalidHeader("TRANSFER-ENCODING", req=self) - chunked = True - elif val.lower() == "identity": - # does not do much, could still plausibly desync from what the proxy does - # safe option: nuke it, its never needed - if chunked: - raise InvalidHeader("TRANSFER-ENCODING", req=self) - elif val.lower() in ('compress', 'deflate', 'gzip'): - # chunked should be the last one - if chunked: - raise InvalidHeader("TRANSFER-ENCODING", req=self) - self.force_close() - else: - raise UnsupportedTransferCoding(value) - - if chunked: - # two potentially dangerous cases: - # a) CL + TE (TE overrides CL.. only safe if the recipient sees it that way too) - # b) chunked HTTP/1.0 (always faulty) - if self.version < (1, 1): - # framing wonky, see RFC 9112 Section 6.1 - raise InvalidHeader("TRANSFER-ENCODING", req=self) - if content_length is not None: - # we cannot be certain the message framing we understood matches proxy intent - # -> whatever happens next, remaining input must not be trusted - raise InvalidHeader("CONTENT-LENGTH", req=self) - self.body = Body(ChunkedReader(self, self.unreader)) - elif content_length is not None: - try: - if str(content_length).isnumeric(): - content_length = int(content_length) - else: - raise InvalidHeader("CONTENT-LENGTH", req=self) - except ValueError: - raise InvalidHeader("CONTENT-LENGTH", req=self) - - if content_length < 0: - raise InvalidHeader("CONTENT-LENGTH", req=self) - - self.body = Body(LengthReader(self.unreader, content_length)) - else: - self.body = Body(EOFReader(self.unreader)) - - def should_close(self): - if self.must_close: - return True - for (h, v) in self.headers: - if h == "CONNECTION": - v = v.lower().strip(" \t") - if v == "close": - return True - elif v == "keep-alive": - return False - break - return self.version <= (1, 0) - - -class Request(Message): - def __init__(self, cfg, unreader, peer_addr, req_number=1): - self.method = None - self.uri = None - self.path = None - self.query = None - self.fragment = None - - # get max request line size - self.limit_request_line = cfg.limit_request_line - if (self.limit_request_line < 0 - or self.limit_request_line >= MAX_REQUEST_LINE): - self.limit_request_line = MAX_REQUEST_LINE - - self.req_number = req_number - self.proxy_protocol_info = None - super().__init__(cfg, unreader, peer_addr) - - def get_data(self, unreader, buf, stop=False): - data = unreader.read() - if not data: - if stop: - raise StopIteration() - raise NoMoreData(buf.getvalue()) - buf.write(data) - - def parse(self, unreader): - buf = io.BytesIO() - self.get_data(unreader, buf, stop=True) - - # get request line - line, rbuf = self.read_line(unreader, buf, self.limit_request_line) - - # proxy protocol - if self.proxy_protocol(bytes_to_str(line)): - # get next request line - buf = io.BytesIO() - buf.write(rbuf) - line, rbuf = self.read_line(unreader, buf, self.limit_request_line) - - self.parse_request_line(line) - buf = io.BytesIO() - buf.write(rbuf) - - # Headers - data = buf.getvalue() - idx = data.find(b"\r\n\r\n") - - done = data[:2] == b"\r\n" - while True: - idx = data.find(b"\r\n\r\n") - done = data[:2] == b"\r\n" - - if idx < 0 and not done: - self.get_data(unreader, buf) - data = buf.getvalue() - if len(data) > self.max_buffer_headers: - raise LimitRequestHeaders("max buffer headers") - else: - break - - if done: - self.unreader.unread(data[2:]) - return b"" - - self.headers = self.parse_headers(data[:idx], from_trailer=False) - - ret = data[idx + 4:] - buf = None - return ret - - def read_line(self, unreader, buf, limit=0): - data = buf.getvalue() - - while True: - idx = data.find(b"\r\n") - if idx >= 0: - # check if the request line is too large - if idx > limit > 0: - raise LimitRequestLine(idx, limit) - break - if len(data) - 2 > limit > 0: - raise LimitRequestLine(len(data), limit) - self.get_data(unreader, buf) - data = buf.getvalue() - - return (data[:idx], # request line, - data[idx + 2:]) # residue in the buffer, skip \r\n - - def proxy_protocol(self, line): - """\ - Detect, check and parse proxy protocol. - - :raises: ForbiddenProxyRequest, InvalidProxyLine. - :return: True for proxy protocol line else False - """ - if not self.cfg.proxy_protocol: - return False - - if self.req_number != 1: - return False - - if not line.startswith("PROXY"): - return False - - self.proxy_protocol_access_check() - self.parse_proxy_protocol(line) - - return True - - def proxy_protocol_access_check(self): - # check in allow list - if ("*" not in self.cfg.proxy_allow_ips and - isinstance(self.peer_addr, tuple) and - self.peer_addr[0] not in self.cfg.proxy_allow_ips): - raise ForbiddenProxyRequest(self.peer_addr[0]) - - def parse_proxy_protocol(self, line): - bits = line.split(" ") - - if len(bits) != 6: - raise InvalidProxyLine(line) - - # Extract data - proto = bits[1] - s_addr = bits[2] - d_addr = bits[3] - - # Validation - if proto not in ["TCP4", "TCP6"]: - raise InvalidProxyLine("protocol '%s' not supported" % proto) - if proto == "TCP4": - try: - socket.inet_pton(socket.AF_INET, s_addr) - socket.inet_pton(socket.AF_INET, d_addr) - except OSError: - raise InvalidProxyLine(line) - elif proto == "TCP6": - try: - socket.inet_pton(socket.AF_INET6, s_addr) - socket.inet_pton(socket.AF_INET6, d_addr) - except OSError: - raise InvalidProxyLine(line) - - try: - s_port = int(bits[4]) - d_port = int(bits[5]) - except ValueError: - raise InvalidProxyLine("invalid port %s" % line) - - if not ((0 <= s_port <= 65535) and (0 <= d_port <= 65535)): - raise InvalidProxyLine("invalid port %s" % line) - - # Set data - self.proxy_protocol_info = { - "proxy_protocol": proto, - "client_addr": s_addr, - "client_port": s_port, - "proxy_addr": d_addr, - "proxy_port": d_port - } - - def parse_request_line(self, line_bytes): - bits = [bytes_to_str(bit) for bit in line_bytes.split(b" ", 2)] - if len(bits) != 3: - raise InvalidRequestLine(bytes_to_str(line_bytes)) - - # Method: RFC9110 Section 9 - self.method = bits[0] - - # nonstandard restriction, suitable for all IANA registered methods - # partially enforced in previous gunicorn versions - if not self.cfg.permit_unconventional_http_method: - if METHOD_BADCHAR_RE.search(self.method): - raise InvalidRequestMethod(self.method) - if not 3 <= len(bits[0]) <= 20: - raise InvalidRequestMethod(self.method) - # standard restriction: RFC9110 token - if not TOKEN_RE.fullmatch(self.method): - raise InvalidRequestMethod(self.method) - # nonstandard and dangerous - # methods are merely uppercase by convention, no case-insensitive treatment is intended - if self.cfg.casefold_http_method: - self.method = self.method.upper() - - # URI - self.uri = bits[1] - - # Python stdlib explicitly tells us it will not perform validation. - # https://docs.python.org/3/library/urllib.parse.html#url-parsing-security - # There are *four* `request-target` forms in rfc9112, none of them can be empty: - # 1. origin-form, which starts with a slash - # 2. absolute-form, which starts with a non-empty scheme - # 3. authority-form, (for CONNECT) which contains a colon after the host - # 4. asterisk-form, which is an asterisk (`\x2A`) - # => manually reject one always invalid URI: empty - if len(self.uri) == 0: - raise InvalidRequestLine(bytes_to_str(line_bytes)) - - try: - parts = split_request_uri(self.uri) - except ValueError: - raise InvalidRequestLine(bytes_to_str(line_bytes)) - self.path = parts.path or "" - self.query = parts.query or "" - self.fragment = parts.fragment or "" - - # Version - match = VERSION_RE.fullmatch(bits[2]) - if match is None: - raise InvalidHTTPVersion(bits[2]) - self.version = (int(match.group(1)), int(match.group(2))) - if not (1, 0) <= self.version < (2, 0): - # if ever relaxing this, carefully review Content-Encoding processing - if not self.cfg.permit_unconventional_http_version: - raise InvalidHTTPVersion(self.version) - - def set_body_reader(self): - super().set_body_reader() - if isinstance(self.body.reader, EOFReader): - self.body = Body(LengthReader(self.unreader, 0)) diff --git a/port/lib/python3.11/site-packages/gunicorn/http/parser.py b/port/lib/python3.11/site-packages/gunicorn/http/parser.py deleted file mode 100644 index 88da17a..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/http/parser.py +++ /dev/null @@ -1,51 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -from gunicorn.http.message import Request -from gunicorn.http.unreader import SocketUnreader, IterUnreader - - -class Parser: - - mesg_class = None - - def __init__(self, cfg, source, source_addr): - self.cfg = cfg - if hasattr(source, "recv"): - self.unreader = SocketUnreader(source) - else: - self.unreader = IterUnreader(source) - self.mesg = None - self.source_addr = source_addr - - # request counter (for keepalive connetions) - self.req_count = 0 - - def __iter__(self): - return self - - def __next__(self): - # Stop if HTTP dictates a stop. - if self.mesg and self.mesg.should_close(): - raise StopIteration() - - # Discard any unread body of the previous message - if self.mesg: - data = self.mesg.body.read(8192) - while data: - data = self.mesg.body.read(8192) - - # Parse the next request - self.req_count += 1 - self.mesg = self.mesg_class(self.cfg, self.unreader, self.source_addr, self.req_count) - if not self.mesg: - raise StopIteration() - return self.mesg - - next = __next__ - - -class RequestParser(Parser): - - mesg_class = Request diff --git a/port/lib/python3.11/site-packages/gunicorn/http/unreader.py b/port/lib/python3.11/site-packages/gunicorn/http/unreader.py deleted file mode 100644 index 9aadfbc..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/http/unreader.py +++ /dev/null @@ -1,78 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import io -import os - -# Classes that can undo reading data from -# a given type of data source. - - -class Unreader: - def __init__(self): - self.buf = io.BytesIO() - - def chunk(self): - raise NotImplementedError() - - def read(self, size=None): - if size is not None and not isinstance(size, int): - raise TypeError("size parameter must be an int or long.") - - if size is not None: - if size == 0: - return b"" - if size < 0: - size = None - - self.buf.seek(0, os.SEEK_END) - - if size is None and self.buf.tell(): - ret = self.buf.getvalue() - self.buf = io.BytesIO() - return ret - if size is None: - d = self.chunk() - return d - - while self.buf.tell() < size: - chunk = self.chunk() - if not chunk: - ret = self.buf.getvalue() - self.buf = io.BytesIO() - return ret - self.buf.write(chunk) - data = self.buf.getvalue() - self.buf = io.BytesIO() - self.buf.write(data[size:]) - return data[:size] - - def unread(self, data): - self.buf.seek(0, os.SEEK_END) - self.buf.write(data) - - -class SocketUnreader(Unreader): - def __init__(self, sock, max_chunk=8192): - super().__init__() - self.sock = sock - self.mxchunk = max_chunk - - def chunk(self): - return self.sock.recv(self.mxchunk) - - -class IterUnreader(Unreader): - def __init__(self, iterable): - super().__init__() - self.iter = iter(iterable) - - def chunk(self): - if not self.iter: - return b"" - try: - return next(self.iter) - except StopIteration: - self.iter = None - return b"" diff --git a/port/lib/python3.11/site-packages/gunicorn/http/wsgi.py b/port/lib/python3.11/site-packages/gunicorn/http/wsgi.py deleted file mode 100644 index 419ac50..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/http/wsgi.py +++ /dev/null @@ -1,401 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import io -import logging -import os -import re -import sys - -from gunicorn.http.message import TOKEN_RE -from gunicorn.http.errors import ConfigurationProblem, InvalidHeader, InvalidHeaderName -from gunicorn import SERVER_SOFTWARE, SERVER -from gunicorn import util - -# Send files in at most 1GB blocks as some operating systems can have problems -# with sending files in blocks over 2GB. -BLKSIZE = 0x3FFFFFFF - -# RFC9110 5.5: field-vchar = VCHAR / obs-text -# RFC4234 B.1: VCHAR = 0x21-x07E = printable ASCII -HEADER_VALUE_RE = re.compile(r'[ \t\x21-\x7e\x80-\xff]*') - -log = logging.getLogger(__name__) - - -class FileWrapper: - - def __init__(self, filelike, blksize=8192): - self.filelike = filelike - self.blksize = blksize - if hasattr(filelike, 'close'): - self.close = filelike.close - - def __getitem__(self, key): - data = self.filelike.read(self.blksize) - if data: - return data - raise IndexError - - -class WSGIErrorsWrapper(io.RawIOBase): - - def __init__(self, cfg): - # There is no public __init__ method for RawIOBase so - # we don't need to call super() in the __init__ method. - # pylint: disable=super-init-not-called - errorlog = logging.getLogger("gunicorn.error") - handlers = errorlog.handlers - self.streams = [] - - if cfg.errorlog == "-": - self.streams.append(sys.stderr) - handlers = handlers[1:] - - for h in handlers: - if hasattr(h, "stream"): - self.streams.append(h.stream) - - def write(self, data): - for stream in self.streams: - try: - stream.write(data) - except UnicodeError: - stream.write(data.encode("UTF-8")) - stream.flush() - - -def base_environ(cfg): - return { - "wsgi.errors": WSGIErrorsWrapper(cfg), - "wsgi.version": (1, 0), - "wsgi.multithread": False, - "wsgi.multiprocess": (cfg.workers > 1), - "wsgi.run_once": False, - "wsgi.file_wrapper": FileWrapper, - "wsgi.input_terminated": True, - "SERVER_SOFTWARE": SERVER_SOFTWARE, - } - - -def default_environ(req, sock, cfg): - env = base_environ(cfg) - env.update({ - "wsgi.input": req.body, - "gunicorn.socket": sock, - "REQUEST_METHOD": req.method, - "QUERY_STRING": req.query, - "RAW_URI": req.uri, - "SERVER_PROTOCOL": "HTTP/%s" % ".".join([str(v) for v in req.version]) - }) - return env - - -def proxy_environ(req): - info = req.proxy_protocol_info - - if not info: - return {} - - return { - "PROXY_PROTOCOL": info["proxy_protocol"], - "REMOTE_ADDR": info["client_addr"], - "REMOTE_PORT": str(info["client_port"]), - "PROXY_ADDR": info["proxy_addr"], - "PROXY_PORT": str(info["proxy_port"]), - } - - -def create(req, sock, client, server, cfg): - resp = Response(req, sock, cfg) - - # set initial environ - environ = default_environ(req, sock, cfg) - - # default variables - host = None - script_name = os.environ.get("SCRIPT_NAME", "") - - # add the headers to the environ - for hdr_name, hdr_value in req.headers: - if hdr_name == "EXPECT": - # handle expect - if hdr_value.lower() == "100-continue": - sock.send(b"HTTP/1.1 100 Continue\r\n\r\n") - elif hdr_name == 'HOST': - host = hdr_value - elif hdr_name == "SCRIPT_NAME": - script_name = hdr_value - elif hdr_name == "CONTENT-TYPE": - environ['CONTENT_TYPE'] = hdr_value - continue - elif hdr_name == "CONTENT-LENGTH": - environ['CONTENT_LENGTH'] = hdr_value - continue - - # do not change lightly, this is a common source of security problems - # RFC9110 Section 17.10 discourages ambiguous or incomplete mappings - key = 'HTTP_' + hdr_name.replace('-', '_') - if key in environ: - hdr_value = "%s,%s" % (environ[key], hdr_value) - environ[key] = hdr_value - - # set the url scheme - environ['wsgi.url_scheme'] = req.scheme - - # set the REMOTE_* keys in environ - # authors should be aware that REMOTE_HOST and REMOTE_ADDR - # may not qualify the remote addr: - # http://www.ietf.org/rfc/rfc3875 - if isinstance(client, str): - environ['REMOTE_ADDR'] = client - elif isinstance(client, bytes): - environ['REMOTE_ADDR'] = client.decode() - else: - environ['REMOTE_ADDR'] = client[0] - environ['REMOTE_PORT'] = str(client[1]) - - # handle the SERVER_* - # Normally only the application should use the Host header but since the - # WSGI spec doesn't support unix sockets, we are using it to create - # viable SERVER_* if possible. - if isinstance(server, str): - server = server.split(":") - if len(server) == 1: - # unix socket - if host: - server = host.split(':') - if len(server) == 1: - if req.scheme == "http": - server.append(80) - elif req.scheme == "https": - server.append(443) - else: - server.append('') - else: - # no host header given which means that we are not behind a - # proxy, so append an empty port. - server.append('') - environ['SERVER_NAME'] = server[0] - environ['SERVER_PORT'] = str(server[1]) - - # set the path and script name - path_info = req.path - if script_name: - if not path_info.startswith(script_name): - raise ConfigurationProblem( - "Request path %r does not start with SCRIPT_NAME %r" % - (path_info, script_name)) - path_info = path_info[len(script_name):] - environ['PATH_INFO'] = util.unquote_to_wsgi_str(path_info) - environ['SCRIPT_NAME'] = script_name - - # override the environ with the correct remote and server address if - # we are behind a proxy using the proxy protocol. - environ.update(proxy_environ(req)) - return resp, environ - - -class Response: - - def __init__(self, req, sock, cfg): - self.req = req - self.sock = sock - self.version = SERVER - self.status = None - self.chunked = False - self.must_close = False - self.headers = [] - self.headers_sent = False - self.response_length = None - self.sent = 0 - self.upgrade = False - self.cfg = cfg - - def force_close(self): - self.must_close = True - - def should_close(self): - if self.must_close or self.req.should_close(): - return True - if self.response_length is not None or self.chunked: - return False - if self.req.method == 'HEAD': - return False - if self.status_code < 200 or self.status_code in (204, 304): - return False - return True - - def start_response(self, status, headers, exc_info=None): - if exc_info: - try: - if self.status and self.headers_sent: - util.reraise(exc_info[0], exc_info[1], exc_info[2]) - finally: - exc_info = None - elif self.status is not None: - raise AssertionError("Response headers already set!") - - self.status = status - - # get the status code from the response here so we can use it to check - # the need for the connection header later without parsing the string - # each time. - try: - self.status_code = int(self.status.split()[0]) - except ValueError: - self.status_code = None - - self.process_headers(headers) - self.chunked = self.is_chunked() - return self.write - - def process_headers(self, headers): - for name, value in headers: - if not isinstance(name, str): - raise TypeError('%r is not a string' % name) - - if not TOKEN_RE.fullmatch(name): - raise InvalidHeaderName('%r' % name) - - if not isinstance(value, str): - raise TypeError('%r is not a string' % value) - - if not HEADER_VALUE_RE.fullmatch(value): - raise InvalidHeader('%r' % value) - - # RFC9110 5.5 - value = value.strip(" \t") - lname = name.lower() - if lname == "content-length": - self.response_length = int(value) - elif util.is_hoppish(name): - if lname == "connection": - # handle websocket - if value.lower() == "upgrade": - self.upgrade = True - elif lname == "upgrade": - if value.lower() == "websocket": - self.headers.append((name, value)) - - # ignore hopbyhop headers - continue - self.headers.append((name, value)) - - def is_chunked(self): - # Only use chunked responses when the client is - # speaking HTTP/1.1 or newer and there was - # no Content-Length header set. - if self.response_length is not None: - return False - elif self.req.version <= (1, 0): - return False - elif self.req.method == 'HEAD': - # Responses to a HEAD request MUST NOT contain a response body. - return False - elif self.status_code in (204, 304): - # Do not use chunked responses when the response is guaranteed to - # not have a response body. - return False - return True - - def default_headers(self): - # set the connection header - if self.upgrade: - connection = "upgrade" - elif self.should_close(): - connection = "close" - else: - connection = "keep-alive" - - headers = [ - "HTTP/%s.%s %s\r\n" % (self.req.version[0], - self.req.version[1], self.status), - "Server: %s\r\n" % self.version, - "Date: %s\r\n" % util.http_date(), - "Connection: %s\r\n" % connection - ] - if self.chunked: - headers.append("Transfer-Encoding: chunked\r\n") - return headers - - def send_headers(self): - if self.headers_sent: - return - tosend = self.default_headers() - tosend.extend(["%s: %s\r\n" % (k, v) for k, v in self.headers]) - - header_str = "%s\r\n" % "".join(tosend) - util.write(self.sock, util.to_bytestring(header_str, "latin-1")) - self.headers_sent = True - - def write(self, arg): - self.send_headers() - if not isinstance(arg, bytes): - raise TypeError('%r is not a byte' % arg) - arglen = len(arg) - tosend = arglen - if self.response_length is not None: - if self.sent >= self.response_length: - # Never write more than self.response_length bytes - return - - tosend = min(self.response_length - self.sent, tosend) - if tosend < arglen: - arg = arg[:tosend] - - # Sending an empty chunk signals the end of the - # response and prematurely closes the response - if self.chunked and tosend == 0: - return - - self.sent += tosend - util.write(self.sock, arg, self.chunked) - - def can_sendfile(self): - return self.cfg.sendfile is not False - - def sendfile(self, respiter): - if self.cfg.is_ssl or not self.can_sendfile(): - return False - - if not util.has_fileno(respiter.filelike): - return False - - fileno = respiter.filelike.fileno() - try: - offset = os.lseek(fileno, 0, os.SEEK_CUR) - if self.response_length is None: - filesize = os.fstat(fileno).st_size - nbytes = filesize - offset - else: - nbytes = self.response_length - except (OSError, io.UnsupportedOperation): - return False - - self.send_headers() - - if self.is_chunked(): - chunk_size = "%X\r\n" % nbytes - self.sock.sendall(chunk_size.encode('utf-8')) - if nbytes > 0: - self.sock.sendfile(respiter.filelike, offset=offset, count=nbytes) - - if self.is_chunked(): - self.sock.sendall(b"\r\n") - - os.lseek(fileno, offset, os.SEEK_SET) - - return True - - def write_file(self, respiter): - if not self.sendfile(respiter): - for item in respiter: - self.write(item) - - def close(self): - if not self.headers_sent: - self.send_headers() - if self.chunked: - util.write_chunk(self.sock, b"") diff --git a/port/lib/python3.11/site-packages/gunicorn/instrument/__init__.py b/port/lib/python3.11/site-packages/gunicorn/instrument/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index cba1818859c29060fb94affba54fc0e82628701c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 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 diff --git a/port/lib/python3.11/site-packages/gunicorn/instrument/statsd.py b/port/lib/python3.11/site-packages/gunicorn/instrument/statsd.py deleted file mode 100644 index 7bc4e6f..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/instrument/statsd.py +++ /dev/null @@ -1,134 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -"Bare-bones implementation of statsD's protocol, client-side" - -import logging -import socket -from re import sub - -from gunicorn.glogging import Logger - -# Instrumentation constants -METRIC_VAR = "metric" -VALUE_VAR = "value" -MTYPE_VAR = "mtype" -GAUGE_TYPE = "gauge" -COUNTER_TYPE = "counter" -HISTOGRAM_TYPE = "histogram" - - -class Statsd(Logger): - """statsD-based instrumentation, that passes as a logger - """ - def __init__(self, cfg): - Logger.__init__(self, cfg) - self.prefix = sub(r"^(.+[^.]+)\.*$", "\\g<1>.", cfg.statsd_prefix) - - if isinstance(cfg.statsd_host, str): - address_family = socket.AF_UNIX - else: - address_family = socket.AF_INET - - try: - self.sock = socket.socket(address_family, socket.SOCK_DGRAM) - self.sock.connect(cfg.statsd_host) - except Exception: - self.sock = None - - self.dogstatsd_tags = cfg.dogstatsd_tags - - # Log errors and warnings - def critical(self, msg, *args, **kwargs): - Logger.critical(self, msg, *args, **kwargs) - self.increment("gunicorn.log.critical", 1) - - def error(self, msg, *args, **kwargs): - Logger.error(self, msg, *args, **kwargs) - self.increment("gunicorn.log.error", 1) - - def warning(self, msg, *args, **kwargs): - Logger.warning(self, msg, *args, **kwargs) - self.increment("gunicorn.log.warning", 1) - - def exception(self, msg, *args, **kwargs): - Logger.exception(self, msg, *args, **kwargs) - self.increment("gunicorn.log.exception", 1) - - # Special treatment for info, the most common log level - def info(self, msg, *args, **kwargs): - self.log(logging.INFO, msg, *args, **kwargs) - - # skip the run-of-the-mill logs - def debug(self, msg, *args, **kwargs): - self.log(logging.DEBUG, msg, *args, **kwargs) - - def log(self, lvl, msg, *args, **kwargs): - """Log a given statistic if metric, value and type are present - """ - try: - extra = kwargs.get("extra", None) - if extra is not None: - metric = extra.get(METRIC_VAR, None) - value = extra.get(VALUE_VAR, None) - typ = extra.get(MTYPE_VAR, None) - if metric and value and typ: - if typ == GAUGE_TYPE: - self.gauge(metric, value) - elif typ == COUNTER_TYPE: - self.increment(metric, value) - elif typ == HISTOGRAM_TYPE: - self.histogram(metric, value) - else: - pass - - # Log to parent logger only if there is something to say - if msg: - Logger.log(self, lvl, msg, *args, **kwargs) - except Exception: - Logger.warning(self, "Failed to log to statsd", exc_info=True) - - # access logging - def access(self, resp, req, environ, request_time): - """Measure request duration - request_time is a datetime.timedelta - """ - Logger.access(self, resp, req, environ, request_time) - duration_in_ms = request_time.seconds * 1000 + float(request_time.microseconds) / 10 ** 3 - status = resp.status - if isinstance(status, bytes): - status = status.decode('utf-8') - if isinstance(status, str): - status = int(status.split(None, 1)[0]) - self.histogram("gunicorn.request.duration", duration_in_ms) - self.increment("gunicorn.requests", 1) - self.increment("gunicorn.request.status.%d" % status, 1) - - # statsD methods - # you can use those directly if you want - def gauge(self, name, value): - self._sock_send("{0}{1}:{2}|g".format(self.prefix, name, value)) - - def increment(self, name, value, sampling_rate=1.0): - self._sock_send("{0}{1}:{2}|c|@{3}".format(self.prefix, name, value, sampling_rate)) - - def decrement(self, name, value, sampling_rate=1.0): - self._sock_send("{0}{1}:-{2}|c|@{3}".format(self.prefix, name, value, sampling_rate)) - - def histogram(self, name, value): - self._sock_send("{0}{1}:{2}|ms".format(self.prefix, name, value)) - - def _sock_send(self, msg): - try: - if isinstance(msg, str): - msg = msg.encode("ascii") - - # http://docs.datadoghq.com/guides/dogstatsd/#datagram-format - if self.dogstatsd_tags: - msg = msg + b"|#" + self.dogstatsd_tags.encode('ascii') - - if self.sock: - self.sock.send(msg) - except Exception: - Logger.warning(self, "Error sending message to statsd", exc_info=True) diff --git a/port/lib/python3.11/site-packages/gunicorn/pidfile.py b/port/lib/python3.11/site-packages/gunicorn/pidfile.py deleted file mode 100644 index b171f7d..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/pidfile.py +++ /dev/null @@ -1,85 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import errno -import os -import tempfile - - -class Pidfile: - """\ - Manage a PID file. If a specific name is provided - it and '"%s.oldpid" % name' will be used. Otherwise - we create a temp file using os.mkstemp. - """ - - def __init__(self, fname): - self.fname = fname - self.pid = None - - def create(self, pid): - oldpid = self.validate() - if oldpid: - if oldpid == os.getpid(): - return - msg = "Already running on PID %s (or pid file '%s' is stale)" - raise RuntimeError(msg % (oldpid, self.fname)) - - self.pid = pid - - # Write pidfile - fdir = os.path.dirname(self.fname) - if fdir and not os.path.isdir(fdir): - raise RuntimeError("%s doesn't exist. Can't create pidfile." % fdir) - fd, fname = tempfile.mkstemp(dir=fdir) - os.write(fd, ("%s\n" % self.pid).encode('utf-8')) - if self.fname: - os.rename(fname, self.fname) - else: - self.fname = fname - os.close(fd) - - # set permissions to -rw-r--r-- - os.chmod(self.fname, 420) - - def rename(self, path): - self.unlink() - self.fname = path - self.create(self.pid) - - def unlink(self): - """ delete pidfile""" - try: - with open(self.fname) as f: - pid1 = int(f.read() or 0) - - if pid1 == self.pid: - os.unlink(self.fname) - except Exception: - pass - - def validate(self): - """ Validate pidfile and make it stale if needed""" - if not self.fname: - return - try: - with open(self.fname) as f: - try: - wpid = int(f.read()) - except ValueError: - return - - try: - os.kill(wpid, 0) - return wpid - except OSError as e: - if e.args[0] == errno.EPERM: - return wpid - if e.args[0] == errno.ESRCH: - return - raise - except OSError as e: - if e.args[0] == errno.ENOENT: - return - raise diff --git a/port/lib/python3.11/site-packages/gunicorn/reloader.py b/port/lib/python3.11/site-packages/gunicorn/reloader.py deleted file mode 100644 index 1c67f2a..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/reloader.py +++ /dev/null @@ -1,131 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. -# pylint: disable=no-else-continue - -import os -import os.path -import re -import sys -import time -import threading - -COMPILED_EXT_RE = re.compile(r'py[co]$') - - -class Reloader(threading.Thread): - def __init__(self, extra_files=None, interval=1, callback=None): - super().__init__() - self.daemon = True - self._extra_files = set(extra_files or ()) - self._interval = interval - self._callback = callback - - def add_extra_file(self, filename): - self._extra_files.add(filename) - - def get_files(self): - fnames = [ - COMPILED_EXT_RE.sub('py', module.__file__) - for module in tuple(sys.modules.values()) - if getattr(module, '__file__', None) - ] - - fnames.extend(self._extra_files) - - return fnames - - def run(self): - mtimes = {} - while True: - for filename in self.get_files(): - try: - mtime = os.stat(filename).st_mtime - except OSError: - continue - old_time = mtimes.get(filename) - if old_time is None: - mtimes[filename] = mtime - continue - elif mtime > old_time: - if self._callback: - self._callback(filename) - time.sleep(self._interval) - - -has_inotify = False -if sys.platform.startswith('linux'): - try: - from inotify.adapters import Inotify - import inotify.constants - has_inotify = True - except ImportError: - pass - - -if has_inotify: - - class InotifyReloader(threading.Thread): - event_mask = (inotify.constants.IN_CREATE | inotify.constants.IN_DELETE - | inotify.constants.IN_DELETE_SELF | inotify.constants.IN_MODIFY - | inotify.constants.IN_MOVE_SELF | inotify.constants.IN_MOVED_FROM - | inotify.constants.IN_MOVED_TO) - - def __init__(self, extra_files=None, callback=None): - super().__init__() - self.daemon = True - self._callback = callback - self._dirs = set() - self._watcher = Inotify() - - for extra_file in extra_files: - self.add_extra_file(extra_file) - - def add_extra_file(self, filename): - dirname = os.path.dirname(filename) - - if dirname in self._dirs: - return - - self._watcher.add_watch(dirname, mask=self.event_mask) - self._dirs.add(dirname) - - def get_dirs(self): - fnames = [ - os.path.dirname(os.path.abspath(COMPILED_EXT_RE.sub('py', module.__file__))) - for module in tuple(sys.modules.values()) - if getattr(module, '__file__', None) - ] - - return set(fnames) - - def run(self): - self._dirs = self.get_dirs() - - for dirname in self._dirs: - if os.path.isdir(dirname): - self._watcher.add_watch(dirname, mask=self.event_mask) - - for event in self._watcher.event_gen(): - if event is None: - continue - - filename = event[3] - - self._callback(filename) - -else: - - class InotifyReloader: - def __init__(self, extra_files=None, callback=None): - raise ImportError('You must have the inotify module installed to ' - 'use the inotify reloader') - - -preferred_reloader = InotifyReloader if has_inotify else Reloader - -reloader_engines = { - 'auto': preferred_reloader, - 'poll': Reloader, - 'inotify': InotifyReloader, -} diff --git a/port/lib/python3.11/site-packages/gunicorn/sock.py b/port/lib/python3.11/site-packages/gunicorn/sock.py deleted file mode 100644 index eb2b6fa..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/sock.py +++ /dev/null @@ -1,231 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import errno -import os -import socket -import ssl -import stat -import sys -import time - -from gunicorn import util - - -class BaseSocket: - - def __init__(self, address, conf, log, fd=None): - self.log = log - self.conf = conf - - self.cfg_addr = address - if fd is None: - sock = socket.socket(self.FAMILY, socket.SOCK_STREAM) - bound = False - else: - sock = socket.fromfd(fd, self.FAMILY, socket.SOCK_STREAM) - os.close(fd) - bound = True - - self.sock = self.set_options(sock, bound=bound) - - def __str__(self): - return "" % self.sock.fileno() - - def __getattr__(self, name): - return getattr(self.sock, name) - - def set_options(self, sock, bound=False): - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - if (self.conf.reuse_port - and hasattr(socket, 'SO_REUSEPORT')): # pragma: no cover - try: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - except OSError as err: - if err.errno not in (errno.ENOPROTOOPT, errno.EINVAL): - raise - if not bound: - self.bind(sock) - sock.setblocking(0) - - # make sure that the socket can be inherited - if hasattr(sock, "set_inheritable"): - sock.set_inheritable(True) - - sock.listen(self.conf.backlog) - return sock - - def bind(self, sock): - sock.bind(self.cfg_addr) - - def close(self): - if self.sock is None: - return - - try: - self.sock.close() - except OSError as e: - self.log.info("Error while closing socket %s", str(e)) - - self.sock = None - - -class TCPSocket(BaseSocket): - - FAMILY = socket.AF_INET - - def __str__(self): - if self.conf.is_ssl: - scheme = "https" - else: - scheme = "http" - - addr = self.sock.getsockname() - return "%s://%s:%d" % (scheme, addr[0], addr[1]) - - def set_options(self, sock, bound=False): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - return super().set_options(sock, bound=bound) - - -class TCP6Socket(TCPSocket): - - FAMILY = socket.AF_INET6 - - def __str__(self): - (host, port, _, _) = self.sock.getsockname() - return "http://[%s]:%d" % (host, port) - - -class UnixSocket(BaseSocket): - - FAMILY = socket.AF_UNIX - - def __init__(self, addr, conf, log, fd=None): - if fd is None: - try: - st = os.stat(addr) - except OSError as e: - if e.args[0] != errno.ENOENT: - raise - else: - if stat.S_ISSOCK(st.st_mode): - os.remove(addr) - else: - raise ValueError("%r is not a socket" % addr) - super().__init__(addr, conf, log, fd=fd) - - def __str__(self): - return "unix:%s" % self.cfg_addr - - def bind(self, sock): - old_umask = os.umask(self.conf.umask) - sock.bind(self.cfg_addr) - util.chown(self.cfg_addr, self.conf.uid, self.conf.gid) - os.umask(old_umask) - - -def _sock_type(addr): - if isinstance(addr, tuple): - if util.is_ipv6(addr[0]): - sock_type = TCP6Socket - else: - sock_type = TCPSocket - elif isinstance(addr, (str, bytes)): - sock_type = UnixSocket - else: - raise TypeError("Unable to create socket from: %r" % addr) - return sock_type - - -def create_sockets(conf, log, fds=None): - """ - Create a new socket for the configured addresses or file descriptors. - - If a configured address is a tuple then a TCP socket is created. - If it is a string, a Unix socket is created. Otherwise, a TypeError is - raised. - """ - listeners = [] - - # get it only once - addr = conf.address - fdaddr = [bind for bind in addr if isinstance(bind, int)] - if fds: - fdaddr += list(fds) - laddr = [bind for bind in addr if not isinstance(bind, int)] - - # check ssl config early to raise the error on startup - # only the certfile is needed since it can contains the keyfile - if conf.certfile and not os.path.exists(conf.certfile): - raise ValueError('certfile "%s" does not exist' % conf.certfile) - - if conf.keyfile and not os.path.exists(conf.keyfile): - raise ValueError('keyfile "%s" does not exist' % conf.keyfile) - - # sockets are already bound - if fdaddr: - for fd in fdaddr: - sock = socket.fromfd(fd, socket.AF_UNIX, socket.SOCK_STREAM) - sock_name = sock.getsockname() - sock_type = _sock_type(sock_name) - listener = sock_type(sock_name, conf, log, fd=fd) - listeners.append(listener) - - return listeners - - # no sockets is bound, first initialization of gunicorn in this env. - for addr in laddr: - sock_type = _sock_type(addr) - sock = None - for i in range(5): - try: - sock = sock_type(addr, conf, log) - except OSError as e: - if e.args[0] == errno.EADDRINUSE: - log.error("Connection in use: %s", str(addr)) - if e.args[0] == errno.EADDRNOTAVAIL: - log.error("Invalid address: %s", str(addr)) - msg = "connection to {addr} failed: {error}" - log.error(msg.format(addr=str(addr), error=str(e))) - if i < 5: - log.debug("Retrying in 1 second.") - time.sleep(1) - else: - break - - if sock is None: - log.error("Can't connect to %s", str(addr)) - sys.exit(1) - - listeners.append(sock) - - return listeners - - -def close_sockets(listeners, unlink=True): - for sock in listeners: - sock_name = sock.getsockname() - sock.close() - if unlink and _sock_type(sock_name) is UnixSocket: - os.unlink(sock_name) - - -def ssl_context(conf): - def default_ssl_context_factory(): - context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH, cafile=conf.ca_certs) - context.load_cert_chain(certfile=conf.certfile, keyfile=conf.keyfile) - context.verify_mode = conf.cert_reqs - if conf.ciphers: - context.set_ciphers(conf.ciphers) - return context - - return conf.ssl_context(conf, default_ssl_context_factory) - - -def ssl_wrap_socket(sock, conf): - return ssl_context(conf).wrap_socket(sock, - server_side=True, - suppress_ragged_eofs=conf.suppress_ragged_eofs, - do_handshake_on_connect=conf.do_handshake_on_connect) diff --git a/port/lib/python3.11/site-packages/gunicorn/systemd.py b/port/lib/python3.11/site-packages/gunicorn/systemd.py deleted file mode 100644 index 9b18550..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/systemd.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import os -import socket - -SD_LISTEN_FDS_START = 3 - - -def listen_fds(unset_environment=True): - """ - Get the number of sockets inherited from systemd socket activation. - - :param unset_environment: clear systemd environment variables unless False - :type unset_environment: bool - :return: the number of sockets to inherit from systemd socket activation - :rtype: int - - Returns zero immediately if $LISTEN_PID is not set to the current pid. - Otherwise, returns the number of systemd activation sockets specified by - $LISTEN_FDS. - - When $LISTEN_PID matches the current pid, unsets the environment variables - unless the ``unset_environment`` flag is ``False``. - - .. note:: - Unlike the sd_listen_fds C function, this implementation does not set - the FD_CLOEXEC flag because the gunicorn arbiter never needs to do this. - - .. seealso:: - ``_ - - """ - fds = int(os.environ.get('LISTEN_FDS', 0)) - listen_pid = int(os.environ.get('LISTEN_PID', 0)) - - if listen_pid != os.getpid(): - return 0 - - if unset_environment: - os.environ.pop('LISTEN_PID', None) - os.environ.pop('LISTEN_FDS', None) - - return fds - - -def sd_notify(state, logger, unset_environment=False): - """Send a notification to systemd. state is a string; see - the man page of sd_notify (http://www.freedesktop.org/software/systemd/man/sd_notify.html) - for a description of the allowable values. - - If the unset_environment parameter is True, sd_notify() will unset - the $NOTIFY_SOCKET environment variable before returning (regardless of - whether the function call itself succeeded or not). Further calls to - sd_notify() will then fail, but the variable is no longer inherited by - child processes. - """ - - addr = os.environ.get('NOTIFY_SOCKET') - if addr is None: - # not run in a service, just a noop - return - try: - sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM | socket.SOCK_CLOEXEC) - if addr[0] == '@': - addr = '\0' + addr[1:] - sock.connect(addr) - sock.sendall(state.encode('utf-8')) - except Exception: - logger.debug("Exception while invoking sd_notify()", exc_info=True) - finally: - if unset_environment: - os.environ.pop('NOTIFY_SOCKET') - sock.close() diff --git a/port/lib/python3.11/site-packages/gunicorn/util.py b/port/lib/python3.11/site-packages/gunicorn/util.py deleted file mode 100644 index ecd8174..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/util.py +++ /dev/null @@ -1,653 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. -import ast -import email.utils -import errno -import fcntl -import html -import importlib -import inspect -import io -import logging -import os -import pwd -import random -import re -import socket -import sys -import textwrap -import time -import traceback -import warnings - -try: - import importlib.metadata as importlib_metadata -except (ModuleNotFoundError, ImportError): - import importlib_metadata - -from gunicorn.errors import AppImportError -from gunicorn.workers import SUPPORTED_WORKERS -import urllib.parse - -REDIRECT_TO = getattr(os, 'devnull', '/dev/null') - -# Server and Date aren't technically hop-by-hop -# headers, but they are in the purview of the -# origin server which the WSGI spec says we should -# act like. So we drop them and add our own. -# -# In the future, concatenation server header values -# might be better, but nothing else does it and -# dropping them is easier. -hop_headers = set(""" - connection keep-alive proxy-authenticate proxy-authorization - te trailers transfer-encoding upgrade - server date - """.split()) - -try: - from setproctitle import setproctitle - - def _setproctitle(title): - setproctitle("gunicorn: %s" % title) -except ImportError: - def _setproctitle(title): - pass - - -def load_entry_point(distribution, group, name): - dist_obj = importlib_metadata.distribution(distribution) - eps = [ep for ep in dist_obj.entry_points - if ep.group == group and ep.name == name] - if not eps: - raise ImportError("Entry point %r not found" % ((group, name),)) - return eps[0].load() - - -def load_class(uri, default="gunicorn.workers.sync.SyncWorker", - section="gunicorn.workers"): - if inspect.isclass(uri): - return uri - if uri.startswith("egg:"): - # uses entry points - entry_str = uri.split("egg:")[1] - try: - dist, name = entry_str.rsplit("#", 1) - except ValueError: - dist = entry_str - name = default - - try: - return load_entry_point(dist, section, name) - except Exception: - exc = traceback.format_exc() - msg = "class uri %r invalid or not found: \n\n[%s]" - raise RuntimeError(msg % (uri, exc)) - else: - components = uri.split('.') - if len(components) == 1: - while True: - if uri.startswith("#"): - uri = uri[1:] - - if uri in SUPPORTED_WORKERS: - components = SUPPORTED_WORKERS[uri].split(".") - break - - try: - return load_entry_point( - "gunicorn", section, uri - ) - except Exception: - exc = traceback.format_exc() - msg = "class uri %r invalid or not found: \n\n[%s]" - raise RuntimeError(msg % (uri, exc)) - - klass = components.pop(-1) - - try: - mod = importlib.import_module('.'.join(components)) - except Exception: - exc = traceback.format_exc() - msg = "class uri %r invalid or not found: \n\n[%s]" - raise RuntimeError(msg % (uri, exc)) - return getattr(mod, klass) - - -positionals = ( - inspect.Parameter.POSITIONAL_ONLY, - inspect.Parameter.POSITIONAL_OR_KEYWORD, -) - - -def get_arity(f): - sig = inspect.signature(f) - arity = 0 - - for param in sig.parameters.values(): - if param.kind in positionals: - arity += 1 - - return arity - - -def get_username(uid): - """ get the username for a user id""" - return pwd.getpwuid(uid).pw_name - - -def set_owner_process(uid, gid, initgroups=False): - """ set user and group of workers processes """ - - if gid: - if uid: - try: - username = get_username(uid) - except KeyError: - initgroups = False - - # versions of python < 2.6.2 don't manage unsigned int for - # groups like on osx or fedora - gid = abs(gid) & 0x7FFFFFFF - - if initgroups: - os.initgroups(username, gid) - elif gid != os.getgid(): - os.setgid(gid) - - if uid and uid != os.getuid(): - os.setuid(uid) - - -def chown(path, uid, gid): - os.chown(path, uid, gid) - - -if sys.platform.startswith("win"): - def _waitfor(func, pathname, waitall=False): - # Perform the operation - func(pathname) - # Now setup the wait loop - if waitall: - dirname = pathname - else: - dirname, name = os.path.split(pathname) - dirname = dirname or '.' - # Check for `pathname` to be removed from the filesystem. - # The exponential backoff of the timeout amounts to a total - # of ~1 second after which the deletion is probably an error - # anyway. - # Testing on a i7@4.3GHz shows that usually only 1 iteration is - # required when contention occurs. - timeout = 0.001 - while timeout < 1.0: - # Note we are only testing for the existence of the file(s) in - # the contents of the directory regardless of any security or - # access rights. If we have made it this far, we have sufficient - # permissions to do that much using Python's equivalent of the - # Windows API FindFirstFile. - # Other Windows APIs can fail or give incorrect results when - # dealing with files that are pending deletion. - L = os.listdir(dirname) - if not L if waitall else name in L: - return - # Increase the timeout and try again - time.sleep(timeout) - timeout *= 2 - warnings.warn('tests may fail, delete still pending for ' + pathname, - RuntimeWarning, stacklevel=4) - - def _unlink(filename): - _waitfor(os.unlink, filename) -else: - _unlink = os.unlink - - -def unlink(filename): - try: - _unlink(filename) - except OSError as error: - # The filename need not exist. - if error.errno not in (errno.ENOENT, errno.ENOTDIR): - raise - - -def is_ipv6(addr): - try: - socket.inet_pton(socket.AF_INET6, addr) - except OSError: # not a valid address - return False - except ValueError: # ipv6 not supported on this platform - return False - return True - - -def parse_address(netloc, default_port='8000'): - if re.match(r'unix:(//)?', netloc): - return re.split(r'unix:(//)?', netloc)[-1] - - if netloc.startswith("fd://"): - fd = netloc[5:] - try: - return int(fd) - except ValueError: - raise RuntimeError("%r is not a valid file descriptor." % fd) from None - - if netloc.startswith("tcp://"): - netloc = netloc.split("tcp://")[1] - host, port = netloc, default_port - - if '[' in netloc and ']' in netloc: - host = netloc.split(']')[0][1:] - port = (netloc.split(']:') + [default_port])[1] - elif ':' in netloc: - host, port = (netloc.split(':') + [default_port])[:2] - elif netloc == "": - host, port = "0.0.0.0", default_port - - try: - port = int(port) - except ValueError: - raise RuntimeError("%r is not a valid port number." % port) - - return host.lower(), port - - -def close_on_exec(fd): - flags = fcntl.fcntl(fd, fcntl.F_GETFD) - flags |= fcntl.FD_CLOEXEC - fcntl.fcntl(fd, fcntl.F_SETFD, flags) - - -def set_non_blocking(fd): - flags = fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK - fcntl.fcntl(fd, fcntl.F_SETFL, flags) - - -def close(sock): - try: - sock.close() - except OSError: - pass - - -try: - from os import closerange -except ImportError: - def closerange(fd_low, fd_high): - # Iterate through and close all file descriptors. - for fd in range(fd_low, fd_high): - try: - os.close(fd) - except OSError: # ERROR, fd wasn't open to begin with (ignored) - pass - - -def write_chunk(sock, data): - if isinstance(data, str): - data = data.encode('utf-8') - chunk_size = "%X\r\n" % len(data) - chunk = b"".join([chunk_size.encode('utf-8'), data, b"\r\n"]) - sock.sendall(chunk) - - -def write(sock, data, chunked=False): - if chunked: - return write_chunk(sock, data) - sock.sendall(data) - - -def write_nonblock(sock, data, chunked=False): - timeout = sock.gettimeout() - if timeout != 0.0: - try: - sock.setblocking(0) - return write(sock, data, chunked) - finally: - sock.setblocking(1) - else: - return write(sock, data, chunked) - - -def write_error(sock, status_int, reason, mesg): - html_error = textwrap.dedent("""\ - - - %(reason)s - - -

%(reason)s

- %(mesg)s - - - """) % {"reason": reason, "mesg": html.escape(mesg)} - - http = textwrap.dedent("""\ - HTTP/1.1 %s %s\r - Connection: close\r - Content-Type: text/html\r - Content-Length: %d\r - \r - %s""") % (str(status_int), reason, len(html_error), html_error) - write_nonblock(sock, http.encode('latin1')) - - -def _called_with_wrong_args(f): - """Check whether calling a function raised a ``TypeError`` because - the call failed or because something in the function raised the - error. - - :param f: The function that was called. - :return: ``True`` if the call failed. - """ - tb = sys.exc_info()[2] - - try: - while tb is not None: - if tb.tb_frame.f_code is f.__code__: - # In the function, it was called successfully. - return False - - tb = tb.tb_next - - # Didn't reach the function. - return True - finally: - # Delete tb to break a circular reference in Python 2. - # https://docs.python.org/2/library/sys.html#sys.exc_info - del tb - - -def import_app(module): - parts = module.split(":", 1) - if len(parts) == 1: - obj = "application" - else: - module, obj = parts[0], parts[1] - - try: - mod = importlib.import_module(module) - except ImportError: - if module.endswith(".py") and os.path.exists(module): - msg = "Failed to find application, did you mean '%s:%s'?" - raise ImportError(msg % (module.rsplit(".", 1)[0], obj)) - raise - - # Parse obj as a single expression to determine if it's a valid - # attribute name or function call. - try: - expression = ast.parse(obj, mode="eval").body - except SyntaxError: - raise AppImportError( - "Failed to parse %r as an attribute name or function call." % obj - ) - - if isinstance(expression, ast.Name): - name = expression.id - args = kwargs = None - elif isinstance(expression, ast.Call): - # Ensure the function name is an attribute name only. - if not isinstance(expression.func, ast.Name): - raise AppImportError("Function reference must be a simple name: %r" % obj) - - name = expression.func.id - - # Parse the positional and keyword arguments as literals. - try: - args = [ast.literal_eval(arg) for arg in expression.args] - kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expression.keywords} - except ValueError: - # literal_eval gives cryptic error messages, show a generic - # message with the full expression instead. - raise AppImportError( - "Failed to parse arguments as literal values: %r" % obj - ) - else: - raise AppImportError( - "Failed to parse %r as an attribute name or function call." % obj - ) - - is_debug = logging.root.level == logging.DEBUG - try: - app = getattr(mod, name) - except AttributeError: - if is_debug: - traceback.print_exception(*sys.exc_info()) - raise AppImportError("Failed to find attribute %r in %r." % (name, module)) - - # If the expression was a function call, call the retrieved object - # to get the real application. - if args is not None: - try: - app = app(*args, **kwargs) - except TypeError as e: - # If the TypeError was due to bad arguments to the factory - # function, show Python's nice error message without a - # traceback. - if _called_with_wrong_args(app): - raise AppImportError( - "".join(traceback.format_exception_only(TypeError, e)).strip() - ) - - # Otherwise it was raised from within the function, show the - # full traceback. - raise - - if app is None: - raise AppImportError("Failed to find application object: %r" % obj) - - if not callable(app): - raise AppImportError("Application object must be callable.") - return app - - -def getcwd(): - # get current path, try to use PWD env first - try: - a = os.stat(os.environ['PWD']) - b = os.stat(os.getcwd()) - if a.st_ino == b.st_ino and a.st_dev == b.st_dev: - cwd = os.environ['PWD'] - else: - cwd = os.getcwd() - except Exception: - cwd = os.getcwd() - return cwd - - -def http_date(timestamp=None): - """Return the current date and time formatted for a message header.""" - if timestamp is None: - timestamp = time.time() - s = email.utils.formatdate(timestamp, localtime=False, usegmt=True) - return s - - -def is_hoppish(header): - return header.lower().strip() in hop_headers - - -def daemonize(enable_stdio_inheritance=False): - """\ - Standard daemonization of a process. - http://www.faqs.org/faqs/unix-faq/programmer/faq/ section 1.7 - """ - if 'GUNICORN_FD' not in os.environ: - if os.fork(): - os._exit(0) - os.setsid() - - if os.fork(): - os._exit(0) - - os.umask(0o22) - - # In both the following any file descriptors above stdin - # stdout and stderr are left untouched. The inheritance - # option simply allows one to have output go to a file - # specified by way of shell redirection when not wanting - # to use --error-log option. - - if not enable_stdio_inheritance: - # Remap all of stdin, stdout and stderr on to - # /dev/null. The expectation is that users have - # specified the --error-log option. - - closerange(0, 3) - - fd_null = os.open(REDIRECT_TO, os.O_RDWR) - # PEP 446, make fd for /dev/null inheritable - os.set_inheritable(fd_null, True) - - # expect fd_null to be always 0 here, but in-case not ... - if fd_null != 0: - os.dup2(fd_null, 0) - - os.dup2(fd_null, 1) - os.dup2(fd_null, 2) - - else: - fd_null = os.open(REDIRECT_TO, os.O_RDWR) - - # Always redirect stdin to /dev/null as we would - # never expect to need to read interactive input. - - if fd_null != 0: - os.close(0) - os.dup2(fd_null, 0) - - # If stdout and stderr are still connected to - # their original file descriptors we check to see - # if they are associated with terminal devices. - # When they are we map them to /dev/null so that - # are still detached from any controlling terminal - # properly. If not we preserve them as they are. - # - # If stdin and stdout were not hooked up to the - # original file descriptors, then all bets are - # off and all we can really do is leave them as - # they were. - # - # This will allow 'gunicorn ... > output.log 2>&1' - # to work with stdout/stderr going to the file - # as expected. - # - # Note that if using --error-log option, the log - # file specified through shell redirection will - # only be used up until the log file specified - # by the option takes over. As it replaces stdout - # and stderr at the file descriptor level, then - # anything using stdout or stderr, including having - # cached a reference to them, will still work. - - def redirect(stream, fd_expect): - try: - fd = stream.fileno() - if fd == fd_expect and stream.isatty(): - os.close(fd) - os.dup2(fd_null, fd) - except AttributeError: - pass - - redirect(sys.stdout, 1) - redirect(sys.stderr, 2) - - -def seed(): - try: - random.seed(os.urandom(64)) - except NotImplementedError: - random.seed('%s.%s' % (time.time(), os.getpid())) - - -def check_is_writable(path): - try: - with open(path, 'a') as f: - f.close() - except OSError as e: - raise RuntimeError("Error: '%s' isn't writable [%r]" % (path, e)) - - -def to_bytestring(value, encoding="utf8"): - """Converts a string argument to a byte string""" - if isinstance(value, bytes): - return value - if not isinstance(value, str): - raise TypeError('%r is not a string' % value) - - return value.encode(encoding) - - -def has_fileno(obj): - if not hasattr(obj, "fileno"): - return False - - # check BytesIO case and maybe others - try: - obj.fileno() - except (AttributeError, OSError, io.UnsupportedOperation): - return False - - return True - - -def warn(msg): - print("!!!", file=sys.stderr) - - lines = msg.splitlines() - for i, line in enumerate(lines): - if i == 0: - line = "WARNING: %s" % line - print("!!! %s" % line, file=sys.stderr) - - print("!!!\n", file=sys.stderr) - sys.stderr.flush() - - -def make_fail_app(msg): - msg = to_bytestring(msg) - - def app(environ, start_response): - start_response("500 Internal Server Error", [ - ("Content-Type", "text/plain"), - ("Content-Length", str(len(msg))) - ]) - return [msg] - - return app - - -def split_request_uri(uri): - if uri.startswith("//"): - # When the path starts with //, urlsplit considers it as a - # relative uri while the RFC says we should consider it as abs_path - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2 - # We use temporary dot prefix to workaround this behaviour - parts = urllib.parse.urlsplit("." + uri) - return parts._replace(path=parts.path[1:]) - - return urllib.parse.urlsplit(uri) - - -# From six.reraise -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 - - -def bytes_to_str(b): - if isinstance(b, str): - return b - return str(b, 'latin1') - - -def unquote_to_wsgi_str(string): - return urllib.parse.unquote_to_bytes(string).decode('latin-1') diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/__init__.py b/port/lib/python3.11/site-packages/gunicorn/workers/__init__.py deleted file mode 100644 index 3da5f85..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -# supported gunicorn workers. -SUPPORTED_WORKERS = { - "sync": "gunicorn.workers.sync.SyncWorker", - "eventlet": "gunicorn.workers.geventlet.EventletWorker", - "gevent": "gunicorn.workers.ggevent.GeventWorker", - "gevent_wsgi": "gunicorn.workers.ggevent.GeventPyWSGIWorker", - "gevent_pywsgi": "gunicorn.workers.ggevent.GeventPyWSGIWorker", - "tornado": "gunicorn.workers.gtornado.TornadoWorker", - "gthread": "gunicorn.workers.gthread.ThreadWorker", -} diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c09d80ac3bf5f043ada5d1cfbba0125f684f3bb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571 zcmaixPfNov6u{GM+T!TukX<}^5gB5_5Jhl^h+~N0>N**CDRqfmS#3(%t#n_+i}&HT z@mPBG3lw%62xd)p8sbax{)FGl%S+~}x&ye(TR&E-0KoSuSc{T7i+%3A0}QZ)3%JNf z32));5BV8jSqBYec3@3hdq|lJL(0a4`OuHtA=J4VWE-=_24RsYaRY}0u$?}N(`4LK>TI!u&x6Unx?V^S8@ z2z|>=)I9K_ER^$_iEN2O9~x3p)1Nf0+v~S)jX}3}-|p$3V6l4nev){+(VB2g1jggQTG%!o5;5Va^ji8v1t(>tvf}b_zGkgwrdB50ljFcwB9J5IOK|{ wyn@7+kGM*Uk|d=SprUy9GOnD(d)IOOCazw@)$_Ef)C(!#>I>AwWM!W73t4Z&wEzGB diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/base.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 20fac6e3e2606bae4ffea590db61e56f8ad40494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14747 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 -{% endblock %} -``` - -## Donate - -The Pallets organization develops and supports Jinja and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - -## Contributing - -See our [detailed contributing documentation][contrib] for many ways to -contribute, including reporting issues, requesting features, asking or answering -questions, and making PRs. - -[contrib]: https://palletsprojects.com/contributing/ - diff --git a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD b/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD deleted file mode 100644 index 4b48b91..0000000 --- a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/RECORD +++ /dev/null @@ -1,57 +0,0 @@ -jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 -jinja2-3.1.6.dist-info/RECORD,, -jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 -jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 -jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 -jinja2/__pycache__/__init__.cpython-311.pyc,, -jinja2/__pycache__/_identifier.cpython-311.pyc,, -jinja2/__pycache__/async_utils.cpython-311.pyc,, -jinja2/__pycache__/bccache.cpython-311.pyc,, -jinja2/__pycache__/compiler.cpython-311.pyc,, -jinja2/__pycache__/constants.cpython-311.pyc,, -jinja2/__pycache__/debug.cpython-311.pyc,, -jinja2/__pycache__/defaults.cpython-311.pyc,, -jinja2/__pycache__/environment.cpython-311.pyc,, -jinja2/__pycache__/exceptions.cpython-311.pyc,, -jinja2/__pycache__/ext.cpython-311.pyc,, -jinja2/__pycache__/filters.cpython-311.pyc,, -jinja2/__pycache__/idtracking.cpython-311.pyc,, -jinja2/__pycache__/lexer.cpython-311.pyc,, -jinja2/__pycache__/loaders.cpython-311.pyc,, -jinja2/__pycache__/meta.cpython-311.pyc,, -jinja2/__pycache__/nativetypes.cpython-311.pyc,, -jinja2/__pycache__/nodes.cpython-311.pyc,, -jinja2/__pycache__/optimizer.cpython-311.pyc,, -jinja2/__pycache__/parser.cpython-311.pyc,, -jinja2/__pycache__/runtime.cpython-311.pyc,, -jinja2/__pycache__/sandbox.cpython-311.pyc,, -jinja2/__pycache__/tests.cpython-311.pyc,, -jinja2/__pycache__/utils.cpython-311.pyc,, -jinja2/__pycache__/visitor.cpython-311.pyc,, -jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 -jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 -jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 -jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 -jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 -jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 -jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 -jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 -jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 -jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 -jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 -jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 -jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 -jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 -jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 -jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 -jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 -jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 -jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 -jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 -jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL b/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL deleted file mode 100644 index 23d2d7e..0000000 --- a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.11.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt b/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt deleted file mode 100644 index abc3eae..0000000 --- a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[babel.extractors] -jinja2=jinja2.ext:babel_extract[i18n] - diff --git a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt deleted file mode 100644 index c37cae4..0000000 --- a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2007 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/jinja2/__init__.py b/port/lib/python3.11/site-packages/jinja2/__init__.py deleted file mode 100644 index 1a423a3..0000000 --- a/port/lib/python3.11/site-packages/jinja2/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Jinja is a template engine written in pure Python. It provides a -non-XML syntax that supports inline expressions and an optional -sandboxed environment. -""" - -from .bccache import BytecodeCache as BytecodeCache -from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache -from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache -from .environment import Environment as Environment -from .environment import Template as Template -from .exceptions import TemplateAssertionError as TemplateAssertionError -from .exceptions import TemplateError as TemplateError -from .exceptions import TemplateNotFound as TemplateNotFound -from .exceptions import TemplateRuntimeError as TemplateRuntimeError -from .exceptions import TemplatesNotFound as TemplatesNotFound -from .exceptions import TemplateSyntaxError as TemplateSyntaxError -from .exceptions import UndefinedError as UndefinedError -from .loaders import BaseLoader as BaseLoader -from .loaders import ChoiceLoader as ChoiceLoader -from .loaders import DictLoader as DictLoader -from .loaders import FileSystemLoader as FileSystemLoader -from .loaders import FunctionLoader as FunctionLoader -from .loaders import ModuleLoader as ModuleLoader -from .loaders import PackageLoader as PackageLoader -from .loaders import PrefixLoader as PrefixLoader -from .runtime import ChainableUndefined as ChainableUndefined -from .runtime import DebugUndefined as DebugUndefined -from .runtime import make_logging_undefined as make_logging_undefined -from .runtime import StrictUndefined as StrictUndefined -from .runtime import Undefined as Undefined -from .utils import clear_caches as clear_caches -from .utils import is_undefined as is_undefined -from .utils import pass_context as pass_context -from .utils import pass_environment as pass_environment -from .utils import pass_eval_context as pass_eval_context -from .utils import select_autoescape as select_autoescape - -__version__ = "3.1.6" diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3a6fb52d2feb0ff04fe6cb69cfa8bad429e4147e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2113 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 diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/bccache.cpython-311.pyc deleted file mode 100644 index 1244b70fa875f23e923de427598dc32f4fe8cd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20911 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 GYW#10Epqz+ diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/compiler.cpython-311.pyc deleted file mode 100644 index 8688e2db8f8a7c513d46c56fdc344fd2caf5350c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112433 zcmdSC3v?XUc_!FzRHGZ{#`{e)o(GiM8h+qdrf`QQKk_y7O+(10Md)Zk1c*B_nW-lLGGv0Wnk=ZL? z51k1yd*xWuc=MTNyDjRt(4sYkRLE-HdZrDftQu<{UwdY)-R7V$9a+{6i@YtALh`G^gqd)Pm7(q^(^ziG% z_2LGUWV7ZHjb!R4Zp`bm$>ig>utke+h`l+wRosGqs%g&jM}p$kH{EBpiQ5oDZ()Sr ziu!Ixske(e;Il(Z8ztYV*$w&ZG=(vipK{)%#W2=v#3SxP`nw&rLpE{un>KNer6>0= zpS|!2TYUC1pMCIoD!T8xm`@+#pFd}wVt&2w+aGPV`1LZs1Mut1^4rh+`r&sldcYE| zkNF*fUq@EFe$jE#7Cw?#e_(QaYIH0b3r$RlFh``x@lgDHG&D6N#iCMZbRs?(I({{N zesUr-j1ZB(r2-Fx?djs-$%%OMN_>21V(45{BA4kYaVQ=gyeth(O)(eYWLz4ZICtb2 zeBHz6heju0@s7qWMz3C;ltg@ZqOswjsVLc=9g;3iPyMYO=~Hl49#|?*MaQSckZx}b z1&WVOPV`ICB;{9d^6L02lVdShi=Xd3G5E}}-oC-!XO8rqgiERJa=iCM@3Z}<`cJ?$ zsJou%KY8q#=le||PY?96M_PEUvl$DTb2N7J51_Pq(m zUi|D%ICk$zJ4PoGo{7mgnmjC|9nn|Qj)`d6aW0;Aor}}g7;Iy(N%d$UYM=P%MA|-* z_DIqAv@|hH4W~T>&}nczyawZI1h@gTMQ0pe+H*kend-%{Xt{f5U##_JMsM z>`HqlwZW7Yq8Mg_!|^L=;nE~VIi_OTeTfE9*dwh)86{dxBm!|#H;l9}5xqP}?IyM2 zGv@|JhFRia(HMgwl_j$pa2mn!bKRL zU9+tUHh*w_uk34EiheYqMEYS{sj9p2<$G0K%T--VeRtYEj-;x3m8#yk!w&*gi<_4N zjdGw7Vctu;n@Dyn^{1*fDpech;Km1m;M}VVPzB_Dp$ zuKp`iQraF*J9{UtN;HDQ4%RRdEh{k^2QP;tT0+uArn*S99Q06_AsAGAN1;2iQrxiW z#P9vK&f900ZDspD?sD{*zu3ZTKk*jMSFE}bYSos<_*u2hU%S|m>`nRF6<@pTYL~WB z5ge0K5}^uG7Yx&Ur5Qwn?BN$-(0nz{RCVs^gBtTww~MYg4FUDRJhqJpY-W1i^nVww zA8KBTR4CA(ykqWLC_Xut0K zmP2&ha()-7f2czuJ0^9~0EhI#V%PHoZgbEL1gV|MxzV&0nkbJxIy zma>VipR1)FQ)a9dkSv|+S(1`?rYW*v)Q`i~91GCDCi)uAr`-JwSg{M$Po*%>)1q@D3N{RZx@u7=Ro@NF}slIzD;{OGMCb`E}RHFFn6@UAx)93A6 z>FT*tu59R4Hk^{X=zZW1zWwxDPs>&N?>58WZ_0l_@gI==2UfW6Lj1q^rFV64<3_^ON=msqQ#_s@+5%4F{8tbklqpUY zNH|S#z6rw$5(>QG3`jUBchReZgxXSh*%oukp5I3YJ+RdZ!D?ono zjrJMGj1ySCd&cu!ESw+ei|1^?OhHmdI<)-hcP4u-xvtgB6kO2bCJklD#QZL-8HDVl zjqSmmi7s_V6y+OlzS)jVPGhYMjZ8|RA+|RUp)I44MCicK#M(Ia;%wUvpNUXh-5~QV z`~Y^3h1fsuVoQuY> zJDHA#1w&8Mh>}i{L4hQiOVaZ&(q28K81*LBY4-578fmdzUsU=M{G#}e&A`COEVub9 z7sOlrHwRL_F2&ciYO}j{-!HC`t9Pb~cPYiYWMS8XVBNjo`sLvI6`^e5)Z+H!^Gj#$ z)_m%8lz9Hp2IJZhtnBXMuO0i!v4y^rt449v$gY|P1x44syb`EZ0*&_q9m|1^RG?D{ zbjm{K17BcnGsnr@tcIqQNFR%Th*3!U%r{Cg22on=nYP8e=21CqlYq{iw8ahM#X3ri zh*le}2y8nHcd(gT2~dug%!cyO3&4ydmQv zI^RS)^x4cK*gVHRr}k?ysiC#HOsTsl^`xPWnXu*@Kd%I$n~>H-xNj1)EFxpkPC0ab z=u#B3C^j?_4N1`{DH;P!27B$viG2g7OkGb4B9S;BZiaExW@p`hwhS~5BS5kMm*;Ko z+3mLZa$4{t+7f?YPZymZiVaeRgOp*|k#p=_BuMniN3F_9jq7L-5Rk zrHA-cBpV|tz)$ga%_f&_!nBiTVB=<2g4=l;(^Kd5zrE&M3TdXMCczI8=Z=c#?r1h zfMVM9%H-r&+6j~cG^w%4p?JE0!0cG`3U(z!6X&97Cl)k`_UdVOd>S6uvy8?-e27J{ zuz_@%h)$5ziCt3KC5{dwA#88PV;|V1L8=K2BDMa*uu5dilE)vxxMq7$;J-Gz=zf2V zT)htOoh^TQSl-l!cO_6Z7yn6tZ?6B1*WP^X>+xGB-*5X~)%V-}wCqnu09Fa2fkM$S8kFE=)E5(RY%Qf{H97bDKG<@l)xrg*px|IlnZL{ve49$pPc^hU;0-s z{pjqUoyAA0^rQkaa8e1Jl!cQIe8IUbtakK)^>ZodLr0jGZHCVZIaV&d(k%Gx@^1Re9?B9=zCNK_5eQE z6E_Z=j}Bi9jgD{_L8S)48}wx{G$a933=c=y2dK4Ctcp@pjD$j`08TimHN@78LR#KN zW1*oC`aCo_5<;)D^fIwRtU)qF^;q=P=_nRu3axq(ML5Ee0%5S?w4UJr3Z)X0`S#eS ze)V4g7FC$Z1KT_wY9_r#2JPtBTCJhPe6*zlBcl`IU?!4u4FP`x|FQEhunPNaf!1Vy zs<=}r?!0zr)!}j%t(4bbE%t_(G1s@^FMIphx1L>WP5B!Yf1}LaRVM;`_7h(vt=dHy zV@2@Kx!~z8`s}mM9{5TXUxVywh|%iyPHngCqrx4|yY?MU8vpu3LxrA)wDEioIKmk_ zjvH~z7d= z(wJrAlr|$+^X)S>nz8&5=}RAv>`Ncx>`NbA1OPv93>-wKgb_C#P=``%kSHfn$>6~0 z-07em0@Pcgd}DLI7EyUGQZ_2YObdeygB~1AlxVeyXimS4a50K@&9+irJ?EPDt~9pJ zxfG#Z{|&X#cZ1AcHfh6NN|VOn;9$CNaBzH5oE{^)e{k^C>7g<1BW*{rY4_;~ESKsu zXW6H{2T-N`APHZT2uy!qPU$O}aSN8%K^WKcKN?)^i_hJBA$j`tOCSobliPZg zhW)EHIDdj|2!8S!JPS(QG;|0g)ANvgj6>&)lbu}_i_RzpgmLhQHp4lf+vpQ5F!*?I znkt9|IBOKdfat}L@`^#x7cCS$Aho(gKYV=fDT0qb>OE7$aQYHPW=XUko*WZnIwGydvN4NXGQL@=%wfwKLBx2t<;C?Y=}OEp=ceV*u)ry z=#1l9mkAYheq;f*2%Q0NwCMKIC@F@CU^E|&nXN2TcC0S;(OpLncI86u6e0Ku3ML?Tc^~mo9ml@2FEku$XuV|Z$p&s^>8|h zC|%_D^xV^+57f6Lx8B}+7qRxG>h>vh`zY2*M?~p3z@n|xhHmyyw3V91oAne8@oUzw zybEo$jj$9Wle!Qrfff2ugzD8o)q&`eZ1O%Th({wQaTsXAyJ;-4vHjn|Vm|%Ig9sST zK+M|^I_JnN_ep)+Az}T&iG@D;&9Uh$Au}eE`pDCx!t!1GXSVS(_RMTyCoJ|v(*ck@ z;e6o^&$Nq@Q`d*ILo)3qBq~*+kPj3J_wVo>I|SpJ?I%TLZ-42nFD>?Ak6qNI6m`ux zR)oTN-#wvrS*Tsyd~;7q2rEKZ7Q!nPH8;L^ucCdqqCHj7p;UCtIpzyj0wr@^)_Vuj z!f1@nDWjrk`J`FQ`tK4f1e>H5(|*C0IWa=}0#5KJ(+i@VNR%IC9i!$?#SCq*$~zO4 zC)i1NXlMdp7UTvXURc~B62SrK>o73my2#FE95pF}05~#a^Y8;W7&mA@-YJ!Yk2fm& z_zx6jHw<9wzA{3M4%+XRRWFv`Y*-RM8dD-qeX=1H>66R)Q)T^1S-zaJ=HICbM} zvM&_~D*^zn% zzR|`nqgcg4mq+90*??!Qk6?N#ml122O$`x~qC51;G`Jn&Yl-(Hj>)1!PhLcHUi)}*vV#*^ewc!L@1T?yD&^c!bMG}O*69pltQ$^04xsLic8;q@vRrH zzcl|6rdU-yCXaumntqBhb13W>7{HKgqx8QG;{*G_aIy3jef}C5^Dqc1h?B#EgAx&Y zI0_~Z3kp?3njkmAxp;BM$wmN4`W_4d9yI?EcY)ltlEIKNHuTAOAOErc4#qY8Z^gA< zcC81vUfZ?O)VAu~;0E3g<3VY|s+&GMwvy5tg^SyiV9RO&IS963$$Vn5W&U*@y3kfw zyz0~9vB=yQvAc0{WHTGZE_Wwkd7X}iHE&p`3VDK49C@n{Sl*crqkY={r!hI1!am5k8c4BLRcX?{U^xE!O|9RlxLpBj z;T-;W7lskav@Q}%r~ijEW%I-J84GsKun@ieNxhCpM1PD}junT=w1q2O#3=8h!-K5r zB%(BdKqZP2b%8Vo!vx^`EZE>d)}x8me2rra1!{{eMi2&@Pr{{mMY|Ja0-Jf(fs&!qA&&2N*f>B zN`-G1zg0}!1u3CP5t?M}&2A$a8*E&8U?J{4;6IK;^+^CHK1JCYjpdwnD73?5OF>p= z`*;=DCO*;f_&TsaK4kom^5lSw6$}U|tz`q)N0}Ef4inirM;~Ub|{D8-l~#nyk28PwuUETG@}) zK$zym>6;01Z(hPGgdeLR*xhTB?%O^hY^}ZHVn2Be4g#pK!}!-9muh=B28#uXJEE@4 zW+Un`&>ftj3)BTSgXEs5aKWpkCvqQxst-YOzv#k%@Jd8mPJG7-wP_Oz z90~+WMucQEOpW46$Qw4hzymRY7`|kpfO6am_#yVcw3pG@g*mRrh7+AwGVJj3=om-2 z2)(0qGem2~*ko*4!oen?<|_8ZX_sse<%XW8P>;tGkAL~~f*0a-%+&Dvv#Qpa0ccQnWv^m!I!i>h3yT<>>Y77{UU;c>p ziwsIi&%%}FKYNV3DID7EGwy7Y+R)Pi^B9KM)^)=e+nBPNb8%cBY}Q@yS3s*hNqc7< zlIPw#8_RCZozZ0+;1$N%i-;Yv6Kt^@_EJws)HNI)6Q-0d5JzLfLz0-igsFg;DCmh$ z?%v{Xk3v9L#1^AnD*%cwFu#4_(lTh(zJ_G$?eJ3kqlDbN126bC=8xU;H!k}dldjv| zl)qE)cgp@woVm=uj-Z{(fo?g_eZR8lo$(vvGH_(4EeOWdZs5&DCG$_;^RHR-7naIy zg2xOW9CUXxyTK4V*f%iH4GV#8{8){k-QBK%?sg8kK~{!iE`x(^Dy0c@qp+p92P3~b`DM}CDCd4`cQfGtrWVxidd@Oh$y zMD?u>fHy&6OKLdVV$lYqe~HRkdv2NB$Y`UU<8V#uJ44U0?jwV@Bth%hUKszua98zac1bohS=U{fmn!tpJ*Q`W+Zzd>ID(MV8lU$ zd-I+G%W84dEe4`Kgbza8r-Uu2zNj0aOJOe(%c8|BEtgo1?*PjG4s)we^YDn3I2H(s z?}}CMFA;xJtYN9yv830+r&PSb!q=I~UUs3JH4ms1PHRZ z&(tC2&lAfdu0^bRR%43SU?@2aO7@@@jRt#2vyV6pV}a__VQP2hg(fXz)D53z?aO$k zXh?xtKoG+yPsgfyNw}`*Jh;M1L3=Fy{sOH+PTg| zke^|cu#&mNZSYyArt8MIAkn+^823ByyFpLECGN!cM!1vc+$M3iK92U_d$ZwtFTS@R z+&=tnWqCNnr(oZv+IwN&Zpd#xzIX8Wn9VNn0KRu3ejk2!8S?MP_ilCclwH`P)gK{@ zXUoNwUiOFw(eis)&G#AN@Y(MX4#+>JN8x*z`ReHye4l~u5$5}}mW#pnS@<4hzH}7N9)s@ye4k~$ z`iL|59)s@y^VP?o!S^_Pk1^llIZ}QOzRxk=6FGcO!1pBcrR@NF3@M+4?`bCRcnSiK zr_rv@YoRP+kuOBQAU+R&eV$`%8NM)zUdUP#UKH(T&LEVIQAc0MjFsq1;uq*h0O`Dd zHR45-_tk7R$DHBzSJ%--9gdVuAru9}1 z|I1lv{hAtjK1b*)S)qTO-#^UZ`y256m(2I$ z9KLVE_xp@`{2r4`9e_~BeuR@qo`cg~PLhpQ+zhKf=S?broAx+iq5p@su}#D|hwGY& zU)VfmAXIH)sAIfK4lOANV;FdoAedp~O`>>iJtPFI4ZK0bx1^V8#v_%-OSF&>*|40j z7{fw5+cu~ZSlL&h7SqBxMEU!5KPoBqv;1N4icMeIuGe;satLaEjHgO38_S_o_anZg zGX0BcukQ+3$O_$$LeiNcdsq(CX_+q_`w-pdsN6arVstjoz(I-HoH0k7B2H(f%^_SX zQTy^iKv-Bt)FWM?p4|^Jf&&hjSqwfbNCSyPG^| z0;h^#bDta>8IsZ^#PWV|V)F9Dpz4$MF@cn^(TV89BtL#(r&SOidS&_?m>)+b(}Oyt?UXt-|2wXVmZEC=VMh;Orx8-k6&#Gi72lGKtFo4?m43 z3RVpcWJ$!&B zd|+f708cSfzCp#&9uF+6cspUS9$OHw%T2!jt_uq*{`vD2JNVQ)4-SovafX_q&`wbD zcD}3$a`l?Dp}ZWysW$ zxHWllsr^pt$KkuDet0%jd{ikuDho%mdxVl^RVFer^~e>|$wdNCa@a8lKmHIT%kD}P z5Q2o<0@o5G4paMT53N(Iz1z`hXm3Ys)p%Z(nPk%4d@UM3e zYG($2cibQQ<;H#dO$DD)f=|i8 zrz~kzE_hZ-DsQY&N^k(^FcdX!Q78rnKXTQ!CHF^u{O~s=Y*&Qsvi3e^k!wc}Jjo)* z7PaCd49g6G$B;O`8NN-j2mgWk(z1q0KZBzcqVmD<+tf|<@KzV88sJZh&!vPlvOrdt zc=^gyh)__t6^~At)+d4x9A3g=E&hx>f!%{?jpjT>!DDje2quq|AF1K zCj2KjBr41UPaV;}ldB4+!0VJ<1)?mQfW5xBUV{$`ZvZgYssUDzboK*aY+)$JQi*Ei z3vW!7f$lu&Zzi=)voa4}0EwoGz8d6|`#&&0^UBhOV9?vW57op=*s2O5r+O*ZjO z)0(Pmp4L8WMX-@#86;}VO=|EWf?ezgVq;|Zg7dp&Un8lR7MQ5&3z4gKKFrUs+x z5vrmcZnK)o7fq}-m<7YvJ-$cH)rN?AbG2w% zIaIYgb5P9#{tbVt>}%n8h&?t;15kVP!T76ip_!D_d`!QjSi&r&!0?8gL)A*3$d6%Q zNF#+0^;Gzf2KV3QlZ*`>O!?S;4}*t`kUv8UhPu?T+69ILwUr`-^VyIVSF7THO_NF@ zu1>CZj*U#JGd2&ZJgGm%@=}|+)-pB?exyPn){D4ob@3Lde4rIcS4wE(TRZ~Cq`zpx z^`iNrxgr%hFHENxBF^O%VRG2!LsBNdK$sMRYHz{v9{36J^+pa{&)#P{TMc33Jm3SA zs4Va?UqiTdmcTLg>Mt@ZToXCQZszOHlN!I!P>5v2nZz%25kMv(rZQ}dPQZ`j8llh; zvy2dPW^5VM=8SPe!&Zhu;`I19CdbRbPuA}YaR4)bwdLiPDJ0D&pfe%D9!SoRc(Jc$ zq#V*N5_G0+C)9&$`&foe>vn43yxm^NXgQ2|Dp76j^o-9RQ7$q44iO%)S^^yE> z2}F$9mi;U1H`_ig>~%PQWVgdi+pn0`KYiBDqkuGPFQAP4k$%UxDUV&mmk#}MW7Z`0 zn~9&mD74N>wg;v>*<%XLcf&?M8pZ5+qX!{9+E=nbvl)L8LJtqSp3X=%WWYWIl5sASV6!DP}`CwsZ9)+Fu~59_9mhf@v|p?sSr^4nQ3s zcuCGsBoujMFB~|Sa4|SUg$Il4|B4^!0U3-&-A}fEN5*|J{ymJehcCSha?owl0-_ z)R=1Co(k?zf;;5k4tUDJkP-|f`)(gg1vl{z7CS7LZ2=MQ#<6?loy+B&OMOcB{!jXp zKB%EPohpA`DSuure}1KB1JNEjS0KF&+06zF`}w2y{0+Afi)|6kEKVc|62;* z#X1w49dFUw{D1>TW{{qbs&uyA?4Oa-wz%u@Xhv!OScTU0ia=A*u0RIHC&6y0HYir1C=dj$ za|&8$;v6|p_a{)9;2a;i!ew$~I0cAvn zKC!ACnsH7+@x8fEtzpb-0iAbc`V}}w&n)0(Qit0poBoKoXgf6CvK}Zb%f?P3Gp-mY zxS0{fa`XHX91q6dHZX| zlMw`g{@lWBN-%QGT~|*=HKdna6Dl85h87s=0@!8f6{#vB zt=&xSm9_=MTTWYWj$P@81)8D)(w&ysIP`|bqC+AfXW(leA7WBNqDUO=ri}*Ilf(dV zNLBN%?_;3eW||9TYvSgk6T@TE(9p)!lWP$`iAAxb%iv>2kz-eJMten11Ofb(!_S z8CQ=C2mLXi7WW(h+wseq%8^k>t7l$O$B8I%Ab7?nomh{*$FJb^Y;}65p zpp=`W*=aaf5oO)uuc@v682tv_VD+|ooC;_?{*#JY-c(DQKiUObs&1Q7x9x7dyyNJP zOH&okC>77Fx)JzOit&$Rz*bMT`a+p$gu$j~2dMSl7G}(4)M{rb(2gzk>qG<44ITtg z4v%-!N=?H}5Cj}WVP-72bqYd?ZMLw>(po69r8fSXD&MG-ZUZrqG_X$${_nJV9+ly8yQYps%@^cr#J=005T5ZtH)>4FEXl$+iO+z2eNKds_M zCy34s%0;?{^-C%L8pXdx_OH>JJbvSK)Y2bO{1I7uSKYSaFk*2qq{CcHgF^hXUBF(L z=3RgpTb;#uBrw*WQxTz&{s9eEdd}d`2IVEQ1Arfuf<2;R#5v;Vvn|-qp86tOXI-=I zS&!*P6^mwm7Irr&C!TR#vP(pL&x!GwYXm;Jg5Agwp$QsgJ=oD;#(#)^{xGar$F?dX#sBl79|xPkq5lJeh4h0k zy_Z%EAf!7m#+9pp&P_-rao&*PC?fC}kT6(O+v4xG)f#S5Fh7}fNIk1R3g`w ziA!sukr30}2|QF!gy|xoEO@3+Nd!He=RkC40++fvB7+)wLS988ia-K0gAww~2*ahs zxUvF9jv`eBOp|adq7mwuUSXs{MEnVIoRswP9Dv55erOnCQMy@TOmUo^D;RJj$b)iq zfGFk=L@@Q(kx1xLR3hC(xG)RKkHnojLz^P&b$?pOdD*yrqc{r3%7H?Vz9Uoa2!hsN zxf7Id@7)Cd z{c#`vg_#OIuLPf$gU?f3EBgn~DHASWO?&b6RB)XVTqg(DQFO+AvNt)hbn5n)+_;y& zso*{(xK9r5%T>5lhrMF`oeQ6oebW3%*~gG3$0svDM8u(y`oUa2bvjE*fu5E?(-ax3 z`lbTwAMX@@8b%wgmY|tggJN!0EVi4jPC6fa#i zVA5{RKxo=^0gRs7O>(q%ghENMBaMJ9AG{?<5{F}~G-)^EchB4>rylgsl`9l1sYOsh@0@8=u3wbn0Hu{^g$ish&Qi2Y`m$ zKAGmfFjK)3O7MitUZiqs?{Z04E(seFVH+5LEBZ|Zww6AF(w~`Zx@z@|Q(A|)pzlNUz_4I0xQySL-8$n4GUT5NY(6*#qzxDq(nc7#vyTS3 zw22&O$Z`$@x?BlfY-MKDjosw6jg0LuVzjv-Y(*Q8phD6NAoW4k0cr610u9KoAu0xB z0ICe#-u?EKimJJTE47U`dz9K9^h6Qq0x4<-Ltw5x$G9YKMB@ukvh8;}f2VWl`Bd{} zr5PjWDgNp#k>HBNyXvEycz&w_MdyjIh2oKC2*k|cP}-LEG20+hB%dxMS8g|r0aTx_ zCC#vyITkYOh=lcJ0VG|Zk z9;4sO)S@I|gce=XtgMMBYqrUOLvydqy>|DEEF8*S3Mn796mC|FpTuwWleOGHsVOZG z*km{caL+4-hh6HYAC(WCju4F$PslRRWtCQ02DlObM~oT|WiG9}SK6{%+L9`5Q%c+9 zzy`caoB6LSY~aN=&Ig@Za2zWu&A?=K+2LX?K303fMWlJ=V;0xB@#-QgkHoA~w9mSX z6ah<)ZombPQ8N=@ghwl?dG!LEIH#Y&37OM0(V?!~j+p|SRvLYr&?;3s<4zi|3oUI> z6AU5EIbrwd$+K=7+lSgX>&c(0HIMo8aT<~8gL-FV^IT?%`>YpOj2CtJ>Wu4+W8f0A zU(hA@fOqJ6G*G9!t(QP)GZYQGZQ={y1JfmCZ8lsyv4-us4Oom;Hb7P4QP-vZ%%x-3 zRcz3B$DXL=N;4^EY*vm-YkT2r)oG9}EMP6NT`ZV!gOarQm&n&bd&!w^MvhTX^A&#S zd@U53ocZcFq3E4)WF#hkk$H+0(=gsL?GE?q%vZ)H7Me?h71JmBlbJ!335xlW6}IRW zI0vjF1$mKlR@P&N3TzzKWd(wR6{BS#>z_EJVWwo_WT*M0@CbBIw+@kh3CJ*8n6Ga@ zA1g$=2eNk@Puh|eXi@NsK#N&lzVfls1+(!egg3wzLtFc@PkSe}XF;Ma)~~roE44?7 z5z1nBS8Dk#%iisouGFz5b&Um?vSD;tMm#G;$QVMiTgNLXiv_52ljd*ywT4AFTGg{2 z;|h@7N{H2x6$K764$<>bd5(G3nm2Ssj?kf8p|eU3p70Tp)~igc>zf{*V$?zXP@c$R zpu!D7{~NBWA(kz6OwV|0BLlc=9*6e0f!@In6ARQEV}Riu0eZw7rKe#_oPPmy%@9(< zm5U%}vea;>ZcL7Ak&9v1F$%rb%{=91{oFh>4wZCtXg)bk?8HpcK|4Z6`H=L`^jJJ{ zDwFBKw43F__r8147?6b8`N%ms5_;q((xd16O1+kHl{)eI$S zLZm02G}S>Q;1WbR#pZ5C{@cR^0PIWx3KBH5Q3$tj&F5_U>>mQ5@oFNTlIO3IK^qV0Ju(;t@(^W8`y3|U!{tAA;WJ%3H66nqkR;711(G(W zOEO6>J)>);E5?VUi-rKuq6#H~jGCFQnZgYtx#J3y*JqUfUf4igV7n`#b~4uPw3qc1 z39_dH(1kxXIy{QYP1xW{m&GoQP7SI9gQp*3&4!!N#4A!WCH*?3bb@M7ptTiYUf5LV z4?k%xaDPqHH=;MAvQS4#_FX@z1|#n6aH_gnsfOxEw-@&l!?=EU?!ZFX zN}zQ9%HsCrK#Lq`S!r%t2rw79ZoM3!cO}?zFSvF&xOU0;k&p^*P=Xue;0D_0AARfS zqWfmiz3T9Cb$F@eqmESdCZ&2)%D-9hZyM=>jw=<%=L&I0#6m*$ zHQ`+?hHxEDeODbqNhLAp9asKW5)a$OO{6`xMRL^8M5eq!=xQ+mHTu@dQ`)@vbuYT8Z{jR%* zQ}z8yJVpwYlK6Sy+p+Wlb#kzIjvyyg18;p^mE3svA9gdzn0N z`*5nXM=9;$j18a<$#ol(Wia@g@^4c7n`HkcwRNsPJOAw5v#SnoQP)cCnwvdK&hHJA z#Qg^oA5Ek>b}O}e778$SI7vR)viKVPrGi~buuBdy5*f)(Y{TVk!A>REDYN&pp9O5? zYjB%F5s2EFp%OAys%k-#sGy5hE4uC+`1o+P;%AH7lzF4^BjwR`5RXRZ&-56lf*A7IVgzAUusvzWRf@K#{ab<>MW()Igi zsOejlg_dOh-OW%EpAw!@gr{WTDMLTqX$2oiO4z0d+hk!I^)I-%uNTi3&lNwwT`Qw< zfI5+J`uyvT=02b8&wOoto1A~P(GK%}+SmMS(D9eSjRS7?|Ln5ElwJZLGtpgWXGoNQ zhwI@(+SQZz$bM8#VT9pN=EVPV_<^0~{eFg)Ln^$@+Um?Zf8aMcax?E6M7O$^ch5LQ z4{2Ut5>7dJ1hDgS0rwNwd4Sir^MxzOFc}Jg`mIv|@LhN-i|dl99rq=6>zEA#@+u<2 z*bYf1jZRmwZ0J|PK+-R>7(^Jmm5B)tD+A{qBcwv-9;-Gp;TfC8+#o7nSxtto%#n7{ zt*l&E22%iy709M>u#doQ<)7o_L!oo<&;1E4U!91gvXwO)mKzQ)y?RSbZn(Ym8)Fc( zWG+UN5t~@{156(Hk-a-n`z+yn9fo7oZr&{2A!0o1NI1i=t?9-YEz`S`OD3HTMH!yK zmU_Z<(gh&$55>VUcp6_^$}fYW5XPd>UTGGn*a1!k2HE|l{0P)SfmM+QG=`OXOmC$h zP?MyQIAmt{%EfDc=g7wc%H~7(NHrW*V3r?N$`8+Z?*}RuuHN`^^3qZ~71*onPq25&JfD$?YHq-`UK5Zc8Q)VkCTY2G}fPF@=Y2mOO2&u0S;uBh* zipY=pgpJe{Sn^B5_5-fqaJ;%+wF69*;q zQSc^BPce}JB+SNd=zMf+3LH)>p(tI43Z?d;p%A;LXb2lzoz*FR9*oWBpv4~O0uIk# z!6n?o=QC_ciB|PI9HazoQPfVzC#6A^-jHb0$qWc*SY9K#d!i1}p}WQ6&m9wu_!Xg} zZc1VoC}W2Xa>yQbu>`Xxf*^621hGlI2iy4n03BgaJ(ezFf{2*F)XcF&oq6b+JpV0? zdR2&01MjfbGpnO5> z^&%0*Kx?}Sm1E#M1Z|7!|3lyExq;m;bR@$c2zQ9nPvbstKDeVy+ZHFJsS4!Odwr>J zFK6x;;Wx;EtfCi6A9}c+LBEQSt>>A{X&Gl271{vQGr|sWeIi2yRQ-c`av5=%>4{f} zKh9VOJ=6dI`2UWs;fL=GigSR>@*Gr~HcP37^aXTAqQg8^^AoNf(7;`XY(UK^#^{4G zwR=MAve1g_p3mNE>tAl`PqiIV+76|J!-{ZN*4}LRO9P1wzU{C)$>1}u^x9xbbRD0Z zQZLO=uVB?1*|0TXz=~v!SsSIDpsr=9=Q%?yvDVTO`KWMzOASHCB|w`5KWm1jWdQ=& z+4r9@P6rc~MD=EM|3X&XrDmXvaOIC^P%xZtN@h(mRYVx#!PiK66+z!jlW45Bk8LZA zNKT8)fMa$uC*AoJA_^j#oGNq|Gn8J=i)vUfq)xP{*6PwSf|*sARKCUD7h@My>k1a)@643a z>K0xWu#9yn0%>OC?_+94=bYxQGtM8*aY6$U3pnc^>jEAiE<8io6Ak9!Xz_kTKAsb zlvc}uX7v@CvnP=oX)w6<&EF=H%hUoLG=m3Anl9dZB~V^7`L zd~eg!%bTA5@s`x4=afy)aaS^hQ`wE8Ll%+=G!M@h=y24>CXjEC|G0!H2Qa>w2}M8* zfDR8iO2n6QCZ>y9ZgGS)48+BV-9!$u(Gs?Eq`*2Z(pCDBFbH0P9KS+!Vy6dRMs&?rYGxfkT{3f(`2*4hH?gvdE`M2 z#kA_5%@xK^E!Bb~RYaloors59|S>p@R=cM)-DEDJio~6Vr!SJXh zG4~o%qCs_KPaf7X%U&4l@`l<-4S*qqS_;Nrh^7%4+zmGO9EvCS1kAM2W76?_ZaVo& zzzOkrN-&W!)q~Vf9SSUJ8xa$*n?F+im|03Gm;#I3xn!|;7@6?m2Ii*6_b8YV zk29*72Yu_2NMVLyWN2juEhOuh0d@NMM?#*|S&#Wy&u5DyJeRjjSt=fk?Hv1cV}Hfw zz-&Ednj4m!^tsWLw`YrSm=nk}EkSts}SC}C<`O7oPD%BcQ_%Mz3N-VFD{j!%N;WGs3qI+hO(Gn&!#ln7Q1wxiSc zwkl3$lprLPQgmG+6oO|qDdy|QX~m#R3my_`L&7>UwzH)S#X=d4VwOO;7*za&;Eeqp z$9x&XFWAvd+CIqdOthXOJu2KyivLKWZf|0XWyu5vY*{D_)LcDUJ@QnSP`PS5e;0?A zHY}Z38d^H>(Uv<0esA~E?nV0&%%$CIX<%ha_&_N}7T^zxz4XX+7SyVQU%j<~yA`SJ z6=9!=vP}30Z(S%iC^y8=T_05#W9rU~OwI`0j~uh%N3~iYP&b%39xF-&w~lx4ODB5K z-ibB2L#YMmkRBpXxJ3FJ{77skaf@s>$@nH2bfT4Zk?yLr3-o4*ix&`E3a7pi5lQMM zqo0Bk?V7Y&O-XdRs0jmh!Yl2fW=Q*|re6Uo%pemZ<+OR0*q11xm$~A`2Pub0U>WUJ zEFDS;&WwcZ96^HAzn=g+vwdo?TnRMY3$!f<+ERhFN&wd{JP1}O!KPKG$6E$bL8ZKP z)eS3%dKI-d238BmF4)SeSG{EO+ltB{-@pb+ax+Fts%pDZwSCS{M``ivJLY#R+TYrX zt0c;*Zn+jueWUPZVXCY}DQlVQTQTr2^rcF}N@*C}3jq`eVs1vY%6peiapAkWWm!Ua zq*^@~ymh6r?#B4N%C*atYnNQ9${wY%XTeD& zBVG)Vt7KSmT2wQTb_UdzDTc_Xx=@?U?LB5+s!+l>+#u`SG5&i$P`a=?6$qhOlf4)j za-dCbfa7$m`?PN$R2$^yn{6z zSgGTU!lwaK&A8`R>~Tyj?J*vN!meX2=2Zyd5ICb7bB?=ap>!2?7wqm?H=U(q4pK7$ z5K@^5$Akc70vTG?GS5W79LnmCwNA%4wDQug=oa&dIat`avvXx7)>lx;Ar?&7MFEN( z@`xhFt1~%ggcr;urRz_iV9lNf2Qa3fW8UTzfR!DX_0D)R?T>cV1sWhg(TcXv#TYUr zLR*+(F$NJQ($NJK%>9VkdyOd@bKH$&=lhvPMX>DP*lA_XS%4G`BP-K> zVu`s|P^waf8d_j4uiivbE&Xc zX&$TS-Hi|zS)+x{&H64@m}@&5$k);{0klL_j`lU?5z=xq{#vPBfPmE)m5#wCEfnm{ zx?PwAmVTi{`}PA454LJwGXmRlAGP=;oPVb}5XIdIqACW~Nj&m!7ou ze|bn;oGAlkEA3zTofh#lr~K4uNDtn-gq0}TC@BlX;C zfFaIIiMfwiPPx|rjGAA34S+D(hxssjF$@LK2AtSR2RGMiwk&V^cFvTcPrGhmN0W^U ziQTzr++q*Qy+`Z4&&jwDRjuq% zf2C(o2%LS926N7D@B>sW(SW$RGAiw!Pc4z~sYE4CyKpcxsB1IZ6QZj(q+>|t5#1PO z^#>CiiLz0kor%r-vJO@UOTY+~7iaxAsDru{9J%V5Ce{yuH4f!^;uumpHE=aoHbEy^ zAgSUoi*%JCrJV^MF9vf>)Pso)y?b?MXz20~-B*Gjk)h!+D23<BJgXox!L*&Bh?vcnNnB)Ja(?Fv(Wm9 zWQ-#_VW*k_=cARZL|18qI&qzu^2Qmlv|cq3T8ZNj>{omLkmzvh5mV*hZ#pVB9lhI> zd`@oOg7;1n|AnLFWps}OzZE4$HDr9UkL>NaD@u#GUQr{*Fc?F!Ifl{ZwP7kR8BgGp2FCEI@@->YOWQuH^-_U~bYD=ZS0{Dwch5$N(`l@QLz z$Y~G29p1G6JSnpQe8RksNt9k%1!aQ}w;Z2JyV*6$Y0vniI6W3kJ11YczyvQjd771i zgfY`aj3bvgu8BmQ_Va$?Uoj$CgmOJxNVC{HL9Cn)X5T$Dfd1aYXx1KEuwrg@ZdP8i z<@)SAEceUSEXI|_b$7}?u1S^cQp$GC2@f>39GyRBMZ4LT-|q_(7po|~I>iSb0jD=| zzo8|0c1Z{Vm9%y8gY{cW2)}t+Z|9r1@2w;N8cJxkD>~ zN|67T%9ZeLIY949WrI@L0jlz*ZTB`kv%Kk<)TRMt6VYWCTu=<0JOHi1OItvqUTj&| zxv&$mtV}=A$vaJ4L(w}&q0a9Bk*){c9gtg&E^UQ@_wFYC`$<3lO_e{Rls_Z0mxOg# z=sim(<(55o??m};s(i0fzE>{a`r?Am)8WB*FB+jS*X>ovH6(?62c4T zNpCRZgMB4mA0(06JKj{qPNia}?4wsb&e*VAy5SDka&{=CJ9J^p#bLSbDgLJXy^6nA z_V?zIIqjnQ;J(`8#fqDaD{UL(w&QnOm7T}st;e~js;`Q8TDIs%7#U$;R_^L$p?a}G zmnvm$YnBB}k(*bI0+0E`AbI@9NIRmj{MDb@O1!)HjY4$r!u3^I^(mU}?!*}cgqgYA zDT|0hAPjY15!0l|4oNcF8==5aKRU^%SW^!UK1V~O+_)nZ+^Gb2%E6r!!&<7v*;KGc z3HHcAs9m!tiPUv2s#(d6ds4x@N^q|nWO~;iTe?`1Y*m`K%eVolW=G1uQ}OSV{X5Yp z^`V=)?$vcK*LA1rB1&Ck)mBI1x-hOEo$Fg@Q#(wRCRzN#lIt6Tsj?oW3?(52azFO) zUzjVwij`o=r=(^RQee=v$&5l;rHYSgclUT)FG+!Bph| zrSbqjQ9^%^@@?q5qc;`oSAt9jU7&KYQx3G^HN`!Ys_auL`%H0hM0D(~3kKdFtG}?O zg2$EMaXEN=#b2fP8}IqMm;K#Kr!xY|p;jt5T{=Z-?r@r=Yubj>J%9bOzkczhls~Na z!?Hij+?tpD%>)&VA>Tgs)-lMSKfUDBh2;(L@Ak?5`pi^BUIww@2i5i8_I}gL(XPAk zAHD`#s_Cc#v-+q~eN?|LP_EjVJPU)rcZcSRGm^tqweMYd_X@{k?!-TS9kx{CAq8gD zA*JfjoOT~Iu7OR?JmxM~tbF=Y02_TjJO%zJl4669t>c33E$zn+5f}r1aJB>XOt|RO zbSnA^42In{x{-VWnV9Jj|PlKVK?l8Uq^}xkphp zpHiNyezNPIdt9QdIr)ps@ln^}Ti`6T))ldzw2$@kNv#*?R}ADl1$e?9&CRc5F8O2H z66a&N>n@gvrRJKFxNnX=%2`h9$rPPxW3yY9h#VlhV|rF9YwuNtmn*|dZK=xjO6B^wLvx27kYnd^WoN3gTdC}Z1Haa! zz+0y;`$z8deSAc&Q{NwNPWg{3{^PPAc!Lp>L8=KmVs~_&OX5-(x-m)ivuk4XT2lp0A1KaB@YG`8z51Tz`W`v5|C47^^(T~i z;G?JTTI;J{UU@nt)G0z8lppaon-zzc9BFZQNZ0ugE6xRc@Fzx^x-p`&AEv!PM_0_i zjV+G)as$>#2GXSoESWlRXGf-#bJmj+vGHUDgF_C$oIAxVCI@3lq+%m$k2y`~1kZC^ zW)8;|h1_}PSkRHCzVsXGg~eQ70CFy4I>KR$1)ZI?3<3h=sUVxN7CGiFT^2()LjH1X zoqd?}q%CMboTLKW`DZiSWoo-(VAL0VguV_t1~X%fZX7AX^}JXRxg;kinMI{Yq8lQy zL}7=FI)rJ7kj90Bhp;T+5|PQN9?ntBKtAU_{WgYtV$0*!I5l|@YVgM5qf;abj~g*! zSl_xVRCtg<4M!Id5&+XyAm5 z*T@KD>Q$v{9X!F8&W0oWisKG7EtYop6kF~G!o_?c{5zC`D+OVzAzK$2NtRJbm&unc zdmCX(3tA;O@9YWkB?9ROP79^eM3YVz@x`s56Ev*??k3Nl(%MJFSdtGapZ_wEQcl_l zE*^R7h+NtCiTGz1Q~nc*|Ag#6v07*&G0ru~l4Yi34BzF|N*TNVYmH7JcuH5sZC(rc z$|TpFNcm4H{*$u*B-S8xd36>w-mh$aXX3_$9Bd^@hfa9Vsf;K}N;s+rM`htCh&b%B z`pq}?;ASyRBc19hm$j2REBx>`C9GA1wX(35{29UWL`pcR2q$IXBsm$$T-^V;lyE{3 zPRPOu^4HZ`QT0pc>S?>T6Zhe=+i)4B3@{(SfAQ6n5aQN+i-5jgO#@JT&Gt1176OBM z8Yz4|??Pb3V-Zqc7%(FA#|kn<2PA?FyGZ1xFAs4Y5ZVmaotu{#>1e*#7xYw(7e-iO zJ4NTLbK?0YNQ2HW)F-YhDYn^gojU6Ipn2A{$v1!vA*ESi9bexq0Ne+MYP{%Xc121J5el#{V=)lYuD7v zRGFw1({LNf#dmOoUvZpaJJ7@Tp!P9hQT`0-0WAB^&)YxJnJ7P!AK-)(t(&s>NOYfx z=w(g1U8ns}=L4zkfNsH4(loGBCUqtKfU5l`Wc-kfKZTJvWTMJ+aPo_u_#maE;-!Q9 zw3^>3(h&|v2B~@IU>bU*b|$tONJNi|-(ij@{cAK;xH4Ug8v~&QS<~;7A?rwApbq*G z6_}RawEF;*EXCO!y6nbeDMtQr=5=ZsNPXJ%3?%gU4RZbD$Ix6tg42F>JCBNabBzIv z{`K#ko-Z^R) zn&sTW4y_G`wKivG>`>f#Z>w>&hju%3$A~>g_%`e_6q;GfI*0GRKeOId4Uw9e2p0;O z*;QFtS($(S`RAYiBNOaXf_>yMx9gL#np6w(d-Ib-rfiQ=27kA{lHP26*HU09@JV?c z4ELQ?>UaG~>z_tfw`Iy7QOb$hq#Qj!`H65h_$QY>d`gB(r;?*e$x%*_ zR(CF()`{gqtJo1f#Lu<4j5wl*BeFQ6QpigWNjH;R0KUD5f4iMwBG(OOLVJ}EHkHY? zi)BZSIcBo*ckGX+_F-!t8*|v5w>-V+_kjTimf02oUysyp!k_OYwrBzW29_wx_hAct zBf4`vx)a`RnYZ9g0awv|Y5;?h&aK2R=S8LB8{2oSZ{L;K-luHulj}zKnF)<5Y-1f} zF&9qXer)kE>^Gt%?4SBDtR==zBd3E($u@<2Bo&!I(OcdGi@DW0Y3+2& zK<|ZDxMDDMZX*s=c50kUpOzXESJ?Erz<;Ma-8DTkF6B$a`J)Bnu3_gtQ$%t`APs zM?avsVL}KP*ghwS=N){|(6SSyV8iQZLK-%g?Y{GFcW0Ss&O1VK!0ta@S^CWUExky$t7AdQ6s^WFD-8WZ26U=hI=d9?Q9(}~FmNwu^z2JL#r zTKpZfAD34oYi^tmIZD?y@DqOTV5Dd+L8O-SXSiVHC5AY=@HCV8w0ovA-}@#Ft96tL zVu>@_QmyayY}D>tuid#aa`&-J?T}In^9e3g3Eyw?1`ev@K#mQk=kC0Mh@Y9z0VQ-m z4jn+j8)Dr$cx@vlzTbWA`7tkCPVC%h9$If6T8m_w4=K%uXi^)~Xal+K%-YCDk0Ih` zCUjN_ot3qdX2CHiS=&SBK%t!lHc;LGm@+n=Cyh(a!>KBm7k@h#1IU?Ya5-5?!XZM2+6G_oBO(+IV5S$l9WL@`>?)HQz1Ti75hV z43dxE_xw;E|8=%}XkG*YDq;SEOI?(gJZYUJYJ9VufrJ&jdGF{E_&IfDUfO#e%#^~k z&dfBIA1|{a#6;!1|3S-yYS1hU`rMvtGD@_IaKyu^v8#g+#wxGTGr}NMp4Nq8H2GML zJOJF;%s7K8binn@a6Ia+q`y#b#T&1D10El~L~)3yJy%LHUNs*8yu@5!-7mdlX%$<& z^j0A=NA6`;&-=~og%&Awz9(LX$t%zI&9&-{?U`#c(qJ|MqZ!P6YyUIvaqcy$VgA`_ z^V9-0>8wvi`SeM=Bq?+GCIvUKXH9S5G=Ihb_8IRkV}RRM+P`}DAqNVI;FET zXO2-oR8g|v6|P^BEVy+mxu1+5YuuB@R~$w4jx%y~e7s4z)!4x+h1y|DG}+qO7@vjx zB-%CQdI`)}D@njiCCJwoeF$k^nLTt}Nfw#Ca4}kd?Jx2zRf9+%Cmj~`7i!l%`2Xw) z1V8ZV3NSm!&=Pu>MmO&8!+j-Z$AW-)&A5IGX$DEx&_3YM>Es63cX1TR89KzbQ%MWX zv*W5WeQw;k6ENM(DGq~ScMu#lrYE#Sga)k>KG*E)7qr5^4ub3>$Cu{h=rGPSlnXYR z`q!KKR|hgpLrT*SzYcE`YG(F?EnpM9v_yUV76t#7I=oZc`PH>Y$WBpjeEN!N0D9bF zD`~7VDwWa0I)x>@LXE)KVvP4?qsbVDlf+cXSm^bu6O&VX2bihDgs7w(11JGiu12xM#P7s|+2 z*Q1-B`au7u6fBG|X4?BgrmRgV1AD|*vJDQA-wMLP!qn0fB$k&1q9#e8CsMt9h>H-V zFJ&S-l?eG&DrY{S5oUMo0o|wn=Gl0&EH z&AJ>CwvD;YN%~?Y)}_R{He&tjvHsOPYyM2^kPE#KqEnLT{rain1Za<^GX;(YOX1OSGi?81hRLB>yFT?x0#;r48-ek0bt9)oALOsrdpL1V#N-k*)`*obzm zN4r)AGtoXJ+9yZ*{_Fi9yupZplU}l(wEy<2i?2d%fSIMu#v0S*%kxWqU1s3o%ADK) zqgEH!20uEqap27QfioXp%p7=JIq*2Yo(W%4!k1)r-mh!;z5PFgi6-Yz&YnEaMmY3Y zS}P!!)>?s7J*Da^mP9P~xdSh`VRTJIz)!;uTM$0EiUJi>;YTuMJCrhVc%y3@F-gC# z-z$^Pe@!`pdVQUrneaE1@Hb@bG#PwaEz7hWQQD4V>W?b*M|DF_*(e!$ik{^sdZU~w zSWY<15(H5dRv+j3gA5?B^~X9WE0QKlitW4sWm*IswZWzIyA8pbKDRK}N3T!nED zj6W5^+qTaT9d}<9*d2-BIrB4wNF4|4Mi<=`tzXEt8+8g?s-G83Z_Zarz_k=z2m!`Z zHbLK++QX=d4JyQW{{y_Q*yVj5ce)<$b=@wVx5>fLdWTp+hA6+IUGf;YvVH-R3#>4{ z&q#sZ1hgAl^(?3BS_E~b9Z<&+55-HYwQ?y@->f!2j_<0}eq&`~p?g_9sf zzH83BH7<*Xt#5nK677bfSS@u?33Dx7+TXQRv7Xwxck{KJ4#)Nt!xk;)X8z(=t9`_! z%NYeTTe?v7{Upi)!JQijP;oJuG8DG3ExT+fCtw;$Tu48*bAev%9Szu;A7BO zVw);&UzMW=eb4JT=Y?@2T_{!O{R-laxEbqukeQ%XtB$q3M?6pOVMg}qwEOXDm1EEb zLwNQ2)dKY@$!Y7xv$VSu$7_&ZH%w+7eK7VmfKg!J_imK(Ab6R4sk`?mc@D323iIU6 z|G>D-RaNM#KzyOJ8?|x8Tk$%^=_0dx?ikl*It$;r?L8Z}1tzu0P_=vcP7G?oK@7rN zp97D~6W{LAs^(Ef2ESaNjynu#&0s`6ubX>*zEOi0DK=jSPFKEi+{|a?>wzY%OqY#~ zukvoE0WEXO<*&2bb2=r+R36>itl2sq(W^E2+65F@L3{^HbN(t=-knBpY|EeyuH!D= zVy`c9Hfw!gjxpYMXun+cp)9Ls#zP(BX*(orT@|$1(P|Xm!1&^R`t4qZ{1Y!>xSR`P$LKrgoG*MXg%2 zJ~ziM^WTH_pox!alsWIN(&;+JP%C#V+h&Djz*@T-thr*a{FvZ3i@ox{*NK7h;a4|v zYHdc_8Y#Q120_sCB#poh3A4EIE8eLSF`l%$AvDv<@OctvV28C2up#ULPaXfAU1Jw> zeiBiHZ7kBxfN3xP?9A1h`1$Yg)56&$OuGmFpAq=!d|hV2$>8X!PEbQsI`@6$mHq`4 zT)|2OeTm}RhJYlk#7N!h#Moe;L-O?JMzVdU)k+;fL^cMePaC>%Dn-~)3i zIdpttrXA+E5(&sVl8eH`brdmil@*}-IUu86s8akl|rv?+K zejT)hK#5N7c&JMv4w3XOf?NRAxgjOstVw!}eut^C#wVYfz6vHX?C2+?Z74@tp@0|@ z+&7jQ_U7K)l&v_dZ6Yz~QdwaQJ z_9;AFqG_YC2F{7pgya=27iOs|(^sjjNcxo3Hy5F{W1c9-VNGiqj!kDJmAS6*)>Y}H zfXY0dmF%v(^&9We=pvC6$S7CVzVpquzxmeF%TF&9XJH(q7)}kX7tJ}yAwl`#7%_BD zdtvJ2lQLMo*=QJ8Zx~qXB=h|ZBTB=_z3EKZd8G`@Q*ZcdUU(x$X4v=%NBF>9x%kIV z|M=-Y9sKA(rst&6a}rlG6{i%0Wv7&~Q=0)#pbBm#qty#yHdsvp6eHejtVxM=Zp03( z$H4C1B7vjcY{QO?hN1O_p-jWD(g3?N^;BEX}M!4 zvwgp^9o+ll{JeMZ=TBxr=akSnIdsm#!N(8P&dO7nP=^xgkVEi*&NdfP1Kh;T%D2|` zX6lY9b;mNH<4Wkb96C-pn3sX&SJIDWLc5gEE;+PIyZT}#v>l%)hqh~1<~Cv->#+{G z^WfUEnb-*>b|Moxsf13-p_5vc#O-s7=N255V^X$*kbUXQgu0bbw;bx$o|s#{neMVE zKU0;qDrYDYYEeQha;U{9!~Ow~9Zi+%bgI2ZbKTj}#g4;*!GPu-6g5^F~=@@#WM$zB>WYqnoQI*4u~W zc4jXLM#i$yG1`B63_A40t4DzGR9^8p|3<)UL12HjxoxBQzlG^Dj^{X#tVuzL3;d}m!II4)FvN&pp93Ds)>)sXF0P_V{=}g}5 z@f0Nd9>=-Tve9*5z3af*$xPRX(lx@bBGeTwp>s)s!2|*Z{IT&w&8NYpT-znbdiZHr z5W=WCOuG?{^jTEG%}l5Xjy$;obCdl5Z%NncHk4P=McX^%iUT&II+bvz946~T>X^6* z0WN(kk!Lz?e85}M$RBRh9^OMn#+J&MlY6QqhBz-n1!Af`D&`AdE05oiV~=D)Dii_` z)h}Mb7advpt)<^ugGjV$a*TSxtp2$nGHYM3bJn7WEwb36c9R_Ia5WVMug|@T*ei>@ zR6T~f_ERMQ>#n^{J*umdvK>!)A8^)6%iUhN>#=*$pVzK^n=G=`*e$XF#>4c6LX$~| zeR31Lwb((6DqtQu+VC`*8yUzL)Ci10VMy&!LVM)U9z5onQg*Qt6Ij~Qo7v&QhR9mrQOQ+Zp+ZDZ_L?PLADU%ij@1u&fGGP$e&h(VCViemaoqx1`a2#EHdAmVF^eoC=* z23tQcK^kKCsH6O9^$!p)R^c)AfzzWE!-cjXumr z32Mdy#Z0JA3H8aLJ}O6_3l_%I3D2)jNBQ))=s9h+$y*vUkOC+Qb{*X`kO(jt3SC8G zZ=sgp5b$U27<~B=g#*PD7@Se*2{Zc4BfVgg*-rdM6c^wa)r80)tLHA^>^gj*;Gm=4 zJd)a`vaS3m@B|Cpc!KV-)boDluxGriqA@O}_%=F^u{I<_Op#O@I*X;tbc+eiF`+lM z-e*E@Y+N(`0b?>SM}W`LGlE_64N6Lr(yTh1zlkjN;T+_{`7C8~HwMOT9il;<0l;BU zH?{s@!;czPqpLSEO^1}GLm6@VLU8Fx>loz92fn~z7&2YnzY%F)kC1Rwq??&@^_HCS zs)UGKcVf-|Q2-G?GvSj;_@o?Wt2?3?$@$)0tVa*pJnw0^W6E%LcQ=r!>Q}1z<;XsM zX2c;y9FoN$$_yhXOE=Ryb>bBCDb6iOlkI4)U+1{8>-;eiBG2^egc?j*I@yAb(2qQP zZ?Hz32S$uO9^iVJ0SInV~OeW?0l#{WhoZwqb_qKrEGNT-3v(E1F-gf&WLGc1U4^Z6L z@`q(VDqHohPGuSoDvbv-;Y#RIj}Q^8%FH)}K2#x#iRWOsfyY06ZP6TtQn$$Cjtuw{%?TV!T0DW^sLkPKR0F z;L<9@!*v`e6D@2Onld&GLY!I5knwo}a>mSM>{^5HVjS2%MY*{`&K2eCSmNwD6*@y2 z<5VIkWNLikj&iBvat_re7;BY-eS;e*X3B7m0RJPD0>F>ezw^r5ue^0@`4$-$jw)jP zhS<3-cCNJOcG3;-uFr^Vir6NLZ3Mz#3M`$;h)s&vB#TXEaL4f3t%$p2akufTZD?$W zHR~d2`tMB7XT$+T9FWBUDuV`>F))nhjd$bqIGuxqK#dKS{~e9^5R1s)=wPwvm6`Fa zX$V-Cs#vx?#b`1=)4_2a3J#hqk7YYIdIJMp9~x*e{cxR++y|H7l%-hwCdzdmR9?e8 zvFlLO_oMZyAmKj1I$`sKkwYbJV=U)OPG8RzK~ocID~Vj;ixXF&CcdBY)V z;qbdmBnEfwllq3V|4wKne)ok;{jgFG_Le^Y?-K}apIJDuG-6qEXbYJaQ%UFICKK8Q zPO!|)q|xa`h1PL{tshtP# zxK0u|fzH6WK2tB#&asPx|H)LFrD`~*?wr8PGFzA zm}7xP@+fs>`q>*~Uz$(`6xODC8_!|i+~vvV;Q9;qyHO_&s{gIt#^V!{&mnJO7PjIE?jgd{I0^e(q~AF^Gl?My zX%-9LzRVO`=g4B#<;#3j(ipxnOFjXoXP(9T=cMUp zZa{ot*eKxgWmd_{m-QlPh#$3lk^Y(5_cX>Q<|a@c(7?6p)2i8BQ>`vv24b}pd13a3 zgzuSzlnAwwI>IL;vOWhLSICa2jWBw_lG77)vHyrgV}ihB8=LS zBuy_BI6gV|GM5XX&SfU>E{uj|xR`KQ}yVjKM&V+X<;ayNFEF;7GWu=hK zDXD~PPIWzmZ^~kFS;MB^TR!yu(L1Bq zUFz0)q+5pfD!;dK%=;7XT>*t5^(RdqlIsMd9wIFC)NbFX*|}b`bLG_PWTs|VsTp4I zFP4&w#;f2b@tIqA7MSJwB)U*PXpFO2dl(5TjWkEs)x)mEZXfZWo__ZvB;eqtvyr`| zarO$)L$Hzq@11al{8>;}VQ#0Xt4K!q6e%YGBBh zBnXI6!eT;zTiMc4V1i*)6KPby6u%|XHiGD8J0htYjbIkt%vFqY>`P`QA<71&aw*wp z!$po9D+IUIC=ZlUG0bxR;6!Tht+UH#GiA+icp;0;9P!Y|ne?koNfD)4tN#Ziuq^VX z5jzj;Ltsqs!`kB5oiW`rC?=`QqCaZeu)O6rQ!?{jvsD{|0cS;bDA6R>Z`Tck%{5=1 z9TMBSiNc;Zj?cL$-DGp!b(p0m`g)>~_c{P(Vg@s|1{4eo8lORC=_c=ey@ORiB3Cj1 z1r5x)b(%f?WpnZAD~-c2`Z|1>>?J@-6^oh6Ai^7&UHv!_I zhLv{E@M1%Z#F>ftXUyovpkit^_;BapWPZ);vy?$)vtx@g9GfCc0n7b;4*oHC_WJj{ zUJrhV>vQH@Ruq9P7_9pF%0KxHKB~yegfs!l+8{fhnF2LE)yTLVj371-M;%CQ!_ol7 zWM9WrVshg86fJTA9TwuUm*lh6+awfBh`bY`)cjIM(vROAV*p5EtVn$nj8ed$nJA49 z?4}GEtlAmgRw%s=0d)HcS3}$kK#}3+1e<>cuL5j_$Ugx9v6;jg4FN$2pTdFQV=_Cl zB^8U`W(GwK8A6jx6etu`Ud|#R7+E|h2bq0V;;p^BJg*ChLQWJXMAi@ocd$vqGC%0R zdlhxe&o*-csd=O4^%#H#&pQw2bL6&*x$g2Mzn&LVCayp@`zu2V+r=Kk{L8wSdRH1i zVCzg{8s>d93!R31)3BaHq3$G(6YI`E33GFyiig|}TDw7&-B^G`u(kd50gZBWUdI1{ zlC8)?>W2=CJ}X1N4xEg9gVWj0$Z39$-Zg)K)F0`;*v_v$`1Q+3So7)D>rhL6V6WgW zZwUd?7S{P4i5|-gZn0%&a5Jp4ej;MF9${>qS>Mlm5EX0hHplbW5dg;?-}*=T_rgA2 z-wuz3=Fs;Y=BkXRuN1U+q-wN*-`&C*wA9f4f28+;*Yl)jasDOG%f2T)FL~$v(mu=g z`r{_n>71_BjJ5>y8Ou6Ykg(*;^KP46Tj(kOv%K{zeAXuEg4{AD5nYe@^=IaEU03XI z*eIsBPv!HFd<^R9Jj`W5?!@nuJDJ(`fX@ofXCD|={eZg9ZxvZuy=aS;9z)5*UUVGu zMb@5$ML$z(y+(SjuI&InQzG#_txu!1&*XbzUW^yHJ~3r^BVo{dZ?su0RJE(i9Up}Y z_U~fj+r$$zo|!LljvJQSRUeUZTcMccb=Q1$FWJ<-ual;rZjr&L6Sfa*{eqVLujY1o z{V<+1jbP(hE52a0b8XKD8VBHrLYLX$bOklhUzlHS+FldF+w|XAJSMFHmoU99ZWZqT zLvhJKFIQda=#Yqll;V`557p>&P{CcVPsD0kxHxQ-W*)0`IXLn>EnEHtEk zx)2!ERs|BXRyIckr6^z~%X;Z?CfhYgseZb#k5X*%{9F9&4A}N5IT=qXUD(N?sZpXj zz| z(IZhoOehO7llzs>emTS>`*p$k`{b6eZ9USKiF7ED4oH0-IJDr0LP%9D$z;X?C=0>D z=w?BANeu+cE4M9=Z5D~;J=ln-ZcexUq*CcTkck~sVh1-%=yDj|s+HQVOl`MP+bu`C zVZ&^rde3_Gp4HK{!FwIt)$)?CBz*o!v_^@xygw~Rc7xJG=|&*Z@&q2fQ=^%1vl4EW z!_C=nHB4Uxkq;~>aDu`x%jGL+eXlq@uu^bm=qDF5)%{9!Kf4G~wWY_G#dpfyE=voU zaGMf_!$msDCl?iaDRnXvZc)Ne-l3CLK13Ok#jJtbHy3ZFj=uTo!mA|lMjo?U?{v!z zL;TEy_bZz3Mk-CezaI|D%|6Ph<&9>JLY=IVHiZ#rM&JCIvR3AmGg{KZTxa&ISM{vK zGgW((sy)P!s)o{Oq#Y_d?~J`YmL6J}{Qbk+4S*c&$4R(4KblIsb#D3G(z(yI)^%)y12Es;k&gd<=bg@#@BFAY-J9Bz+Orxr z>?Esjy|tuKQm05*Odayyh;A;-Ku1Q@6il z{w@eC==7fJY;EGM8PC~Grn9fhSH4b5xt8xvkvLcrY%UbWk`-9TlXX>CRcGAW$*B&~ zmL4NPv+FRk32o`KTe+W9U0SNT-}?3%HttaDOb;`gN#!(RqXEvGnmf7tPK89fh|&!- zfuSj#6UHt)K6QnwGJiz3eun}k&}>Y)G#i?vJxD}{Pm`T=<9G2>+reNLx^OiYNK8%5 zkRoy-C(I-evqBv*J?iv$lqs^iPmlawFGf*<#QKCronW-4|m6}zzYp-sKVR(*2aF@9RqYW3+s&AM6OEkEIP zHQH%XS;%XL6w)pSFx{C207)xjFeBC|VhyAPNKS^XSfyf^0AJ&}NcJ%`ACu5$#>v?r zW;9C6T82jNJ`@^-=|%K}^RNzY)vzN<<_DI{`n%Jvi*NfT2pg38(pxKsVyCbg&;vlk zdAR0u6+!?a(Zw9_6zXj(Uh^YA*E+i|+09~kZp#W+MChXTW-@=o_?9~QGk-n4Mn`AP zubH7GulxH*mRWB}w&-<3@9xjq7TB!ST+uHODImzqVnBU#G;8?|$J#3o#h-i5`T!VIv5trD@n|j4Q$0=pu!-) zMIz~9h7Xy&2<%m}oiH6KO7G#mjUA^76LTcDg)p%x!&yRw!+B6)wyN%(7v6s1t!vBI z7J{JfyZaV`irA4ABk%>gA$F{b9V<~?1%u%Vrd(WSk)kI-vvq^!U3ktQ^RM_9>x#GCNgvuN>Q(u2Y)! zAm*o@M?-#wlG=u7!+LICCo@d}CnhAqhG9Zd?E^t+^0XNDs%)a8Ak1{Umng+A9k(U0 z_&2Z{GsB}}IH?s3P5qadS?2Cd2JhC#pJSAKIcb>pX(Dlrg}l!Edd@;_Qad;fI}RmM z_w_cg^ZbS+q}e;J+Fr!&a3urnB6`c zoh95V%nzxAcPXIJ&aAyijIw&1e(K~EJOaZ03XHZ)#3jOz(s!v2#C&jWA2M=`YG&I$ zl>P$O+(n^@nw%m$5kavanK0mnmR?#9ZkL0w>_L`Sur<<<-M&NF-piBy`;`9UED6Gh z{9iW_*I_T#%vi6d`?2KS2zRZAyGR)<6CPB;gK~HayfUNJ(yCswu>-)=hre~0GCyoOse|J5g8?s8+>pL`o^So z0*Vd<016#+IJHjXdCpJdzjK};fU(Ups-7Vu_ucgj*{xRzW=^1JZ1fa+KrXxVE@58i zjHGtRv0j|i@jQi4pB=bdv9p^#hv*4jAm8*ZWq=Y8hoxs_&*eK_GoeN$)F^AGIx+uXE_M8^o68n!E7+xVb~usRY+U_cNWA00&Y35T zl=Cq2X7cf3%#*COfw%g_I}tl$I(g3}pGZ^}gaigANTG>T+7BSe`AH7eMctx;D^!?;QtUgs&K!TAfMWq=W55>( zfl^hS1>HOHduM-mcBS=hZ>D~~QolbF8&+b&Ixi1y&v1VJNf~B}1_GN>BT&o8hQI!C z^xwdD;Me(Sckp0%31lfB$^a`kL9^j+4wqzWe zqHGNW74}C^DNebN>@BBU3c5QPAbsHHNabq;NH^&=tyw;>>!?fLruzp8y-?G#%?rMF zq0Sl19kM%qVYhx@fRLRiFAW31)HJ6D?hI#YdX<`90upe|5!^n#aC|A6ErZP}Z%LD? zjGh|Egc~7MN|XWEEqOGiFqfzHq?>*?lp0zZSQ=P~=;~Zh4aVt2LORU+2Ylhfz|5~1 zUffo_zXo`5!XbkXze+$b&>$*8xu=0`Ecj)JrN#pm+A!JYbqsT*=E#!Q7u zb(E?{07ma906?S0>}*U0o_9^j%oe?Y)R>!vRQE+NoGf@EC}j6jxO1}8Ms zu7ujecAAZcjp)0o}9Pq3-7LE!7luF zA=#SqL3TA)0CSmsV(+`pS;c550IO+3-QXxlq|oG>DYx9kSmg)qV*Z+eZ`m(dUbqOU zm=_$F+j^Mk85%&21M16;c`6^k#T{Zoi@kaC=9|HiLmk%`2XFlOS(vMJlW}};_9|2# zq3@$fII^srz%U*YBY??&d?XirWKxd|d>JuCv!Qdb{g(vF zAP60^p}JK8k{XOd_pJ(k?@tX#Rz+}`G{g;-28TIndVU~$Eu zfB-;>V1(s-v)2>SDg3mpuu3?=d>jgA6OekfsrOoL{yFvfGbn<4mNW4i^e(U{FJ~*N zmODWE1OOZe7LIA%Cz&k&VMV1qy(RO4#xh%EeGiGP`fg6gCs?tX7#Id04}3MR>lU#) zonm5TID3h;JPZgNL9H;-sL^wQ+3Q^MEFm4hZ!UR5o#3*fQJeo9Juwq^Z+`XW|3=M! z90lsr2Q+_va5Ejf6N9~9r1_~+idwT;_s+~3<>v3z+qVl4O6_a#QBC-p)(NKeMP<~( zxfaQr^TEl9En7Zs`NRXJuVDw6Pky()cKy2iqI!;bfcl;Fec{*_6&({V!5DfYwxCl>%K^VpI)Wg`7u&zI)X8*V1jp?w->@7XO;t%Q0%UDF3UpmxJQU(^fRD-CMwQ zcZH2>(ZrgTt^yVvLz;vlRXWTV(gDuzBzkTAh5>7hXmhQBfg6mPx~*o^ zN?0o3!czfT1t$d`N{4rl;~^Kd~JCX#T= zx9L-}%iB!T;_J{Pd58%)-?!;V%=tEbq63jb8^@gjdFYss<~T?bH0Pj$HG5t9f01;d za8wo>8wTzyHg@ZC0%gvnWfo55pb2!%%T|r7(RRhL@3&tL8q72+l-ce&;N3hZ;9LOb zrr?2X^do2PAkQ#fDvIyp0Qg|hiVtajk+)%px=7jef# zcrK4@l@k@@dq+HEFFnudAwPXxVlP2QJEdc6_T@`kCW7=gz(Psi*leS;6DjFE3jPX> zCpDu5I7Q8vBS+~PFj?>w;rdUgPvKV)IX%)Zzv!Rx?$!*YNsrn6tv(~FgMyx z_t{+DMX4Kf>m+XF0&_R7Pcf(OQWq{J2qw9vggUiHR9rI7T;0IP%eC2=WRp!3TD8k) z%2I%W68{`;;4Yq2WBFSW^yC6ufNu;w_rfG%H%S#JwS97IfS;Mrpb{FCLxbSFD3Kj- z&b|@ZwI12E>i;m1i3}@|;e`>%Fz5wzr7zxjQmNe~$NKqcI51EP=-i0(tVf^^aCbTr z8B!uc3nNTSV&Py~P#SkH9L%=#$kqE(VoF@y3uX|CKK4+Xn03%m5vB{ z7I3aCzx^&QLr+`YqGM{QA@5tD`e`fGv8rM6o$hrkv^`zqGms4?MD$ z3b-mLDTaFSr>+SuCd<@)?~X|>UYYFeWI|K;xwYQ9nxA2$WGR>F)C!SC35Og7Fu-Wu z%ams5g)JHk<}T4%T)&I4c^xYUCYxT7~i>Niqy8Y%#f%+m!yt09v6H+ z6a2>mML!F95n31;G+5X$r=6d#FwFC>NB}4Na1QLR0^ZUaC=JH882lOQRVSGJOXPFk zLcItNZifiSmXXB{WP_QK{YuGx;stlIz*z8^sc>Qr@%t>(rv%p`$3rR3!@1{)oO*wn^WQeD7;if^uJV>|BN@H0l$f`C`eJrGMEMTZ zP5~(_pcJDu*gM_7-od!hST3z7VUkydhctRfTkf+J1Y}+f?ZNLLe0>}G#q|y5T(@1( zJf3uI@3I zq->$rgfqF1`rH?s)D<{&7GZoI9owU{l|n7P_9y$SG^n=iGZQDsQ ztksw+hSN8=jUGANlMPovK$X*xn*{~sOxqG3;nFRcXuA?^-}K=cHvQD#Q=h*C7Ss^H z9Q!X^gCQCmi`6GX<=7jKw8=BmaiZ}=(zfbE7|zI<6F&{ccB z$I*B6<#vm6)^<5YP4LgC3CQBy{ct5sL~n(bLkq&DKS1JQUmjF>tfodZ?#96Ka0(X7 zO=kaTyKQeqtc4dxS*$hknau@jSK+p%9#+?3-WFOB3&GnZizN#s+D-d5n;WeBmAM_q;IgP(Cjt3g!!?k~uS4~q1p+@-eQkgeEk{4mTPamOa4ruBEwDm8W1*V2m~%$5SrcZgunK zv8kIc%}ROp^VOTz37Gbx7=1q`LUJQqev-a&fi~S{3hc9(l!6l11vOm&@+@jCq=gsJOJIIvvwv7bdPuxlhO1-504n z51~Frd+yhr;TSFHHecGOME3>3|A@^hog*}Nn*zr|EmzCw6|I3zUpcDV(o1%@QG9MW zU!i6_!kQIIN}O7eBT$_@qljl@ks$-3O>Fo|70PRX%?v3M?^S7ySc32x{>2P}F&go2~N7q5k=LU@E z3pQZSKg9QwI+b}~{sT{5<*H=N+#bvp5iK?n-%J)f-HYYHC|;W@<~qYyU?-Hb#GPaCW<-7A~iz` zN;NRlfD(ZLn>)XyME2>Pn(lxCkdzu>!K&N{3J}BI&dPReqfTtb;D+W^%v(ta}ZT=+uw1A&Tago zMy4d#(~e^`Yi)s@Zlg9&=69$eh>rl0S400x1Ka`^7Wt7LT)+!Vc3?268NPA;(z4bP>@FKJgjUyNG<;P*K=<1K~&kwfl)mP`*Rf>_*GJ?!wrpV2|m)&)j-J(SlbzN?TPTBj zZ(X2UKce0u1_;o;*>=T4TC8xjPoesVG;CYs>wDCJVUvZM*KIu5{z4nMAo6dj7pk2>K57JpnJD(<^$W2TdB2t(c^kLh|F zvzS3_z+3|@Z8zD}WUt$nZVc|u8woZ}_MUgFen z7p&3;c&M{f`cH_sA@f2 z^X%H1DsgfS9w4qx++<_Ro#-;>_<%-VAzp;hS6Z=A+P+@eo+<5AN;?;PD()ve|HC-b zEgQ{)>&=63*xGzhX+FrWX2eGn@ex^k#FV>Tj?t-47{>DQpvfi`u5O4s*2Nv^<9g2f z90RNjEWMDa+O1UW2E*pzEZ0039$@coUKg8n4V!$D{{;1nW+8c0U0)1F} z4hr=8c!dHzEFxKD9me%B3e(Zcnrb{FSKzX^Tw{M~PLg`rFuK?o%oWWtPYww_a%>!> z-2i*0&y_1ma3Ozg3zpR4nTnTVxa5jn;LIk8*-s#B$7GJUf^&_!bc5|yl?*&P8=t1d zUb5Yd3LJH2{HHX4K0>jK0<5lIp2wDd0J>TT77QQSkF30O_Z7MB5q@SuN0iVJIdnwZ z>U`kohB!-8{WRm-yqU{NP{y{;Ls#91G`SrnIstAUv zbLg1KCZ=>I;AtA-j)Uy0+b0nyoteLehz7^uI-$4@axf}rGWR(re{Go5VnT6@l*Gh~ zQyrbjYR3&}ihTd57R^LH{m|MG0?2rTkEb8gKp_@A+cd}(@@JgZ8$+{K;X!=vWhSl% zTaGAz{gw{U#6u0nMv=NN*uaMon{whVViFPgow5g|CjveD?Mm(;F$7S(2L-cLyBG?EkmonlWMI;wj z*~*&bCy9ekmX*mGvNjHHz~f1%MPbe(;6EZOmMoTTh}+i1ZK-K}l2TtM$BwSzjYs*J z5sxY2FIjxVPF$4!XM73Yfc0|g*S)wvtaCIac}sePy5k6f&VQ2EB`7ltlPkQ4 zrTXb}(lsjaHUjtwlR!dCb2lYgQcE)w{0#++_}ED)X7c)TO8t_8zoj6EAm<;0A2{X? zo;$)8s2+bww;3HWN~!-$0W){^_t_(~%_IGsF8(X}4VLxw>o9{Q?Waq$(pLVkFtE9f`3Clf16U5DfKJ`#Ez1_LjgGvmA*m2QxrT&0i&3R9FktAV1NQf zRDG9H%&sX}A(ft_LjMV+{xzk3O2Hq}&z~X46`h`$ym|xQEYq(-&U?xgpMX;~o|ZN! z@4utquPKY~#H=L!H%b+pz9M;O?D!}MAjkzx?!BcFy5cAQ!%~!zBJGcp&s(XAeijp_ zD9(&!Fo$os5R?SwrYEmW%{@08=RV{bkx{CrU?&C4KKVZSfPVVPjFgjo@?0S|7cL!U zKe$;y={WrenrsA0C+I1ep8pF9j?mA?DEM>wyt9-dyXn%`D7ZwyU(k)OBbD=$KECuM zT|9$_a{)fSkH+I#^1_X0wB*?vSGDBG^ou!_(QpF0iW2=+pFKbOl9t32t0j*@VP52g zpOd7oncj7NHlbx2n|fAH&dy21-pdtYx`r0E6sPJIsp`4Xv+UP7t}QAN@s%r5_5Gx4 z+Aq=!lCI;IG)n;~#7cypbK+@m^~fb6m+@k@97&i9?s!#!2kAA+T!3}!W0omP=(LHiDE$sy3Zrrs{*{!X z%dtERE9r-Hm%fOzi{7K30%MyhYaKL0MfM=%864j9RR|ClL;yeM>_@hzkHz-`C7XhF zljYz+M}YuKP1Zmx5TJjKAa$HYD}EN)15pqTLS$aR`i(^^6L+6qtNf@|=^bIe5Q-)nd^qL1-vME0O6By3wsY=QuDBe-8$w)pJQ)bjJ>z+hGQuvo4dR!R?S3X}mN$(5T$loCC$ zYUC-uQ?s&X)%&5aGORT1RjT&!f{F>)gIbZSTpmc?ZlNLlojb|Z)(^Xs_CuQ<{Jz)1 zB75*HZ>eyYKmpOp0E_HFW1(;i63!G-MvB*vlj4s7Gsay@I_wny3>apoyek+>6yF12 zQY?S%B2T!4gpbX&$k(DJcA!SAem}%H@-=efQW(<=qCken^SJyd=AE>?BXz z4-_xPmMT-?QiBp`+7#&KrpFOpDJT|-(~t;9w2G06XbnAx$R1P+LPhG*yKudM#0owI zkv#x#G_449wP}@s1C%q7HU*_Y0WyHrpteXj?OnxV6tAJ5D0T@e3IyD=1{ltJd1dyl zqBHQz9+Y~8!4+UJM60ab2U*$_pv{4~tO2g|@eb&tTjrq9FYHL;>k!$4kXN|mO`{np zUYX>vONb)&&}~GkXl+FHAXFegINBPBox(Zq3P6zJRe&JHF5$Plo+I874EC43gjXqK zOAUS@yR-Z5@amMZ6QcTbiw$%mC(o~jbG}_deHx0!n;s+xJ`fRnAhHL~csqn9jOU(B z4-#wWPDC{75ZQx^-XWom=S70@BBH#A?7^J31dXWy{F#+jrE6HOA6B9VHht{Q$Z4Kn zA3|3k%Wn_22ZS+<-aDu@rBFPgA0s~^dobfYT_BwI z!eiz1riUd7npuLtnI+t#C;Sni4x{QDn;s-q@D@aCcnczX&?RCPWqpAJ^#vm83qJQOQ5&@1L%k7wj9MeI2UW#FYwE_kNkR>+tF0_r z8)1<>s4fs%(}Q;o6AZVmAuFPL$co4wVB&_62xpM;z8m_Ku0yp;%OQFSE5K6{YB4Eb zARw{QcNblRgb@%mQ}M>PSU$Mp>E8X?>4opWTSAXg)*<_M;mr7VZTfrBMkSjbME2ma zR}glrc<&ak_I)_0bYKkO_Zr44B70C85n5?fo}!qZLd>2*Ouc3fs?K^b*cj|nieR5&f_;iz z!fzLB6FT@4NYDd_C_f^5a5yTosqljo!4D#WA4K+GcTA|}@Ph=w4_J!%nt4_vC@Uh$ipU<677C^58%jHR6sdct0U|z$Ly8+|QxGl^dU>%( zP_c-pSVZ=qqEP!TBraVQd4y|yvtajlQ*sm;WRLUA(JCzOBF2PFWTV=~- z^rYj*UhW9%wbS>384H3!4Tl^g2yze+S~uplt9gt0zfNlZeo47OUq74%8r<2M@*%g1FVeCfv7?8_*9mrbucB=Cy276 zpO&x~^qPvlkRtqri0~I8djJY{yPkJD&%2%H#e|2Orl8P=sfZJ(kVIo2#fQ6s~01J!3Gl4=!mG%5!nM&x{VJWBxvv;qQQg69ux{%RwOvu zXIb%!`oAB>D8?bJf;5HS=#D#R4 zf-1UIa`DOYqvOX`{8XSJ+q#eY(2A{I@x+=J^ixvyzkj2 zThFZZC+^<&L}crk_4LZtGwW%Pt!LKLCR@*}r%Se;Sx<*-J>Bwbmpzs<>uHp&r`wm- z$R5k-eCoc>|HdQ0RNl_4zggDK`+m^u8;@|z67ksE-S+=+|TU>%YH7zX7mQ-$*2TBS+G?Wy)7TByV@wP904NFdMdkS0v zME0Pu!W&sS4r;+0A)eVv8Q6{6J}#2m&&!WLA-6xF)PJ4bvbZzL-QH+_ij3x#hy zwbX!FZrAEQIecL4q8vV|2*)-B+=TrvOR(G1(vgkTXRB&A%PPHLc=q(7{$-1p$dI~U zzI{`m%lN*~V%O4z#a)|4^jkC-(E<8h>?tW-e01qM%P+%e!e)>zh2Z>jvxHL2%PA{8 z>?tfl-F$D1Zf#BME0OLTwU3 zx}mg=`_Ni9a*1Jr0B4YT;ZwT$3*%N>gzD=IQjdK~SASvL>h^m@Fo+z%(*95BDwJro ZTcyv`dTFl7A1$GDcJ~)sWMWwD{|AmbmJk2{ diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/constants.cpython-311.pyc deleted file mode 100644 index fa9057d3e64c822f6b647c1bd459fe80ceea79b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcmX|>&#GKS5XNUTiX6xyid*Sz7G{XOJjOsBAMjJMOQT<-~sA~k$sBJVi`$hMoO|!y&)?jO0T&!!SRVz%4NZLRwdu z2y8p4K-*m1^O2m4=70w#RDxb!(NjW;8ZUMS**67ntN3pGbQKN%h>SPY&PE+bU5Edn1e+f*L4yVpl#QagYqnwo~ zg;I^#hTMpB?S?Xt{m+!4vL} j5#`JJKEQUHw~sKd-`#GvukU^M@h5+79$cP!kMVy2@oh7~ diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/debug.cpython-311.pyc deleted file mode 100644 index 1804b5ac156f911863554aeee314446abc4fbc50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6708 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 yQ||lBKJc(7%m>I#KIOj8>;s+O^mxEd;Oi9 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 diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/ext.cpython-311.pyc deleted file mode 100644 index 384917aae897a2d58b158245082e9f42c5000b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43375 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
rf@nrNn~hEWe?CV31ajrm%0AL)7*zo2QO8zDd( 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

upIn#wDUq~m$+g@}cMhh+Yc=C*|@@LY~RD)UF5 z@IjexReiGcJATzI@4ArVA!qm^u9-^T$no`b(h&+n|44C5Fy#Ca=YGzw$hdR1xRv7r zcW$O{F1vHCHrYke#g6^?!F_ZMRa3TkAjj{>yDBI|wyrnl>XThK3bi=4<-7VQ$ksJ~ z`2E-4d;LdmF24EL-?r*+%k2BhgMV>wW&Y7VRjr->xa>cE=OkU29e}dG$AJhA8#6Vz zK(`#gDa;e7nSASm_)p@Qw;p#6uXYYUx}57gE_WW!)tr!PPH61OY3J{scp>*>cLYj? zqGt|5)4s|zz9Q{RL#Pq~KpDq{krhqLCo|`A{++UaC%V6N=fka!_+0Bzx%DX3;1~n7 zW0oA>oOUkRm#*b2!b`&P^O?(!I}WUN9C*~3>o_WR9L-i7&GMxmNbh>o1g*sX^3YMw zS)Th_-hZ~<_P2Ewm^~*H0p@NRqgDwDP;n|j^Cz24Ju?u~pPNlUP@mmDExkm;o90sG z1fC6anqLV=m;lQ#@R|fumdYj*=nGO*0x@ks%Dw1B)+t~m;l(h^bw zrD7)he$5Zh#D%$O@v!theDUKFE9en)w#Aa?_Gj5|jq~4Oe|gS*hyCTbs;u@~~!j=~-d3#${`>olVvgV)BR|%H4w`9#f63(im(OPaSzjW_4DA06NLV>2{ z>2o;1pRnG*LDrY#3{?YKfC{c<%f0VpJN9J{oX>Wgmzzhk_J*Rz*=@~ol}kJC?pq$r z*p~OpAxH;1EmmfH$!w4c52vdZ88!t5#(lI73JkUp-NbFR){1wV zl;ny&uO+m6^xl~jTV`%$A~O$$`yvOohu{6>{AcZ-B|htx_kr{emvW;iXbCT?67x8W z2tX#jdsuEh1i5}o__NmE^nQLZ`_jvwzak&Qq6w#RqqCwEUzfPYIfNzr=*3URKDT{- z@pE22^dfU9H`;0})p>}*_byFPyJs$Dt9!sFQr$0m28uR#Qag;1i2M>SJ8;`CoFI>H zGIqV}u%NRxHZ!NcWIkUR{bxNMs>XU_+5IKCepT{na9e;otT&bqd`YffmAvXYENHUz z#?q@_lIvF`FKlRf59aHdimr1O3;18i%)2WVAw5slwc5J7^O^R$-!D3tzmuz~QG@cF z)AjCH-tKt!`Si$AXeoO48q;MEx))#h?t`03U;py^pWCwg&dLMlvMuN2n)6xTdD%V+ zwE<3R(Ot?>$yYVsw02l}wT)#T(0^#dy)d zzHw;Gv@%@0J5Y2fE)kFWL+H(1yf?72 z^T9qSLl}bYfg_)dWCx#@`%YyWPRUiLKi~P=y#UGI9?bHWQ7?z{E1Mma^D1d_8@=YO c9N%%ro_EyTvE~EqcYL^u?2d!}*lzFt0SqpUPyhe` diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/filters.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/filters.cpython-311.pyc deleted file mode 100644 index 6596caff619bf80bea4a2191d7baa49999d23da0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77633 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 diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/ggevent.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/ggevent.cpython-311.pyc deleted file mode 100644 index 7e47e1a39e4eeaa472f6873fb1aa7931188aee8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10385 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 X2%~SRmvMLe3D@sse&!AIciR6K`xD+e diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gthread.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gthread.cpython-311.pyc deleted file mode 100644 index 321f09fa034685f25bf15ea9fcf8e0da8c020375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20224 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 S@mo93K4kB{e@qHC5C0ED_f?1h diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-311.pyc b/port/lib/python3.11/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-311.pyc deleted file mode 100644 index aa4733f7f847d0180d772f20aea68236c3e634b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8705 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 F{tvQ1gMt76 diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/base.py b/port/lib/python3.11/site-packages/gunicorn/workers/base.py deleted file mode 100644 index 93c465c..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/base.py +++ /dev/null @@ -1,287 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import io -import os -import signal -import sys -import time -import traceback -from datetime import datetime -from random import randint -from ssl import SSLError - -from gunicorn import util -from gunicorn.http.errors import ( - ForbiddenProxyRequest, InvalidHeader, - InvalidHeaderName, InvalidHTTPVersion, - InvalidProxyLine, InvalidRequestLine, - InvalidRequestMethod, InvalidSchemeHeaders, - LimitRequestHeaders, LimitRequestLine, - UnsupportedTransferCoding, - ConfigurationProblem, ObsoleteFolding, -) -from gunicorn.http.wsgi import Response, default_environ -from gunicorn.reloader import reloader_engines -from gunicorn.workers.workertmp import WorkerTmp - - -class Worker: - - SIGNALS = [getattr(signal, "SIG%s" % x) for x in ( - "ABRT HUP QUIT INT TERM USR1 USR2 WINCH CHLD".split() - )] - - PIPE = [] - - def __init__(self, age, ppid, sockets, app, timeout, cfg, log): - """\ - This is called pre-fork so it shouldn't do anything to the - current process. If there's a need to make process wide - changes you'll want to do that in ``self.init_process()``. - """ - self.age = age - self.pid = "[booting]" - self.ppid = ppid - self.sockets = sockets - self.app = app - self.timeout = timeout - self.cfg = cfg - self.booted = False - self.aborted = False - self.reloader = None - - self.nr = 0 - - if cfg.max_requests > 0: - jitter = randint(0, cfg.max_requests_jitter) - self.max_requests = cfg.max_requests + jitter - else: - self.max_requests = sys.maxsize - - self.alive = True - self.log = log - self.tmp = WorkerTmp(cfg) - - def __str__(self): - return "" % self.pid - - def notify(self): - """\ - Your worker subclass must arrange to have this method called - once every ``self.timeout`` seconds. If you fail in accomplishing - this task, the master process will murder your workers. - """ - self.tmp.notify() - - def run(self): - """\ - This is the mainloop of a worker process. You should override - this method in a subclass to provide the intended behaviour - for your particular evil schemes. - """ - raise NotImplementedError() - - def init_process(self): - """\ - If you override this method in a subclass, the last statement - in the function should be to call this method with - super().init_process() so that the ``run()`` loop is initiated. - """ - - # set environment' variables - if self.cfg.env: - for k, v in self.cfg.env.items(): - os.environ[k] = v - - util.set_owner_process(self.cfg.uid, self.cfg.gid, - initgroups=self.cfg.initgroups) - - # Reseed the random number generator - util.seed() - - # For waking ourselves up - self.PIPE = os.pipe() - for p in self.PIPE: - util.set_non_blocking(p) - util.close_on_exec(p) - - # Prevent fd inheritance - for s in self.sockets: - util.close_on_exec(s) - util.close_on_exec(self.tmp.fileno()) - - self.wait_fds = self.sockets + [self.PIPE[0]] - - self.log.close_on_exec() - - self.init_signals() - - # start the reloader - if self.cfg.reload: - def changed(fname): - self.log.info("Worker reloading: %s modified", fname) - self.alive = False - os.write(self.PIPE[1], b"1") - self.cfg.worker_int(self) - time.sleep(0.1) - sys.exit(0) - - reloader_cls = reloader_engines[self.cfg.reload_engine] - self.reloader = reloader_cls(extra_files=self.cfg.reload_extra_files, - callback=changed) - - self.load_wsgi() - if self.reloader: - self.reloader.start() - - self.cfg.post_worker_init(self) - - # Enter main run loop - self.booted = True - self.run() - - def load_wsgi(self): - try: - self.wsgi = self.app.wsgi() - except SyntaxError as e: - if not self.cfg.reload: - raise - - self.log.exception(e) - - # fix from PR #1228 - # storing the traceback into exc_tb will create a circular reference. - # per https://docs.python.org/2/library/sys.html#sys.exc_info warning, - # delete the traceback after use. - try: - _, exc_val, exc_tb = sys.exc_info() - self.reloader.add_extra_file(exc_val.filename) - - tb_string = io.StringIO() - traceback.print_tb(exc_tb, file=tb_string) - self.wsgi = util.make_fail_app(tb_string.getvalue()) - finally: - del exc_tb - - def init_signals(self): - # reset signaling - for s in self.SIGNALS: - signal.signal(s, signal.SIG_DFL) - # init new signaling - signal.signal(signal.SIGQUIT, self.handle_quit) - signal.signal(signal.SIGTERM, self.handle_exit) - signal.signal(signal.SIGINT, self.handle_quit) - signal.signal(signal.SIGWINCH, self.handle_winch) - signal.signal(signal.SIGUSR1, self.handle_usr1) - signal.signal(signal.SIGABRT, self.handle_abort) - - # Don't let SIGTERM and SIGUSR1 disturb active requests - # by interrupting system calls - signal.siginterrupt(signal.SIGTERM, False) - signal.siginterrupt(signal.SIGUSR1, False) - - if hasattr(signal, 'set_wakeup_fd'): - signal.set_wakeup_fd(self.PIPE[1]) - - def handle_usr1(self, sig, frame): - self.log.reopen_files() - - def handle_exit(self, sig, frame): - self.alive = False - - def handle_quit(self, sig, frame): - self.alive = False - # worker_int callback - self.cfg.worker_int(self) - time.sleep(0.1) - sys.exit(0) - - def handle_abort(self, sig, frame): - self.alive = False - self.cfg.worker_abort(self) - sys.exit(1) - - def handle_error(self, req, client, addr, exc): - request_start = datetime.now() - addr = addr or ('', -1) # unix socket case - if isinstance(exc, ( - InvalidRequestLine, InvalidRequestMethod, - InvalidHTTPVersion, InvalidHeader, InvalidHeaderName, - LimitRequestLine, LimitRequestHeaders, - InvalidProxyLine, ForbiddenProxyRequest, - InvalidSchemeHeaders, UnsupportedTransferCoding, - ConfigurationProblem, ObsoleteFolding, - SSLError, - )): - - status_int = 400 - reason = "Bad Request" - - if isinstance(exc, InvalidRequestLine): - mesg = "Invalid Request Line '%s'" % str(exc) - elif isinstance(exc, InvalidRequestMethod): - mesg = "Invalid Method '%s'" % str(exc) - elif isinstance(exc, InvalidHTTPVersion): - mesg = "Invalid HTTP Version '%s'" % str(exc) - elif isinstance(exc, UnsupportedTransferCoding): - mesg = "%s" % str(exc) - status_int = 501 - elif isinstance(exc, ConfigurationProblem): - mesg = "%s" % str(exc) - status_int = 500 - elif isinstance(exc, ObsoleteFolding): - mesg = "%s" % str(exc) - elif isinstance(exc, (InvalidHeaderName, InvalidHeader,)): - mesg = "%s" % str(exc) - if not req and hasattr(exc, "req"): - req = exc.req # for access log - elif isinstance(exc, LimitRequestLine): - mesg = "%s" % str(exc) - elif isinstance(exc, LimitRequestHeaders): - reason = "Request Header Fields Too Large" - mesg = "Error parsing headers: '%s'" % str(exc) - status_int = 431 - elif isinstance(exc, InvalidProxyLine): - mesg = "'%s'" % str(exc) - elif isinstance(exc, ForbiddenProxyRequest): - reason = "Forbidden" - mesg = "Request forbidden" - status_int = 403 - elif isinstance(exc, InvalidSchemeHeaders): - mesg = "%s" % str(exc) - elif isinstance(exc, SSLError): - reason = "Forbidden" - mesg = "'%s'" % str(exc) - status_int = 403 - - msg = "Invalid request from ip={ip}: {error}" - self.log.warning(msg.format(ip=addr[0], error=str(exc))) - else: - if hasattr(req, "uri"): - self.log.exception("Error handling request %s", req.uri) - else: - self.log.exception("Error handling request (no URI read)") - status_int = 500 - reason = "Internal Server Error" - mesg = "" - - if req is not None: - request_time = datetime.now() - request_start - environ = default_environ(req, client, self.cfg) - environ['REMOTE_ADDR'] = addr[0] - environ['REMOTE_PORT'] = str(addr[1]) - resp = Response(req, client, self.cfg) - resp.status = "%s %s" % (status_int, reason) - resp.response_length = len(mesg) - self.log.access(resp, req, environ, request_time) - - try: - util.write_error(client, status_int, reason, mesg) - except Exception: - self.log.debug("Failed to send error message.") - - def handle_winch(self, sig, fname): - # Ignore SIGWINCH in worker. Fixes a crash on OpenBSD. - self.log.debug("worker: SIGWINCH ignored.") diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/base_async.py b/port/lib/python3.11/site-packages/gunicorn/workers/base_async.py deleted file mode 100644 index 9466d6a..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/base_async.py +++ /dev/null @@ -1,147 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -from datetime import datetime -import errno -import socket -import ssl -import sys - -from gunicorn import http -from gunicorn.http import wsgi -from gunicorn import util -from gunicorn.workers import base - -ALREADY_HANDLED = object() - - -class AsyncWorker(base.Worker): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.worker_connections = self.cfg.worker_connections - - def timeout_ctx(self): - raise NotImplementedError() - - def is_already_handled(self, respiter): - # some workers will need to overload this function to raise a StopIteration - return respiter == ALREADY_HANDLED - - def handle(self, listener, client, addr): - req = None - try: - parser = http.RequestParser(self.cfg, client, addr) - try: - listener_name = listener.getsockname() - if not self.cfg.keepalive: - req = next(parser) - self.handle_request(listener_name, req, client, addr) - else: - # keepalive loop - proxy_protocol_info = {} - while True: - req = None - with self.timeout_ctx(): - req = next(parser) - if not req: - break - if req.proxy_protocol_info: - proxy_protocol_info = req.proxy_protocol_info - else: - req.proxy_protocol_info = proxy_protocol_info - self.handle_request(listener_name, req, client, addr) - except http.errors.NoMoreData as e: - self.log.debug("Ignored premature client disconnection. %s", e) - except StopIteration as e: - self.log.debug("Closing connection. %s", e) - except ssl.SSLError: - # pass to next try-except level - util.reraise(*sys.exc_info()) - except OSError: - # pass to next try-except level - util.reraise(*sys.exc_info()) - except Exception as e: - self.handle_error(req, client, addr, e) - except ssl.SSLError as e: - if e.args[0] == ssl.SSL_ERROR_EOF: - self.log.debug("ssl connection closed") - client.close() - else: - self.log.debug("Error processing SSL request.") - self.handle_error(req, client, addr, e) - except OSError as e: - if e.errno not in (errno.EPIPE, errno.ECONNRESET, errno.ENOTCONN): - self.log.exception("Socket error processing request.") - else: - if e.errno == errno.ECONNRESET: - self.log.debug("Ignoring connection reset") - elif e.errno == errno.ENOTCONN: - self.log.debug("Ignoring socket not connected") - else: - self.log.debug("Ignoring EPIPE") - except BaseException as e: - self.handle_error(req, client, addr, e) - finally: - util.close(client) - - def handle_request(self, listener_name, req, sock, addr): - request_start = datetime.now() - environ = {} - resp = None - try: - self.cfg.pre_request(self, req) - resp, environ = wsgi.create(req, sock, addr, - listener_name, self.cfg) - environ["wsgi.multithread"] = True - self.nr += 1 - if self.nr >= self.max_requests: - if self.alive: - self.log.info("Autorestarting worker after current request.") - self.alive = False - - if not self.alive or not self.cfg.keepalive: - resp.force_close() - - respiter = self.wsgi(environ, resp.start_response) - if self.is_already_handled(respiter): - return False - try: - if isinstance(respiter, environ['wsgi.file_wrapper']): - resp.write_file(respiter) - else: - for item in respiter: - resp.write(item) - resp.close() - finally: - request_time = datetime.now() - request_start - self.log.access(resp, req, environ, request_time) - if hasattr(respiter, "close"): - respiter.close() - if resp.should_close(): - raise StopIteration() - except StopIteration: - raise - except OSError: - # If the original exception was a socket.error we delegate - # handling it to the caller (where handle() might ignore it) - util.reraise(*sys.exc_info()) - except Exception: - if resp and resp.headers_sent: - # If the requests have already been sent, we should close the - # connection to indicate the error. - self.log.exception("Error handling request") - try: - sock.shutdown(socket.SHUT_RDWR) - sock.close() - except OSError: - pass - raise StopIteration() - raise - finally: - try: - self.cfg.post_request(self, req, environ, resp) - except Exception: - self.log.exception("Exception in post_request hook") - return True diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/geventlet.py b/port/lib/python3.11/site-packages/gunicorn/workers/geventlet.py deleted file mode 100644 index 087eb61..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/geventlet.py +++ /dev/null @@ -1,186 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -from functools import partial -import sys - -try: - import eventlet -except ImportError: - raise RuntimeError("eventlet worker requires eventlet 0.24.1 or higher") -else: - from packaging.version import parse as parse_version - if parse_version(eventlet.__version__) < parse_version('0.24.1'): - raise RuntimeError("eventlet worker requires eventlet 0.24.1 or higher") - -from eventlet import hubs, greenthread -from eventlet.greenio import GreenSocket -import eventlet.wsgi -import greenlet - -from gunicorn.workers.base_async import AsyncWorker -from gunicorn.sock import ssl_wrap_socket - -# ALREADY_HANDLED is removed in 0.30.3+ now it's `WSGI_LOCAL.already_handled: bool` -# https://github.com/eventlet/eventlet/pull/544 -EVENTLET_WSGI_LOCAL = getattr(eventlet.wsgi, "WSGI_LOCAL", None) -EVENTLET_ALREADY_HANDLED = getattr(eventlet.wsgi, "ALREADY_HANDLED", None) - - -def _eventlet_socket_sendfile(self, file, offset=0, count=None): - # Based on the implementation in gevent which in turn is slightly - # modified from the standard library implementation. - if self.gettimeout() == 0: - raise ValueError("non-blocking sockets are not supported") - if offset: - file.seek(offset) - blocksize = min(count, 8192) if count else 8192 - total_sent = 0 - # localize variable access to minimize overhead - file_read = file.read - sock_send = self.send - try: - while True: - if count: - blocksize = min(count - total_sent, blocksize) - if blocksize <= 0: - break - data = memoryview(file_read(blocksize)) - if not data: - break # EOF - while True: - try: - sent = sock_send(data) - except BlockingIOError: - continue - else: - total_sent += sent - if sent < len(data): - data = data[sent:] - else: - break - return total_sent - finally: - if total_sent > 0 and hasattr(file, 'seek'): - file.seek(offset + total_sent) - - -def _eventlet_serve(sock, handle, concurrency): - """ - Serve requests forever. - - This code is nearly identical to ``eventlet.convenience.serve`` except - that it attempts to join the pool at the end, which allows for gunicorn - graceful shutdowns. - """ - pool = eventlet.greenpool.GreenPool(concurrency) - server_gt = eventlet.greenthread.getcurrent() - - while True: - try: - conn, addr = sock.accept() - gt = pool.spawn(handle, conn, addr) - gt.link(_eventlet_stop, server_gt, conn) - conn, addr, gt = None, None, None - except eventlet.StopServe: - sock.close() - pool.waitall() - return - - -def _eventlet_stop(client, server, conn): - """ - Stop a greenlet handling a request and close its connection. - - This code is lifted from eventlet so as not to depend on undocumented - functions in the library. - """ - try: - try: - client.wait() - finally: - conn.close() - except greenlet.GreenletExit: - pass - except Exception: - greenthread.kill(server, *sys.exc_info()) - - -def patch_sendfile(): - # As of eventlet 0.25.1, GreenSocket.sendfile doesn't exist, - # meaning the native implementations of socket.sendfile will be used. - # If os.sendfile exists, it will attempt to use that, failing explicitly - # if the socket is in non-blocking mode, which the underlying - # socket object /is/. Even the regular _sendfile_use_send will - # fail in that way; plus, it would use the underlying socket.send which isn't - # properly cooperative. So we have to monkey-patch a working socket.sendfile() - # into GreenSocket; in this method, `self.send` will be the GreenSocket's - # send method which is properly cooperative. - if not hasattr(GreenSocket, 'sendfile'): - GreenSocket.sendfile = _eventlet_socket_sendfile - - -class EventletWorker(AsyncWorker): - - def patch(self): - hubs.use_hub() - eventlet.monkey_patch() - patch_sendfile() - - def is_already_handled(self, respiter): - # eventlet >= 0.30.3 - if getattr(EVENTLET_WSGI_LOCAL, "already_handled", None): - raise StopIteration() - # eventlet < 0.30.3 - if respiter == EVENTLET_ALREADY_HANDLED: - raise StopIteration() - return super().is_already_handled(respiter) - - def init_process(self): - self.patch() - super().init_process() - - def handle_quit(self, sig, frame): - eventlet.spawn(super().handle_quit, sig, frame) - - def handle_usr1(self, sig, frame): - eventlet.spawn(super().handle_usr1, sig, frame) - - def timeout_ctx(self): - return eventlet.Timeout(self.cfg.keepalive or None, False) - - def handle(self, listener, client, addr): - if self.cfg.is_ssl: - client = ssl_wrap_socket(client, self.cfg) - super().handle(listener, client, addr) - - def run(self): - acceptors = [] - for sock in self.sockets: - gsock = GreenSocket(sock) - gsock.setblocking(1) - hfun = partial(self.handle, gsock) - acceptor = eventlet.spawn(_eventlet_serve, gsock, hfun, - self.worker_connections) - - acceptors.append(acceptor) - eventlet.sleep(0.0) - - while self.alive: - self.notify() - eventlet.sleep(1.0) - - self.notify() - t = None - try: - with eventlet.Timeout(self.cfg.graceful_timeout) as t: - for a in acceptors: - a.kill(eventlet.StopServe()) - for a in acceptors: - a.wait() - except eventlet.Timeout as te: - if te != t: - raise - for a in acceptors: - a.kill() diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/ggevent.py b/port/lib/python3.11/site-packages/gunicorn/workers/ggevent.py deleted file mode 100644 index b9b9b44..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/ggevent.py +++ /dev/null @@ -1,193 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import os -import sys -from datetime import datetime -from functools import partial -import time - -try: - import gevent -except ImportError: - raise RuntimeError("gevent worker requires gevent 1.4 or higher") -else: - from packaging.version import parse as parse_version - if parse_version(gevent.__version__) < parse_version('1.4'): - raise RuntimeError("gevent worker requires gevent 1.4 or higher") - -from gevent.pool import Pool -from gevent.server import StreamServer -from gevent import hub, monkey, socket, pywsgi - -import gunicorn -from gunicorn.http.wsgi import base_environ -from gunicorn.sock import ssl_context -from gunicorn.workers.base_async import AsyncWorker - -VERSION = "gevent/%s gunicorn/%s" % (gevent.__version__, gunicorn.__version__) - - -class GeventWorker(AsyncWorker): - - server_class = None - wsgi_handler = None - - def patch(self): - monkey.patch_all() - - # patch sockets - sockets = [] - for s in self.sockets: - sockets.append(socket.socket(s.FAMILY, socket.SOCK_STREAM, - fileno=s.sock.fileno())) - self.sockets = sockets - - def notify(self): - super().notify() - if self.ppid != os.getppid(): - self.log.info("Parent changed, shutting down: %s", self) - sys.exit(0) - - def timeout_ctx(self): - return gevent.Timeout(self.cfg.keepalive, False) - - def run(self): - servers = [] - ssl_args = {} - - if self.cfg.is_ssl: - ssl_args = {"ssl_context": ssl_context(self.cfg)} - - for s in self.sockets: - s.setblocking(1) - pool = Pool(self.worker_connections) - if self.server_class is not None: - environ = base_environ(self.cfg) - environ.update({ - "wsgi.multithread": True, - "SERVER_SOFTWARE": VERSION, - }) - server = self.server_class( - s, application=self.wsgi, spawn=pool, log=self.log, - handler_class=self.wsgi_handler, environ=environ, - **ssl_args) - else: - hfun = partial(self.handle, s) - server = StreamServer(s, handle=hfun, spawn=pool, **ssl_args) - if self.cfg.workers > 1: - server.max_accept = 1 - - server.start() - servers.append(server) - - while self.alive: - self.notify() - gevent.sleep(1.0) - - try: - # Stop accepting requests - for server in servers: - if hasattr(server, 'close'): # gevent 1.0 - server.close() - if hasattr(server, 'kill'): # gevent < 1.0 - server.kill() - - # Handle current requests until graceful_timeout - ts = time.time() - while time.time() - ts <= self.cfg.graceful_timeout: - accepting = 0 - for server in servers: - if server.pool.free_count() != server.pool.size: - accepting += 1 - - # if no server is accepting a connection, we can exit - if not accepting: - return - - self.notify() - gevent.sleep(1.0) - - # Force kill all active the handlers - self.log.warning("Worker graceful timeout (pid:%s)", self.pid) - for server in servers: - server.stop(timeout=1) - except Exception: - pass - - def handle(self, listener, client, addr): - # Connected socket timeout defaults to socket.getdefaulttimeout(). - # This forces to blocking mode. - client.setblocking(1) - super().handle(listener, client, addr) - - def handle_request(self, listener_name, req, sock, addr): - try: - super().handle_request(listener_name, req, sock, addr) - except gevent.GreenletExit: - pass - except SystemExit: - pass - - def handle_quit(self, sig, frame): - # Move this out of the signal handler so we can use - # blocking calls. See #1126 - gevent.spawn(super().handle_quit, sig, frame) - - def handle_usr1(self, sig, frame): - # Make the gevent workers handle the usr1 signal - # by deferring to a new greenlet. See #1645 - gevent.spawn(super().handle_usr1, sig, frame) - - def init_process(self): - self.patch() - hub.reinit() - super().init_process() - - -class GeventResponse: - - status = None - headers = None - sent = None - - def __init__(self, status, headers, clength): - self.status = status - self.headers = headers - self.sent = clength - - -class PyWSGIHandler(pywsgi.WSGIHandler): - - def log_request(self): - start = datetime.fromtimestamp(self.time_start) - finish = datetime.fromtimestamp(self.time_finish) - response_time = finish - start - resp_headers = getattr(self, 'response_headers', {}) - - # Status is expected to be a string but is encoded to bytes in gevent for PY3 - # Except when it isn't because gevent uses hardcoded strings for network errors. - status = self.status.decode() if isinstance(self.status, bytes) else self.status - resp = GeventResponse(status, resp_headers, self.response_length) - if hasattr(self, 'headers'): - req_headers = self.headers.items() - else: - req_headers = [] - self.server.log.access(resp, req_headers, self.environ, response_time) - - def get_environ(self): - env = super().get_environ() - env['gunicorn.sock'] = self.socket - env['RAW_URI'] = self.path - return env - - -class PyWSGIServer(pywsgi.WSGIServer): - pass - - -class GeventPyWSGIWorker(GeventWorker): - "The Gevent StreamServer based workers." - server_class = PyWSGIServer - wsgi_handler = PyWSGIHandler diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/gthread.py b/port/lib/python3.11/site-packages/gunicorn/workers/gthread.py deleted file mode 100644 index 7a23228..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/gthread.py +++ /dev/null @@ -1,372 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -# design: -# A threaded worker accepts connections in the main loop, accepted -# connections are added to the thread pool as a connection job. -# Keepalive connections are put back in the loop waiting for an event. -# If no event happen after the keep alive timeout, the connection is -# closed. -# pylint: disable=no-else-break - -from concurrent import futures -import errno -import os -import selectors -import socket -import ssl -import sys -import time -from collections import deque -from datetime import datetime -from functools import partial -from threading import RLock - -from . import base -from .. import http -from .. import util -from .. import sock -from ..http import wsgi - - -class TConn: - - def __init__(self, cfg, sock, client, server): - self.cfg = cfg - self.sock = sock - self.client = client - self.server = server - - self.timeout = None - self.parser = None - self.initialized = False - - # set the socket to non blocking - self.sock.setblocking(False) - - def init(self): - self.initialized = True - self.sock.setblocking(True) - - if self.parser is None: - # wrap the socket if needed - if self.cfg.is_ssl: - self.sock = sock.ssl_wrap_socket(self.sock, self.cfg) - - # initialize the parser - self.parser = http.RequestParser(self.cfg, self.sock, self.client) - - def set_timeout(self): - # set the timeout - self.timeout = time.time() + self.cfg.keepalive - - def close(self): - util.close(self.sock) - - -class ThreadWorker(base.Worker): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.worker_connections = self.cfg.worker_connections - self.max_keepalived = self.cfg.worker_connections - self.cfg.threads - # initialise the pool - self.tpool = None - self.poller = None - self._lock = None - self.futures = deque() - self._keep = deque() - self.nr_conns = 0 - - @classmethod - def check_config(cls, cfg, log): - max_keepalived = cfg.worker_connections - cfg.threads - - if max_keepalived <= 0 and cfg.keepalive: - log.warning("No keepalived connections can be handled. " + - "Check the number of worker connections and threads.") - - def init_process(self): - self.tpool = self.get_thread_pool() - self.poller = selectors.DefaultSelector() - self._lock = RLock() - super().init_process() - - def get_thread_pool(self): - """Override this method to customize how the thread pool is created""" - return futures.ThreadPoolExecutor(max_workers=self.cfg.threads) - - def handle_quit(self, sig, frame): - self.alive = False - # worker_int callback - self.cfg.worker_int(self) - self.tpool.shutdown(False) - time.sleep(0.1) - sys.exit(0) - - def _wrap_future(self, fs, conn): - fs.conn = conn - self.futures.append(fs) - fs.add_done_callback(self.finish_request) - - def enqueue_req(self, conn): - conn.init() - # submit the connection to a worker - fs = self.tpool.submit(self.handle, conn) - self._wrap_future(fs, conn) - - def accept(self, server, listener): - try: - sock, client = listener.accept() - # initialize the connection object - conn = TConn(self.cfg, sock, client, server) - - self.nr_conns += 1 - # wait until socket is readable - with self._lock: - self.poller.register(conn.sock, selectors.EVENT_READ, - partial(self.on_client_socket_readable, conn)) - except OSError as e: - if e.errno not in (errno.EAGAIN, errno.ECONNABORTED, - errno.EWOULDBLOCK): - raise - - def on_client_socket_readable(self, conn, client): - with self._lock: - # unregister the client from the poller - self.poller.unregister(client) - - if conn.initialized: - # remove the connection from keepalive - try: - self._keep.remove(conn) - except ValueError: - # race condition - return - - # submit the connection to a worker - self.enqueue_req(conn) - - def murder_keepalived(self): - now = time.time() - while True: - with self._lock: - try: - # remove the connection from the queue - conn = self._keep.popleft() - except IndexError: - break - - delta = conn.timeout - now - if delta > 0: - # add the connection back to the queue - with self._lock: - self._keep.appendleft(conn) - break - else: - self.nr_conns -= 1 - # remove the socket from the poller - with self._lock: - try: - self.poller.unregister(conn.sock) - except OSError as e: - if e.errno != errno.EBADF: - raise - except KeyError: - # already removed by the system, continue - pass - except ValueError: - # already removed by the system continue - pass - - # close the socket - conn.close() - - def is_parent_alive(self): - # If our parent changed then we shut down. - if self.ppid != os.getppid(): - self.log.info("Parent changed, shutting down: %s", self) - return False - return True - - def run(self): - # init listeners, add them to the event loop - for sock in self.sockets: - sock.setblocking(False) - # a race condition during graceful shutdown may make the listener - # name unavailable in the request handler so capture it once here - server = sock.getsockname() - acceptor = partial(self.accept, server) - self.poller.register(sock, selectors.EVENT_READ, acceptor) - - while self.alive: - # notify the arbiter we are alive - self.notify() - - # can we accept more connections? - if self.nr_conns < self.worker_connections: - # wait for an event - events = self.poller.select(1.0) - for key, _ in events: - callback = key.data - callback(key.fileobj) - - # check (but do not wait) for finished requests - result = futures.wait(self.futures, timeout=0, - return_when=futures.FIRST_COMPLETED) - else: - # wait for a request to finish - result = futures.wait(self.futures, timeout=1.0, - return_when=futures.FIRST_COMPLETED) - - # clean up finished requests - for fut in result.done: - self.futures.remove(fut) - - if not self.is_parent_alive(): - break - - # handle keepalive timeouts - self.murder_keepalived() - - self.tpool.shutdown(False) - self.poller.close() - - for s in self.sockets: - s.close() - - futures.wait(self.futures, timeout=self.cfg.graceful_timeout) - - def finish_request(self, fs): - if fs.cancelled(): - self.nr_conns -= 1 - fs.conn.close() - return - - try: - (keepalive, conn) = fs.result() - # if the connection should be kept alived add it - # to the eventloop and record it - if keepalive and self.alive: - # flag the socket as non blocked - conn.sock.setblocking(False) - - # register the connection - conn.set_timeout() - with self._lock: - self._keep.append(conn) - - # add the socket to the event loop - self.poller.register(conn.sock, selectors.EVENT_READ, - partial(self.on_client_socket_readable, conn)) - else: - self.nr_conns -= 1 - conn.close() - except Exception: - # an exception happened, make sure to close the - # socket. - self.nr_conns -= 1 - fs.conn.close() - - def handle(self, conn): - keepalive = False - req = None - try: - req = next(conn.parser) - if not req: - return (False, conn) - - # handle the request - keepalive = self.handle_request(req, conn) - if keepalive: - return (keepalive, conn) - except http.errors.NoMoreData as e: - self.log.debug("Ignored premature client disconnection. %s", e) - - except StopIteration as e: - self.log.debug("Closing connection. %s", e) - except ssl.SSLError as e: - if e.args[0] == ssl.SSL_ERROR_EOF: - self.log.debug("ssl connection closed") - conn.sock.close() - else: - self.log.debug("Error processing SSL request.") - self.handle_error(req, conn.sock, conn.client, e) - - except OSError as e: - if e.errno not in (errno.EPIPE, errno.ECONNRESET, errno.ENOTCONN): - self.log.exception("Socket error processing request.") - else: - if e.errno == errno.ECONNRESET: - self.log.debug("Ignoring connection reset") - elif e.errno == errno.ENOTCONN: - self.log.debug("Ignoring socket not connected") - else: - self.log.debug("Ignoring connection epipe") - except Exception as e: - self.handle_error(req, conn.sock, conn.client, e) - - return (False, conn) - - def handle_request(self, req, conn): - environ = {} - resp = None - try: - self.cfg.pre_request(self, req) - request_start = datetime.now() - resp, environ = wsgi.create(req, conn.sock, conn.client, - conn.server, self.cfg) - environ["wsgi.multithread"] = True - self.nr += 1 - if self.nr >= self.max_requests: - if self.alive: - self.log.info("Autorestarting worker after current request.") - self.alive = False - resp.force_close() - - if not self.alive or not self.cfg.keepalive: - resp.force_close() - elif len(self._keep) >= self.max_keepalived: - resp.force_close() - - respiter = self.wsgi(environ, resp.start_response) - try: - if isinstance(respiter, environ['wsgi.file_wrapper']): - resp.write_file(respiter) - else: - for item in respiter: - resp.write(item) - - resp.close() - finally: - request_time = datetime.now() - request_start - self.log.access(resp, req, environ, request_time) - if hasattr(respiter, "close"): - respiter.close() - - if resp.should_close(): - self.log.debug("Closing connection.") - return False - except OSError: - # pass to next try-except level - util.reraise(*sys.exc_info()) - except Exception: - if resp and resp.headers_sent: - # If the requests have already been sent, we should close the - # connection to indicate the error. - self.log.exception("Error handling request") - try: - conn.sock.shutdown(socket.SHUT_RDWR) - conn.sock.close() - except OSError: - pass - raise StopIteration() - raise - finally: - try: - self.cfg.post_request(self, req, environ, resp) - except Exception: - self.log.exception("Exception in post_request hook") - - return True diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/gtornado.py b/port/lib/python3.11/site-packages/gunicorn/workers/gtornado.py deleted file mode 100644 index 544af7d..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/gtornado.py +++ /dev/null @@ -1,166 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import os -import sys - -try: - import tornado -except ImportError: - raise RuntimeError("You need tornado installed to use this worker.") -import tornado.web -import tornado.httpserver -from tornado.ioloop import IOLoop, PeriodicCallback -from tornado.wsgi import WSGIContainer -from gunicorn.workers.base import Worker -from gunicorn import __version__ as gversion -from gunicorn.sock import ssl_context - - -# Tornado 5.0 updated its IOLoop, and the `io_loop` arguments to many -# Tornado functions have been removed in Tornado 5.0. Also, they no -# longer store PeriodCallbacks in ioloop._callbacks. Instead we store -# them on our side, and use stop() on them when stopping the worker. -# See https://www.tornadoweb.org/en/stable/releases/v5.0.0.html#backwards-compatibility-notes -# for more details. -TORNADO5 = tornado.version_info >= (5, 0, 0) - - -class TornadoWorker(Worker): - - @classmethod - def setup(cls): - web = sys.modules.pop("tornado.web") - old_clear = web.RequestHandler.clear - - def clear(self): - old_clear(self) - if "Gunicorn" not in self._headers["Server"]: - self._headers["Server"] += " (Gunicorn/%s)" % gversion - web.RequestHandler.clear = clear - sys.modules["tornado.web"] = web - - def handle_exit(self, sig, frame): - if self.alive: - super().handle_exit(sig, frame) - - def handle_request(self): - self.nr += 1 - if self.alive and self.nr >= self.max_requests: - self.log.info("Autorestarting worker after current request.") - self.alive = False - - def watchdog(self): - if self.alive: - self.notify() - - if self.ppid != os.getppid(): - self.log.info("Parent changed, shutting down: %s", self) - self.alive = False - - def heartbeat(self): - if not self.alive: - if self.server_alive: - if hasattr(self, 'server'): - try: - self.server.stop() - except Exception: - pass - self.server_alive = False - else: - if TORNADO5: - for callback in self.callbacks: - callback.stop() - self.ioloop.stop() - else: - if not self.ioloop._callbacks: - self.ioloop.stop() - - def init_process(self): - # IOLoop cannot survive a fork or be shared across processes - # in any way. When multiple processes are being used, each process - # should create its own IOLoop. We should clear current IOLoop - # if exists before os.fork. - IOLoop.clear_current() - super().init_process() - - def run(self): - self.ioloop = IOLoop.instance() - self.alive = True - self.server_alive = False - - if TORNADO5: - self.callbacks = [] - self.callbacks.append(PeriodicCallback(self.watchdog, 1000)) - self.callbacks.append(PeriodicCallback(self.heartbeat, 1000)) - for callback in self.callbacks: - callback.start() - else: - PeriodicCallback(self.watchdog, 1000, io_loop=self.ioloop).start() - PeriodicCallback(self.heartbeat, 1000, io_loop=self.ioloop).start() - - # Assume the app is a WSGI callable if its not an - # instance of tornado.web.Application or is an - # instance of tornado.wsgi.WSGIApplication - app = self.wsgi - - if tornado.version_info[0] < 6: - if not isinstance(app, tornado.web.Application) or \ - isinstance(app, tornado.wsgi.WSGIApplication): - app = WSGIContainer(app) - elif not isinstance(app, WSGIContainer) and \ - not isinstance(app, tornado.web.Application): - app = WSGIContainer(app) - - # Monkey-patching HTTPConnection.finish to count the - # number of requests being handled by Tornado. This - # will help gunicorn shutdown the worker if max_requests - # is exceeded. - httpserver = sys.modules["tornado.httpserver"] - if hasattr(httpserver, 'HTTPConnection'): - old_connection_finish = httpserver.HTTPConnection.finish - - def finish(other): - self.handle_request() - old_connection_finish(other) - httpserver.HTTPConnection.finish = finish - sys.modules["tornado.httpserver"] = httpserver - - server_class = tornado.httpserver.HTTPServer - else: - - class _HTTPServer(tornado.httpserver.HTTPServer): - - def on_close(instance, server_conn): - self.handle_request() - super().on_close(server_conn) - - server_class = _HTTPServer - - if self.cfg.is_ssl: - if TORNADO5: - server = server_class(app, ssl_options=ssl_context(self.cfg)) - else: - server = server_class(app, io_loop=self.ioloop, - ssl_options=ssl_context(self.cfg)) - else: - if TORNADO5: - server = server_class(app) - else: - server = server_class(app, io_loop=self.ioloop) - - self.server = server - self.server_alive = True - - for s in self.sockets: - s.setblocking(0) - if hasattr(server, "add_socket"): # tornado > 2.0 - server.add_socket(s) - elif hasattr(server, "_sockets"): # tornado 2.0 - server._sockets[s.fileno()] = s - - server.no_keep_alive = self.cfg.keepalive <= 0 - server.start(num_processes=1) - - self.ioloop.start() diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/sync.py b/port/lib/python3.11/site-packages/gunicorn/workers/sync.py deleted file mode 100644 index 4c029f9..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/sync.py +++ /dev/null @@ -1,209 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. -# - -from datetime import datetime -import errno -import os -import select -import socket -import ssl -import sys - -from gunicorn import http -from gunicorn.http import wsgi -from gunicorn import sock -from gunicorn import util -from gunicorn.workers import base - - -class StopWaiting(Exception): - """ exception raised to stop waiting for a connection """ - - -class SyncWorker(base.Worker): - - def accept(self, listener): - client, addr = listener.accept() - client.setblocking(1) - util.close_on_exec(client) - self.handle(listener, client, addr) - - def wait(self, timeout): - try: - self.notify() - ret = select.select(self.wait_fds, [], [], timeout) - if ret[0]: - if self.PIPE[0] in ret[0]: - os.read(self.PIPE[0], 1) - return ret[0] - - except OSError as e: - if e.args[0] == errno.EINTR: - return self.sockets - if e.args[0] == errno.EBADF: - if self.nr < 0: - return self.sockets - else: - raise StopWaiting - raise - - def is_parent_alive(self): - # If our parent changed then we shut down. - if self.ppid != os.getppid(): - self.log.info("Parent changed, shutting down: %s", self) - return False - return True - - def run_for_one(self, timeout): - listener = self.sockets[0] - while self.alive: - self.notify() - - # Accept a connection. If we get an error telling us - # that no connection is waiting we fall down to the - # select which is where we'll wait for a bit for new - # workers to come give us some love. - try: - self.accept(listener) - # Keep processing clients until no one is waiting. This - # prevents the need to select() for every client that we - # process. - continue - - except OSError as e: - if e.errno not in (errno.EAGAIN, errno.ECONNABORTED, - errno.EWOULDBLOCK): - raise - - if not self.is_parent_alive(): - return - - try: - self.wait(timeout) - except StopWaiting: - return - - def run_for_multiple(self, timeout): - while self.alive: - self.notify() - - try: - ready = self.wait(timeout) - except StopWaiting: - return - - if ready is not None: - for listener in ready: - if listener == self.PIPE[0]: - continue - - try: - self.accept(listener) - except OSError as e: - if e.errno not in (errno.EAGAIN, errno.ECONNABORTED, - errno.EWOULDBLOCK): - raise - - if not self.is_parent_alive(): - return - - def run(self): - # if no timeout is given the worker will never wait and will - # use the CPU for nothing. This minimal timeout prevent it. - timeout = self.timeout or 0.5 - - # self.socket appears to lose its blocking status after - # we fork in the arbiter. Reset it here. - for s in self.sockets: - s.setblocking(0) - - if len(self.sockets) > 1: - self.run_for_multiple(timeout) - else: - self.run_for_one(timeout) - - def handle(self, listener, client, addr): - req = None - try: - if self.cfg.is_ssl: - client = sock.ssl_wrap_socket(client, self.cfg) - parser = http.RequestParser(self.cfg, client, addr) - req = next(parser) - self.handle_request(listener, req, client, addr) - except http.errors.NoMoreData as e: - self.log.debug("Ignored premature client disconnection. %s", e) - except StopIteration as e: - self.log.debug("Closing connection. %s", e) - except ssl.SSLError as e: - if e.args[0] == ssl.SSL_ERROR_EOF: - self.log.debug("ssl connection closed") - client.close() - else: - self.log.debug("Error processing SSL request.") - self.handle_error(req, client, addr, e) - except OSError as e: - if e.errno not in (errno.EPIPE, errno.ECONNRESET, errno.ENOTCONN): - self.log.exception("Socket error processing request.") - else: - if e.errno == errno.ECONNRESET: - self.log.debug("Ignoring connection reset") - elif e.errno == errno.ENOTCONN: - self.log.debug("Ignoring socket not connected") - else: - self.log.debug("Ignoring EPIPE") - except BaseException as e: - self.handle_error(req, client, addr, e) - finally: - util.close(client) - - def handle_request(self, listener, req, client, addr): - environ = {} - resp = None - try: - self.cfg.pre_request(self, req) - request_start = datetime.now() - resp, environ = wsgi.create(req, client, addr, - listener.getsockname(), self.cfg) - # Force the connection closed until someone shows - # a buffering proxy that supports Keep-Alive to - # the backend. - resp.force_close() - self.nr += 1 - if self.nr >= self.max_requests: - self.log.info("Autorestarting worker after current request.") - self.alive = False - respiter = self.wsgi(environ, resp.start_response) - try: - if isinstance(respiter, environ['wsgi.file_wrapper']): - resp.write_file(respiter) - else: - for item in respiter: - resp.write(item) - resp.close() - finally: - request_time = datetime.now() - request_start - self.log.access(resp, req, environ, request_time) - if hasattr(respiter, "close"): - respiter.close() - except OSError: - # pass to next try-except level - util.reraise(*sys.exc_info()) - except Exception: - if resp and resp.headers_sent: - # If the requests have already been sent, we should close the - # connection to indicate the error. - self.log.exception("Error handling request") - try: - client.shutdown(socket.SHUT_RDWR) - client.close() - except OSError: - pass - raise StopIteration() - raise - finally: - try: - self.cfg.post_request(self, req, environ, resp) - except Exception: - self.log.exception("Exception in post_request hook") diff --git a/port/lib/python3.11/site-packages/gunicorn/workers/workertmp.py b/port/lib/python3.11/site-packages/gunicorn/workers/workertmp.py deleted file mode 100644 index 8ef00a5..0000000 --- a/port/lib/python3.11/site-packages/gunicorn/workers/workertmp.py +++ /dev/null @@ -1,53 +0,0 @@ -# -# This file is part of gunicorn released under the MIT license. -# See the NOTICE for more information. - -import os -import time -import platform -import tempfile - -from gunicorn import util - -PLATFORM = platform.system() -IS_CYGWIN = PLATFORM.startswith('CYGWIN') - - -class WorkerTmp: - - def __init__(self, cfg): - old_umask = os.umask(cfg.umask) - fdir = cfg.worker_tmp_dir - if fdir and not os.path.isdir(fdir): - raise RuntimeError("%s doesn't exist. Can't create workertmp." % fdir) - fd, name = tempfile.mkstemp(prefix="wgunicorn-", dir=fdir) - os.umask(old_umask) - - # change the owner and group of the file if the worker will run as - # a different user or group, so that the worker can modify the file - if cfg.uid != os.geteuid() or cfg.gid != os.getegid(): - util.chown(name, cfg.uid, cfg.gid) - - # unlink the file so we don't leak temporary files - try: - if not IS_CYGWIN: - util.unlink(name) - # In Python 3.8, open() emits RuntimeWarning if buffering=1 for binary mode. - # Because we never write to this file, pass 0 to switch buffering off. - self._tmp = os.fdopen(fd, 'w+b', 0) - except Exception: - os.close(fd) - raise - - def notify(self): - new_time = time.monotonic() - os.utime(self._tmp.fileno(), (new_time, new_time)) - - def last_update(self): - return os.fstat(self._tmp.fileno()).st_mtime - - def fileno(self): - return self._tmp.fileno() - - def close(self): - return self._tmp.close() diff --git a/port/lib/python3.11/site-packages/idna-3.11.dist-info/INSTALLER b/port/lib/python3.11/site-packages/idna-3.11.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/idna-3.11.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/idna-3.11.dist-info/METADATA b/port/lib/python3.11/site-packages/idna-3.11.dist-info/METADATA deleted file mode 100644 index 7a4a4b7..0000000 --- a/port/lib/python3.11/site-packages/idna-3.11.dist-info/METADATA +++ /dev/null @@ -1,209 +0,0 @@ -Metadata-Version: 2.4 -Name: idna -Version: 3.11 -Summary: Internationalized Domain Names in Applications (IDNA) -Author-email: Kim Davies -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -License-Expression: BSD-3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -License-File: LICENSE.md -Requires-Dist: ruff >= 0.6.2 ; extra == "all" -Requires-Dist: mypy >= 1.11.2 ; extra == "all" -Requires-Dist: pytest >= 8.3.2 ; extra == "all" -Requires-Dist: flake8 >= 7.1.1 ; extra == "all" -Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst -Project-URL: Issue tracker, https://github.com/kjd/idna/issues -Project-URL: Source, https://github.com/kjd/idna -Provides-Extra: all - -Internationalized Domain Names in Applications (IDNA) -===================================================== - -Support for `Internationalized Domain Names in -Applications (IDNA) `_ -and `Unicode IDNA Compatibility Processing -`_. - -The latest versions of these standards supplied here provide -more comprehensive language coverage and reduce the potential of -allowing domains with known security vulnerabilities. This library -is a suitable replacement for the “encodings.idna” -module that comes with the Python standard library, but which -only supports an older superseded IDNA specification from 2003. - -Basic functions are simply executed: - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - - -Installation ------------- - -This package is available for installation from PyPI via the -typical mechanisms, such as: - -.. code-block:: bash - - $ python3 -m pip install idna - - -Usage ------ - -For typical usage, the ``encode`` and ``decode`` functions will take a -domain name argument and perform a conversion to ASCII compatible encoding -(known as A-labels), or to Unicode strings (known as U-labels) -respectively. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('ドメイン.テスト') - b'xn--eckwd4c7c.xn--zckzah' - >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) - ドメイン.テスト - -Conversions can be applied at a per-label basis using the ``ulabel`` or -``alabel`` functions if necessary: - -.. code-block:: pycon - - >>> idna.alabel('测试') - b'xn--0zwm56d' - - -Compatibility Mapping (UTS #46) -+++++++++++++++++++++++++++++++ - -This library provides support for `Unicode IDNA Compatibility -Processing `_ which normalizes input from -different potential ways a user may input a domain prior to performing the IDNA -conversion operations. This functionality, known as a -`mapping `_, is considered by the -specification to be a local user-interface issue distinct from IDNA -conversion functionality. - -For example, “Königsgäßchen” is not a permissible label as *LATIN -CAPITAL LETTER K* is not allowed (nor are capital letters in general). -UTS 46 will convert this into lower case prior to applying the IDNA -conversion. - -.. code-block:: pycon - - >>> import idna - >>> idna.encode('Königsgäßchen') - ... - idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed - >>> idna.encode('Königsgäßchen', uts46=True) - b'xn--knigsgchen-b4a3dun' - >>> print(idna.decode('xn--knigsgchen-b4a3dun')) - königsgäßchen - - -Exceptions ----------- - -All errors raised during the conversion following the specification -should raise an exception derived from the ``idna.IDNAError`` base -class. - -More specific exceptions that may be generated as ``idna.IDNABidiError`` -when the error reflects an illegal combination of left-to-right and -right-to-left characters in a label; ``idna.InvalidCodepoint`` when -a specific codepoint is an illegal character in an IDN label (i.e. -INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is -illegal based on its position in the string (i.e. it is CONTEXTO or CONTEXTJ -but the contextual requirements are not satisfied.) - -Building and Diagnostics ------------------------- - -The IDNA and UTS 46 functionality relies upon pre-calculated lookup -tables for performance. These tables are derived from computing against -eligibility criteria in the respective standards using the command-line -script ``tools/idna-data``. - -This tool will fetch relevant codepoint data from the Unicode repository -and perform the required calculations to identify eligibility. There are -three main modes: - -* ``idna-data make-libdata``. Generates ``idnadata.py`` and - ``uts46data.py``, the pre-calculated lookup tables used for IDNA and - UTS 46 conversions. Implementers who wish to track this library against - a different Unicode version may use this tool to manually generate a - different version of the ``idnadata.py`` and ``uts46data.py`` files. - -* ``idna-data make-table``. Generate a table of the IDNA disposition - (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix - B.1 of RFC 5892 and the pre-computed tables published by `IANA - `_. - -* ``idna-data U+0061``. Prints debugging output on the various - properties associated with an individual Unicode codepoint (in this - case, U+0061), that are used to assess the IDNA and UTS 46 status of a - codepoint. This is helpful in debugging or analysis. - -The tool accepts a number of arguments, described using ``idna-data --h``. Most notably, the ``--version`` argument allows the specification -of the version of Unicode to be used in computing the table data. For -example, ``idna-data --version 9.0.0 make-libdata`` will generate -library data against Unicode 9.0.0. - - -Additional Notes ----------------- - -* **Packages**. The latest tagged release version is published in the - `Python Package Index `_. - -* **Version support**. This library supports Python 3.8 and higher. - As this library serves as a low-level toolkit for a variety of - applications, many of which strive for broad compatibility with older - Python versions, there is no rush to remove older interpreter support. - Support for older versions are likely to be removed from new releases - as automated tests can no longer easily be run, i.e. once the Python - version is officially end-of-life. - -* **Testing**. The library has a test suite based on each rule of the - IDNA specification, as well as tests that are provided as part of the - Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing - `_. - -* **Emoji**. It is an occasional request to support emoji domains in - this library. Encoding of symbols like emoji is expressly prohibited by - the technical standard IDNA 2008 and emoji domains are broadly phased - out across the domain industry due to associated security risks. For - now, applications that need to support these non-compliant labels - may wish to consider trying the encode/decode operation in this library - first, and then falling back to using `encodings.idna`. See `the Github - project `_ for more discussion. - -* **Transitional processing**. Unicode 16.0.0 removed transitional - processing so the `transitional` argument for the encode() method - no longer has any effect and will be removed at a later date. - diff --git a/port/lib/python3.11/site-packages/idna-3.11.dist-info/RECORD b/port/lib/python3.11/site-packages/idna-3.11.dist-info/RECORD deleted file mode 100644 index cc60f7a..0000000 --- a/port/lib/python3.11/site-packages/idna-3.11.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -idna-3.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-3.11.dist-info/METADATA,sha256=fCwSww9SuiN8TIHllFSASUQCW55hAs8dzKnr9RaEEbA,8378 -idna-3.11.dist-info/RECORD,, -idna-3.11.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -idna-3.11.dist-info/licenses/LICENSE.md,sha256=t6M2q_OwThgOwGXN0W5wXQeeHMehT5EKpukYfza5zYc,1541 -idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 -idna/__pycache__/__init__.cpython-311.pyc,, -idna/__pycache__/codec.cpython-311.pyc,, -idna/__pycache__/compat.cpython-311.pyc,, -idna/__pycache__/core.cpython-311.pyc,, -idna/__pycache__/idnadata.cpython-311.pyc,, -idna/__pycache__/intranges.cpython-311.pyc,, -idna/__pycache__/package_data.cpython-311.pyc,, -idna/__pycache__/uts46data.cpython-311.pyc,, -idna/codec.py,sha256=M2SGWN7cs_6B32QmKTyTN6xQGZeYQgQ2wiX3_DR6loE,3438 -idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 -idna/core.py,sha256=P26_XVycuMTZ1R2mNK1ZREVzM5mvTzdabBXfyZVU1Lc,13246 -idna/idnadata.py,sha256=SG8jhaGE53iiD6B49pt2pwTv_UvClciWE-N54oR2p4U,79623 -idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 -idna/package_data.py,sha256=_CUavOxobnbyNG2FLyHoN8QHP3QM9W1tKuw7eq9QwBk,21 -idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna/uts46data.py,sha256=H9J35VkD0F9L9mKOqjeNGd2A-Va6FlPoz6Jz4K7h-ps,243725 diff --git a/port/lib/python3.11/site-packages/idna-3.11.dist-info/WHEEL b/port/lib/python3.11/site-packages/idna-3.11.dist-info/WHEEL deleted file mode 100644 index d8b9936..0000000 --- a/port/lib/python3.11/site-packages/idna-3.11.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/port/lib/python3.11/site-packages/idna-3.11.dist-info/licenses/LICENSE.md b/port/lib/python3.11/site-packages/idna-3.11.dist-info/licenses/LICENSE.md deleted file mode 100644 index 256ba90..0000000 --- a/port/lib/python3.11/site-packages/idna-3.11.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,31 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2025, Kim Davies and contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/idna/__init__.py b/port/lib/python3.11/site-packages/idna/__init__.py deleted file mode 100644 index cfdc030..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4e26104a2bce6c45843cc95741a13ba4e1c50ffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1085 zcmdUtzi-n(6vyup$NAwnzmqZ`Hl%u>Rs~{0NKiU-sgT%iIbG~)a`b*!XD1;We*zmj z3u5LU>4+-aUT~!w#_P>xVi^>i~Rr&h4u0jq9~F zK7tgakOKh`6g5;6byOD~@f+nS1=Tk95GYA$S^*%v#kT%|c$o~Ot@@QnjvsdRYUb2*(YOS)ylq~4G!uW)fIpwC4ENOCy=T^@2D|@-kmQ-SOX=YV` zNmekzaiYYWNvcgy#Vdt&<;aV~_$f_nYU5K`-B;Bs!K%ogJjI#{l9^svq7^F(d3(oK zW>h^dzr>u%MX@yFDwY?T$;CbxK{K>1Y9bdjFXaf6HW*;MraEUzVjNBM%pRJy^90&+ zXgK%|O^234+rbTA2M%3_(4prrb?7?`9EJ`fhq1%N;yk)%yhLgGPkH{D!nA+2S{7uw z8A&e5g5s1Eq-@eOF(#a2`~_UwqQK2*ye2x{Y&P+0rHc#2nTj)O#hlIKY+Edqe0+3# z9OtZ{kM?qT%u-2WjNQyJKFYQ?t!F}|D^8#52UgYngL%txSBDVpYGYX2f&U+e07h5f b@b~=Hxrn~fgdm=vp%EcL_ diff --git a/port/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc b/port/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc deleted file mode 100644 index df8f4c01064576774949de1b5e4fc969c7049eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5767 zcmdT|OKcm*8J;C~mrIE|7W>; zT7qN1hYolDoyRxNf99M2=U+QI+6aVyWbJXagOKkrVFj@g*-|+|ZWEcvT!MtmFBjq< zZA;ja_K-cvhxnur5;!8;Wj-M$9U(_j3Q0+4$eC;lwI$m_?HsWYg`0C(jmyFsw0aL- zGlV*9V|b7b9=08 zrMqz*U=6v8WX$&j0kdOv!~V9qXh^?I>+zHtNf^TW^XY{01lMg$Fr4Ruvu~fHG(`c6^wyu)&@wie`YFZh z&XhW53a*(Aw{Meh&Oq7MlRfs>?a#`eW^QJ_zL@X&>ccx97Tm)HX_)$<$^TbXQY3@B zHlsmT6i+q9vqHO3;32kjLjzWswYcUvM6!6b#qBBk_GG7aTHM(&j_o@*R#G^uMv_W6 zY_x^L$&@^wz_=?M{`Gt$Q7N&*nWMPP4dLpdu4o2uzPaz%obD2)F>@kt7Z8d9x25)b z5G&Q+rp+OYY!VQ;qwKS8XP%)N5gVT*TPgW1TCG2>u~j^ z(~2rn3EM(uF!;GtTpeqpxbn4qL`SepWcRUVxO5tcU=Dw(6CA6OM|WZc%l)~53OjsVVilfx4>Mm6=lx%e-x)8uMoX^If@`$Q zZlI1p+0&KdK6hsMvdi=3J2~O=3%4#5UHevptHDi??CHC`_{Cy=cd>i4)IGX>s@VM| zj8t-cY0pj z&^(Pco6I+sFLOE`)=J3NwQA+HT6(~#LX}g+22OP_P8I7o72=Fjp@ea&)WE5A@EKkJDPW%BhaLW#-p9h1d?9THorTFGGpK2=H85yp_g5LzguD&SYE!SmpuJ^ZAp7QHcTeuXU+hKqfs*?Gn$g3Le7m!H z?t`N5V99rIHTd{N6x&m!*pWJl9Vzz@wNmUzBgKxC_Yc1wirw(1Pm7VR2S{by{$0m729v1S5P?%Tj=c7o0?!k+6>o4ohp&!2Nawy zI(ygNe1kMi;Vo!`qLAU;!n0qSLYbFVg61F)@#6>ao)VE^5EQp+^V$V555;wioJGMd zF3d7`^c75cw`L331c?I`wDnIAVCcf16cs1jCKGU;>#%dxc&5RrUW1zV;5EY>w#Gue z?7ZSu#5tX2$r(6ktv#o*oc&}vBT)-lr;{~Q;D+M{Q*x-bT%*oaaC-bh)tKiwAty}AdnFMU# zGR-qBfDea*(Qw%YOry@NDG?gI9*)hcQT*G7qH~@=kh#;#j`r21hmM|tqX*2ORsB)B zx76NS?(jZxcYV5WbK&OiYLVXYNAUOu;n{RcF7YV=@eBo6Yl6sBKh{I1p>@LsCatJ1 zrokqqs2_?7Fg->-nxcxy+04piPB3bPv9sZbrjqG+LNTcuCv61IGQ(7nTP;$y3@-#! z2)Aj8Oj^LXvz0I;s$7d}aLSst_H*f!>H40bmjR3`s@(y(Y3DeuOgdKBuS}dP>{liu zh3%gWaReYw4VbiY8AQN zrJfT{vEW&)G{_Aix>Z!rQ1Gl)`U{x26RwyRk)6s7mjdHYvFKT?TxvzK+S|d~IWY%b nJbdz_>&HrOoGcBUV##LFM>x-lc*C7_7s)`03>2(~ZNUElIibH7 diff --git a/port/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc b/port/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc deleted file mode 100644 index 687fd1a270dc5b9f4dc6d66c7a453547527f47c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1007 zcmbVKy=xRf6rb6z`%2V!C7gDOEh92pCi(`qn8^!WgITYPRuO%T7kH_w zEzU9$#4W@Nh?iNBQ)aRf`epPhth7y>%CU-dv`nwZgUsBG0}&r%VQR}_ydxOTEFS0D z4E;6_GYh!vLEKSMv!SD**2G4!Pvj}=IeCZPhu=HfdI@A^B(F0?u|1NW;egZxk-39;v diff --git a/port/lib/python3.11/site-packages/idna/__pycache__/core.cpython-311.pyc b/port/lib/python3.11/site-packages/idna/__pycache__/core.cpython-311.pyc deleted file mode 100644 index 46476664e95afdd1df9c8d2efff22bf7a9f9a864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19286 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 diff --git a/port/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc b/port/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc deleted file mode 100644 index eaaf420106ba1b0c6df70dac7a84861cd42ce248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2965 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 Tuple[bytes, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return b"", 0 - - return encode(data), len(data) - - def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return "", 0 - - return decode(data), len(data) - - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return b"", 0 - - labels = _unicode_dots_re.split(data) - trailing_dot = b"" - if labels: - if not labels[-1]: - trailing_dot = b"." - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = b"." - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result_bytes = b".".join(result) + trailing_dot - size += len(trailing_dot) - return result_bytes, size - - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: - if errors != "strict": - raise IDNAError('Unsupported error handling "{}"'.format(errors)) - - if not data: - return ("", 0) - - if not isinstance(data, str): - data = str(data, "ascii") - - labels = _unicode_dots_re.split(data) - trailing_dot = "" - if labels: - if not labels[-1]: - trailing_dot = "." - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = "." - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result_str = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result_str, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -def search_function(name: str) -> Optional[codecs.CodecInfo]: - if name != "idna2008": - return None - return codecs.CodecInfo( - name=name, - encode=Codec().encode, - decode=Codec().decode, # type: ignore - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) - - -codecs.register(search_function) diff --git a/port/lib/python3.11/site-packages/idna/compat.py b/port/lib/python3.11/site-packages/idna/compat.py deleted file mode 100644 index 1df9f2a..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/idna/core.py b/port/lib/python3.11/site-packages/idna/core.py deleted file mode 100644 index 8177bf7..0000000 --- a/port/lib/python3.11/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 = 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/port/lib/python3.11/site-packages/idna/idnadata.py b/port/lib/python3.11/site-packages/idna/idnadata.py deleted file mode 100644 index ded47ca..0000000 --- a/port/lib/python3.11/site-packages/idna/idnadata.py +++ /dev/null @@ -1,4309 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "16.0.0" - -scripts = { - "Greek": ( - 0x37000000374, - 0x37500000378, - 0x37A0000037E, - 0x37F00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038B, - 0x38C0000038D, - 0x38E000003A2, - 0x3A3000003E2, - 0x3F000000400, - 0x1D2600001D2B, - 0x1D5D00001D62, - 0x1D6600001D6B, - 0x1DBF00001DC0, - 0x1F0000001F16, - 0x1F1800001F1E, - 0x1F2000001F46, - 0x1F4800001F4E, - 0x1F5000001F58, - 0x1F5900001F5A, - 0x1F5B00001F5C, - 0x1F5D00001F5E, - 0x1F5F00001F7E, - 0x1F8000001FB5, - 0x1FB600001FC5, - 0x1FC600001FD4, - 0x1FD600001FDC, - 0x1FDD00001FF0, - 0x1FF200001FF5, - 0x1FF600001FFF, - 0x212600002127, - 0xAB650000AB66, - 0x101400001018F, - 0x101A0000101A1, - 0x1D2000001D246, - ), - "Han": ( - 0x2E8000002E9A, - 0x2E9B00002EF4, - 0x2F0000002FD6, - 0x300500003006, - 0x300700003008, - 0x30210000302A, - 0x30380000303C, - 0x340000004DC0, - 0x4E000000A000, - 0xF9000000FA6E, - 0xFA700000FADA, - 0x16FE200016FE4, - 0x16FF000016FF2, - 0x200000002A6E0, - 0x2A7000002B73A, - 0x2B7400002B81E, - 0x2B8200002CEA2, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x2F8000002FA1E, - 0x300000003134B, - 0x31350000323B0, - ), - "Hebrew": ( - 0x591000005C8, - 0x5D0000005EB, - 0x5EF000005F5, - 0xFB1D0000FB37, - 0xFB380000FB3D, - 0xFB3E0000FB3F, - 0xFB400000FB42, - 0xFB430000FB45, - 0xFB460000FB50, - ), - "Hiragana": ( - 0x304100003097, - 0x309D000030A0, - 0x1B0010001B120, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1F2000001F201, - ), - "Katakana": ( - 0x30A1000030FB, - 0x30FD00003100, - 0x31F000003200, - 0x32D0000032FF, - 0x330000003358, - 0xFF660000FF70, - 0xFF710000FF9E, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B001, - 0x1B1200001B123, - 0x1B1550001B156, - 0x1B1640001B168, - ), -} -joining_types = { - 0xAD: 84, - 0x300: 84, - 0x301: 84, - 0x302: 84, - 0x303: 84, - 0x304: 84, - 0x305: 84, - 0x306: 84, - 0x307: 84, - 0x308: 84, - 0x309: 84, - 0x30A: 84, - 0x30B: 84, - 0x30C: 84, - 0x30D: 84, - 0x30E: 84, - 0x30F: 84, - 0x310: 84, - 0x311: 84, - 0x312: 84, - 0x313: 84, - 0x314: 84, - 0x315: 84, - 0x316: 84, - 0x317: 84, - 0x318: 84, - 0x319: 84, - 0x31A: 84, - 0x31B: 84, - 0x31C: 84, - 0x31D: 84, - 0x31E: 84, - 0x31F: 84, - 0x320: 84, - 0x321: 84, - 0x322: 84, - 0x323: 84, - 0x324: 84, - 0x325: 84, - 0x326: 84, - 0x327: 84, - 0x328: 84, - 0x329: 84, - 0x32A: 84, - 0x32B: 84, - 0x32C: 84, - 0x32D: 84, - 0x32E: 84, - 0x32F: 84, - 0x330: 84, - 0x331: 84, - 0x332: 84, - 0x333: 84, - 0x334: 84, - 0x335: 84, - 0x336: 84, - 0x337: 84, - 0x338: 84, - 0x339: 84, - 0x33A: 84, - 0x33B: 84, - 0x33C: 84, - 0x33D: 84, - 0x33E: 84, - 0x33F: 84, - 0x340: 84, - 0x341: 84, - 0x342: 84, - 0x343: 84, - 0x344: 84, - 0x345: 84, - 0x346: 84, - 0x347: 84, - 0x348: 84, - 0x349: 84, - 0x34A: 84, - 0x34B: 84, - 0x34C: 84, - 0x34D: 84, - 0x34E: 84, - 0x34F: 84, - 0x350: 84, - 0x351: 84, - 0x352: 84, - 0x353: 84, - 0x354: 84, - 0x355: 84, - 0x356: 84, - 0x357: 84, - 0x358: 84, - 0x359: 84, - 0x35A: 84, - 0x35B: 84, - 0x35C: 84, - 0x35D: 84, - 0x35E: 84, - 0x35F: 84, - 0x360: 84, - 0x361: 84, - 0x362: 84, - 0x363: 84, - 0x364: 84, - 0x365: 84, - 0x366: 84, - 0x367: 84, - 0x368: 84, - 0x369: 84, - 0x36A: 84, - 0x36B: 84, - 0x36C: 84, - 0x36D: 84, - 0x36E: 84, - 0x36F: 84, - 0x483: 84, - 0x484: 84, - 0x485: 84, - 0x486: 84, - 0x487: 84, - 0x488: 84, - 0x489: 84, - 0x591: 84, - 0x592: 84, - 0x593: 84, - 0x594: 84, - 0x595: 84, - 0x596: 84, - 0x597: 84, - 0x598: 84, - 0x599: 84, - 0x59A: 84, - 0x59B: 84, - 0x59C: 84, - 0x59D: 84, - 0x59E: 84, - 0x59F: 84, - 0x5A0: 84, - 0x5A1: 84, - 0x5A2: 84, - 0x5A3: 84, - 0x5A4: 84, - 0x5A5: 84, - 0x5A6: 84, - 0x5A7: 84, - 0x5A8: 84, - 0x5A9: 84, - 0x5AA: 84, - 0x5AB: 84, - 0x5AC: 84, - 0x5AD: 84, - 0x5AE: 84, - 0x5AF: 84, - 0x5B0: 84, - 0x5B1: 84, - 0x5B2: 84, - 0x5B3: 84, - 0x5B4: 84, - 0x5B5: 84, - 0x5B6: 84, - 0x5B7: 84, - 0x5B8: 84, - 0x5B9: 84, - 0x5BA: 84, - 0x5BB: 84, - 0x5BC: 84, - 0x5BD: 84, - 0x5BF: 84, - 0x5C1: 84, - 0x5C2: 84, - 0x5C4: 84, - 0x5C5: 84, - 0x5C7: 84, - 0x610: 84, - 0x611: 84, - 0x612: 84, - 0x613: 84, - 0x614: 84, - 0x615: 84, - 0x616: 84, - 0x617: 84, - 0x618: 84, - 0x619: 84, - 0x61A: 84, - 0x61C: 84, - 0x620: 68, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62A: 68, - 0x62B: 68, - 0x62C: 68, - 0x62D: 68, - 0x62E: 68, - 0x62F: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63A: 68, - 0x63B: 68, - 0x63C: 68, - 0x63D: 68, - 0x63E: 68, - 0x63F: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64A: 68, - 0x64B: 84, - 0x64C: 84, - 0x64D: 84, - 0x64E: 84, - 0x64F: 84, - 0x650: 84, - 0x651: 84, - 0x652: 84, - 0x653: 84, - 0x654: 84, - 0x655: 84, - 0x656: 84, - 0x657: 84, - 0x658: 84, - 0x659: 84, - 0x65A: 84, - 0x65B: 84, - 0x65C: 84, - 0x65D: 84, - 0x65E: 84, - 0x65F: 84, - 0x66E: 68, - 0x66F: 68, - 0x670: 84, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67A: 68, - 0x67B: 68, - 0x67C: 68, - 0x67D: 68, - 0x67E: 68, - 0x67F: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68A: 82, - 0x68B: 82, - 0x68C: 82, - 0x68D: 82, - 0x68E: 82, - 0x68F: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69A: 68, - 0x69B: 68, - 0x69C: 68, - 0x69D: 68, - 0x69E: 68, - 0x69F: 68, - 0x6A0: 68, - 0x6A1: 68, - 0x6A2: 68, - 0x6A3: 68, - 0x6A4: 68, - 0x6A5: 68, - 0x6A6: 68, - 0x6A7: 68, - 0x6A8: 68, - 0x6A9: 68, - 0x6AA: 68, - 0x6AB: 68, - 0x6AC: 68, - 0x6AD: 68, - 0x6AE: 68, - 0x6AF: 68, - 0x6B0: 68, - 0x6B1: 68, - 0x6B2: 68, - 0x6B3: 68, - 0x6B4: 68, - 0x6B5: 68, - 0x6B6: 68, - 0x6B7: 68, - 0x6B8: 68, - 0x6B9: 68, - 0x6BA: 68, - 0x6BB: 68, - 0x6BC: 68, - 0x6BD: 68, - 0x6BE: 68, - 0x6BF: 68, - 0x6C0: 82, - 0x6C1: 68, - 0x6C2: 68, - 0x6C3: 82, - 0x6C4: 82, - 0x6C5: 82, - 0x6C6: 82, - 0x6C7: 82, - 0x6C8: 82, - 0x6C9: 82, - 0x6CA: 82, - 0x6CB: 82, - 0x6CC: 68, - 0x6CD: 82, - 0x6CE: 68, - 0x6CF: 82, - 0x6D0: 68, - 0x6D1: 68, - 0x6D2: 82, - 0x6D3: 82, - 0x6D5: 82, - 0x6D6: 84, - 0x6D7: 84, - 0x6D8: 84, - 0x6D9: 84, - 0x6DA: 84, - 0x6DB: 84, - 0x6DC: 84, - 0x6DF: 84, - 0x6E0: 84, - 0x6E1: 84, - 0x6E2: 84, - 0x6E3: 84, - 0x6E4: 84, - 0x6E7: 84, - 0x6E8: 84, - 0x6EA: 84, - 0x6EB: 84, - 0x6EC: 84, - 0x6ED: 84, - 0x6EE: 82, - 0x6EF: 82, - 0x6FA: 68, - 0x6FB: 68, - 0x6FC: 68, - 0x6FF: 68, - 0x70F: 84, - 0x710: 82, - 0x711: 84, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71A: 68, - 0x71B: 68, - 0x71C: 68, - 0x71D: 68, - 0x71E: 82, - 0x71F: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72A: 82, - 0x72B: 68, - 0x72C: 82, - 0x72D: 68, - 0x72E: 68, - 0x72F: 82, - 0x730: 84, - 0x731: 84, - 0x732: 84, - 0x733: 84, - 0x734: 84, - 0x735: 84, - 0x736: 84, - 0x737: 84, - 0x738: 84, - 0x739: 84, - 0x73A: 84, - 0x73B: 84, - 0x73C: 84, - 0x73D: 84, - 0x73E: 84, - 0x73F: 84, - 0x740: 84, - 0x741: 84, - 0x742: 84, - 0x743: 84, - 0x744: 84, - 0x745: 84, - 0x746: 84, - 0x747: 84, - 0x748: 84, - 0x749: 84, - 0x74A: 84, - 0x74D: 82, - 0x74E: 68, - 0x74F: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75A: 82, - 0x75B: 82, - 0x75C: 68, - 0x75D: 68, - 0x75E: 68, - 0x75F: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76A: 68, - 0x76B: 82, - 0x76C: 82, - 0x76D: 68, - 0x76E: 68, - 0x76F: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77A: 68, - 0x77B: 68, - 0x77C: 68, - 0x77D: 68, - 0x77E: 68, - 0x77F: 68, - 0x7A6: 84, - 0x7A7: 84, - 0x7A8: 84, - 0x7A9: 84, - 0x7AA: 84, - 0x7AB: 84, - 0x7AC: 84, - 0x7AD: 84, - 0x7AE: 84, - 0x7AF: 84, - 0x7B0: 84, - 0x7CA: 68, - 0x7CB: 68, - 0x7CC: 68, - 0x7CD: 68, - 0x7CE: 68, - 0x7CF: 68, - 0x7D0: 68, - 0x7D1: 68, - 0x7D2: 68, - 0x7D3: 68, - 0x7D4: 68, - 0x7D5: 68, - 0x7D6: 68, - 0x7D7: 68, - 0x7D8: 68, - 0x7D9: 68, - 0x7DA: 68, - 0x7DB: 68, - 0x7DC: 68, - 0x7DD: 68, - 0x7DE: 68, - 0x7DF: 68, - 0x7E0: 68, - 0x7E1: 68, - 0x7E2: 68, - 0x7E3: 68, - 0x7E4: 68, - 0x7E5: 68, - 0x7E6: 68, - 0x7E7: 68, - 0x7E8: 68, - 0x7E9: 68, - 0x7EA: 68, - 0x7EB: 84, - 0x7EC: 84, - 0x7ED: 84, - 0x7EE: 84, - 0x7EF: 84, - 0x7F0: 84, - 0x7F1: 84, - 0x7F2: 84, - 0x7F3: 84, - 0x7FA: 67, - 0x7FD: 84, - 0x816: 84, - 0x817: 84, - 0x818: 84, - 0x819: 84, - 0x81B: 84, - 0x81C: 84, - 0x81D: 84, - 0x81E: 84, - 0x81F: 84, - 0x820: 84, - 0x821: 84, - 0x822: 84, - 0x823: 84, - 0x825: 84, - 0x826: 84, - 0x827: 84, - 0x829: 84, - 0x82A: 84, - 0x82B: 84, - 0x82C: 84, - 0x82D: 84, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 82, - 0x848: 68, - 0x849: 82, - 0x84A: 68, - 0x84B: 68, - 0x84C: 68, - 0x84D: 68, - 0x84E: 68, - 0x84F: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 82, - 0x857: 82, - 0x858: 82, - 0x859: 84, - 0x85A: 84, - 0x85B: 84, - 0x860: 68, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86A: 82, - 0x870: 82, - 0x871: 82, - 0x872: 82, - 0x873: 82, - 0x874: 82, - 0x875: 82, - 0x876: 82, - 0x877: 82, - 0x878: 82, - 0x879: 82, - 0x87A: 82, - 0x87B: 82, - 0x87C: 82, - 0x87D: 82, - 0x87E: 82, - 0x87F: 82, - 0x880: 82, - 0x881: 82, - 0x882: 82, - 0x883: 67, - 0x884: 67, - 0x885: 67, - 0x886: 68, - 0x889: 68, - 0x88A: 68, - 0x88B: 68, - 0x88C: 68, - 0x88D: 68, - 0x88E: 82, - 0x897: 84, - 0x898: 84, - 0x899: 84, - 0x89A: 84, - 0x89B: 84, - 0x89C: 84, - 0x89D: 84, - 0x89E: 84, - 0x89F: 84, - 0x8A0: 68, - 0x8A1: 68, - 0x8A2: 68, - 0x8A3: 68, - 0x8A4: 68, - 0x8A5: 68, - 0x8A6: 68, - 0x8A7: 68, - 0x8A8: 68, - 0x8A9: 68, - 0x8AA: 82, - 0x8AB: 82, - 0x8AC: 82, - 0x8AE: 82, - 0x8AF: 68, - 0x8B0: 68, - 0x8B1: 82, - 0x8B2: 82, - 0x8B3: 68, - 0x8B4: 68, - 0x8B5: 68, - 0x8B6: 68, - 0x8B7: 68, - 0x8B8: 68, - 0x8B9: 82, - 0x8BA: 68, - 0x8BB: 68, - 0x8BC: 68, - 0x8BD: 68, - 0x8BE: 68, - 0x8BF: 68, - 0x8C0: 68, - 0x8C1: 68, - 0x8C2: 68, - 0x8C3: 68, - 0x8C4: 68, - 0x8C5: 68, - 0x8C6: 68, - 0x8C7: 68, - 0x8C8: 68, - 0x8CA: 84, - 0x8CB: 84, - 0x8CC: 84, - 0x8CD: 84, - 0x8CE: 84, - 0x8CF: 84, - 0x8D0: 84, - 0x8D1: 84, - 0x8D2: 84, - 0x8D3: 84, - 0x8D4: 84, - 0x8D5: 84, - 0x8D6: 84, - 0x8D7: 84, - 0x8D8: 84, - 0x8D9: 84, - 0x8DA: 84, - 0x8DB: 84, - 0x8DC: 84, - 0x8DD: 84, - 0x8DE: 84, - 0x8DF: 84, - 0x8E0: 84, - 0x8E1: 84, - 0x8E3: 84, - 0x8E4: 84, - 0x8E5: 84, - 0x8E6: 84, - 0x8E7: 84, - 0x8E8: 84, - 0x8E9: 84, - 0x8EA: 84, - 0x8EB: 84, - 0x8EC: 84, - 0x8ED: 84, - 0x8EE: 84, - 0x8EF: 84, - 0x8F0: 84, - 0x8F1: 84, - 0x8F2: 84, - 0x8F3: 84, - 0x8F4: 84, - 0x8F5: 84, - 0x8F6: 84, - 0x8F7: 84, - 0x8F8: 84, - 0x8F9: 84, - 0x8FA: 84, - 0x8FB: 84, - 0x8FC: 84, - 0x8FD: 84, - 0x8FE: 84, - 0x8FF: 84, - 0x900: 84, - 0x901: 84, - 0x902: 84, - 0x93A: 84, - 0x93C: 84, - 0x941: 84, - 0x942: 84, - 0x943: 84, - 0x944: 84, - 0x945: 84, - 0x946: 84, - 0x947: 84, - 0x948: 84, - 0x94D: 84, - 0x951: 84, - 0x952: 84, - 0x953: 84, - 0x954: 84, - 0x955: 84, - 0x956: 84, - 0x957: 84, - 0x962: 84, - 0x963: 84, - 0x981: 84, - 0x9BC: 84, - 0x9C1: 84, - 0x9C2: 84, - 0x9C3: 84, - 0x9C4: 84, - 0x9CD: 84, - 0x9E2: 84, - 0x9E3: 84, - 0x9FE: 84, - 0xA01: 84, - 0xA02: 84, - 0xA3C: 84, - 0xA41: 84, - 0xA42: 84, - 0xA47: 84, - 0xA48: 84, - 0xA4B: 84, - 0xA4C: 84, - 0xA4D: 84, - 0xA51: 84, - 0xA70: 84, - 0xA71: 84, - 0xA75: 84, - 0xA81: 84, - 0xA82: 84, - 0xABC: 84, - 0xAC1: 84, - 0xAC2: 84, - 0xAC3: 84, - 0xAC4: 84, - 0xAC5: 84, - 0xAC7: 84, - 0xAC8: 84, - 0xACD: 84, - 0xAE2: 84, - 0xAE3: 84, - 0xAFA: 84, - 0xAFB: 84, - 0xAFC: 84, - 0xAFD: 84, - 0xAFE: 84, - 0xAFF: 84, - 0xB01: 84, - 0xB3C: 84, - 0xB3F: 84, - 0xB41: 84, - 0xB42: 84, - 0xB43: 84, - 0xB44: 84, - 0xB4D: 84, - 0xB55: 84, - 0xB56: 84, - 0xB62: 84, - 0xB63: 84, - 0xB82: 84, - 0xBC0: 84, - 0xBCD: 84, - 0xC00: 84, - 0xC04: 84, - 0xC3C: 84, - 0xC3E: 84, - 0xC3F: 84, - 0xC40: 84, - 0xC46: 84, - 0xC47: 84, - 0xC48: 84, - 0xC4A: 84, - 0xC4B: 84, - 0xC4C: 84, - 0xC4D: 84, - 0xC55: 84, - 0xC56: 84, - 0xC62: 84, - 0xC63: 84, - 0xC81: 84, - 0xCBC: 84, - 0xCBF: 84, - 0xCC6: 84, - 0xCCC: 84, - 0xCCD: 84, - 0xCE2: 84, - 0xCE3: 84, - 0xD00: 84, - 0xD01: 84, - 0xD3B: 84, - 0xD3C: 84, - 0xD41: 84, - 0xD42: 84, - 0xD43: 84, - 0xD44: 84, - 0xD4D: 84, - 0xD62: 84, - 0xD63: 84, - 0xD81: 84, - 0xDCA: 84, - 0xDD2: 84, - 0xDD3: 84, - 0xDD4: 84, - 0xDD6: 84, - 0xE31: 84, - 0xE34: 84, - 0xE35: 84, - 0xE36: 84, - 0xE37: 84, - 0xE38: 84, - 0xE39: 84, - 0xE3A: 84, - 0xE47: 84, - 0xE48: 84, - 0xE49: 84, - 0xE4A: 84, - 0xE4B: 84, - 0xE4C: 84, - 0xE4D: 84, - 0xE4E: 84, - 0xEB1: 84, - 0xEB4: 84, - 0xEB5: 84, - 0xEB6: 84, - 0xEB7: 84, - 0xEB8: 84, - 0xEB9: 84, - 0xEBA: 84, - 0xEBB: 84, - 0xEBC: 84, - 0xEC8: 84, - 0xEC9: 84, - 0xECA: 84, - 0xECB: 84, - 0xECC: 84, - 0xECD: 84, - 0xECE: 84, - 0xF18: 84, - 0xF19: 84, - 0xF35: 84, - 0xF37: 84, - 0xF39: 84, - 0xF71: 84, - 0xF72: 84, - 0xF73: 84, - 0xF74: 84, - 0xF75: 84, - 0xF76: 84, - 0xF77: 84, - 0xF78: 84, - 0xF79: 84, - 0xF7A: 84, - 0xF7B: 84, - 0xF7C: 84, - 0xF7D: 84, - 0xF7E: 84, - 0xF80: 84, - 0xF81: 84, - 0xF82: 84, - 0xF83: 84, - 0xF84: 84, - 0xF86: 84, - 0xF87: 84, - 0xF8D: 84, - 0xF8E: 84, - 0xF8F: 84, - 0xF90: 84, - 0xF91: 84, - 0xF92: 84, - 0xF93: 84, - 0xF94: 84, - 0xF95: 84, - 0xF96: 84, - 0xF97: 84, - 0xF99: 84, - 0xF9A: 84, - 0xF9B: 84, - 0xF9C: 84, - 0xF9D: 84, - 0xF9E: 84, - 0xF9F: 84, - 0xFA0: 84, - 0xFA1: 84, - 0xFA2: 84, - 0xFA3: 84, - 0xFA4: 84, - 0xFA5: 84, - 0xFA6: 84, - 0xFA7: 84, - 0xFA8: 84, - 0xFA9: 84, - 0xFAA: 84, - 0xFAB: 84, - 0xFAC: 84, - 0xFAD: 84, - 0xFAE: 84, - 0xFAF: 84, - 0xFB0: 84, - 0xFB1: 84, - 0xFB2: 84, - 0xFB3: 84, - 0xFB4: 84, - 0xFB5: 84, - 0xFB6: 84, - 0xFB7: 84, - 0xFB8: 84, - 0xFB9: 84, - 0xFBA: 84, - 0xFBB: 84, - 0xFBC: 84, - 0xFC6: 84, - 0x102D: 84, - 0x102E: 84, - 0x102F: 84, - 0x1030: 84, - 0x1032: 84, - 0x1033: 84, - 0x1034: 84, - 0x1035: 84, - 0x1036: 84, - 0x1037: 84, - 0x1039: 84, - 0x103A: 84, - 0x103D: 84, - 0x103E: 84, - 0x1058: 84, - 0x1059: 84, - 0x105E: 84, - 0x105F: 84, - 0x1060: 84, - 0x1071: 84, - 0x1072: 84, - 0x1073: 84, - 0x1074: 84, - 0x1082: 84, - 0x1085: 84, - 0x1086: 84, - 0x108D: 84, - 0x109D: 84, - 0x135D: 84, - 0x135E: 84, - 0x135F: 84, - 0x1712: 84, - 0x1713: 84, - 0x1714: 84, - 0x1732: 84, - 0x1733: 84, - 0x1752: 84, - 0x1753: 84, - 0x1772: 84, - 0x1773: 84, - 0x17B4: 84, - 0x17B5: 84, - 0x17B7: 84, - 0x17B8: 84, - 0x17B9: 84, - 0x17BA: 84, - 0x17BB: 84, - 0x17BC: 84, - 0x17BD: 84, - 0x17C6: 84, - 0x17C9: 84, - 0x17CA: 84, - 0x17CB: 84, - 0x17CC: 84, - 0x17CD: 84, - 0x17CE: 84, - 0x17CF: 84, - 0x17D0: 84, - 0x17D1: 84, - 0x17D2: 84, - 0x17D3: 84, - 0x17DD: 84, - 0x1807: 68, - 0x180A: 67, - 0x180B: 84, - 0x180C: 84, - 0x180D: 84, - 0x180F: 84, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182A: 68, - 0x182B: 68, - 0x182C: 68, - 0x182D: 68, - 0x182E: 68, - 0x182F: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183A: 68, - 0x183B: 68, - 0x183C: 68, - 0x183D: 68, - 0x183E: 68, - 0x183F: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184A: 68, - 0x184B: 68, - 0x184C: 68, - 0x184D: 68, - 0x184E: 68, - 0x184F: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185A: 68, - 0x185B: 68, - 0x185C: 68, - 0x185D: 68, - 0x185E: 68, - 0x185F: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186A: 68, - 0x186B: 68, - 0x186C: 68, - 0x186D: 68, - 0x186E: 68, - 0x186F: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1878: 68, - 0x1885: 84, - 0x1886: 84, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188A: 68, - 0x188B: 68, - 0x188C: 68, - 0x188D: 68, - 0x188E: 68, - 0x188F: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189A: 68, - 0x189B: 68, - 0x189C: 68, - 0x189D: 68, - 0x189E: 68, - 0x189F: 68, - 0x18A0: 68, - 0x18A1: 68, - 0x18A2: 68, - 0x18A3: 68, - 0x18A4: 68, - 0x18A5: 68, - 0x18A6: 68, - 0x18A7: 68, - 0x18A8: 68, - 0x18A9: 84, - 0x18AA: 68, - 0x1920: 84, - 0x1921: 84, - 0x1922: 84, - 0x1927: 84, - 0x1928: 84, - 0x1932: 84, - 0x1939: 84, - 0x193A: 84, - 0x193B: 84, - 0x1A17: 84, - 0x1A18: 84, - 0x1A1B: 84, - 0x1A56: 84, - 0x1A58: 84, - 0x1A59: 84, - 0x1A5A: 84, - 0x1A5B: 84, - 0x1A5C: 84, - 0x1A5D: 84, - 0x1A5E: 84, - 0x1A60: 84, - 0x1A62: 84, - 0x1A65: 84, - 0x1A66: 84, - 0x1A67: 84, - 0x1A68: 84, - 0x1A69: 84, - 0x1A6A: 84, - 0x1A6B: 84, - 0x1A6C: 84, - 0x1A73: 84, - 0x1A74: 84, - 0x1A75: 84, - 0x1A76: 84, - 0x1A77: 84, - 0x1A78: 84, - 0x1A79: 84, - 0x1A7A: 84, - 0x1A7B: 84, - 0x1A7C: 84, - 0x1A7F: 84, - 0x1AB0: 84, - 0x1AB1: 84, - 0x1AB2: 84, - 0x1AB3: 84, - 0x1AB4: 84, - 0x1AB5: 84, - 0x1AB6: 84, - 0x1AB7: 84, - 0x1AB8: 84, - 0x1AB9: 84, - 0x1ABA: 84, - 0x1ABB: 84, - 0x1ABC: 84, - 0x1ABD: 84, - 0x1ABE: 84, - 0x1ABF: 84, - 0x1AC0: 84, - 0x1AC1: 84, - 0x1AC2: 84, - 0x1AC3: 84, - 0x1AC4: 84, - 0x1AC5: 84, - 0x1AC6: 84, - 0x1AC7: 84, - 0x1AC8: 84, - 0x1AC9: 84, - 0x1ACA: 84, - 0x1ACB: 84, - 0x1ACC: 84, - 0x1ACD: 84, - 0x1ACE: 84, - 0x1B00: 84, - 0x1B01: 84, - 0x1B02: 84, - 0x1B03: 84, - 0x1B34: 84, - 0x1B36: 84, - 0x1B37: 84, - 0x1B38: 84, - 0x1B39: 84, - 0x1B3A: 84, - 0x1B3C: 84, - 0x1B42: 84, - 0x1B6B: 84, - 0x1B6C: 84, - 0x1B6D: 84, - 0x1B6E: 84, - 0x1B6F: 84, - 0x1B70: 84, - 0x1B71: 84, - 0x1B72: 84, - 0x1B73: 84, - 0x1B80: 84, - 0x1B81: 84, - 0x1BA2: 84, - 0x1BA3: 84, - 0x1BA4: 84, - 0x1BA5: 84, - 0x1BA8: 84, - 0x1BA9: 84, - 0x1BAB: 84, - 0x1BAC: 84, - 0x1BAD: 84, - 0x1BE6: 84, - 0x1BE8: 84, - 0x1BE9: 84, - 0x1BED: 84, - 0x1BEF: 84, - 0x1BF0: 84, - 0x1BF1: 84, - 0x1C2C: 84, - 0x1C2D: 84, - 0x1C2E: 84, - 0x1C2F: 84, - 0x1C30: 84, - 0x1C31: 84, - 0x1C32: 84, - 0x1C33: 84, - 0x1C36: 84, - 0x1C37: 84, - 0x1CD0: 84, - 0x1CD1: 84, - 0x1CD2: 84, - 0x1CD4: 84, - 0x1CD5: 84, - 0x1CD6: 84, - 0x1CD7: 84, - 0x1CD8: 84, - 0x1CD9: 84, - 0x1CDA: 84, - 0x1CDB: 84, - 0x1CDC: 84, - 0x1CDD: 84, - 0x1CDE: 84, - 0x1CDF: 84, - 0x1CE0: 84, - 0x1CE2: 84, - 0x1CE3: 84, - 0x1CE4: 84, - 0x1CE5: 84, - 0x1CE6: 84, - 0x1CE7: 84, - 0x1CE8: 84, - 0x1CED: 84, - 0x1CF4: 84, - 0x1CF8: 84, - 0x1CF9: 84, - 0x1DC0: 84, - 0x1DC1: 84, - 0x1DC2: 84, - 0x1DC3: 84, - 0x1DC4: 84, - 0x1DC5: 84, - 0x1DC6: 84, - 0x1DC7: 84, - 0x1DC8: 84, - 0x1DC9: 84, - 0x1DCA: 84, - 0x1DCB: 84, - 0x1DCC: 84, - 0x1DCD: 84, - 0x1DCE: 84, - 0x1DCF: 84, - 0x1DD0: 84, - 0x1DD1: 84, - 0x1DD2: 84, - 0x1DD3: 84, - 0x1DD4: 84, - 0x1DD5: 84, - 0x1DD6: 84, - 0x1DD7: 84, - 0x1DD8: 84, - 0x1DD9: 84, - 0x1DDA: 84, - 0x1DDB: 84, - 0x1DDC: 84, - 0x1DDD: 84, - 0x1DDE: 84, - 0x1DDF: 84, - 0x1DE0: 84, - 0x1DE1: 84, - 0x1DE2: 84, - 0x1DE3: 84, - 0x1DE4: 84, - 0x1DE5: 84, - 0x1DE6: 84, - 0x1DE7: 84, - 0x1DE8: 84, - 0x1DE9: 84, - 0x1DEA: 84, - 0x1DEB: 84, - 0x1DEC: 84, - 0x1DED: 84, - 0x1DEE: 84, - 0x1DEF: 84, - 0x1DF0: 84, - 0x1DF1: 84, - 0x1DF2: 84, - 0x1DF3: 84, - 0x1DF4: 84, - 0x1DF5: 84, - 0x1DF6: 84, - 0x1DF7: 84, - 0x1DF8: 84, - 0x1DF9: 84, - 0x1DFA: 84, - 0x1DFB: 84, - 0x1DFC: 84, - 0x1DFD: 84, - 0x1DFE: 84, - 0x1DFF: 84, - 0x200B: 84, - 0x200D: 67, - 0x200E: 84, - 0x200F: 84, - 0x202A: 84, - 0x202B: 84, - 0x202C: 84, - 0x202D: 84, - 0x202E: 84, - 0x2060: 84, - 0x2061: 84, - 0x2062: 84, - 0x2063: 84, - 0x2064: 84, - 0x206A: 84, - 0x206B: 84, - 0x206C: 84, - 0x206D: 84, - 0x206E: 84, - 0x206F: 84, - 0x20D0: 84, - 0x20D1: 84, - 0x20D2: 84, - 0x20D3: 84, - 0x20D4: 84, - 0x20D5: 84, - 0x20D6: 84, - 0x20D7: 84, - 0x20D8: 84, - 0x20D9: 84, - 0x20DA: 84, - 0x20DB: 84, - 0x20DC: 84, - 0x20DD: 84, - 0x20DE: 84, - 0x20DF: 84, - 0x20E0: 84, - 0x20E1: 84, - 0x20E2: 84, - 0x20E3: 84, - 0x20E4: 84, - 0x20E5: 84, - 0x20E6: 84, - 0x20E7: 84, - 0x20E8: 84, - 0x20E9: 84, - 0x20EA: 84, - 0x20EB: 84, - 0x20EC: 84, - 0x20ED: 84, - 0x20EE: 84, - 0x20EF: 84, - 0x20F0: 84, - 0x2CEF: 84, - 0x2CF0: 84, - 0x2CF1: 84, - 0x2D7F: 84, - 0x2DE0: 84, - 0x2DE1: 84, - 0x2DE2: 84, - 0x2DE3: 84, - 0x2DE4: 84, - 0x2DE5: 84, - 0x2DE6: 84, - 0x2DE7: 84, - 0x2DE8: 84, - 0x2DE9: 84, - 0x2DEA: 84, - 0x2DEB: 84, - 0x2DEC: 84, - 0x2DED: 84, - 0x2DEE: 84, - 0x2DEF: 84, - 0x2DF0: 84, - 0x2DF1: 84, - 0x2DF2: 84, - 0x2DF3: 84, - 0x2DF4: 84, - 0x2DF5: 84, - 0x2DF6: 84, - 0x2DF7: 84, - 0x2DF8: 84, - 0x2DF9: 84, - 0x2DFA: 84, - 0x2DFB: 84, - 0x2DFC: 84, - 0x2DFD: 84, - 0x2DFE: 84, - 0x2DFF: 84, - 0x302A: 84, - 0x302B: 84, - 0x302C: 84, - 0x302D: 84, - 0x3099: 84, - 0x309A: 84, - 0xA66F: 84, - 0xA670: 84, - 0xA671: 84, - 0xA672: 84, - 0xA674: 84, - 0xA675: 84, - 0xA676: 84, - 0xA677: 84, - 0xA678: 84, - 0xA679: 84, - 0xA67A: 84, - 0xA67B: 84, - 0xA67C: 84, - 0xA67D: 84, - 0xA69E: 84, - 0xA69F: 84, - 0xA6F0: 84, - 0xA6F1: 84, - 0xA802: 84, - 0xA806: 84, - 0xA80B: 84, - 0xA825: 84, - 0xA826: 84, - 0xA82C: 84, - 0xA840: 68, - 0xA841: 68, - 0xA842: 68, - 0xA843: 68, - 0xA844: 68, - 0xA845: 68, - 0xA846: 68, - 0xA847: 68, - 0xA848: 68, - 0xA849: 68, - 0xA84A: 68, - 0xA84B: 68, - 0xA84C: 68, - 0xA84D: 68, - 0xA84E: 68, - 0xA84F: 68, - 0xA850: 68, - 0xA851: 68, - 0xA852: 68, - 0xA853: 68, - 0xA854: 68, - 0xA855: 68, - 0xA856: 68, - 0xA857: 68, - 0xA858: 68, - 0xA859: 68, - 0xA85A: 68, - 0xA85B: 68, - 0xA85C: 68, - 0xA85D: 68, - 0xA85E: 68, - 0xA85F: 68, - 0xA860: 68, - 0xA861: 68, - 0xA862: 68, - 0xA863: 68, - 0xA864: 68, - 0xA865: 68, - 0xA866: 68, - 0xA867: 68, - 0xA868: 68, - 0xA869: 68, - 0xA86A: 68, - 0xA86B: 68, - 0xA86C: 68, - 0xA86D: 68, - 0xA86E: 68, - 0xA86F: 68, - 0xA870: 68, - 0xA871: 68, - 0xA872: 76, - 0xA8C4: 84, - 0xA8C5: 84, - 0xA8E0: 84, - 0xA8E1: 84, - 0xA8E2: 84, - 0xA8E3: 84, - 0xA8E4: 84, - 0xA8E5: 84, - 0xA8E6: 84, - 0xA8E7: 84, - 0xA8E8: 84, - 0xA8E9: 84, - 0xA8EA: 84, - 0xA8EB: 84, - 0xA8EC: 84, - 0xA8ED: 84, - 0xA8EE: 84, - 0xA8EF: 84, - 0xA8F0: 84, - 0xA8F1: 84, - 0xA8FF: 84, - 0xA926: 84, - 0xA927: 84, - 0xA928: 84, - 0xA929: 84, - 0xA92A: 84, - 0xA92B: 84, - 0xA92C: 84, - 0xA92D: 84, - 0xA947: 84, - 0xA948: 84, - 0xA949: 84, - 0xA94A: 84, - 0xA94B: 84, - 0xA94C: 84, - 0xA94D: 84, - 0xA94E: 84, - 0xA94F: 84, - 0xA950: 84, - 0xA951: 84, - 0xA980: 84, - 0xA981: 84, - 0xA982: 84, - 0xA9B3: 84, - 0xA9B6: 84, - 0xA9B7: 84, - 0xA9B8: 84, - 0xA9B9: 84, - 0xA9BC: 84, - 0xA9BD: 84, - 0xA9E5: 84, - 0xAA29: 84, - 0xAA2A: 84, - 0xAA2B: 84, - 0xAA2C: 84, - 0xAA2D: 84, - 0xAA2E: 84, - 0xAA31: 84, - 0xAA32: 84, - 0xAA35: 84, - 0xAA36: 84, - 0xAA43: 84, - 0xAA4C: 84, - 0xAA7C: 84, - 0xAAB0: 84, - 0xAAB2: 84, - 0xAAB3: 84, - 0xAAB4: 84, - 0xAAB7: 84, - 0xAAB8: 84, - 0xAABE: 84, - 0xAABF: 84, - 0xAAC1: 84, - 0xAAEC: 84, - 0xAAED: 84, - 0xAAF6: 84, - 0xABE5: 84, - 0xABE8: 84, - 0xABED: 84, - 0xFB1E: 84, - 0xFE00: 84, - 0xFE01: 84, - 0xFE02: 84, - 0xFE03: 84, - 0xFE04: 84, - 0xFE05: 84, - 0xFE06: 84, - 0xFE07: 84, - 0xFE08: 84, - 0xFE09: 84, - 0xFE0A: 84, - 0xFE0B: 84, - 0xFE0C: 84, - 0xFE0D: 84, - 0xFE0E: 84, - 0xFE0F: 84, - 0xFE20: 84, - 0xFE21: 84, - 0xFE22: 84, - 0xFE23: 84, - 0xFE24: 84, - 0xFE25: 84, - 0xFE26: 84, - 0xFE27: 84, - 0xFE28: 84, - 0xFE29: 84, - 0xFE2A: 84, - 0xFE2B: 84, - 0xFE2C: 84, - 0xFE2D: 84, - 0xFE2E: 84, - 0xFE2F: 84, - 0xFEFF: 84, - 0xFFF9: 84, - 0xFFFA: 84, - 0xFFFB: 84, - 0x101FD: 84, - 0x102E0: 84, - 0x10376: 84, - 0x10377: 84, - 0x10378: 84, - 0x10379: 84, - 0x1037A: 84, - 0x10A01: 84, - 0x10A02: 84, - 0x10A03: 84, - 0x10A05: 84, - 0x10A06: 84, - 0x10A0C: 84, - 0x10A0D: 84, - 0x10A0E: 84, - 0x10A0F: 84, - 0x10A38: 84, - 0x10A39: 84, - 0x10A3A: 84, - 0x10A3F: 84, - 0x10AC0: 68, - 0x10AC1: 68, - 0x10AC2: 68, - 0x10AC3: 68, - 0x10AC4: 68, - 0x10AC5: 82, - 0x10AC7: 82, - 0x10AC9: 82, - 0x10ACA: 82, - 0x10ACD: 76, - 0x10ACE: 82, - 0x10ACF: 82, - 0x10AD0: 82, - 0x10AD1: 82, - 0x10AD2: 82, - 0x10AD3: 68, - 0x10AD4: 68, - 0x10AD5: 68, - 0x10AD6: 68, - 0x10AD7: 76, - 0x10AD8: 68, - 0x10AD9: 68, - 0x10ADA: 68, - 0x10ADB: 68, - 0x10ADC: 68, - 0x10ADD: 82, - 0x10ADE: 68, - 0x10ADF: 68, - 0x10AE0: 68, - 0x10AE1: 82, - 0x10AE4: 82, - 0x10AE5: 84, - 0x10AE6: 84, - 0x10AEB: 68, - 0x10AEC: 68, - 0x10AED: 68, - 0x10AEE: 68, - 0x10AEF: 82, - 0x10B80: 68, - 0x10B81: 82, - 0x10B82: 68, - 0x10B83: 82, - 0x10B84: 82, - 0x10B85: 82, - 0x10B86: 68, - 0x10B87: 68, - 0x10B88: 68, - 0x10B89: 82, - 0x10B8A: 68, - 0x10B8B: 68, - 0x10B8C: 82, - 0x10B8D: 68, - 0x10B8E: 82, - 0x10B8F: 82, - 0x10B90: 68, - 0x10B91: 82, - 0x10BA9: 82, - 0x10BAA: 82, - 0x10BAB: 82, - 0x10BAC: 82, - 0x10BAD: 68, - 0x10BAE: 68, - 0x10D00: 76, - 0x10D01: 68, - 0x10D02: 68, - 0x10D03: 68, - 0x10D04: 68, - 0x10D05: 68, - 0x10D06: 68, - 0x10D07: 68, - 0x10D08: 68, - 0x10D09: 68, - 0x10D0A: 68, - 0x10D0B: 68, - 0x10D0C: 68, - 0x10D0D: 68, - 0x10D0E: 68, - 0x10D0F: 68, - 0x10D10: 68, - 0x10D11: 68, - 0x10D12: 68, - 0x10D13: 68, - 0x10D14: 68, - 0x10D15: 68, - 0x10D16: 68, - 0x10D17: 68, - 0x10D18: 68, - 0x10D19: 68, - 0x10D1A: 68, - 0x10D1B: 68, - 0x10D1C: 68, - 0x10D1D: 68, - 0x10D1E: 68, - 0x10D1F: 68, - 0x10D20: 68, - 0x10D21: 68, - 0x10D22: 82, - 0x10D23: 68, - 0x10D24: 84, - 0x10D25: 84, - 0x10D26: 84, - 0x10D27: 84, - 0x10D69: 84, - 0x10D6A: 84, - 0x10D6B: 84, - 0x10D6C: 84, - 0x10D6D: 84, - 0x10EAB: 84, - 0x10EAC: 84, - 0x10EC2: 82, - 0x10EC3: 68, - 0x10EC4: 68, - 0x10EFC: 84, - 0x10EFD: 84, - 0x10EFE: 84, - 0x10EFF: 84, - 0x10F30: 68, - 0x10F31: 68, - 0x10F32: 68, - 0x10F33: 82, - 0x10F34: 68, - 0x10F35: 68, - 0x10F36: 68, - 0x10F37: 68, - 0x10F38: 68, - 0x10F39: 68, - 0x10F3A: 68, - 0x10F3B: 68, - 0x10F3C: 68, - 0x10F3D: 68, - 0x10F3E: 68, - 0x10F3F: 68, - 0x10F40: 68, - 0x10F41: 68, - 0x10F42: 68, - 0x10F43: 68, - 0x10F44: 68, - 0x10F46: 84, - 0x10F47: 84, - 0x10F48: 84, - 0x10F49: 84, - 0x10F4A: 84, - 0x10F4B: 84, - 0x10F4C: 84, - 0x10F4D: 84, - 0x10F4E: 84, - 0x10F4F: 84, - 0x10F50: 84, - 0x10F51: 68, - 0x10F52: 68, - 0x10F53: 68, - 0x10F54: 82, - 0x10F70: 68, - 0x10F71: 68, - 0x10F72: 68, - 0x10F73: 68, - 0x10F74: 82, - 0x10F75: 82, - 0x10F76: 68, - 0x10F77: 68, - 0x10F78: 68, - 0x10F79: 68, - 0x10F7A: 68, - 0x10F7B: 68, - 0x10F7C: 68, - 0x10F7D: 68, - 0x10F7E: 68, - 0x10F7F: 68, - 0x10F80: 68, - 0x10F81: 68, - 0x10F82: 84, - 0x10F83: 84, - 0x10F84: 84, - 0x10F85: 84, - 0x10FB0: 68, - 0x10FB2: 68, - 0x10FB3: 68, - 0x10FB4: 82, - 0x10FB5: 82, - 0x10FB6: 82, - 0x10FB8: 68, - 0x10FB9: 82, - 0x10FBA: 82, - 0x10FBB: 68, - 0x10FBC: 68, - 0x10FBD: 82, - 0x10FBE: 68, - 0x10FBF: 68, - 0x10FC1: 68, - 0x10FC2: 82, - 0x10FC3: 82, - 0x10FC4: 68, - 0x10FC9: 82, - 0x10FCA: 68, - 0x10FCB: 76, - 0x11001: 84, - 0x11038: 84, - 0x11039: 84, - 0x1103A: 84, - 0x1103B: 84, - 0x1103C: 84, - 0x1103D: 84, - 0x1103E: 84, - 0x1103F: 84, - 0x11040: 84, - 0x11041: 84, - 0x11042: 84, - 0x11043: 84, - 0x11044: 84, - 0x11045: 84, - 0x11046: 84, - 0x11070: 84, - 0x11073: 84, - 0x11074: 84, - 0x1107F: 84, - 0x11080: 84, - 0x11081: 84, - 0x110B3: 84, - 0x110B4: 84, - 0x110B5: 84, - 0x110B6: 84, - 0x110B9: 84, - 0x110BA: 84, - 0x110C2: 84, - 0x11100: 84, - 0x11101: 84, - 0x11102: 84, - 0x11127: 84, - 0x11128: 84, - 0x11129: 84, - 0x1112A: 84, - 0x1112B: 84, - 0x1112D: 84, - 0x1112E: 84, - 0x1112F: 84, - 0x11130: 84, - 0x11131: 84, - 0x11132: 84, - 0x11133: 84, - 0x11134: 84, - 0x11173: 84, - 0x11180: 84, - 0x11181: 84, - 0x111B6: 84, - 0x111B7: 84, - 0x111B8: 84, - 0x111B9: 84, - 0x111BA: 84, - 0x111BB: 84, - 0x111BC: 84, - 0x111BD: 84, - 0x111BE: 84, - 0x111C9: 84, - 0x111CA: 84, - 0x111CB: 84, - 0x111CC: 84, - 0x111CF: 84, - 0x1122F: 84, - 0x11230: 84, - 0x11231: 84, - 0x11234: 84, - 0x11236: 84, - 0x11237: 84, - 0x1123E: 84, - 0x11241: 84, - 0x112DF: 84, - 0x112E3: 84, - 0x112E4: 84, - 0x112E5: 84, - 0x112E6: 84, - 0x112E7: 84, - 0x112E8: 84, - 0x112E9: 84, - 0x112EA: 84, - 0x11300: 84, - 0x11301: 84, - 0x1133B: 84, - 0x1133C: 84, - 0x11340: 84, - 0x11366: 84, - 0x11367: 84, - 0x11368: 84, - 0x11369: 84, - 0x1136A: 84, - 0x1136B: 84, - 0x1136C: 84, - 0x11370: 84, - 0x11371: 84, - 0x11372: 84, - 0x11373: 84, - 0x11374: 84, - 0x113BB: 84, - 0x113BC: 84, - 0x113BD: 84, - 0x113BE: 84, - 0x113BF: 84, - 0x113C0: 84, - 0x113CE: 84, - 0x113D0: 84, - 0x113D2: 84, - 0x113E1: 84, - 0x113E2: 84, - 0x11438: 84, - 0x11439: 84, - 0x1143A: 84, - 0x1143B: 84, - 0x1143C: 84, - 0x1143D: 84, - 0x1143E: 84, - 0x1143F: 84, - 0x11442: 84, - 0x11443: 84, - 0x11444: 84, - 0x11446: 84, - 0x1145E: 84, - 0x114B3: 84, - 0x114B4: 84, - 0x114B5: 84, - 0x114B6: 84, - 0x114B7: 84, - 0x114B8: 84, - 0x114BA: 84, - 0x114BF: 84, - 0x114C0: 84, - 0x114C2: 84, - 0x114C3: 84, - 0x115B2: 84, - 0x115B3: 84, - 0x115B4: 84, - 0x115B5: 84, - 0x115BC: 84, - 0x115BD: 84, - 0x115BF: 84, - 0x115C0: 84, - 0x115DC: 84, - 0x115DD: 84, - 0x11633: 84, - 0x11634: 84, - 0x11635: 84, - 0x11636: 84, - 0x11637: 84, - 0x11638: 84, - 0x11639: 84, - 0x1163A: 84, - 0x1163D: 84, - 0x1163F: 84, - 0x11640: 84, - 0x116AB: 84, - 0x116AD: 84, - 0x116B0: 84, - 0x116B1: 84, - 0x116B2: 84, - 0x116B3: 84, - 0x116B4: 84, - 0x116B5: 84, - 0x116B7: 84, - 0x1171D: 84, - 0x1171F: 84, - 0x11722: 84, - 0x11723: 84, - 0x11724: 84, - 0x11725: 84, - 0x11727: 84, - 0x11728: 84, - 0x11729: 84, - 0x1172A: 84, - 0x1172B: 84, - 0x1182F: 84, - 0x11830: 84, - 0x11831: 84, - 0x11832: 84, - 0x11833: 84, - 0x11834: 84, - 0x11835: 84, - 0x11836: 84, - 0x11837: 84, - 0x11839: 84, - 0x1183A: 84, - 0x1193B: 84, - 0x1193C: 84, - 0x1193E: 84, - 0x11943: 84, - 0x119D4: 84, - 0x119D5: 84, - 0x119D6: 84, - 0x119D7: 84, - 0x119DA: 84, - 0x119DB: 84, - 0x119E0: 84, - 0x11A01: 84, - 0x11A02: 84, - 0x11A03: 84, - 0x11A04: 84, - 0x11A05: 84, - 0x11A06: 84, - 0x11A07: 84, - 0x11A08: 84, - 0x11A09: 84, - 0x11A0A: 84, - 0x11A33: 84, - 0x11A34: 84, - 0x11A35: 84, - 0x11A36: 84, - 0x11A37: 84, - 0x11A38: 84, - 0x11A3B: 84, - 0x11A3C: 84, - 0x11A3D: 84, - 0x11A3E: 84, - 0x11A47: 84, - 0x11A51: 84, - 0x11A52: 84, - 0x11A53: 84, - 0x11A54: 84, - 0x11A55: 84, - 0x11A56: 84, - 0x11A59: 84, - 0x11A5A: 84, - 0x11A5B: 84, - 0x11A8A: 84, - 0x11A8B: 84, - 0x11A8C: 84, - 0x11A8D: 84, - 0x11A8E: 84, - 0x11A8F: 84, - 0x11A90: 84, - 0x11A91: 84, - 0x11A92: 84, - 0x11A93: 84, - 0x11A94: 84, - 0x11A95: 84, - 0x11A96: 84, - 0x11A98: 84, - 0x11A99: 84, - 0x11C30: 84, - 0x11C31: 84, - 0x11C32: 84, - 0x11C33: 84, - 0x11C34: 84, - 0x11C35: 84, - 0x11C36: 84, - 0x11C38: 84, - 0x11C39: 84, - 0x11C3A: 84, - 0x11C3B: 84, - 0x11C3C: 84, - 0x11C3D: 84, - 0x11C3F: 84, - 0x11C92: 84, - 0x11C93: 84, - 0x11C94: 84, - 0x11C95: 84, - 0x11C96: 84, - 0x11C97: 84, - 0x11C98: 84, - 0x11C99: 84, - 0x11C9A: 84, - 0x11C9B: 84, - 0x11C9C: 84, - 0x11C9D: 84, - 0x11C9E: 84, - 0x11C9F: 84, - 0x11CA0: 84, - 0x11CA1: 84, - 0x11CA2: 84, - 0x11CA3: 84, - 0x11CA4: 84, - 0x11CA5: 84, - 0x11CA6: 84, - 0x11CA7: 84, - 0x11CAA: 84, - 0x11CAB: 84, - 0x11CAC: 84, - 0x11CAD: 84, - 0x11CAE: 84, - 0x11CAF: 84, - 0x11CB0: 84, - 0x11CB2: 84, - 0x11CB3: 84, - 0x11CB5: 84, - 0x11CB6: 84, - 0x11D31: 84, - 0x11D32: 84, - 0x11D33: 84, - 0x11D34: 84, - 0x11D35: 84, - 0x11D36: 84, - 0x11D3A: 84, - 0x11D3C: 84, - 0x11D3D: 84, - 0x11D3F: 84, - 0x11D40: 84, - 0x11D41: 84, - 0x11D42: 84, - 0x11D43: 84, - 0x11D44: 84, - 0x11D45: 84, - 0x11D47: 84, - 0x11D90: 84, - 0x11D91: 84, - 0x11D95: 84, - 0x11D97: 84, - 0x11EF3: 84, - 0x11EF4: 84, - 0x11F00: 84, - 0x11F01: 84, - 0x11F36: 84, - 0x11F37: 84, - 0x11F38: 84, - 0x11F39: 84, - 0x11F3A: 84, - 0x11F40: 84, - 0x11F42: 84, - 0x11F5A: 84, - 0x13430: 84, - 0x13431: 84, - 0x13432: 84, - 0x13433: 84, - 0x13434: 84, - 0x13435: 84, - 0x13436: 84, - 0x13437: 84, - 0x13438: 84, - 0x13439: 84, - 0x1343A: 84, - 0x1343B: 84, - 0x1343C: 84, - 0x1343D: 84, - 0x1343E: 84, - 0x1343F: 84, - 0x13440: 84, - 0x13447: 84, - 0x13448: 84, - 0x13449: 84, - 0x1344A: 84, - 0x1344B: 84, - 0x1344C: 84, - 0x1344D: 84, - 0x1344E: 84, - 0x1344F: 84, - 0x13450: 84, - 0x13451: 84, - 0x13452: 84, - 0x13453: 84, - 0x13454: 84, - 0x13455: 84, - 0x1611E: 84, - 0x1611F: 84, - 0x16120: 84, - 0x16121: 84, - 0x16122: 84, - 0x16123: 84, - 0x16124: 84, - 0x16125: 84, - 0x16126: 84, - 0x16127: 84, - 0x16128: 84, - 0x16129: 84, - 0x1612D: 84, - 0x1612E: 84, - 0x1612F: 84, - 0x16AF0: 84, - 0x16AF1: 84, - 0x16AF2: 84, - 0x16AF3: 84, - 0x16AF4: 84, - 0x16B30: 84, - 0x16B31: 84, - 0x16B32: 84, - 0x16B33: 84, - 0x16B34: 84, - 0x16B35: 84, - 0x16B36: 84, - 0x16F4F: 84, - 0x16F8F: 84, - 0x16F90: 84, - 0x16F91: 84, - 0x16F92: 84, - 0x16FE4: 84, - 0x1BC9D: 84, - 0x1BC9E: 84, - 0x1BCA0: 84, - 0x1BCA1: 84, - 0x1BCA2: 84, - 0x1BCA3: 84, - 0x1CF00: 84, - 0x1CF01: 84, - 0x1CF02: 84, - 0x1CF03: 84, - 0x1CF04: 84, - 0x1CF05: 84, - 0x1CF06: 84, - 0x1CF07: 84, - 0x1CF08: 84, - 0x1CF09: 84, - 0x1CF0A: 84, - 0x1CF0B: 84, - 0x1CF0C: 84, - 0x1CF0D: 84, - 0x1CF0E: 84, - 0x1CF0F: 84, - 0x1CF10: 84, - 0x1CF11: 84, - 0x1CF12: 84, - 0x1CF13: 84, - 0x1CF14: 84, - 0x1CF15: 84, - 0x1CF16: 84, - 0x1CF17: 84, - 0x1CF18: 84, - 0x1CF19: 84, - 0x1CF1A: 84, - 0x1CF1B: 84, - 0x1CF1C: 84, - 0x1CF1D: 84, - 0x1CF1E: 84, - 0x1CF1F: 84, - 0x1CF20: 84, - 0x1CF21: 84, - 0x1CF22: 84, - 0x1CF23: 84, - 0x1CF24: 84, - 0x1CF25: 84, - 0x1CF26: 84, - 0x1CF27: 84, - 0x1CF28: 84, - 0x1CF29: 84, - 0x1CF2A: 84, - 0x1CF2B: 84, - 0x1CF2C: 84, - 0x1CF2D: 84, - 0x1CF30: 84, - 0x1CF31: 84, - 0x1CF32: 84, - 0x1CF33: 84, - 0x1CF34: 84, - 0x1CF35: 84, - 0x1CF36: 84, - 0x1CF37: 84, - 0x1CF38: 84, - 0x1CF39: 84, - 0x1CF3A: 84, - 0x1CF3B: 84, - 0x1CF3C: 84, - 0x1CF3D: 84, - 0x1CF3E: 84, - 0x1CF3F: 84, - 0x1CF40: 84, - 0x1CF41: 84, - 0x1CF42: 84, - 0x1CF43: 84, - 0x1CF44: 84, - 0x1CF45: 84, - 0x1CF46: 84, - 0x1D167: 84, - 0x1D168: 84, - 0x1D169: 84, - 0x1D173: 84, - 0x1D174: 84, - 0x1D175: 84, - 0x1D176: 84, - 0x1D177: 84, - 0x1D178: 84, - 0x1D179: 84, - 0x1D17A: 84, - 0x1D17B: 84, - 0x1D17C: 84, - 0x1D17D: 84, - 0x1D17E: 84, - 0x1D17F: 84, - 0x1D180: 84, - 0x1D181: 84, - 0x1D182: 84, - 0x1D185: 84, - 0x1D186: 84, - 0x1D187: 84, - 0x1D188: 84, - 0x1D189: 84, - 0x1D18A: 84, - 0x1D18B: 84, - 0x1D1AA: 84, - 0x1D1AB: 84, - 0x1D1AC: 84, - 0x1D1AD: 84, - 0x1D242: 84, - 0x1D243: 84, - 0x1D244: 84, - 0x1DA00: 84, - 0x1DA01: 84, - 0x1DA02: 84, - 0x1DA03: 84, - 0x1DA04: 84, - 0x1DA05: 84, - 0x1DA06: 84, - 0x1DA07: 84, - 0x1DA08: 84, - 0x1DA09: 84, - 0x1DA0A: 84, - 0x1DA0B: 84, - 0x1DA0C: 84, - 0x1DA0D: 84, - 0x1DA0E: 84, - 0x1DA0F: 84, - 0x1DA10: 84, - 0x1DA11: 84, - 0x1DA12: 84, - 0x1DA13: 84, - 0x1DA14: 84, - 0x1DA15: 84, - 0x1DA16: 84, - 0x1DA17: 84, - 0x1DA18: 84, - 0x1DA19: 84, - 0x1DA1A: 84, - 0x1DA1B: 84, - 0x1DA1C: 84, - 0x1DA1D: 84, - 0x1DA1E: 84, - 0x1DA1F: 84, - 0x1DA20: 84, - 0x1DA21: 84, - 0x1DA22: 84, - 0x1DA23: 84, - 0x1DA24: 84, - 0x1DA25: 84, - 0x1DA26: 84, - 0x1DA27: 84, - 0x1DA28: 84, - 0x1DA29: 84, - 0x1DA2A: 84, - 0x1DA2B: 84, - 0x1DA2C: 84, - 0x1DA2D: 84, - 0x1DA2E: 84, - 0x1DA2F: 84, - 0x1DA30: 84, - 0x1DA31: 84, - 0x1DA32: 84, - 0x1DA33: 84, - 0x1DA34: 84, - 0x1DA35: 84, - 0x1DA36: 84, - 0x1DA3B: 84, - 0x1DA3C: 84, - 0x1DA3D: 84, - 0x1DA3E: 84, - 0x1DA3F: 84, - 0x1DA40: 84, - 0x1DA41: 84, - 0x1DA42: 84, - 0x1DA43: 84, - 0x1DA44: 84, - 0x1DA45: 84, - 0x1DA46: 84, - 0x1DA47: 84, - 0x1DA48: 84, - 0x1DA49: 84, - 0x1DA4A: 84, - 0x1DA4B: 84, - 0x1DA4C: 84, - 0x1DA4D: 84, - 0x1DA4E: 84, - 0x1DA4F: 84, - 0x1DA50: 84, - 0x1DA51: 84, - 0x1DA52: 84, - 0x1DA53: 84, - 0x1DA54: 84, - 0x1DA55: 84, - 0x1DA56: 84, - 0x1DA57: 84, - 0x1DA58: 84, - 0x1DA59: 84, - 0x1DA5A: 84, - 0x1DA5B: 84, - 0x1DA5C: 84, - 0x1DA5D: 84, - 0x1DA5E: 84, - 0x1DA5F: 84, - 0x1DA60: 84, - 0x1DA61: 84, - 0x1DA62: 84, - 0x1DA63: 84, - 0x1DA64: 84, - 0x1DA65: 84, - 0x1DA66: 84, - 0x1DA67: 84, - 0x1DA68: 84, - 0x1DA69: 84, - 0x1DA6A: 84, - 0x1DA6B: 84, - 0x1DA6C: 84, - 0x1DA75: 84, - 0x1DA84: 84, - 0x1DA9B: 84, - 0x1DA9C: 84, - 0x1DA9D: 84, - 0x1DA9E: 84, - 0x1DA9F: 84, - 0x1DAA1: 84, - 0x1DAA2: 84, - 0x1DAA3: 84, - 0x1DAA4: 84, - 0x1DAA5: 84, - 0x1DAA6: 84, - 0x1DAA7: 84, - 0x1DAA8: 84, - 0x1DAA9: 84, - 0x1DAAA: 84, - 0x1DAAB: 84, - 0x1DAAC: 84, - 0x1DAAD: 84, - 0x1DAAE: 84, - 0x1DAAF: 84, - 0x1E000: 84, - 0x1E001: 84, - 0x1E002: 84, - 0x1E003: 84, - 0x1E004: 84, - 0x1E005: 84, - 0x1E006: 84, - 0x1E008: 84, - 0x1E009: 84, - 0x1E00A: 84, - 0x1E00B: 84, - 0x1E00C: 84, - 0x1E00D: 84, - 0x1E00E: 84, - 0x1E00F: 84, - 0x1E010: 84, - 0x1E011: 84, - 0x1E012: 84, - 0x1E013: 84, - 0x1E014: 84, - 0x1E015: 84, - 0x1E016: 84, - 0x1E017: 84, - 0x1E018: 84, - 0x1E01B: 84, - 0x1E01C: 84, - 0x1E01D: 84, - 0x1E01E: 84, - 0x1E01F: 84, - 0x1E020: 84, - 0x1E021: 84, - 0x1E023: 84, - 0x1E024: 84, - 0x1E026: 84, - 0x1E027: 84, - 0x1E028: 84, - 0x1E029: 84, - 0x1E02A: 84, - 0x1E08F: 84, - 0x1E130: 84, - 0x1E131: 84, - 0x1E132: 84, - 0x1E133: 84, - 0x1E134: 84, - 0x1E135: 84, - 0x1E136: 84, - 0x1E2AE: 84, - 0x1E2EC: 84, - 0x1E2ED: 84, - 0x1E2EE: 84, - 0x1E2EF: 84, - 0x1E4EC: 84, - 0x1E4ED: 84, - 0x1E4EE: 84, - 0x1E4EF: 84, - 0x1E5EE: 84, - 0x1E5EF: 84, - 0x1E8D0: 84, - 0x1E8D1: 84, - 0x1E8D2: 84, - 0x1E8D3: 84, - 0x1E8D4: 84, - 0x1E8D5: 84, - 0x1E8D6: 84, - 0x1E900: 68, - 0x1E901: 68, - 0x1E902: 68, - 0x1E903: 68, - 0x1E904: 68, - 0x1E905: 68, - 0x1E906: 68, - 0x1E907: 68, - 0x1E908: 68, - 0x1E909: 68, - 0x1E90A: 68, - 0x1E90B: 68, - 0x1E90C: 68, - 0x1E90D: 68, - 0x1E90E: 68, - 0x1E90F: 68, - 0x1E910: 68, - 0x1E911: 68, - 0x1E912: 68, - 0x1E913: 68, - 0x1E914: 68, - 0x1E915: 68, - 0x1E916: 68, - 0x1E917: 68, - 0x1E918: 68, - 0x1E919: 68, - 0x1E91A: 68, - 0x1E91B: 68, - 0x1E91C: 68, - 0x1E91D: 68, - 0x1E91E: 68, - 0x1E91F: 68, - 0x1E920: 68, - 0x1E921: 68, - 0x1E922: 68, - 0x1E923: 68, - 0x1E924: 68, - 0x1E925: 68, - 0x1E926: 68, - 0x1E927: 68, - 0x1E928: 68, - 0x1E929: 68, - 0x1E92A: 68, - 0x1E92B: 68, - 0x1E92C: 68, - 0x1E92D: 68, - 0x1E92E: 68, - 0x1E92F: 68, - 0x1E930: 68, - 0x1E931: 68, - 0x1E932: 68, - 0x1E933: 68, - 0x1E934: 68, - 0x1E935: 68, - 0x1E936: 68, - 0x1E937: 68, - 0x1E938: 68, - 0x1E939: 68, - 0x1E93A: 68, - 0x1E93B: 68, - 0x1E93C: 68, - 0x1E93D: 68, - 0x1E93E: 68, - 0x1E93F: 68, - 0x1E940: 68, - 0x1E941: 68, - 0x1E942: 68, - 0x1E943: 68, - 0x1E944: 84, - 0x1E945: 84, - 0x1E946: 84, - 0x1E947: 84, - 0x1E948: 84, - 0x1E949: 84, - 0x1E94A: 84, - 0x1E94B: 84, - 0xE0001: 84, - 0xE0020: 84, - 0xE0021: 84, - 0xE0022: 84, - 0xE0023: 84, - 0xE0024: 84, - 0xE0025: 84, - 0xE0026: 84, - 0xE0027: 84, - 0xE0028: 84, - 0xE0029: 84, - 0xE002A: 84, - 0xE002B: 84, - 0xE002C: 84, - 0xE002D: 84, - 0xE002E: 84, - 0xE002F: 84, - 0xE0030: 84, - 0xE0031: 84, - 0xE0032: 84, - 0xE0033: 84, - 0xE0034: 84, - 0xE0035: 84, - 0xE0036: 84, - 0xE0037: 84, - 0xE0038: 84, - 0xE0039: 84, - 0xE003A: 84, - 0xE003B: 84, - 0xE003C: 84, - 0xE003D: 84, - 0xE003E: 84, - 0xE003F: 84, - 0xE0040: 84, - 0xE0041: 84, - 0xE0042: 84, - 0xE0043: 84, - 0xE0044: 84, - 0xE0045: 84, - 0xE0046: 84, - 0xE0047: 84, - 0xE0048: 84, - 0xE0049: 84, - 0xE004A: 84, - 0xE004B: 84, - 0xE004C: 84, - 0xE004D: 84, - 0xE004E: 84, - 0xE004F: 84, - 0xE0050: 84, - 0xE0051: 84, - 0xE0052: 84, - 0xE0053: 84, - 0xE0054: 84, - 0xE0055: 84, - 0xE0056: 84, - 0xE0057: 84, - 0xE0058: 84, - 0xE0059: 84, - 0xE005A: 84, - 0xE005B: 84, - 0xE005C: 84, - 0xE005D: 84, - 0xE005E: 84, - 0xE005F: 84, - 0xE0060: 84, - 0xE0061: 84, - 0xE0062: 84, - 0xE0063: 84, - 0xE0064: 84, - 0xE0065: 84, - 0xE0066: 84, - 0xE0067: 84, - 0xE0068: 84, - 0xE0069: 84, - 0xE006A: 84, - 0xE006B: 84, - 0xE006C: 84, - 0xE006D: 84, - 0xE006E: 84, - 0xE006F: 84, - 0xE0070: 84, - 0xE0071: 84, - 0xE0072: 84, - 0xE0073: 84, - 0xE0074: 84, - 0xE0075: 84, - 0xE0076: 84, - 0xE0077: 84, - 0xE0078: 84, - 0xE0079: 84, - 0xE007A: 84, - 0xE007B: 84, - 0xE007C: 84, - 0xE007D: 84, - 0xE007E: 84, - 0xE007F: 84, - 0xE0100: 84, - 0xE0101: 84, - 0xE0102: 84, - 0xE0103: 84, - 0xE0104: 84, - 0xE0105: 84, - 0xE0106: 84, - 0xE0107: 84, - 0xE0108: 84, - 0xE0109: 84, - 0xE010A: 84, - 0xE010B: 84, - 0xE010C: 84, - 0xE010D: 84, - 0xE010E: 84, - 0xE010F: 84, - 0xE0110: 84, - 0xE0111: 84, - 0xE0112: 84, - 0xE0113: 84, - 0xE0114: 84, - 0xE0115: 84, - 0xE0116: 84, - 0xE0117: 84, - 0xE0118: 84, - 0xE0119: 84, - 0xE011A: 84, - 0xE011B: 84, - 0xE011C: 84, - 0xE011D: 84, - 0xE011E: 84, - 0xE011F: 84, - 0xE0120: 84, - 0xE0121: 84, - 0xE0122: 84, - 0xE0123: 84, - 0xE0124: 84, - 0xE0125: 84, - 0xE0126: 84, - 0xE0127: 84, - 0xE0128: 84, - 0xE0129: 84, - 0xE012A: 84, - 0xE012B: 84, - 0xE012C: 84, - 0xE012D: 84, - 0xE012E: 84, - 0xE012F: 84, - 0xE0130: 84, - 0xE0131: 84, - 0xE0132: 84, - 0xE0133: 84, - 0xE0134: 84, - 0xE0135: 84, - 0xE0136: 84, - 0xE0137: 84, - 0xE0138: 84, - 0xE0139: 84, - 0xE013A: 84, - 0xE013B: 84, - 0xE013C: 84, - 0xE013D: 84, - 0xE013E: 84, - 0xE013F: 84, - 0xE0140: 84, - 0xE0141: 84, - 0xE0142: 84, - 0xE0143: 84, - 0xE0144: 84, - 0xE0145: 84, - 0xE0146: 84, - 0xE0147: 84, - 0xE0148: 84, - 0xE0149: 84, - 0xE014A: 84, - 0xE014B: 84, - 0xE014C: 84, - 0xE014D: 84, - 0xE014E: 84, - 0xE014F: 84, - 0xE0150: 84, - 0xE0151: 84, - 0xE0152: 84, - 0xE0153: 84, - 0xE0154: 84, - 0xE0155: 84, - 0xE0156: 84, - 0xE0157: 84, - 0xE0158: 84, - 0xE0159: 84, - 0xE015A: 84, - 0xE015B: 84, - 0xE015C: 84, - 0xE015D: 84, - 0xE015E: 84, - 0xE015F: 84, - 0xE0160: 84, - 0xE0161: 84, - 0xE0162: 84, - 0xE0163: 84, - 0xE0164: 84, - 0xE0165: 84, - 0xE0166: 84, - 0xE0167: 84, - 0xE0168: 84, - 0xE0169: 84, - 0xE016A: 84, - 0xE016B: 84, - 0xE016C: 84, - 0xE016D: 84, - 0xE016E: 84, - 0xE016F: 84, - 0xE0170: 84, - 0xE0171: 84, - 0xE0172: 84, - 0xE0173: 84, - 0xE0174: 84, - 0xE0175: 84, - 0xE0176: 84, - 0xE0177: 84, - 0xE0178: 84, - 0xE0179: 84, - 0xE017A: 84, - 0xE017B: 84, - 0xE017C: 84, - 0xE017D: 84, - 0xE017E: 84, - 0xE017F: 84, - 0xE0180: 84, - 0xE0181: 84, - 0xE0182: 84, - 0xE0183: 84, - 0xE0184: 84, - 0xE0185: 84, - 0xE0186: 84, - 0xE0187: 84, - 0xE0188: 84, - 0xE0189: 84, - 0xE018A: 84, - 0xE018B: 84, - 0xE018C: 84, - 0xE018D: 84, - 0xE018E: 84, - 0xE018F: 84, - 0xE0190: 84, - 0xE0191: 84, - 0xE0192: 84, - 0xE0193: 84, - 0xE0194: 84, - 0xE0195: 84, - 0xE0196: 84, - 0xE0197: 84, - 0xE0198: 84, - 0xE0199: 84, - 0xE019A: 84, - 0xE019B: 84, - 0xE019C: 84, - 0xE019D: 84, - 0xE019E: 84, - 0xE019F: 84, - 0xE01A0: 84, - 0xE01A1: 84, - 0xE01A2: 84, - 0xE01A3: 84, - 0xE01A4: 84, - 0xE01A5: 84, - 0xE01A6: 84, - 0xE01A7: 84, - 0xE01A8: 84, - 0xE01A9: 84, - 0xE01AA: 84, - 0xE01AB: 84, - 0xE01AC: 84, - 0xE01AD: 84, - 0xE01AE: 84, - 0xE01AF: 84, - 0xE01B0: 84, - 0xE01B1: 84, - 0xE01B2: 84, - 0xE01B3: 84, - 0xE01B4: 84, - 0xE01B5: 84, - 0xE01B6: 84, - 0xE01B7: 84, - 0xE01B8: 84, - 0xE01B9: 84, - 0xE01BA: 84, - 0xE01BB: 84, - 0xE01BC: 84, - 0xE01BD: 84, - 0xE01BE: 84, - 0xE01BF: 84, - 0xE01C0: 84, - 0xE01C1: 84, - 0xE01C2: 84, - 0xE01C3: 84, - 0xE01C4: 84, - 0xE01C5: 84, - 0xE01C6: 84, - 0xE01C7: 84, - 0xE01C8: 84, - 0xE01C9: 84, - 0xE01CA: 84, - 0xE01CB: 84, - 0xE01CC: 84, - 0xE01CD: 84, - 0xE01CE: 84, - 0xE01CF: 84, - 0xE01D0: 84, - 0xE01D1: 84, - 0xE01D2: 84, - 0xE01D3: 84, - 0xE01D4: 84, - 0xE01D5: 84, - 0xE01D6: 84, - 0xE01D7: 84, - 0xE01D8: 84, - 0xE01D9: 84, - 0xE01DA: 84, - 0xE01DB: 84, - 0xE01DC: 84, - 0xE01DD: 84, - 0xE01DE: 84, - 0xE01DF: 84, - 0xE01E0: 84, - 0xE01E1: 84, - 0xE01E2: 84, - 0xE01E3: 84, - 0xE01E4: 84, - 0xE01E5: 84, - 0xE01E6: 84, - 0xE01E7: 84, - 0xE01E8: 84, - 0xE01E9: 84, - 0xE01EA: 84, - 0xE01EB: 84, - 0xE01EC: 84, - 0xE01ED: 84, - 0xE01EE: 84, - 0xE01EF: 84, -} -codepoint_classes = { - "PVALID": ( - 0x2D0000002E, - 0x300000003A, - 0x610000007B, - 0xDF000000F7, - 0xF800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010A, - 0x10B0000010C, - 0x10D0000010E, - 0x10F00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011A, - 0x11B0000011C, - 0x11D0000011E, - 0x11F00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012A, - 0x12B0000012C, - 0x12D0000012E, - 0x12F00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13A0000013B, - 0x13C0000013D, - 0x13E0000013F, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14B0000014C, - 0x14D0000014E, - 0x14F00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015A, - 0x15B0000015C, - 0x15D0000015E, - 0x15F00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016A, - 0x16B0000016C, - 0x16D0000016E, - 0x16F00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17A0000017B, - 0x17C0000017D, - 0x17E0000017F, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18C0000018E, - 0x19200000193, - 0x19500000196, - 0x1990000019C, - 0x19E0000019F, - 0x1A1000001A2, - 0x1A3000001A4, - 0x1A5000001A6, - 0x1A8000001A9, - 0x1AA000001AC, - 0x1AD000001AE, - 0x1B0000001B1, - 0x1B4000001B5, - 0x1B6000001B7, - 0x1B9000001BC, - 0x1BD000001C4, - 0x1CE000001CF, - 0x1D0000001D1, - 0x1D2000001D3, - 0x1D4000001D5, - 0x1D6000001D7, - 0x1D8000001D9, - 0x1DA000001DB, - 0x1DC000001DE, - 0x1DF000001E0, - 0x1E1000001E2, - 0x1E3000001E4, - 0x1E5000001E6, - 0x1E7000001E8, - 0x1E9000001EA, - 0x1EB000001EC, - 0x1ED000001EE, - 0x1EF000001F1, - 0x1F5000001F6, - 0x1F9000001FA, - 0x1FB000001FC, - 0x1FD000001FE, - 0x1FF00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020A, - 0x20B0000020C, - 0x20D0000020E, - 0x20F00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021A, - 0x21B0000021C, - 0x21D0000021E, - 0x21F00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022A, - 0x22B0000022C, - 0x22D0000022E, - 0x22F00000230, - 0x23100000232, - 0x2330000023A, - 0x23C0000023D, - 0x23F00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024A, - 0x24B0000024C, - 0x24D0000024E, - 0x24F000002B0, - 0x2B9000002C2, - 0x2C6000002D2, - 0x2EC000002ED, - 0x2EE000002EF, - 0x30000000340, - 0x34200000343, - 0x3460000034F, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37B0000037E, - 0x39000000391, - 0x3AC000003CF, - 0x3D7000003D8, - 0x3D9000003DA, - 0x3DB000003DC, - 0x3DD000003DE, - 0x3DF000003E0, - 0x3E1000003E2, - 0x3E3000003E4, - 0x3E5000003E6, - 0x3E7000003E8, - 0x3E9000003EA, - 0x3EB000003EC, - 0x3ED000003EE, - 0x3EF000003F0, - 0x3F3000003F4, - 0x3F8000003F9, - 0x3FB000003FD, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046A, - 0x46B0000046C, - 0x46D0000046E, - 0x46F00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047A, - 0x47B0000047C, - 0x47D0000047E, - 0x47F00000480, - 0x48100000482, - 0x48300000488, - 0x48B0000048C, - 0x48D0000048E, - 0x48F00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049A, - 0x49B0000049C, - 0x49D0000049E, - 0x49F000004A0, - 0x4A1000004A2, - 0x4A3000004A4, - 0x4A5000004A6, - 0x4A7000004A8, - 0x4A9000004AA, - 0x4AB000004AC, - 0x4AD000004AE, - 0x4AF000004B0, - 0x4B1000004B2, - 0x4B3000004B4, - 0x4B5000004B6, - 0x4B7000004B8, - 0x4B9000004BA, - 0x4BB000004BC, - 0x4BD000004BE, - 0x4BF000004C0, - 0x4C2000004C3, - 0x4C4000004C5, - 0x4C6000004C7, - 0x4C8000004C9, - 0x4CA000004CB, - 0x4CC000004CD, - 0x4CE000004D0, - 0x4D1000004D2, - 0x4D3000004D4, - 0x4D5000004D6, - 0x4D7000004D8, - 0x4D9000004DA, - 0x4DB000004DC, - 0x4DD000004DE, - 0x4DF000004E0, - 0x4E1000004E2, - 0x4E3000004E4, - 0x4E5000004E6, - 0x4E7000004E8, - 0x4E9000004EA, - 0x4EB000004EC, - 0x4ED000004EE, - 0x4EF000004F0, - 0x4F1000004F2, - 0x4F3000004F4, - 0x4F5000004F6, - 0x4F7000004F8, - 0x4F9000004FA, - 0x4FB000004FC, - 0x4FD000004FE, - 0x4FF00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050A, - 0x50B0000050C, - 0x50D0000050E, - 0x50F00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051A, - 0x51B0000051C, - 0x51D0000051E, - 0x51F00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052A, - 0x52B0000052C, - 0x52D0000052E, - 0x52F00000530, - 0x5590000055A, - 0x56000000587, - 0x58800000589, - 0x591000005BE, - 0x5BF000005C0, - 0x5C1000005C3, - 0x5C4000005C6, - 0x5C7000005C8, - 0x5D0000005EB, - 0x5EF000005F3, - 0x6100000061B, - 0x62000000640, - 0x64100000660, - 0x66E00000675, - 0x679000006D4, - 0x6D5000006DD, - 0x6DF000006E9, - 0x6EA000006F0, - 0x6FA00000700, - 0x7100000074B, - 0x74D000007B2, - 0x7C0000007F6, - 0x7FD000007FE, - 0x8000000082E, - 0x8400000085C, - 0x8600000086B, - 0x87000000888, - 0x8890000088F, - 0x897000008E2, - 0x8E300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098D, - 0x98F00000991, - 0x993000009A9, - 0x9AA000009B1, - 0x9B2000009B3, - 0x9B6000009BA, - 0x9BC000009C5, - 0x9C7000009C9, - 0x9CB000009CF, - 0x9D7000009D8, - 0x9E0000009E4, - 0x9E6000009F2, - 0x9FC000009FD, - 0x9FE000009FF, - 0xA0100000A04, - 0xA0500000A0B, - 0xA0F00000A11, - 0xA1300000A29, - 0xA2A00000A31, - 0xA3200000A33, - 0xA3500000A36, - 0xA3800000A3A, - 0xA3C00000A3D, - 0xA3E00000A43, - 0xA4700000A49, - 0xA4B00000A4E, - 0xA5100000A52, - 0xA5C00000A5D, - 0xA6600000A76, - 0xA8100000A84, - 0xA8500000A8E, - 0xA8F00000A92, - 0xA9300000AA9, - 0xAAA00000AB1, - 0xAB200000AB4, - 0xAB500000ABA, - 0xABC00000AC6, - 0xAC700000ACA, - 0xACB00000ACE, - 0xAD000000AD1, - 0xAE000000AE4, - 0xAE600000AF0, - 0xAF900000B00, - 0xB0100000B04, - 0xB0500000B0D, - 0xB0F00000B11, - 0xB1300000B29, - 0xB2A00000B31, - 0xB3200000B34, - 0xB3500000B3A, - 0xB3C00000B45, - 0xB4700000B49, - 0xB4B00000B4E, - 0xB5500000B58, - 0xB5F00000B64, - 0xB6600000B70, - 0xB7100000B72, - 0xB8200000B84, - 0xB8500000B8B, - 0xB8E00000B91, - 0xB9200000B96, - 0xB9900000B9B, - 0xB9C00000B9D, - 0xB9E00000BA0, - 0xBA300000BA5, - 0xBA800000BAB, - 0xBAE00000BBA, - 0xBBE00000BC3, - 0xBC600000BC9, - 0xBCA00000BCE, - 0xBD000000BD1, - 0xBD700000BD8, - 0xBE600000BF0, - 0xC0000000C0D, - 0xC0E00000C11, - 0xC1200000C29, - 0xC2A00000C3A, - 0xC3C00000C45, - 0xC4600000C49, - 0xC4A00000C4E, - 0xC5500000C57, - 0xC5800000C5B, - 0xC5D00000C5E, - 0xC6000000C64, - 0xC6600000C70, - 0xC8000000C84, - 0xC8500000C8D, - 0xC8E00000C91, - 0xC9200000CA9, - 0xCAA00000CB4, - 0xCB500000CBA, - 0xCBC00000CC5, - 0xCC600000CC9, - 0xCCA00000CCE, - 0xCD500000CD7, - 0xCDD00000CDF, - 0xCE000000CE4, - 0xCE600000CF0, - 0xCF100000CF4, - 0xD0000000D0D, - 0xD0E00000D11, - 0xD1200000D45, - 0xD4600000D49, - 0xD4A00000D4F, - 0xD5400000D58, - 0xD5F00000D64, - 0xD6600000D70, - 0xD7A00000D80, - 0xD8100000D84, - 0xD8500000D97, - 0xD9A00000DB2, - 0xDB300000DBC, - 0xDBD00000DBE, - 0xDC000000DC7, - 0xDCA00000DCB, - 0xDCF00000DD5, - 0xDD600000DD7, - 0xDD800000DE0, - 0xDE600000DF0, - 0xDF200000DF4, - 0xE0100000E33, - 0xE3400000E3B, - 0xE4000000E4F, - 0xE5000000E5A, - 0xE8100000E83, - 0xE8400000E85, - 0xE8600000E8B, - 0xE8C00000EA4, - 0xEA500000EA6, - 0xEA700000EB3, - 0xEB400000EBE, - 0xEC000000EC5, - 0xEC600000EC7, - 0xEC800000ECF, - 0xED000000EDA, - 0xEDE00000EE0, - 0xF0000000F01, - 0xF0B00000F0C, - 0xF1800000F1A, - 0xF2000000F2A, - 0xF3500000F36, - 0xF3700000F38, - 0xF3900000F3A, - 0xF3E00000F43, - 0xF4400000F48, - 0xF4900000F4D, - 0xF4E00000F52, - 0xF5300000F57, - 0xF5800000F5C, - 0xF5D00000F69, - 0xF6A00000F6D, - 0xF7100000F73, - 0xF7400000F75, - 0xF7A00000F81, - 0xF8200000F85, - 0xF8600000F93, - 0xF9400000F98, - 0xF9900000F9D, - 0xF9E00000FA2, - 0xFA300000FA7, - 0xFA800000FAC, - 0xFAD00000FB9, - 0xFBA00000FBD, - 0xFC600000FC7, - 0x10000000104A, - 0x10500000109E, - 0x10D0000010FB, - 0x10FD00001100, - 0x120000001249, - 0x124A0000124E, - 0x125000001257, - 0x125800001259, - 0x125A0000125E, - 0x126000001289, - 0x128A0000128E, - 0x1290000012B1, - 0x12B2000012B6, - 0x12B8000012BF, - 0x12C0000012C1, - 0x12C2000012C6, - 0x12C8000012D7, - 0x12D800001311, - 0x131200001316, - 0x13180000135B, - 0x135D00001360, - 0x138000001390, - 0x13A0000013F6, - 0x14010000166D, - 0x166F00001680, - 0x16810000169B, - 0x16A0000016EB, - 0x16F1000016F9, - 0x170000001716, - 0x171F00001735, - 0x174000001754, - 0x17600000176D, - 0x176E00001771, - 0x177200001774, - 0x1780000017B4, - 0x17B6000017D4, - 0x17D7000017D8, - 0x17DC000017DE, - 0x17E0000017EA, - 0x18100000181A, - 0x182000001879, - 0x1880000018AB, - 0x18B0000018F6, - 0x19000000191F, - 0x19200000192C, - 0x19300000193C, - 0x19460000196E, - 0x197000001975, - 0x1980000019AC, - 0x19B0000019CA, - 0x19D0000019DA, - 0x1A0000001A1C, - 0x1A2000001A5F, - 0x1A6000001A7D, - 0x1A7F00001A8A, - 0x1A9000001A9A, - 0x1AA700001AA8, - 0x1AB000001ABE, - 0x1ABF00001ACF, - 0x1B0000001B4D, - 0x1B5000001B5A, - 0x1B6B00001B74, - 0x1B8000001BF4, - 0x1C0000001C38, - 0x1C4000001C4A, - 0x1C4D00001C7E, - 0x1C8A00001C8B, - 0x1CD000001CD3, - 0x1CD400001CFB, - 0x1D0000001D2C, - 0x1D2F00001D30, - 0x1D3B00001D3C, - 0x1D4E00001D4F, - 0x1D6B00001D78, - 0x1D7900001D9B, - 0x1DC000001E00, - 0x1E0100001E02, - 0x1E0300001E04, - 0x1E0500001E06, - 0x1E0700001E08, - 0x1E0900001E0A, - 0x1E0B00001E0C, - 0x1E0D00001E0E, - 0x1E0F00001E10, - 0x1E1100001E12, - 0x1E1300001E14, - 0x1E1500001E16, - 0x1E1700001E18, - 0x1E1900001E1A, - 0x1E1B00001E1C, - 0x1E1D00001E1E, - 0x1E1F00001E20, - 0x1E2100001E22, - 0x1E2300001E24, - 0x1E2500001E26, - 0x1E2700001E28, - 0x1E2900001E2A, - 0x1E2B00001E2C, - 0x1E2D00001E2E, - 0x1E2F00001E30, - 0x1E3100001E32, - 0x1E3300001E34, - 0x1E3500001E36, - 0x1E3700001E38, - 0x1E3900001E3A, - 0x1E3B00001E3C, - 0x1E3D00001E3E, - 0x1E3F00001E40, - 0x1E4100001E42, - 0x1E4300001E44, - 0x1E4500001E46, - 0x1E4700001E48, - 0x1E4900001E4A, - 0x1E4B00001E4C, - 0x1E4D00001E4E, - 0x1E4F00001E50, - 0x1E5100001E52, - 0x1E5300001E54, - 0x1E5500001E56, - 0x1E5700001E58, - 0x1E5900001E5A, - 0x1E5B00001E5C, - 0x1E5D00001E5E, - 0x1E5F00001E60, - 0x1E6100001E62, - 0x1E6300001E64, - 0x1E6500001E66, - 0x1E6700001E68, - 0x1E6900001E6A, - 0x1E6B00001E6C, - 0x1E6D00001E6E, - 0x1E6F00001E70, - 0x1E7100001E72, - 0x1E7300001E74, - 0x1E7500001E76, - 0x1E7700001E78, - 0x1E7900001E7A, - 0x1E7B00001E7C, - 0x1E7D00001E7E, - 0x1E7F00001E80, - 0x1E8100001E82, - 0x1E8300001E84, - 0x1E8500001E86, - 0x1E8700001E88, - 0x1E8900001E8A, - 0x1E8B00001E8C, - 0x1E8D00001E8E, - 0x1E8F00001E90, - 0x1E9100001E92, - 0x1E9300001E94, - 0x1E9500001E9A, - 0x1E9C00001E9E, - 0x1E9F00001EA0, - 0x1EA100001EA2, - 0x1EA300001EA4, - 0x1EA500001EA6, - 0x1EA700001EA8, - 0x1EA900001EAA, - 0x1EAB00001EAC, - 0x1EAD00001EAE, - 0x1EAF00001EB0, - 0x1EB100001EB2, - 0x1EB300001EB4, - 0x1EB500001EB6, - 0x1EB700001EB8, - 0x1EB900001EBA, - 0x1EBB00001EBC, - 0x1EBD00001EBE, - 0x1EBF00001EC0, - 0x1EC100001EC2, - 0x1EC300001EC4, - 0x1EC500001EC6, - 0x1EC700001EC8, - 0x1EC900001ECA, - 0x1ECB00001ECC, - 0x1ECD00001ECE, - 0x1ECF00001ED0, - 0x1ED100001ED2, - 0x1ED300001ED4, - 0x1ED500001ED6, - 0x1ED700001ED8, - 0x1ED900001EDA, - 0x1EDB00001EDC, - 0x1EDD00001EDE, - 0x1EDF00001EE0, - 0x1EE100001EE2, - 0x1EE300001EE4, - 0x1EE500001EE6, - 0x1EE700001EE8, - 0x1EE900001EEA, - 0x1EEB00001EEC, - 0x1EED00001EEE, - 0x1EEF00001EF0, - 0x1EF100001EF2, - 0x1EF300001EF4, - 0x1EF500001EF6, - 0x1EF700001EF8, - 0x1EF900001EFA, - 0x1EFB00001EFC, - 0x1EFD00001EFE, - 0x1EFF00001F08, - 0x1F1000001F16, - 0x1F2000001F28, - 0x1F3000001F38, - 0x1F4000001F46, - 0x1F5000001F58, - 0x1F6000001F68, - 0x1F7000001F71, - 0x1F7200001F73, - 0x1F7400001F75, - 0x1F7600001F77, - 0x1F7800001F79, - 0x1F7A00001F7B, - 0x1F7C00001F7D, - 0x1FB000001FB2, - 0x1FB600001FB7, - 0x1FC600001FC7, - 0x1FD000001FD3, - 0x1FD600001FD8, - 0x1FE000001FE3, - 0x1FE400001FE8, - 0x1FF600001FF7, - 0x214E0000214F, - 0x218400002185, - 0x2C3000002C60, - 0x2C6100002C62, - 0x2C6500002C67, - 0x2C6800002C69, - 0x2C6A00002C6B, - 0x2C6C00002C6D, - 0x2C7100002C72, - 0x2C7300002C75, - 0x2C7600002C7C, - 0x2C8100002C82, - 0x2C8300002C84, - 0x2C8500002C86, - 0x2C8700002C88, - 0x2C8900002C8A, - 0x2C8B00002C8C, - 0x2C8D00002C8E, - 0x2C8F00002C90, - 0x2C9100002C92, - 0x2C9300002C94, - 0x2C9500002C96, - 0x2C9700002C98, - 0x2C9900002C9A, - 0x2C9B00002C9C, - 0x2C9D00002C9E, - 0x2C9F00002CA0, - 0x2CA100002CA2, - 0x2CA300002CA4, - 0x2CA500002CA6, - 0x2CA700002CA8, - 0x2CA900002CAA, - 0x2CAB00002CAC, - 0x2CAD00002CAE, - 0x2CAF00002CB0, - 0x2CB100002CB2, - 0x2CB300002CB4, - 0x2CB500002CB6, - 0x2CB700002CB8, - 0x2CB900002CBA, - 0x2CBB00002CBC, - 0x2CBD00002CBE, - 0x2CBF00002CC0, - 0x2CC100002CC2, - 0x2CC300002CC4, - 0x2CC500002CC6, - 0x2CC700002CC8, - 0x2CC900002CCA, - 0x2CCB00002CCC, - 0x2CCD00002CCE, - 0x2CCF00002CD0, - 0x2CD100002CD2, - 0x2CD300002CD4, - 0x2CD500002CD6, - 0x2CD700002CD8, - 0x2CD900002CDA, - 0x2CDB00002CDC, - 0x2CDD00002CDE, - 0x2CDF00002CE0, - 0x2CE100002CE2, - 0x2CE300002CE5, - 0x2CEC00002CED, - 0x2CEE00002CF2, - 0x2CF300002CF4, - 0x2D0000002D26, - 0x2D2700002D28, - 0x2D2D00002D2E, - 0x2D3000002D68, - 0x2D7F00002D97, - 0x2DA000002DA7, - 0x2DA800002DAF, - 0x2DB000002DB7, - 0x2DB800002DBF, - 0x2DC000002DC7, - 0x2DC800002DCF, - 0x2DD000002DD7, - 0x2DD800002DDF, - 0x2DE000002E00, - 0x2E2F00002E30, - 0x300500003008, - 0x302A0000302E, - 0x303C0000303D, - 0x304100003097, - 0x30990000309B, - 0x309D0000309F, - 0x30A1000030FB, - 0x30FC000030FF, - 0x310500003130, - 0x31A0000031C0, - 0x31F000003200, - 0x340000004DC0, - 0x4E000000A48D, - 0xA4D00000A4FE, - 0xA5000000A60D, - 0xA6100000A62C, - 0xA6410000A642, - 0xA6430000A644, - 0xA6450000A646, - 0xA6470000A648, - 0xA6490000A64A, - 0xA64B0000A64C, - 0xA64D0000A64E, - 0xA64F0000A650, - 0xA6510000A652, - 0xA6530000A654, - 0xA6550000A656, - 0xA6570000A658, - 0xA6590000A65A, - 0xA65B0000A65C, - 0xA65D0000A65E, - 0xA65F0000A660, - 0xA6610000A662, - 0xA6630000A664, - 0xA6650000A666, - 0xA6670000A668, - 0xA6690000A66A, - 0xA66B0000A66C, - 0xA66D0000A670, - 0xA6740000A67E, - 0xA67F0000A680, - 0xA6810000A682, - 0xA6830000A684, - 0xA6850000A686, - 0xA6870000A688, - 0xA6890000A68A, - 0xA68B0000A68C, - 0xA68D0000A68E, - 0xA68F0000A690, - 0xA6910000A692, - 0xA6930000A694, - 0xA6950000A696, - 0xA6970000A698, - 0xA6990000A69A, - 0xA69B0000A69C, - 0xA69E0000A6E6, - 0xA6F00000A6F2, - 0xA7170000A720, - 0xA7230000A724, - 0xA7250000A726, - 0xA7270000A728, - 0xA7290000A72A, - 0xA72B0000A72C, - 0xA72D0000A72E, - 0xA72F0000A732, - 0xA7330000A734, - 0xA7350000A736, - 0xA7370000A738, - 0xA7390000A73A, - 0xA73B0000A73C, - 0xA73D0000A73E, - 0xA73F0000A740, - 0xA7410000A742, - 0xA7430000A744, - 0xA7450000A746, - 0xA7470000A748, - 0xA7490000A74A, - 0xA74B0000A74C, - 0xA74D0000A74E, - 0xA74F0000A750, - 0xA7510000A752, - 0xA7530000A754, - 0xA7550000A756, - 0xA7570000A758, - 0xA7590000A75A, - 0xA75B0000A75C, - 0xA75D0000A75E, - 0xA75F0000A760, - 0xA7610000A762, - 0xA7630000A764, - 0xA7650000A766, - 0xA7670000A768, - 0xA7690000A76A, - 0xA76B0000A76C, - 0xA76D0000A76E, - 0xA76F0000A770, - 0xA7710000A779, - 0xA77A0000A77B, - 0xA77C0000A77D, - 0xA77F0000A780, - 0xA7810000A782, - 0xA7830000A784, - 0xA7850000A786, - 0xA7870000A789, - 0xA78C0000A78D, - 0xA78E0000A790, - 0xA7910000A792, - 0xA7930000A796, - 0xA7970000A798, - 0xA7990000A79A, - 0xA79B0000A79C, - 0xA79D0000A79E, - 0xA79F0000A7A0, - 0xA7A10000A7A2, - 0xA7A30000A7A4, - 0xA7A50000A7A6, - 0xA7A70000A7A8, - 0xA7A90000A7AA, - 0xA7AF0000A7B0, - 0xA7B50000A7B6, - 0xA7B70000A7B8, - 0xA7B90000A7BA, - 0xA7BB0000A7BC, - 0xA7BD0000A7BE, - 0xA7BF0000A7C0, - 0xA7C10000A7C2, - 0xA7C30000A7C4, - 0xA7C80000A7C9, - 0xA7CA0000A7CB, - 0xA7CD0000A7CE, - 0xA7D10000A7D2, - 0xA7D30000A7D4, - 0xA7D50000A7D6, - 0xA7D70000A7D8, - 0xA7D90000A7DA, - 0xA7DB0000A7DC, - 0xA7F60000A7F8, - 0xA7FA0000A828, - 0xA82C0000A82D, - 0xA8400000A874, - 0xA8800000A8C6, - 0xA8D00000A8DA, - 0xA8E00000A8F8, - 0xA8FB0000A8FC, - 0xA8FD0000A92E, - 0xA9300000A954, - 0xA9800000A9C1, - 0xA9CF0000A9DA, - 0xA9E00000A9FF, - 0xAA000000AA37, - 0xAA400000AA4E, - 0xAA500000AA5A, - 0xAA600000AA77, - 0xAA7A0000AAC3, - 0xAADB0000AADE, - 0xAAE00000AAF0, - 0xAAF20000AAF7, - 0xAB010000AB07, - 0xAB090000AB0F, - 0xAB110000AB17, - 0xAB200000AB27, - 0xAB280000AB2F, - 0xAB300000AB5B, - 0xAB600000AB69, - 0xABC00000ABEB, - 0xABEC0000ABEE, - 0xABF00000ABFA, - 0xAC000000D7A4, - 0xFA0E0000FA10, - 0xFA110000FA12, - 0xFA130000FA15, - 0xFA1F0000FA20, - 0xFA210000FA22, - 0xFA230000FA25, - 0xFA270000FA2A, - 0xFB1E0000FB1F, - 0xFE200000FE30, - 0xFE730000FE74, - 0x100000001000C, - 0x1000D00010027, - 0x100280001003B, - 0x1003C0001003E, - 0x1003F0001004E, - 0x100500001005E, - 0x10080000100FB, - 0x101FD000101FE, - 0x102800001029D, - 0x102A0000102D1, - 0x102E0000102E1, - 0x1030000010320, - 0x1032D00010341, - 0x103420001034A, - 0x103500001037B, - 0x103800001039E, - 0x103A0000103C4, - 0x103C8000103D0, - 0x104280001049E, - 0x104A0000104AA, - 0x104D8000104FC, - 0x1050000010528, - 0x1053000010564, - 0x10597000105A2, - 0x105A3000105B2, - 0x105B3000105BA, - 0x105BB000105BD, - 0x105C0000105F4, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1078000010781, - 0x1080000010806, - 0x1080800010809, - 0x1080A00010836, - 0x1083700010839, - 0x1083C0001083D, - 0x1083F00010856, - 0x1086000010877, - 0x108800001089F, - 0x108E0000108F3, - 0x108F4000108F6, - 0x1090000010916, - 0x109200001093A, - 0x10980000109B8, - 0x109BE000109C0, - 0x10A0000010A04, - 0x10A0500010A07, - 0x10A0C00010A14, - 0x10A1500010A18, - 0x10A1900010A36, - 0x10A3800010A3B, - 0x10A3F00010A40, - 0x10A6000010A7D, - 0x10A8000010A9D, - 0x10AC000010AC8, - 0x10AC900010AE7, - 0x10B0000010B36, - 0x10B4000010B56, - 0x10B6000010B73, - 0x10B8000010B92, - 0x10C0000010C49, - 0x10CC000010CF3, - 0x10D0000010D28, - 0x10D3000010D3A, - 0x10D4000010D50, - 0x10D6900010D6E, - 0x10D6F00010D86, - 0x10E8000010EAA, - 0x10EAB00010EAD, - 0x10EB000010EB2, - 0x10EC200010EC5, - 0x10EFC00010F1D, - 0x10F2700010F28, - 0x10F3000010F51, - 0x10F7000010F86, - 0x10FB000010FC5, - 0x10FE000010FF7, - 0x1100000011047, - 0x1106600011076, - 0x1107F000110BB, - 0x110C2000110C3, - 0x110D0000110E9, - 0x110F0000110FA, - 0x1110000011135, - 0x1113600011140, - 0x1114400011148, - 0x1115000011174, - 0x1117600011177, - 0x11180000111C5, - 0x111C9000111CD, - 0x111CE000111DB, - 0x111DC000111DD, - 0x1120000011212, - 0x1121300011238, - 0x1123E00011242, - 0x1128000011287, - 0x1128800011289, - 0x1128A0001128E, - 0x1128F0001129E, - 0x1129F000112A9, - 0x112B0000112EB, - 0x112F0000112FA, - 0x1130000011304, - 0x113050001130D, - 0x1130F00011311, - 0x1131300011329, - 0x1132A00011331, - 0x1133200011334, - 0x113350001133A, - 0x1133B00011345, - 0x1134700011349, - 0x1134B0001134E, - 0x1135000011351, - 0x1135700011358, - 0x1135D00011364, - 0x113660001136D, - 0x1137000011375, - 0x113800001138A, - 0x1138B0001138C, - 0x1138E0001138F, - 0x11390000113B6, - 0x113B7000113C1, - 0x113C2000113C3, - 0x113C5000113C6, - 0x113C7000113CB, - 0x113CC000113D4, - 0x113E1000113E3, - 0x114000001144B, - 0x114500001145A, - 0x1145E00011462, - 0x11480000114C6, - 0x114C7000114C8, - 0x114D0000114DA, - 0x11580000115B6, - 0x115B8000115C1, - 0x115D8000115DE, - 0x1160000011641, - 0x1164400011645, - 0x116500001165A, - 0x11680000116B9, - 0x116C0000116CA, - 0x116D0000116E4, - 0x117000001171B, - 0x1171D0001172C, - 0x117300001173A, - 0x1174000011747, - 0x118000001183B, - 0x118C0000118EA, - 0x118FF00011907, - 0x119090001190A, - 0x1190C00011914, - 0x1191500011917, - 0x1191800011936, - 0x1193700011939, - 0x1193B00011944, - 0x119500001195A, - 0x119A0000119A8, - 0x119AA000119D8, - 0x119DA000119E2, - 0x119E3000119E5, - 0x11A0000011A3F, - 0x11A4700011A48, - 0x11A5000011A9A, - 0x11A9D00011A9E, - 0x11AB000011AF9, - 0x11BC000011BE1, - 0x11BF000011BFA, - 0x11C0000011C09, - 0x11C0A00011C37, - 0x11C3800011C41, - 0x11C5000011C5A, - 0x11C7200011C90, - 0x11C9200011CA8, - 0x11CA900011CB7, - 0x11D0000011D07, - 0x11D0800011D0A, - 0x11D0B00011D37, - 0x11D3A00011D3B, - 0x11D3C00011D3E, - 0x11D3F00011D48, - 0x11D5000011D5A, - 0x11D6000011D66, - 0x11D6700011D69, - 0x11D6A00011D8F, - 0x11D9000011D92, - 0x11D9300011D99, - 0x11DA000011DAA, - 0x11EE000011EF7, - 0x11F0000011F11, - 0x11F1200011F3B, - 0x11F3E00011F43, - 0x11F5000011F5B, - 0x11FB000011FB1, - 0x120000001239A, - 0x1248000012544, - 0x12F9000012FF1, - 0x1300000013430, - 0x1344000013456, - 0x13460000143FB, - 0x1440000014647, - 0x161000001613A, - 0x1680000016A39, - 0x16A4000016A5F, - 0x16A6000016A6A, - 0x16A7000016ABF, - 0x16AC000016ACA, - 0x16AD000016AEE, - 0x16AF000016AF5, - 0x16B0000016B37, - 0x16B4000016B44, - 0x16B5000016B5A, - 0x16B6300016B78, - 0x16B7D00016B90, - 0x16D4000016D6D, - 0x16D7000016D7A, - 0x16E6000016E80, - 0x16F0000016F4B, - 0x16F4F00016F88, - 0x16F8F00016FA0, - 0x16FE000016FE2, - 0x16FE300016FE5, - 0x16FF000016FF2, - 0x17000000187F8, - 0x1880000018CD6, - 0x18CFF00018D09, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B123, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1B1550001B156, - 0x1B1640001B168, - 0x1B1700001B2FC, - 0x1BC000001BC6B, - 0x1BC700001BC7D, - 0x1BC800001BC89, - 0x1BC900001BC9A, - 0x1BC9D0001BC9F, - 0x1CCF00001CCFA, - 0x1CF000001CF2E, - 0x1CF300001CF47, - 0x1DA000001DA37, - 0x1DA3B0001DA6D, - 0x1DA750001DA76, - 0x1DA840001DA85, - 0x1DA9B0001DAA0, - 0x1DAA10001DAB0, - 0x1DF000001DF1F, - 0x1DF250001DF2B, - 0x1E0000001E007, - 0x1E0080001E019, - 0x1E01B0001E022, - 0x1E0230001E025, - 0x1E0260001E02B, - 0x1E08F0001E090, - 0x1E1000001E12D, - 0x1E1300001E13E, - 0x1E1400001E14A, - 0x1E14E0001E14F, - 0x1E2900001E2AF, - 0x1E2C00001E2FA, - 0x1E4D00001E4FA, - 0x1E5D00001E5FB, - 0x1E7E00001E7E7, - 0x1E7E80001E7EC, - 0x1E7ED0001E7EF, - 0x1E7F00001E7FF, - 0x1E8000001E8C5, - 0x1E8D00001E8D7, - 0x1E9220001E94C, - 0x1E9500001E95A, - 0x200000002A6E0, - 0x2A7000002B73A, - 0x2B7400002B81E, - 0x2B8200002CEA2, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x300000003134B, - 0x31350000323B0, - ), - "CONTEXTJ": (0x200C0000200E,), - "CONTEXTO": ( - 0xB7000000B8, - 0x37500000376, - 0x5F3000005F5, - 0x6600000066A, - 0x6F0000006FA, - 0x30FB000030FC, - ), -} diff --git a/port/lib/python3.11/site-packages/idna/intranges.py b/port/lib/python3.11/site-packages/idna/intranges.py deleted file mode 100644 index 7bfaa8d..0000000 --- a/port/lib/python3.11/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/port/lib/python3.11/site-packages/idna/package_data.py b/port/lib/python3.11/site-packages/idna/package_data.py deleted file mode 100644 index 7272c8d..0000000 --- a/port/lib/python3.11/site-packages/idna/package_data.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "3.11" diff --git a/port/lib/python3.11/site-packages/idna/py.typed b/port/lib/python3.11/site-packages/idna/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/idna/uts46data.py b/port/lib/python3.11/site-packages/idna/uts46data.py deleted file mode 100644 index 4610b71..0000000 --- a/port/lib/python3.11/site-packages/idna/uts46data.py +++ /dev/null @@ -1,8841 +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__ = "16.0.0" - - -def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x0, "V"), - (0x1, "V"), - (0x2, "V"), - (0x3, "V"), - (0x4, "V"), - (0x5, "V"), - (0x6, "V"), - (0x7, "V"), - (0x8, "V"), - (0x9, "V"), - (0xA, "V"), - (0xB, "V"), - (0xC, "V"), - (0xD, "V"), - (0xE, "V"), - (0xF, "V"), - (0x10, "V"), - (0x11, "V"), - (0x12, "V"), - (0x13, "V"), - (0x14, "V"), - (0x15, "V"), - (0x16, "V"), - (0x17, "V"), - (0x18, "V"), - (0x19, "V"), - (0x1A, "V"), - (0x1B, "V"), - (0x1C, "V"), - (0x1D, "V"), - (0x1E, "V"), - (0x1F, "V"), - (0x20, "V"), - (0x21, "V"), - (0x22, "V"), - (0x23, "V"), - (0x24, "V"), - (0x25, "V"), - (0x26, "V"), - (0x27, "V"), - (0x28, "V"), - (0x29, "V"), - (0x2A, "V"), - (0x2B, "V"), - (0x2C, "V"), - (0x2D, "V"), - (0x2E, "V"), - (0x2F, "V"), - (0x30, "V"), - (0x31, "V"), - (0x32, "V"), - (0x33, "V"), - (0x34, "V"), - (0x35, "V"), - (0x36, "V"), - (0x37, "V"), - (0x38, "V"), - (0x39, "V"), - (0x3A, "V"), - (0x3B, "V"), - (0x3C, "V"), - (0x3D, "V"), - (0x3E, "V"), - (0x3F, "V"), - (0x40, "V"), - (0x41, "M", "a"), - (0x42, "M", "b"), - (0x43, "M", "c"), - (0x44, "M", "d"), - (0x45, "M", "e"), - (0x46, "M", "f"), - (0x47, "M", "g"), - (0x48, "M", "h"), - (0x49, "M", "i"), - (0x4A, "M", "j"), - (0x4B, "M", "k"), - (0x4C, "M", "l"), - (0x4D, "M", "m"), - (0x4E, "M", "n"), - (0x4F, "M", "o"), - (0x50, "M", "p"), - (0x51, "M", "q"), - (0x52, "M", "r"), - (0x53, "M", "s"), - (0x54, "M", "t"), - (0x55, "M", "u"), - (0x56, "M", "v"), - (0x57, "M", "w"), - (0x58, "M", "x"), - (0x59, "M", "y"), - (0x5A, "M", "z"), - (0x5B, "V"), - (0x5C, "V"), - (0x5D, "V"), - (0x5E, "V"), - (0x5F, "V"), - (0x60, "V"), - (0x61, "V"), - (0x62, "V"), - (0x63, "V"), - ] - - -def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x64, "V"), - (0x65, "V"), - (0x66, "V"), - (0x67, "V"), - (0x68, "V"), - (0x69, "V"), - (0x6A, "V"), - (0x6B, "V"), - (0x6C, "V"), - (0x6D, "V"), - (0x6E, "V"), - (0x6F, "V"), - (0x70, "V"), - (0x71, "V"), - (0x72, "V"), - (0x73, "V"), - (0x74, "V"), - (0x75, "V"), - (0x76, "V"), - (0x77, "V"), - (0x78, "V"), - (0x79, "V"), - (0x7A, "V"), - (0x7B, "V"), - (0x7C, "V"), - (0x7D, "V"), - (0x7E, "V"), - (0x7F, "V"), - (0x80, "X"), - (0x81, "X"), - (0x82, "X"), - (0x83, "X"), - (0x84, "X"), - (0x85, "X"), - (0x86, "X"), - (0x87, "X"), - (0x88, "X"), - (0x89, "X"), - (0x8A, "X"), - (0x8B, "X"), - (0x8C, "X"), - (0x8D, "X"), - (0x8E, "X"), - (0x8F, "X"), - (0x90, "X"), - (0x91, "X"), - (0x92, "X"), - (0x93, "X"), - (0x94, "X"), - (0x95, "X"), - (0x96, "X"), - (0x97, "X"), - (0x98, "X"), - (0x99, "X"), - (0x9A, "X"), - (0x9B, "X"), - (0x9C, "X"), - (0x9D, "X"), - (0x9E, "X"), - (0x9F, "X"), - (0xA0, "M", " "), - (0xA1, "V"), - (0xA2, "V"), - (0xA3, "V"), - (0xA4, "V"), - (0xA5, "V"), - (0xA6, "V"), - (0xA7, "V"), - (0xA8, "M", " ̈"), - (0xA9, "V"), - (0xAA, "M", "a"), - (0xAB, "V"), - (0xAC, "V"), - (0xAD, "I"), - (0xAE, "V"), - (0xAF, "M", " ̄"), - (0xB0, "V"), - (0xB1, "V"), - (0xB2, "M", "2"), - (0xB3, "M", "3"), - (0xB4, "M", " ́"), - (0xB5, "M", "μ"), - (0xB6, "V"), - (0xB7, "V"), - (0xB8, "M", " ̧"), - (0xB9, "M", "1"), - (0xBA, "M", "o"), - (0xBB, "V"), - (0xBC, "M", "1⁄4"), - (0xBD, "M", "1⁄2"), - (0xBE, "M", "3⁄4"), - (0xBF, "V"), - (0xC0, "M", "à"), - (0xC1, "M", "á"), - (0xC2, "M", "â"), - (0xC3, "M", "ã"), - (0xC4, "M", "ä"), - (0xC5, "M", "å"), - (0xC6, "M", "æ"), - (0xC7, "M", "ç"), - ] - - -def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC8, "M", "è"), - (0xC9, "M", "é"), - (0xCA, "M", "ê"), - (0xCB, "M", "ë"), - (0xCC, "M", "ì"), - (0xCD, "M", "í"), - (0xCE, "M", "î"), - (0xCF, "M", "ï"), - (0xD0, "M", "ð"), - (0xD1, "M", "ñ"), - (0xD2, "M", "ò"), - (0xD3, "M", "ó"), - (0xD4, "M", "ô"), - (0xD5, "M", "õ"), - (0xD6, "M", "ö"), - (0xD7, "V"), - (0xD8, "M", "ø"), - (0xD9, "M", "ù"), - (0xDA, "M", "ú"), - (0xDB, "M", "û"), - (0xDC, "M", "ü"), - (0xDD, "M", "ý"), - (0xDE, "M", "þ"), - (0xDF, "D", "ss"), - (0xE0, "V"), - (0xE1, "V"), - (0xE2, "V"), - (0xE3, "V"), - (0xE4, "V"), - (0xE5, "V"), - (0xE6, "V"), - (0xE7, "V"), - (0xE8, "V"), - (0xE9, "V"), - (0xEA, "V"), - (0xEB, "V"), - (0xEC, "V"), - (0xED, "V"), - (0xEE, "V"), - (0xEF, "V"), - (0xF0, "V"), - (0xF1, "V"), - (0xF2, "V"), - (0xF3, "V"), - (0xF4, "V"), - (0xF5, "V"), - (0xF6, "V"), - (0xF7, "V"), - (0xF8, "V"), - (0xF9, "V"), - (0xFA, "V"), - (0xFB, "V"), - (0xFC, "V"), - (0xFD, "V"), - (0xFE, "V"), - (0xFF, "V"), - (0x100, "M", "ā"), - (0x101, "V"), - (0x102, "M", "ă"), - (0x103, "V"), - (0x104, "M", "ą"), - (0x105, "V"), - (0x106, "M", "ć"), - (0x107, "V"), - (0x108, "M", "ĉ"), - (0x109, "V"), - (0x10A, "M", "ċ"), - (0x10B, "V"), - (0x10C, "M", "č"), - (0x10D, "V"), - (0x10E, "M", "ď"), - (0x10F, "V"), - (0x110, "M", "đ"), - (0x111, "V"), - (0x112, "M", "ē"), - (0x113, "V"), - (0x114, "M", "ĕ"), - (0x115, "V"), - (0x116, "M", "ė"), - (0x117, "V"), - (0x118, "M", "ę"), - (0x119, "V"), - (0x11A, "M", "ě"), - (0x11B, "V"), - (0x11C, "M", "ĝ"), - (0x11D, "V"), - (0x11E, "M", "ğ"), - (0x11F, "V"), - (0x120, "M", "ġ"), - (0x121, "V"), - (0x122, "M", "ģ"), - (0x123, "V"), - (0x124, "M", "ĥ"), - (0x125, "V"), - (0x126, "M", "ħ"), - (0x127, "V"), - (0x128, "M", "ĩ"), - (0x129, "V"), - (0x12A, "M", "ī"), - (0x12B, "V"), - ] - - -def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x12C, "M", "ĭ"), - (0x12D, "V"), - (0x12E, "M", "į"), - (0x12F, "V"), - (0x130, "M", "i̇"), - (0x131, "V"), - (0x132, "M", "ij"), - (0x134, "M", "ĵ"), - (0x135, "V"), - (0x136, "M", "ķ"), - (0x137, "V"), - (0x139, "M", "ĺ"), - (0x13A, "V"), - (0x13B, "M", "ļ"), - (0x13C, "V"), - (0x13D, "M", "ľ"), - (0x13E, "V"), - (0x13F, "M", "l·"), - (0x141, "M", "ł"), - (0x142, "V"), - (0x143, "M", "ń"), - (0x144, "V"), - (0x145, "M", "ņ"), - (0x146, "V"), - (0x147, "M", "ň"), - (0x148, "V"), - (0x149, "M", "ʼn"), - (0x14A, "M", "ŋ"), - (0x14B, "V"), - (0x14C, "M", "ō"), - (0x14D, "V"), - (0x14E, "M", "ŏ"), - (0x14F, "V"), - (0x150, "M", "ő"), - (0x151, "V"), - (0x152, "M", "œ"), - (0x153, "V"), - (0x154, "M", "ŕ"), - (0x155, "V"), - (0x156, "M", "ŗ"), - (0x157, "V"), - (0x158, "M", "ř"), - (0x159, "V"), - (0x15A, "M", "ś"), - (0x15B, "V"), - (0x15C, "M", "ŝ"), - (0x15D, "V"), - (0x15E, "M", "ş"), - (0x15F, "V"), - (0x160, "M", "š"), - (0x161, "V"), - (0x162, "M", "ţ"), - (0x163, "V"), - (0x164, "M", "ť"), - (0x165, "V"), - (0x166, "M", "ŧ"), - (0x167, "V"), - (0x168, "M", "ũ"), - (0x169, "V"), - (0x16A, "M", "ū"), - (0x16B, "V"), - (0x16C, "M", "ŭ"), - (0x16D, "V"), - (0x16E, "M", "ů"), - (0x16F, "V"), - (0x170, "M", "ű"), - (0x171, "V"), - (0x172, "M", "ų"), - (0x173, "V"), - (0x174, "M", "ŵ"), - (0x175, "V"), - (0x176, "M", "ŷ"), - (0x177, "V"), - (0x178, "M", "ÿ"), - (0x179, "M", "ź"), - (0x17A, "V"), - (0x17B, "M", "ż"), - (0x17C, "V"), - (0x17D, "M", "ž"), - (0x17E, "V"), - (0x17F, "M", "s"), - (0x180, "V"), - (0x181, "M", "ɓ"), - (0x182, "M", "ƃ"), - (0x183, "V"), - (0x184, "M", "ƅ"), - (0x185, "V"), - (0x186, "M", "ɔ"), - (0x187, "M", "ƈ"), - (0x188, "V"), - (0x189, "M", "ɖ"), - (0x18A, "M", "ɗ"), - (0x18B, "M", "ƌ"), - (0x18C, "V"), - (0x18E, "M", "ǝ"), - (0x18F, "M", "ə"), - (0x190, "M", "ɛ"), - (0x191, "M", "ƒ"), - (0x192, "V"), - (0x193, "M", "ɠ"), - ] - - -def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x194, "M", "ɣ"), - (0x195, "V"), - (0x196, "M", "ɩ"), - (0x197, "M", "ɨ"), - (0x198, "M", "ƙ"), - (0x199, "V"), - (0x19C, "M", "ɯ"), - (0x19D, "M", "ɲ"), - (0x19E, "V"), - (0x19F, "M", "ɵ"), - (0x1A0, "M", "ơ"), - (0x1A1, "V"), - (0x1A2, "M", "ƣ"), - (0x1A3, "V"), - (0x1A4, "M", "ƥ"), - (0x1A5, "V"), - (0x1A6, "M", "ʀ"), - (0x1A7, "M", "ƨ"), - (0x1A8, "V"), - (0x1A9, "M", "ʃ"), - (0x1AA, "V"), - (0x1AC, "M", "ƭ"), - (0x1AD, "V"), - (0x1AE, "M", "ʈ"), - (0x1AF, "M", "ư"), - (0x1B0, "V"), - (0x1B1, "M", "ʊ"), - (0x1B2, "M", "ʋ"), - (0x1B3, "M", "ƴ"), - (0x1B4, "V"), - (0x1B5, "M", "ƶ"), - (0x1B6, "V"), - (0x1B7, "M", "ʒ"), - (0x1B8, "M", "ƹ"), - (0x1B9, "V"), - (0x1BC, "M", "ƽ"), - (0x1BD, "V"), - (0x1C4, "M", "dž"), - (0x1C7, "M", "lj"), - (0x1CA, "M", "nj"), - (0x1CD, "M", "ǎ"), - (0x1CE, "V"), - (0x1CF, "M", "ǐ"), - (0x1D0, "V"), - (0x1D1, "M", "ǒ"), - (0x1D2, "V"), - (0x1D3, "M", "ǔ"), - (0x1D4, "V"), - (0x1D5, "M", "ǖ"), - (0x1D6, "V"), - (0x1D7, "M", "ǘ"), - (0x1D8, "V"), - (0x1D9, "M", "ǚ"), - (0x1DA, "V"), - (0x1DB, "M", "ǜ"), - (0x1DC, "V"), - (0x1DE, "M", "ǟ"), - (0x1DF, "V"), - (0x1E0, "M", "ǡ"), - (0x1E1, "V"), - (0x1E2, "M", "ǣ"), - (0x1E3, "V"), - (0x1E4, "M", "ǥ"), - (0x1E5, "V"), - (0x1E6, "M", "ǧ"), - (0x1E7, "V"), - (0x1E8, "M", "ǩ"), - (0x1E9, "V"), - (0x1EA, "M", "ǫ"), - (0x1EB, "V"), - (0x1EC, "M", "ǭ"), - (0x1ED, "V"), - (0x1EE, "M", "ǯ"), - (0x1EF, "V"), - (0x1F1, "M", "dz"), - (0x1F4, "M", "ǵ"), - (0x1F5, "V"), - (0x1F6, "M", "ƕ"), - (0x1F7, "M", "ƿ"), - (0x1F8, "M", "ǹ"), - (0x1F9, "V"), - (0x1FA, "M", "ǻ"), - (0x1FB, "V"), - (0x1FC, "M", "ǽ"), - (0x1FD, "V"), - (0x1FE, "M", "ǿ"), - (0x1FF, "V"), - (0x200, "M", "ȁ"), - (0x201, "V"), - (0x202, "M", "ȃ"), - (0x203, "V"), - (0x204, "M", "ȅ"), - (0x205, "V"), - (0x206, "M", "ȇ"), - (0x207, "V"), - (0x208, "M", "ȉ"), - (0x209, "V"), - (0x20A, "M", "ȋ"), - (0x20B, "V"), - (0x20C, "M", "ȍ"), - ] - - -def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x20D, "V"), - (0x20E, "M", "ȏ"), - (0x20F, "V"), - (0x210, "M", "ȑ"), - (0x211, "V"), - (0x212, "M", "ȓ"), - (0x213, "V"), - (0x214, "M", "ȕ"), - (0x215, "V"), - (0x216, "M", "ȗ"), - (0x217, "V"), - (0x218, "M", "ș"), - (0x219, "V"), - (0x21A, "M", "ț"), - (0x21B, "V"), - (0x21C, "M", "ȝ"), - (0x21D, "V"), - (0x21E, "M", "ȟ"), - (0x21F, "V"), - (0x220, "M", "ƞ"), - (0x221, "V"), - (0x222, "M", "ȣ"), - (0x223, "V"), - (0x224, "M", "ȥ"), - (0x225, "V"), - (0x226, "M", "ȧ"), - (0x227, "V"), - (0x228, "M", "ȩ"), - (0x229, "V"), - (0x22A, "M", "ȫ"), - (0x22B, "V"), - (0x22C, "M", "ȭ"), - (0x22D, "V"), - (0x22E, "M", "ȯ"), - (0x22F, "V"), - (0x230, "M", "ȱ"), - (0x231, "V"), - (0x232, "M", "ȳ"), - (0x233, "V"), - (0x23A, "M", "ⱥ"), - (0x23B, "M", "ȼ"), - (0x23C, "V"), - (0x23D, "M", "ƚ"), - (0x23E, "M", "ⱦ"), - (0x23F, "V"), - (0x241, "M", "ɂ"), - (0x242, "V"), - (0x243, "M", "ƀ"), - (0x244, "M", "ʉ"), - (0x245, "M", "ʌ"), - (0x246, "M", "ɇ"), - (0x247, "V"), - (0x248, "M", "ɉ"), - (0x249, "V"), - (0x24A, "M", "ɋ"), - (0x24B, "V"), - (0x24C, "M", "ɍ"), - (0x24D, "V"), - (0x24E, "M", "ɏ"), - (0x24F, "V"), - (0x2B0, "M", "h"), - (0x2B1, "M", "ɦ"), - (0x2B2, "M", "j"), - (0x2B3, "M", "r"), - (0x2B4, "M", "ɹ"), - (0x2B5, "M", "ɻ"), - (0x2B6, "M", "ʁ"), - (0x2B7, "M", "w"), - (0x2B8, "M", "y"), - (0x2B9, "V"), - (0x2D8, "M", " ̆"), - (0x2D9, "M", " ̇"), - (0x2DA, "M", " ̊"), - (0x2DB, "M", " ̨"), - (0x2DC, "M", " ̃"), - (0x2DD, "M", " ̋"), - (0x2DE, "V"), - (0x2E0, "M", "ɣ"), - (0x2E1, "M", "l"), - (0x2E2, "M", "s"), - (0x2E3, "M", "x"), - (0x2E4, "M", "ʕ"), - (0x2E5, "V"), - (0x340, "M", "̀"), - (0x341, "M", "́"), - (0x342, "V"), - (0x343, "M", "̓"), - (0x344, "M", "̈́"), - (0x345, "M", "ι"), - (0x346, "V"), - (0x34F, "I"), - (0x350, "V"), - (0x370, "M", "ͱ"), - (0x371, "V"), - (0x372, "M", "ͳ"), - (0x373, "V"), - (0x374, "M", "ʹ"), - (0x375, "V"), - (0x376, "M", "ͷ"), - (0x377, "V"), - ] - - -def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x378, "X"), - (0x37A, "M", " ι"), - (0x37B, "V"), - (0x37E, "M", ";"), - (0x37F, "M", "ϳ"), - (0x380, "X"), - (0x384, "M", " ́"), - (0x385, "M", " ̈́"), - (0x386, "M", "ά"), - (0x387, "M", "·"), - (0x388, "M", "έ"), - (0x389, "M", "ή"), - (0x38A, "M", "ί"), - (0x38B, "X"), - (0x38C, "M", "ό"), - (0x38D, "X"), - (0x38E, "M", "ύ"), - (0x38F, "M", "ώ"), - (0x390, "V"), - (0x391, "M", "α"), - (0x392, "M", "β"), - (0x393, "M", "γ"), - (0x394, "M", "δ"), - (0x395, "M", "ε"), - (0x396, "M", "ζ"), - (0x397, "M", "η"), - (0x398, "M", "θ"), - (0x399, "M", "ι"), - (0x39A, "M", "κ"), - (0x39B, "M", "λ"), - (0x39C, "M", "μ"), - (0x39D, "M", "ν"), - (0x39E, "M", "ξ"), - (0x39F, "M", "ο"), - (0x3A0, "M", "π"), - (0x3A1, "M", "ρ"), - (0x3A2, "X"), - (0x3A3, "M", "σ"), - (0x3A4, "M", "τ"), - (0x3A5, "M", "υ"), - (0x3A6, "M", "φ"), - (0x3A7, "M", "χ"), - (0x3A8, "M", "ψ"), - (0x3A9, "M", "ω"), - (0x3AA, "M", "ϊ"), - (0x3AB, "M", "ϋ"), - (0x3AC, "V"), - (0x3C2, "D", "σ"), - (0x3C3, "V"), - (0x3CF, "M", "ϗ"), - (0x3D0, "M", "β"), - (0x3D1, "M", "θ"), - (0x3D2, "M", "υ"), - (0x3D3, "M", "ύ"), - (0x3D4, "M", "ϋ"), - (0x3D5, "M", "φ"), - (0x3D6, "M", "π"), - (0x3D7, "V"), - (0x3D8, "M", "ϙ"), - (0x3D9, "V"), - (0x3DA, "M", "ϛ"), - (0x3DB, "V"), - (0x3DC, "M", "ϝ"), - (0x3DD, "V"), - (0x3DE, "M", "ϟ"), - (0x3DF, "V"), - (0x3E0, "M", "ϡ"), - (0x3E1, "V"), - (0x3E2, "M", "ϣ"), - (0x3E3, "V"), - (0x3E4, "M", "ϥ"), - (0x3E5, "V"), - (0x3E6, "M", "ϧ"), - (0x3E7, "V"), - (0x3E8, "M", "ϩ"), - (0x3E9, "V"), - (0x3EA, "M", "ϫ"), - (0x3EB, "V"), - (0x3EC, "M", "ϭ"), - (0x3ED, "V"), - (0x3EE, "M", "ϯ"), - (0x3EF, "V"), - (0x3F0, "M", "κ"), - (0x3F1, "M", "ρ"), - (0x3F2, "M", "σ"), - (0x3F3, "V"), - (0x3F4, "M", "θ"), - (0x3F5, "M", "ε"), - (0x3F6, "V"), - (0x3F7, "M", "ϸ"), - (0x3F8, "V"), - (0x3F9, "M", "σ"), - (0x3FA, "M", "ϻ"), - (0x3FB, "V"), - (0x3FD, "M", "ͻ"), - (0x3FE, "M", "ͼ"), - (0x3FF, "M", "ͽ"), - (0x400, "M", "ѐ"), - (0x401, "M", "ё"), - (0x402, "M", "ђ"), - ] - - -def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x403, "M", "ѓ"), - (0x404, "M", "є"), - (0x405, "M", "ѕ"), - (0x406, "M", "і"), - (0x407, "M", "ї"), - (0x408, "M", "ј"), - (0x409, "M", "љ"), - (0x40A, "M", "њ"), - (0x40B, "M", "ћ"), - (0x40C, "M", "ќ"), - (0x40D, "M", "ѝ"), - (0x40E, "M", "ў"), - (0x40F, "M", "џ"), - (0x410, "M", "а"), - (0x411, "M", "б"), - (0x412, "M", "в"), - (0x413, "M", "г"), - (0x414, "M", "д"), - (0x415, "M", "е"), - (0x416, "M", "ж"), - (0x417, "M", "з"), - (0x418, "M", "и"), - (0x419, "M", "й"), - (0x41A, "M", "к"), - (0x41B, "M", "л"), - (0x41C, "M", "м"), - (0x41D, "M", "н"), - (0x41E, "M", "о"), - (0x41F, "M", "п"), - (0x420, "M", "р"), - (0x421, "M", "с"), - (0x422, "M", "т"), - (0x423, "M", "у"), - (0x424, "M", "ф"), - (0x425, "M", "х"), - (0x426, "M", "ц"), - (0x427, "M", "ч"), - (0x428, "M", "ш"), - (0x429, "M", "щ"), - (0x42A, "M", "ъ"), - (0x42B, "M", "ы"), - (0x42C, "M", "ь"), - (0x42D, "M", "э"), - (0x42E, "M", "ю"), - (0x42F, "M", "я"), - (0x430, "V"), - (0x460, "M", "ѡ"), - (0x461, "V"), - (0x462, "M", "ѣ"), - (0x463, "V"), - (0x464, "M", "ѥ"), - (0x465, "V"), - (0x466, "M", "ѧ"), - (0x467, "V"), - (0x468, "M", "ѩ"), - (0x469, "V"), - (0x46A, "M", "ѫ"), - (0x46B, "V"), - (0x46C, "M", "ѭ"), - (0x46D, "V"), - (0x46E, "M", "ѯ"), - (0x46F, "V"), - (0x470, "M", "ѱ"), - (0x471, "V"), - (0x472, "M", "ѳ"), - (0x473, "V"), - (0x474, "M", "ѵ"), - (0x475, "V"), - (0x476, "M", "ѷ"), - (0x477, "V"), - (0x478, "M", "ѹ"), - (0x479, "V"), - (0x47A, "M", "ѻ"), - (0x47B, "V"), - (0x47C, "M", "ѽ"), - (0x47D, "V"), - (0x47E, "M", "ѿ"), - (0x47F, "V"), - (0x480, "M", "ҁ"), - (0x481, "V"), - (0x48A, "M", "ҋ"), - (0x48B, "V"), - (0x48C, "M", "ҍ"), - (0x48D, "V"), - (0x48E, "M", "ҏ"), - (0x48F, "V"), - (0x490, "M", "ґ"), - (0x491, "V"), - (0x492, "M", "ғ"), - (0x493, "V"), - (0x494, "M", "ҕ"), - (0x495, "V"), - (0x496, "M", "җ"), - (0x497, "V"), - (0x498, "M", "ҙ"), - (0x499, "V"), - (0x49A, "M", "қ"), - (0x49B, "V"), - (0x49C, "M", "ҝ"), - (0x49D, "V"), - ] - - -def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x49E, "M", "ҟ"), - (0x49F, "V"), - (0x4A0, "M", "ҡ"), - (0x4A1, "V"), - (0x4A2, "M", "ң"), - (0x4A3, "V"), - (0x4A4, "M", "ҥ"), - (0x4A5, "V"), - (0x4A6, "M", "ҧ"), - (0x4A7, "V"), - (0x4A8, "M", "ҩ"), - (0x4A9, "V"), - (0x4AA, "M", "ҫ"), - (0x4AB, "V"), - (0x4AC, "M", "ҭ"), - (0x4AD, "V"), - (0x4AE, "M", "ү"), - (0x4AF, "V"), - (0x4B0, "M", "ұ"), - (0x4B1, "V"), - (0x4B2, "M", "ҳ"), - (0x4B3, "V"), - (0x4B4, "M", "ҵ"), - (0x4B5, "V"), - (0x4B6, "M", "ҷ"), - (0x4B7, "V"), - (0x4B8, "M", "ҹ"), - (0x4B9, "V"), - (0x4BA, "M", "һ"), - (0x4BB, "V"), - (0x4BC, "M", "ҽ"), - (0x4BD, "V"), - (0x4BE, "M", "ҿ"), - (0x4BF, "V"), - (0x4C0, "M", "ӏ"), - (0x4C1, "M", "ӂ"), - (0x4C2, "V"), - (0x4C3, "M", "ӄ"), - (0x4C4, "V"), - (0x4C5, "M", "ӆ"), - (0x4C6, "V"), - (0x4C7, "M", "ӈ"), - (0x4C8, "V"), - (0x4C9, "M", "ӊ"), - (0x4CA, "V"), - (0x4CB, "M", "ӌ"), - (0x4CC, "V"), - (0x4CD, "M", "ӎ"), - (0x4CE, "V"), - (0x4D0, "M", "ӑ"), - (0x4D1, "V"), - (0x4D2, "M", "ӓ"), - (0x4D3, "V"), - (0x4D4, "M", "ӕ"), - (0x4D5, "V"), - (0x4D6, "M", "ӗ"), - (0x4D7, "V"), - (0x4D8, "M", "ә"), - (0x4D9, "V"), - (0x4DA, "M", "ӛ"), - (0x4DB, "V"), - (0x4DC, "M", "ӝ"), - (0x4DD, "V"), - (0x4DE, "M", "ӟ"), - (0x4DF, "V"), - (0x4E0, "M", "ӡ"), - (0x4E1, "V"), - (0x4E2, "M", "ӣ"), - (0x4E3, "V"), - (0x4E4, "M", "ӥ"), - (0x4E5, "V"), - (0x4E6, "M", "ӧ"), - (0x4E7, "V"), - (0x4E8, "M", "ө"), - (0x4E9, "V"), - (0x4EA, "M", "ӫ"), - (0x4EB, "V"), - (0x4EC, "M", "ӭ"), - (0x4ED, "V"), - (0x4EE, "M", "ӯ"), - (0x4EF, "V"), - (0x4F0, "M", "ӱ"), - (0x4F1, "V"), - (0x4F2, "M", "ӳ"), - (0x4F3, "V"), - (0x4F4, "M", "ӵ"), - (0x4F5, "V"), - (0x4F6, "M", "ӷ"), - (0x4F7, "V"), - (0x4F8, "M", "ӹ"), - (0x4F9, "V"), - (0x4FA, "M", "ӻ"), - (0x4FB, "V"), - (0x4FC, "M", "ӽ"), - (0x4FD, "V"), - (0x4FE, "M", "ӿ"), - (0x4FF, "V"), - (0x500, "M", "ԁ"), - (0x501, "V"), - (0x502, "M", "ԃ"), - ] - - -def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x503, "V"), - (0x504, "M", "ԅ"), - (0x505, "V"), - (0x506, "M", "ԇ"), - (0x507, "V"), - (0x508, "M", "ԉ"), - (0x509, "V"), - (0x50A, "M", "ԋ"), - (0x50B, "V"), - (0x50C, "M", "ԍ"), - (0x50D, "V"), - (0x50E, "M", "ԏ"), - (0x50F, "V"), - (0x510, "M", "ԑ"), - (0x511, "V"), - (0x512, "M", "ԓ"), - (0x513, "V"), - (0x514, "M", "ԕ"), - (0x515, "V"), - (0x516, "M", "ԗ"), - (0x517, "V"), - (0x518, "M", "ԙ"), - (0x519, "V"), - (0x51A, "M", "ԛ"), - (0x51B, "V"), - (0x51C, "M", "ԝ"), - (0x51D, "V"), - (0x51E, "M", "ԟ"), - (0x51F, "V"), - (0x520, "M", "ԡ"), - (0x521, "V"), - (0x522, "M", "ԣ"), - (0x523, "V"), - (0x524, "M", "ԥ"), - (0x525, "V"), - (0x526, "M", "ԧ"), - (0x527, "V"), - (0x528, "M", "ԩ"), - (0x529, "V"), - (0x52A, "M", "ԫ"), - (0x52B, "V"), - (0x52C, "M", "ԭ"), - (0x52D, "V"), - (0x52E, "M", "ԯ"), - (0x52F, "V"), - (0x530, "X"), - (0x531, "M", "ա"), - (0x532, "M", "բ"), - (0x533, "M", "գ"), - (0x534, "M", "դ"), - (0x535, "M", "ե"), - (0x536, "M", "զ"), - (0x537, "M", "է"), - (0x538, "M", "ը"), - (0x539, "M", "թ"), - (0x53A, "M", "ժ"), - (0x53B, "M", "ի"), - (0x53C, "M", "լ"), - (0x53D, "M", "խ"), - (0x53E, "M", "ծ"), - (0x53F, "M", "կ"), - (0x540, "M", "հ"), - (0x541, "M", "ձ"), - (0x542, "M", "ղ"), - (0x543, "M", "ճ"), - (0x544, "M", "մ"), - (0x545, "M", "յ"), - (0x546, "M", "ն"), - (0x547, "M", "շ"), - (0x548, "M", "ո"), - (0x549, "M", "չ"), - (0x54A, "M", "պ"), - (0x54B, "M", "ջ"), - (0x54C, "M", "ռ"), - (0x54D, "M", "ս"), - (0x54E, "M", "վ"), - (0x54F, "M", "տ"), - (0x550, "M", "ր"), - (0x551, "M", "ց"), - (0x552, "M", "ւ"), - (0x553, "M", "փ"), - (0x554, "M", "ք"), - (0x555, "M", "օ"), - (0x556, "M", "ֆ"), - (0x557, "X"), - (0x559, "V"), - (0x587, "M", "եւ"), - (0x588, "V"), - (0x58B, "X"), - (0x58D, "V"), - (0x590, "X"), - (0x591, "V"), - (0x5C8, "X"), - (0x5D0, "V"), - (0x5EB, "X"), - (0x5EF, "V"), - (0x5F5, "X"), - (0x606, "V"), - (0x61C, "X"), - (0x61D, "V"), - ] - - -def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x675, "M", "اٴ"), - (0x676, "M", "وٴ"), - (0x677, "M", "ۇٴ"), - (0x678, "M", "يٴ"), - (0x679, "V"), - (0x6DD, "X"), - (0x6DE, "V"), - (0x70E, "X"), - (0x710, "V"), - (0x74B, "X"), - (0x74D, "V"), - (0x7B2, "X"), - (0x7C0, "V"), - (0x7FB, "X"), - (0x7FD, "V"), - (0x82E, "X"), - (0x830, "V"), - (0x83F, "X"), - (0x840, "V"), - (0x85C, "X"), - (0x85E, "V"), - (0x85F, "X"), - (0x860, "V"), - (0x86B, "X"), - (0x870, "V"), - (0x88F, "X"), - (0x897, "V"), - (0x8E2, "X"), - (0x8E3, "V"), - (0x958, "M", "क़"), - (0x959, "M", "ख़"), - (0x95A, "M", "ग़"), - (0x95B, "M", "ज़"), - (0x95C, "M", "ड़"), - (0x95D, "M", "ढ़"), - (0x95E, "M", "फ़"), - (0x95F, "M", "य़"), - (0x960, "V"), - (0x984, "X"), - (0x985, "V"), - (0x98D, "X"), - (0x98F, "V"), - (0x991, "X"), - (0x993, "V"), - (0x9A9, "X"), - (0x9AA, "V"), - (0x9B1, "X"), - (0x9B2, "V"), - (0x9B3, "X"), - (0x9B6, "V"), - (0x9BA, "X"), - (0x9BC, "V"), - (0x9C5, "X"), - (0x9C7, "V"), - (0x9C9, "X"), - (0x9CB, "V"), - (0x9CF, "X"), - (0x9D7, "V"), - (0x9D8, "X"), - (0x9DC, "M", "ড়"), - (0x9DD, "M", "ঢ়"), - (0x9DE, "X"), - (0x9DF, "M", "য়"), - (0x9E0, "V"), - (0x9E4, "X"), - (0x9E6, "V"), - (0x9FF, "X"), - (0xA01, "V"), - (0xA04, "X"), - (0xA05, "V"), - (0xA0B, "X"), - (0xA0F, "V"), - (0xA11, "X"), - (0xA13, "V"), - (0xA29, "X"), - (0xA2A, "V"), - (0xA31, "X"), - (0xA32, "V"), - (0xA33, "M", "ਲ਼"), - (0xA34, "X"), - (0xA35, "V"), - (0xA36, "M", "ਸ਼"), - (0xA37, "X"), - (0xA38, "V"), - (0xA3A, "X"), - (0xA3C, "V"), - (0xA3D, "X"), - (0xA3E, "V"), - (0xA43, "X"), - (0xA47, "V"), - (0xA49, "X"), - (0xA4B, "V"), - (0xA4E, "X"), - (0xA51, "V"), - (0xA52, "X"), - (0xA59, "M", "ਖ਼"), - (0xA5A, "M", "ਗ਼"), - (0xA5B, "M", "ਜ਼"), - (0xA5C, "V"), - (0xA5D, "X"), - ] - - -def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA5E, "M", "ਫ਼"), - (0xA5F, "X"), - (0xA66, "V"), - (0xA77, "X"), - (0xA81, "V"), - (0xA84, "X"), - (0xA85, "V"), - (0xA8E, "X"), - (0xA8F, "V"), - (0xA92, "X"), - (0xA93, "V"), - (0xAA9, "X"), - (0xAAA, "V"), - (0xAB1, "X"), - (0xAB2, "V"), - (0xAB4, "X"), - (0xAB5, "V"), - (0xABA, "X"), - (0xABC, "V"), - (0xAC6, "X"), - (0xAC7, "V"), - (0xACA, "X"), - (0xACB, "V"), - (0xACE, "X"), - (0xAD0, "V"), - (0xAD1, "X"), - (0xAE0, "V"), - (0xAE4, "X"), - (0xAE6, "V"), - (0xAF2, "X"), - (0xAF9, "V"), - (0xB00, "X"), - (0xB01, "V"), - (0xB04, "X"), - (0xB05, "V"), - (0xB0D, "X"), - (0xB0F, "V"), - (0xB11, "X"), - (0xB13, "V"), - (0xB29, "X"), - (0xB2A, "V"), - (0xB31, "X"), - (0xB32, "V"), - (0xB34, "X"), - (0xB35, "V"), - (0xB3A, "X"), - (0xB3C, "V"), - (0xB45, "X"), - (0xB47, "V"), - (0xB49, "X"), - (0xB4B, "V"), - (0xB4E, "X"), - (0xB55, "V"), - (0xB58, "X"), - (0xB5C, "M", "ଡ଼"), - (0xB5D, "M", "ଢ଼"), - (0xB5E, "X"), - (0xB5F, "V"), - (0xB64, "X"), - (0xB66, "V"), - (0xB78, "X"), - (0xB82, "V"), - (0xB84, "X"), - (0xB85, "V"), - (0xB8B, "X"), - (0xB8E, "V"), - (0xB91, "X"), - (0xB92, "V"), - (0xB96, "X"), - (0xB99, "V"), - (0xB9B, "X"), - (0xB9C, "V"), - (0xB9D, "X"), - (0xB9E, "V"), - (0xBA0, "X"), - (0xBA3, "V"), - (0xBA5, "X"), - (0xBA8, "V"), - (0xBAB, "X"), - (0xBAE, "V"), - (0xBBA, "X"), - (0xBBE, "V"), - (0xBC3, "X"), - (0xBC6, "V"), - (0xBC9, "X"), - (0xBCA, "V"), - (0xBCE, "X"), - (0xBD0, "V"), - (0xBD1, "X"), - (0xBD7, "V"), - (0xBD8, "X"), - (0xBE6, "V"), - (0xBFB, "X"), - (0xC00, "V"), - (0xC0D, "X"), - (0xC0E, "V"), - (0xC11, "X"), - (0xC12, "V"), - (0xC29, "X"), - (0xC2A, "V"), - ] - - -def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xC3A, "X"), - (0xC3C, "V"), - (0xC45, "X"), - (0xC46, "V"), - (0xC49, "X"), - (0xC4A, "V"), - (0xC4E, "X"), - (0xC55, "V"), - (0xC57, "X"), - (0xC58, "V"), - (0xC5B, "X"), - (0xC5D, "V"), - (0xC5E, "X"), - (0xC60, "V"), - (0xC64, "X"), - (0xC66, "V"), - (0xC70, "X"), - (0xC77, "V"), - (0xC8D, "X"), - (0xC8E, "V"), - (0xC91, "X"), - (0xC92, "V"), - (0xCA9, "X"), - (0xCAA, "V"), - (0xCB4, "X"), - (0xCB5, "V"), - (0xCBA, "X"), - (0xCBC, "V"), - (0xCC5, "X"), - (0xCC6, "V"), - (0xCC9, "X"), - (0xCCA, "V"), - (0xCCE, "X"), - (0xCD5, "V"), - (0xCD7, "X"), - (0xCDD, "V"), - (0xCDF, "X"), - (0xCE0, "V"), - (0xCE4, "X"), - (0xCE6, "V"), - (0xCF0, "X"), - (0xCF1, "V"), - (0xCF4, "X"), - (0xD00, "V"), - (0xD0D, "X"), - (0xD0E, "V"), - (0xD11, "X"), - (0xD12, "V"), - (0xD45, "X"), - (0xD46, "V"), - (0xD49, "X"), - (0xD4A, "V"), - (0xD50, "X"), - (0xD54, "V"), - (0xD64, "X"), - (0xD66, "V"), - (0xD80, "X"), - (0xD81, "V"), - (0xD84, "X"), - (0xD85, "V"), - (0xD97, "X"), - (0xD9A, "V"), - (0xDB2, "X"), - (0xDB3, "V"), - (0xDBC, "X"), - (0xDBD, "V"), - (0xDBE, "X"), - (0xDC0, "V"), - (0xDC7, "X"), - (0xDCA, "V"), - (0xDCB, "X"), - (0xDCF, "V"), - (0xDD5, "X"), - (0xDD6, "V"), - (0xDD7, "X"), - (0xDD8, "V"), - (0xDE0, "X"), - (0xDE6, "V"), - (0xDF0, "X"), - (0xDF2, "V"), - (0xDF5, "X"), - (0xE01, "V"), - (0xE33, "M", "ํา"), - (0xE34, "V"), - (0xE3B, "X"), - (0xE3F, "V"), - (0xE5C, "X"), - (0xE81, "V"), - (0xE83, "X"), - (0xE84, "V"), - (0xE85, "X"), - (0xE86, "V"), - (0xE8B, "X"), - (0xE8C, "V"), - (0xEA4, "X"), - (0xEA5, "V"), - (0xEA6, "X"), - (0xEA7, "V"), - (0xEB3, "M", "ໍາ"), - (0xEB4, "V"), - ] - - -def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xEBE, "X"), - (0xEC0, "V"), - (0xEC5, "X"), - (0xEC6, "V"), - (0xEC7, "X"), - (0xEC8, "V"), - (0xECF, "X"), - (0xED0, "V"), - (0xEDA, "X"), - (0xEDC, "M", "ຫນ"), - (0xEDD, "M", "ຫມ"), - (0xEDE, "V"), - (0xEE0, "X"), - (0xF00, "V"), - (0xF0C, "M", "་"), - (0xF0D, "V"), - (0xF43, "M", "གྷ"), - (0xF44, "V"), - (0xF48, "X"), - (0xF49, "V"), - (0xF4D, "M", "ཌྷ"), - (0xF4E, "V"), - (0xF52, "M", "དྷ"), - (0xF53, "V"), - (0xF57, "M", "བྷ"), - (0xF58, "V"), - (0xF5C, "M", "ཛྷ"), - (0xF5D, "V"), - (0xF69, "M", "ཀྵ"), - (0xF6A, "V"), - (0xF6D, "X"), - (0xF71, "V"), - (0xF73, "M", "ཱི"), - (0xF74, "V"), - (0xF75, "M", "ཱུ"), - (0xF76, "M", "ྲྀ"), - (0xF77, "M", "ྲཱྀ"), - (0xF78, "M", "ླྀ"), - (0xF79, "M", "ླཱྀ"), - (0xF7A, "V"), - (0xF81, "M", "ཱྀ"), - (0xF82, "V"), - (0xF93, "M", "ྒྷ"), - (0xF94, "V"), - (0xF98, "X"), - (0xF99, "V"), - (0xF9D, "M", "ྜྷ"), - (0xF9E, "V"), - (0xFA2, "M", "ྡྷ"), - (0xFA3, "V"), - (0xFA7, "M", "ྦྷ"), - (0xFA8, "V"), - (0xFAC, "M", "ྫྷ"), - (0xFAD, "V"), - (0xFB9, "M", "ྐྵ"), - (0xFBA, "V"), - (0xFBD, "X"), - (0xFBE, "V"), - (0xFCD, "X"), - (0xFCE, "V"), - (0xFDB, "X"), - (0x1000, "V"), - (0x10A0, "M", "ⴀ"), - (0x10A1, "M", "ⴁ"), - (0x10A2, "M", "ⴂ"), - (0x10A3, "M", "ⴃ"), - (0x10A4, "M", "ⴄ"), - (0x10A5, "M", "ⴅ"), - (0x10A6, "M", "ⴆ"), - (0x10A7, "M", "ⴇ"), - (0x10A8, "M", "ⴈ"), - (0x10A9, "M", "ⴉ"), - (0x10AA, "M", "ⴊ"), - (0x10AB, "M", "ⴋ"), - (0x10AC, "M", "ⴌ"), - (0x10AD, "M", "ⴍ"), - (0x10AE, "M", "ⴎ"), - (0x10AF, "M", "ⴏ"), - (0x10B0, "M", "ⴐ"), - (0x10B1, "M", "ⴑ"), - (0x10B2, "M", "ⴒ"), - (0x10B3, "M", "ⴓ"), - (0x10B4, "M", "ⴔ"), - (0x10B5, "M", "ⴕ"), - (0x10B6, "M", "ⴖ"), - (0x10B7, "M", "ⴗ"), - (0x10B8, "M", "ⴘ"), - (0x10B9, "M", "ⴙ"), - (0x10BA, "M", "ⴚ"), - (0x10BB, "M", "ⴛ"), - (0x10BC, "M", "ⴜ"), - (0x10BD, "M", "ⴝ"), - (0x10BE, "M", "ⴞ"), - (0x10BF, "M", "ⴟ"), - (0x10C0, "M", "ⴠ"), - (0x10C1, "M", "ⴡ"), - (0x10C2, "M", "ⴢ"), - (0x10C3, "M", "ⴣ"), - (0x10C4, "M", "ⴤ"), - (0x10C5, "M", "ⴥ"), - ] - - -def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x10C6, "X"), - (0x10C7, "M", "ⴧ"), - (0x10C8, "X"), - (0x10CD, "M", "ⴭ"), - (0x10CE, "X"), - (0x10D0, "V"), - (0x10FC, "M", "ნ"), - (0x10FD, "V"), - (0x115F, "I"), - (0x1161, "V"), - (0x1249, "X"), - (0x124A, "V"), - (0x124E, "X"), - (0x1250, "V"), - (0x1257, "X"), - (0x1258, "V"), - (0x1259, "X"), - (0x125A, "V"), - (0x125E, "X"), - (0x1260, "V"), - (0x1289, "X"), - (0x128A, "V"), - (0x128E, "X"), - (0x1290, "V"), - (0x12B1, "X"), - (0x12B2, "V"), - (0x12B6, "X"), - (0x12B8, "V"), - (0x12BF, "X"), - (0x12C0, "V"), - (0x12C1, "X"), - (0x12C2, "V"), - (0x12C6, "X"), - (0x12C8, "V"), - (0x12D7, "X"), - (0x12D8, "V"), - (0x1311, "X"), - (0x1312, "V"), - (0x1316, "X"), - (0x1318, "V"), - (0x135B, "X"), - (0x135D, "V"), - (0x137D, "X"), - (0x1380, "V"), - (0x139A, "X"), - (0x13A0, "V"), - (0x13F6, "X"), - (0x13F8, "M", "Ᏸ"), - (0x13F9, "M", "Ᏹ"), - (0x13FA, "M", "Ᏺ"), - (0x13FB, "M", "Ᏻ"), - (0x13FC, "M", "Ᏼ"), - (0x13FD, "M", "Ᏽ"), - (0x13FE, "X"), - (0x1400, "V"), - (0x1680, "X"), - (0x1681, "V"), - (0x169D, "X"), - (0x16A0, "V"), - (0x16F9, "X"), - (0x1700, "V"), - (0x1716, "X"), - (0x171F, "V"), - (0x1737, "X"), - (0x1740, "V"), - (0x1754, "X"), - (0x1760, "V"), - (0x176D, "X"), - (0x176E, "V"), - (0x1771, "X"), - (0x1772, "V"), - (0x1774, "X"), - (0x1780, "V"), - (0x17B4, "I"), - (0x17B6, "V"), - (0x17DE, "X"), - (0x17E0, "V"), - (0x17EA, "X"), - (0x17F0, "V"), - (0x17FA, "X"), - (0x1800, "V"), - (0x180B, "I"), - (0x1810, "V"), - (0x181A, "X"), - (0x1820, "V"), - (0x1879, "X"), - (0x1880, "V"), - (0x18AB, "X"), - (0x18B0, "V"), - (0x18F6, "X"), - (0x1900, "V"), - (0x191F, "X"), - (0x1920, "V"), - (0x192C, "X"), - (0x1930, "V"), - (0x193C, "X"), - (0x1940, "V"), - (0x1941, "X"), - (0x1944, "V"), - (0x196E, "X"), - ] - - -def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1970, "V"), - (0x1975, "X"), - (0x1980, "V"), - (0x19AC, "X"), - (0x19B0, "V"), - (0x19CA, "X"), - (0x19D0, "V"), - (0x19DB, "X"), - (0x19DE, "V"), - (0x1A1C, "X"), - (0x1A1E, "V"), - (0x1A5F, "X"), - (0x1A60, "V"), - (0x1A7D, "X"), - (0x1A7F, "V"), - (0x1A8A, "X"), - (0x1A90, "V"), - (0x1A9A, "X"), - (0x1AA0, "V"), - (0x1AAE, "X"), - (0x1AB0, "V"), - (0x1ACF, "X"), - (0x1B00, "V"), - (0x1B4D, "X"), - (0x1B4E, "V"), - (0x1BF4, "X"), - (0x1BFC, "V"), - (0x1C38, "X"), - (0x1C3B, "V"), - (0x1C4A, "X"), - (0x1C4D, "V"), - (0x1C80, "M", "в"), - (0x1C81, "M", "д"), - (0x1C82, "M", "о"), - (0x1C83, "M", "с"), - (0x1C84, "M", "т"), - (0x1C86, "M", "ъ"), - (0x1C87, "M", "ѣ"), - (0x1C88, "M", "ꙋ"), - (0x1C89, "M", "ᲊ"), - (0x1C8A, "V"), - (0x1C8B, "X"), - (0x1C90, "M", "ა"), - (0x1C91, "M", "ბ"), - (0x1C92, "M", "გ"), - (0x1C93, "M", "დ"), - (0x1C94, "M", "ე"), - (0x1C95, "M", "ვ"), - (0x1C96, "M", "ზ"), - (0x1C97, "M", "თ"), - (0x1C98, "M", "ი"), - (0x1C99, "M", "კ"), - (0x1C9A, "M", "ლ"), - (0x1C9B, "M", "მ"), - (0x1C9C, "M", "ნ"), - (0x1C9D, "M", "ო"), - (0x1C9E, "M", "პ"), - (0x1C9F, "M", "ჟ"), - (0x1CA0, "M", "რ"), - (0x1CA1, "M", "ს"), - (0x1CA2, "M", "ტ"), - (0x1CA3, "M", "უ"), - (0x1CA4, "M", "ფ"), - (0x1CA5, "M", "ქ"), - (0x1CA6, "M", "ღ"), - (0x1CA7, "M", "ყ"), - (0x1CA8, "M", "შ"), - (0x1CA9, "M", "ჩ"), - (0x1CAA, "M", "ც"), - (0x1CAB, "M", "ძ"), - (0x1CAC, "M", "წ"), - (0x1CAD, "M", "ჭ"), - (0x1CAE, "M", "ხ"), - (0x1CAF, "M", "ჯ"), - (0x1CB0, "M", "ჰ"), - (0x1CB1, "M", "ჱ"), - (0x1CB2, "M", "ჲ"), - (0x1CB3, "M", "ჳ"), - (0x1CB4, "M", "ჴ"), - (0x1CB5, "M", "ჵ"), - (0x1CB6, "M", "ჶ"), - (0x1CB7, "M", "ჷ"), - (0x1CB8, "M", "ჸ"), - (0x1CB9, "M", "ჹ"), - (0x1CBA, "M", "ჺ"), - (0x1CBB, "X"), - (0x1CBD, "M", "ჽ"), - (0x1CBE, "M", "ჾ"), - (0x1CBF, "M", "ჿ"), - (0x1CC0, "V"), - (0x1CC8, "X"), - (0x1CD0, "V"), - (0x1CFB, "X"), - (0x1D00, "V"), - (0x1D2C, "M", "a"), - (0x1D2D, "M", "æ"), - (0x1D2E, "M", "b"), - (0x1D2F, "V"), - (0x1D30, "M", "d"), - (0x1D31, "M", "e"), - ] - - -def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D32, "M", "ǝ"), - (0x1D33, "M", "g"), - (0x1D34, "M", "h"), - (0x1D35, "M", "i"), - (0x1D36, "M", "j"), - (0x1D37, "M", "k"), - (0x1D38, "M", "l"), - (0x1D39, "M", "m"), - (0x1D3A, "M", "n"), - (0x1D3B, "V"), - (0x1D3C, "M", "o"), - (0x1D3D, "M", "ȣ"), - (0x1D3E, "M", "p"), - (0x1D3F, "M", "r"), - (0x1D40, "M", "t"), - (0x1D41, "M", "u"), - (0x1D42, "M", "w"), - (0x1D43, "M", "a"), - (0x1D44, "M", "ɐ"), - (0x1D45, "M", "ɑ"), - (0x1D46, "M", "ᴂ"), - (0x1D47, "M", "b"), - (0x1D48, "M", "d"), - (0x1D49, "M", "e"), - (0x1D4A, "M", "ə"), - (0x1D4B, "M", "ɛ"), - (0x1D4C, "M", "ɜ"), - (0x1D4D, "M", "g"), - (0x1D4E, "V"), - (0x1D4F, "M", "k"), - (0x1D50, "M", "m"), - (0x1D51, "M", "ŋ"), - (0x1D52, "M", "o"), - (0x1D53, "M", "ɔ"), - (0x1D54, "M", "ᴖ"), - (0x1D55, "M", "ᴗ"), - (0x1D56, "M", "p"), - (0x1D57, "M", "t"), - (0x1D58, "M", "u"), - (0x1D59, "M", "ᴝ"), - (0x1D5A, "M", "ɯ"), - (0x1D5B, "M", "v"), - (0x1D5C, "M", "ᴥ"), - (0x1D5D, "M", "β"), - (0x1D5E, "M", "γ"), - (0x1D5F, "M", "δ"), - (0x1D60, "M", "φ"), - (0x1D61, "M", "χ"), - (0x1D62, "M", "i"), - (0x1D63, "M", "r"), - (0x1D64, "M", "u"), - (0x1D65, "M", "v"), - (0x1D66, "M", "β"), - (0x1D67, "M", "γ"), - (0x1D68, "M", "ρ"), - (0x1D69, "M", "φ"), - (0x1D6A, "M", "χ"), - (0x1D6B, "V"), - (0x1D78, "M", "н"), - (0x1D79, "V"), - (0x1D9B, "M", "ɒ"), - (0x1D9C, "M", "c"), - (0x1D9D, "M", "ɕ"), - (0x1D9E, "M", "ð"), - (0x1D9F, "M", "ɜ"), - (0x1DA0, "M", "f"), - (0x1DA1, "M", "ɟ"), - (0x1DA2, "M", "ɡ"), - (0x1DA3, "M", "ɥ"), - (0x1DA4, "M", "ɨ"), - (0x1DA5, "M", "ɩ"), - (0x1DA6, "M", "ɪ"), - (0x1DA7, "M", "ᵻ"), - (0x1DA8, "M", "ʝ"), - (0x1DA9, "M", "ɭ"), - (0x1DAA, "M", "ᶅ"), - (0x1DAB, "M", "ʟ"), - (0x1DAC, "M", "ɱ"), - (0x1DAD, "M", "ɰ"), - (0x1DAE, "M", "ɲ"), - (0x1DAF, "M", "ɳ"), - (0x1DB0, "M", "ɴ"), - (0x1DB1, "M", "ɵ"), - (0x1DB2, "M", "ɸ"), - (0x1DB3, "M", "ʂ"), - (0x1DB4, "M", "ʃ"), - (0x1DB5, "M", "ƫ"), - (0x1DB6, "M", "ʉ"), - (0x1DB7, "M", "ʊ"), - (0x1DB8, "M", "ᴜ"), - (0x1DB9, "M", "ʋ"), - (0x1DBA, "M", "ʌ"), - (0x1DBB, "M", "z"), - (0x1DBC, "M", "ʐ"), - (0x1DBD, "M", "ʑ"), - (0x1DBE, "M", "ʒ"), - (0x1DBF, "M", "θ"), - (0x1DC0, "V"), - (0x1E00, "M", "ḁ"), - (0x1E01, "V"), - ] - - -def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E02, "M", "ḃ"), - (0x1E03, "V"), - (0x1E04, "M", "ḅ"), - (0x1E05, "V"), - (0x1E06, "M", "ḇ"), - (0x1E07, "V"), - (0x1E08, "M", "ḉ"), - (0x1E09, "V"), - (0x1E0A, "M", "ḋ"), - (0x1E0B, "V"), - (0x1E0C, "M", "ḍ"), - (0x1E0D, "V"), - (0x1E0E, "M", "ḏ"), - (0x1E0F, "V"), - (0x1E10, "M", "ḑ"), - (0x1E11, "V"), - (0x1E12, "M", "ḓ"), - (0x1E13, "V"), - (0x1E14, "M", "ḕ"), - (0x1E15, "V"), - (0x1E16, "M", "ḗ"), - (0x1E17, "V"), - (0x1E18, "M", "ḙ"), - (0x1E19, "V"), - (0x1E1A, "M", "ḛ"), - (0x1E1B, "V"), - (0x1E1C, "M", "ḝ"), - (0x1E1D, "V"), - (0x1E1E, "M", "ḟ"), - (0x1E1F, "V"), - (0x1E20, "M", "ḡ"), - (0x1E21, "V"), - (0x1E22, "M", "ḣ"), - (0x1E23, "V"), - (0x1E24, "M", "ḥ"), - (0x1E25, "V"), - (0x1E26, "M", "ḧ"), - (0x1E27, "V"), - (0x1E28, "M", "ḩ"), - (0x1E29, "V"), - (0x1E2A, "M", "ḫ"), - (0x1E2B, "V"), - (0x1E2C, "M", "ḭ"), - (0x1E2D, "V"), - (0x1E2E, "M", "ḯ"), - (0x1E2F, "V"), - (0x1E30, "M", "ḱ"), - (0x1E31, "V"), - (0x1E32, "M", "ḳ"), - (0x1E33, "V"), - (0x1E34, "M", "ḵ"), - (0x1E35, "V"), - (0x1E36, "M", "ḷ"), - (0x1E37, "V"), - (0x1E38, "M", "ḹ"), - (0x1E39, "V"), - (0x1E3A, "M", "ḻ"), - (0x1E3B, "V"), - (0x1E3C, "M", "ḽ"), - (0x1E3D, "V"), - (0x1E3E, "M", "ḿ"), - (0x1E3F, "V"), - (0x1E40, "M", "ṁ"), - (0x1E41, "V"), - (0x1E42, "M", "ṃ"), - (0x1E43, "V"), - (0x1E44, "M", "ṅ"), - (0x1E45, "V"), - (0x1E46, "M", "ṇ"), - (0x1E47, "V"), - (0x1E48, "M", "ṉ"), - (0x1E49, "V"), - (0x1E4A, "M", "ṋ"), - (0x1E4B, "V"), - (0x1E4C, "M", "ṍ"), - (0x1E4D, "V"), - (0x1E4E, "M", "ṏ"), - (0x1E4F, "V"), - (0x1E50, "M", "ṑ"), - (0x1E51, "V"), - (0x1E52, "M", "ṓ"), - (0x1E53, "V"), - (0x1E54, "M", "ṕ"), - (0x1E55, "V"), - (0x1E56, "M", "ṗ"), - (0x1E57, "V"), - (0x1E58, "M", "ṙ"), - (0x1E59, "V"), - (0x1E5A, "M", "ṛ"), - (0x1E5B, "V"), - (0x1E5C, "M", "ṝ"), - (0x1E5D, "V"), - (0x1E5E, "M", "ṟ"), - (0x1E5F, "V"), - (0x1E60, "M", "ṡ"), - (0x1E61, "V"), - (0x1E62, "M", "ṣ"), - (0x1E63, "V"), - (0x1E64, "M", "ṥ"), - (0x1E65, "V"), - ] - - -def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E66, "M", "ṧ"), - (0x1E67, "V"), - (0x1E68, "M", "ṩ"), - (0x1E69, "V"), - (0x1E6A, "M", "ṫ"), - (0x1E6B, "V"), - (0x1E6C, "M", "ṭ"), - (0x1E6D, "V"), - (0x1E6E, "M", "ṯ"), - (0x1E6F, "V"), - (0x1E70, "M", "ṱ"), - (0x1E71, "V"), - (0x1E72, "M", "ṳ"), - (0x1E73, "V"), - (0x1E74, "M", "ṵ"), - (0x1E75, "V"), - (0x1E76, "M", "ṷ"), - (0x1E77, "V"), - (0x1E78, "M", "ṹ"), - (0x1E79, "V"), - (0x1E7A, "M", "ṻ"), - (0x1E7B, "V"), - (0x1E7C, "M", "ṽ"), - (0x1E7D, "V"), - (0x1E7E, "M", "ṿ"), - (0x1E7F, "V"), - (0x1E80, "M", "ẁ"), - (0x1E81, "V"), - (0x1E82, "M", "ẃ"), - (0x1E83, "V"), - (0x1E84, "M", "ẅ"), - (0x1E85, "V"), - (0x1E86, "M", "ẇ"), - (0x1E87, "V"), - (0x1E88, "M", "ẉ"), - (0x1E89, "V"), - (0x1E8A, "M", "ẋ"), - (0x1E8B, "V"), - (0x1E8C, "M", "ẍ"), - (0x1E8D, "V"), - (0x1E8E, "M", "ẏ"), - (0x1E8F, "V"), - (0x1E90, "M", "ẑ"), - (0x1E91, "V"), - (0x1E92, "M", "ẓ"), - (0x1E93, "V"), - (0x1E94, "M", "ẕ"), - (0x1E95, "V"), - (0x1E9A, "M", "aʾ"), - (0x1E9B, "M", "ṡ"), - (0x1E9C, "V"), - (0x1E9E, "M", "ß"), - (0x1E9F, "V"), - (0x1EA0, "M", "ạ"), - (0x1EA1, "V"), - (0x1EA2, "M", "ả"), - (0x1EA3, "V"), - (0x1EA4, "M", "ấ"), - (0x1EA5, "V"), - (0x1EA6, "M", "ầ"), - (0x1EA7, "V"), - (0x1EA8, "M", "ẩ"), - (0x1EA9, "V"), - (0x1EAA, "M", "ẫ"), - (0x1EAB, "V"), - (0x1EAC, "M", "ậ"), - (0x1EAD, "V"), - (0x1EAE, "M", "ắ"), - (0x1EAF, "V"), - (0x1EB0, "M", "ằ"), - (0x1EB1, "V"), - (0x1EB2, "M", "ẳ"), - (0x1EB3, "V"), - (0x1EB4, "M", "ẵ"), - (0x1EB5, "V"), - (0x1EB6, "M", "ặ"), - (0x1EB7, "V"), - (0x1EB8, "M", "ẹ"), - (0x1EB9, "V"), - (0x1EBA, "M", "ẻ"), - (0x1EBB, "V"), - (0x1EBC, "M", "ẽ"), - (0x1EBD, "V"), - (0x1EBE, "M", "ế"), - (0x1EBF, "V"), - (0x1EC0, "M", "ề"), - (0x1EC1, "V"), - (0x1EC2, "M", "ể"), - (0x1EC3, "V"), - (0x1EC4, "M", "ễ"), - (0x1EC5, "V"), - (0x1EC6, "M", "ệ"), - (0x1EC7, "V"), - (0x1EC8, "M", "ỉ"), - (0x1EC9, "V"), - (0x1ECA, "M", "ị"), - (0x1ECB, "V"), - (0x1ECC, "M", "ọ"), - (0x1ECD, "V"), - (0x1ECE, "M", "ỏ"), - ] - - -def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1ECF, "V"), - (0x1ED0, "M", "ố"), - (0x1ED1, "V"), - (0x1ED2, "M", "ồ"), - (0x1ED3, "V"), - (0x1ED4, "M", "ổ"), - (0x1ED5, "V"), - (0x1ED6, "M", "ỗ"), - (0x1ED7, "V"), - (0x1ED8, "M", "ộ"), - (0x1ED9, "V"), - (0x1EDA, "M", "ớ"), - (0x1EDB, "V"), - (0x1EDC, "M", "ờ"), - (0x1EDD, "V"), - (0x1EDE, "M", "ở"), - (0x1EDF, "V"), - (0x1EE0, "M", "ỡ"), - (0x1EE1, "V"), - (0x1EE2, "M", "ợ"), - (0x1EE3, "V"), - (0x1EE4, "M", "ụ"), - (0x1EE5, "V"), - (0x1EE6, "M", "ủ"), - (0x1EE7, "V"), - (0x1EE8, "M", "ứ"), - (0x1EE9, "V"), - (0x1EEA, "M", "ừ"), - (0x1EEB, "V"), - (0x1EEC, "M", "ử"), - (0x1EED, "V"), - (0x1EEE, "M", "ữ"), - (0x1EEF, "V"), - (0x1EF0, "M", "ự"), - (0x1EF1, "V"), - (0x1EF2, "M", "ỳ"), - (0x1EF3, "V"), - (0x1EF4, "M", "ỵ"), - (0x1EF5, "V"), - (0x1EF6, "M", "ỷ"), - (0x1EF7, "V"), - (0x1EF8, "M", "ỹ"), - (0x1EF9, "V"), - (0x1EFA, "M", "ỻ"), - (0x1EFB, "V"), - (0x1EFC, "M", "ỽ"), - (0x1EFD, "V"), - (0x1EFE, "M", "ỿ"), - (0x1EFF, "V"), - (0x1F08, "M", "ἀ"), - (0x1F09, "M", "ἁ"), - (0x1F0A, "M", "ἂ"), - (0x1F0B, "M", "ἃ"), - (0x1F0C, "M", "ἄ"), - (0x1F0D, "M", "ἅ"), - (0x1F0E, "M", "ἆ"), - (0x1F0F, "M", "ἇ"), - (0x1F10, "V"), - (0x1F16, "X"), - (0x1F18, "M", "ἐ"), - (0x1F19, "M", "ἑ"), - (0x1F1A, "M", "ἒ"), - (0x1F1B, "M", "ἓ"), - (0x1F1C, "M", "ἔ"), - (0x1F1D, "M", "ἕ"), - (0x1F1E, "X"), - (0x1F20, "V"), - (0x1F28, "M", "ἠ"), - (0x1F29, "M", "ἡ"), - (0x1F2A, "M", "ἢ"), - (0x1F2B, "M", "ἣ"), - (0x1F2C, "M", "ἤ"), - (0x1F2D, "M", "ἥ"), - (0x1F2E, "M", "ἦ"), - (0x1F2F, "M", "ἧ"), - (0x1F30, "V"), - (0x1F38, "M", "ἰ"), - (0x1F39, "M", "ἱ"), - (0x1F3A, "M", "ἲ"), - (0x1F3B, "M", "ἳ"), - (0x1F3C, "M", "ἴ"), - (0x1F3D, "M", "ἵ"), - (0x1F3E, "M", "ἶ"), - (0x1F3F, "M", "ἷ"), - (0x1F40, "V"), - (0x1F46, "X"), - (0x1F48, "M", "ὀ"), - (0x1F49, "M", "ὁ"), - (0x1F4A, "M", "ὂ"), - (0x1F4B, "M", "ὃ"), - (0x1F4C, "M", "ὄ"), - (0x1F4D, "M", "ὅ"), - (0x1F4E, "X"), - (0x1F50, "V"), - (0x1F58, "X"), - (0x1F59, "M", "ὑ"), - (0x1F5A, "X"), - (0x1F5B, "M", "ὓ"), - (0x1F5C, "X"), - (0x1F5D, "M", "ὕ"), - ] - - -def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F5E, "X"), - (0x1F5F, "M", "ὗ"), - (0x1F60, "V"), - (0x1F68, "M", "ὠ"), - (0x1F69, "M", "ὡ"), - (0x1F6A, "M", "ὢ"), - (0x1F6B, "M", "ὣ"), - (0x1F6C, "M", "ὤ"), - (0x1F6D, "M", "ὥ"), - (0x1F6E, "M", "ὦ"), - (0x1F6F, "M", "ὧ"), - (0x1F70, "V"), - (0x1F71, "M", "ά"), - (0x1F72, "V"), - (0x1F73, "M", "έ"), - (0x1F74, "V"), - (0x1F75, "M", "ή"), - (0x1F76, "V"), - (0x1F77, "M", "ί"), - (0x1F78, "V"), - (0x1F79, "M", "ό"), - (0x1F7A, "V"), - (0x1F7B, "M", "ύ"), - (0x1F7C, "V"), - (0x1F7D, "M", "ώ"), - (0x1F7E, "X"), - (0x1F80, "M", "ἀι"), - (0x1F81, "M", "ἁι"), - (0x1F82, "M", "ἂι"), - (0x1F83, "M", "ἃι"), - (0x1F84, "M", "ἄι"), - (0x1F85, "M", "ἅι"), - (0x1F86, "M", "ἆι"), - (0x1F87, "M", "ἇι"), - (0x1F88, "M", "ἀι"), - (0x1F89, "M", "ἁι"), - (0x1F8A, "M", "ἂι"), - (0x1F8B, "M", "ἃι"), - (0x1F8C, "M", "ἄι"), - (0x1F8D, "M", "ἅι"), - (0x1F8E, "M", "ἆι"), - (0x1F8F, "M", "ἇι"), - (0x1F90, "M", "ἠι"), - (0x1F91, "M", "ἡι"), - (0x1F92, "M", "ἢι"), - (0x1F93, "M", "ἣι"), - (0x1F94, "M", "ἤι"), - (0x1F95, "M", "ἥι"), - (0x1F96, "M", "ἦι"), - (0x1F97, "M", "ἧι"), - (0x1F98, "M", "ἠι"), - (0x1F99, "M", "ἡι"), - (0x1F9A, "M", "ἢι"), - (0x1F9B, "M", "ἣι"), - (0x1F9C, "M", "ἤι"), - (0x1F9D, "M", "ἥι"), - (0x1F9E, "M", "ἦι"), - (0x1F9F, "M", "ἧι"), - (0x1FA0, "M", "ὠι"), - (0x1FA1, "M", "ὡι"), - (0x1FA2, "M", "ὢι"), - (0x1FA3, "M", "ὣι"), - (0x1FA4, "M", "ὤι"), - (0x1FA5, "M", "ὥι"), - (0x1FA6, "M", "ὦι"), - (0x1FA7, "M", "ὧι"), - (0x1FA8, "M", "ὠι"), - (0x1FA9, "M", "ὡι"), - (0x1FAA, "M", "ὢι"), - (0x1FAB, "M", "ὣι"), - (0x1FAC, "M", "ὤι"), - (0x1FAD, "M", "ὥι"), - (0x1FAE, "M", "ὦι"), - (0x1FAF, "M", "ὧι"), - (0x1FB0, "V"), - (0x1FB2, "M", "ὰι"), - (0x1FB3, "M", "αι"), - (0x1FB4, "M", "άι"), - (0x1FB5, "X"), - (0x1FB6, "V"), - (0x1FB7, "M", "ᾶι"), - (0x1FB8, "M", "ᾰ"), - (0x1FB9, "M", "ᾱ"), - (0x1FBA, "M", "ὰ"), - (0x1FBB, "M", "ά"), - (0x1FBC, "M", "αι"), - (0x1FBD, "M", " ̓"), - (0x1FBE, "M", "ι"), - (0x1FBF, "M", " ̓"), - (0x1FC0, "M", " ͂"), - (0x1FC1, "M", " ̈͂"), - (0x1FC2, "M", "ὴι"), - (0x1FC3, "M", "ηι"), - (0x1FC4, "M", "ήι"), - (0x1FC5, "X"), - (0x1FC6, "V"), - (0x1FC7, "M", "ῆι"), - (0x1FC8, "M", "ὲ"), - (0x1FC9, "M", "έ"), - (0x1FCA, "M", "ὴ"), - ] - - -def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1FCB, "M", "ή"), - (0x1FCC, "M", "ηι"), - (0x1FCD, "M", " ̓̀"), - (0x1FCE, "M", " ̓́"), - (0x1FCF, "M", " ̓͂"), - (0x1FD0, "V"), - (0x1FD3, "M", "ΐ"), - (0x1FD4, "X"), - (0x1FD6, "V"), - (0x1FD8, "M", "ῐ"), - (0x1FD9, "M", "ῑ"), - (0x1FDA, "M", "ὶ"), - (0x1FDB, "M", "ί"), - (0x1FDC, "X"), - (0x1FDD, "M", " ̔̀"), - (0x1FDE, "M", " ̔́"), - (0x1FDF, "M", " ̔͂"), - (0x1FE0, "V"), - (0x1FE3, "M", "ΰ"), - (0x1FE4, "V"), - (0x1FE8, "M", "ῠ"), - (0x1FE9, "M", "ῡ"), - (0x1FEA, "M", "ὺ"), - (0x1FEB, "M", "ύ"), - (0x1FEC, "M", "ῥ"), - (0x1FED, "M", " ̈̀"), - (0x1FEE, "M", " ̈́"), - (0x1FEF, "M", "`"), - (0x1FF0, "X"), - (0x1FF2, "M", "ὼι"), - (0x1FF3, "M", "ωι"), - (0x1FF4, "M", "ώι"), - (0x1FF5, "X"), - (0x1FF6, "V"), - (0x1FF7, "M", "ῶι"), - (0x1FF8, "M", "ὸ"), - (0x1FF9, "M", "ό"), - (0x1FFA, "M", "ὼ"), - (0x1FFB, "M", "ώ"), - (0x1FFC, "M", "ωι"), - (0x1FFD, "M", " ́"), - (0x1FFE, "M", " ̔"), - (0x1FFF, "X"), - (0x2000, "M", " "), - (0x200B, "I"), - (0x200C, "D", ""), - (0x200E, "X"), - (0x2010, "V"), - (0x2011, "M", "‐"), - (0x2012, "V"), - (0x2017, "M", " ̳"), - (0x2018, "V"), - (0x2024, "X"), - (0x2027, "V"), - (0x2028, "X"), - (0x202F, "M", " "), - (0x2030, "V"), - (0x2033, "M", "′′"), - (0x2034, "M", "′′′"), - (0x2035, "V"), - (0x2036, "M", "‵‵"), - (0x2037, "M", "‵‵‵"), - (0x2038, "V"), - (0x203C, "M", "!!"), - (0x203D, "V"), - (0x203E, "M", " ̅"), - (0x203F, "V"), - (0x2047, "M", "??"), - (0x2048, "M", "?!"), - (0x2049, "M", "!?"), - (0x204A, "V"), - (0x2057, "M", "′′′′"), - (0x2058, "V"), - (0x205F, "M", " "), - (0x2060, "I"), - (0x2065, "X"), - (0x206A, "I"), - (0x2070, "M", "0"), - (0x2071, "M", "i"), - (0x2072, "X"), - (0x2074, "M", "4"), - (0x2075, "M", "5"), - (0x2076, "M", "6"), - (0x2077, "M", "7"), - (0x2078, "M", "8"), - (0x2079, "M", "9"), - (0x207A, "M", "+"), - (0x207B, "M", "−"), - (0x207C, "M", "="), - (0x207D, "M", "("), - (0x207E, "M", ")"), - (0x207F, "M", "n"), - (0x2080, "M", "0"), - (0x2081, "M", "1"), - (0x2082, "M", "2"), - (0x2083, "M", "3"), - (0x2084, "M", "4"), - (0x2085, "M", "5"), - (0x2086, "M", "6"), - (0x2087, "M", "7"), - ] - - -def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2088, "M", "8"), - (0x2089, "M", "9"), - (0x208A, "M", "+"), - (0x208B, "M", "−"), - (0x208C, "M", "="), - (0x208D, "M", "("), - (0x208E, "M", ")"), - (0x208F, "X"), - (0x2090, "M", "a"), - (0x2091, "M", "e"), - (0x2092, "M", "o"), - (0x2093, "M", "x"), - (0x2094, "M", "ə"), - (0x2095, "M", "h"), - (0x2096, "M", "k"), - (0x2097, "M", "l"), - (0x2098, "M", "m"), - (0x2099, "M", "n"), - (0x209A, "M", "p"), - (0x209B, "M", "s"), - (0x209C, "M", "t"), - (0x209D, "X"), - (0x20A0, "V"), - (0x20A8, "M", "rs"), - (0x20A9, "V"), - (0x20C1, "X"), - (0x20D0, "V"), - (0x20F1, "X"), - (0x2100, "M", "a/c"), - (0x2101, "M", "a/s"), - (0x2102, "M", "c"), - (0x2103, "M", "°c"), - (0x2104, "V"), - (0x2105, "M", "c/o"), - (0x2106, "M", "c/u"), - (0x2107, "M", "ɛ"), - (0x2108, "V"), - (0x2109, "M", "°f"), - (0x210A, "M", "g"), - (0x210B, "M", "h"), - (0x210F, "M", "ħ"), - (0x2110, "M", "i"), - (0x2112, "M", "l"), - (0x2114, "V"), - (0x2115, "M", "n"), - (0x2116, "M", "no"), - (0x2117, "V"), - (0x2119, "M", "p"), - (0x211A, "M", "q"), - (0x211B, "M", "r"), - (0x211E, "V"), - (0x2120, "M", "sm"), - (0x2121, "M", "tel"), - (0x2122, "M", "tm"), - (0x2123, "V"), - (0x2124, "M", "z"), - (0x2125, "V"), - (0x2126, "M", "ω"), - (0x2127, "V"), - (0x2128, "M", "z"), - (0x2129, "V"), - (0x212A, "M", "k"), - (0x212B, "M", "å"), - (0x212C, "M", "b"), - (0x212D, "M", "c"), - (0x212E, "V"), - (0x212F, "M", "e"), - (0x2131, "M", "f"), - (0x2132, "M", "ⅎ"), - (0x2133, "M", "m"), - (0x2134, "M", "o"), - (0x2135, "M", "א"), - (0x2136, "M", "ב"), - (0x2137, "M", "ג"), - (0x2138, "M", "ד"), - (0x2139, "M", "i"), - (0x213A, "V"), - (0x213B, "M", "fax"), - (0x213C, "M", "π"), - (0x213D, "M", "γ"), - (0x213F, "M", "π"), - (0x2140, "M", "∑"), - (0x2141, "V"), - (0x2145, "M", "d"), - (0x2147, "M", "e"), - (0x2148, "M", "i"), - (0x2149, "M", "j"), - (0x214A, "V"), - (0x2150, "M", "1⁄7"), - (0x2151, "M", "1⁄9"), - (0x2152, "M", "1⁄10"), - (0x2153, "M", "1⁄3"), - (0x2154, "M", "2⁄3"), - (0x2155, "M", "1⁄5"), - (0x2156, "M", "2⁄5"), - (0x2157, "M", "3⁄5"), - (0x2158, "M", "4⁄5"), - (0x2159, "M", "1⁄6"), - (0x215A, "M", "5⁄6"), - (0x215B, "M", "1⁄8"), - ] - - -def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x215C, "M", "3⁄8"), - (0x215D, "M", "5⁄8"), - (0x215E, "M", "7⁄8"), - (0x215F, "M", "1⁄"), - (0x2160, "M", "i"), - (0x2161, "M", "ii"), - (0x2162, "M", "iii"), - (0x2163, "M", "iv"), - (0x2164, "M", "v"), - (0x2165, "M", "vi"), - (0x2166, "M", "vii"), - (0x2167, "M", "viii"), - (0x2168, "M", "ix"), - (0x2169, "M", "x"), - (0x216A, "M", "xi"), - (0x216B, "M", "xii"), - (0x216C, "M", "l"), - (0x216D, "M", "c"), - (0x216E, "M", "d"), - (0x216F, "M", "m"), - (0x2170, "M", "i"), - (0x2171, "M", "ii"), - (0x2172, "M", "iii"), - (0x2173, "M", "iv"), - (0x2174, "M", "v"), - (0x2175, "M", "vi"), - (0x2176, "M", "vii"), - (0x2177, "M", "viii"), - (0x2178, "M", "ix"), - (0x2179, "M", "x"), - (0x217A, "M", "xi"), - (0x217B, "M", "xii"), - (0x217C, "M", "l"), - (0x217D, "M", "c"), - (0x217E, "M", "d"), - (0x217F, "M", "m"), - (0x2180, "V"), - (0x2183, "M", "ↄ"), - (0x2184, "V"), - (0x2189, "M", "0⁄3"), - (0x218A, "V"), - (0x218C, "X"), - (0x2190, "V"), - (0x222C, "M", "∫∫"), - (0x222D, "M", "∫∫∫"), - (0x222E, "V"), - (0x222F, "M", "∮∮"), - (0x2230, "M", "∮∮∮"), - (0x2231, "V"), - (0x2329, "M", "〈"), - (0x232A, "M", "〉"), - (0x232B, "V"), - (0x242A, "X"), - (0x2440, "V"), - (0x244B, "X"), - (0x2460, "M", "1"), - (0x2461, "M", "2"), - (0x2462, "M", "3"), - (0x2463, "M", "4"), - (0x2464, "M", "5"), - (0x2465, "M", "6"), - (0x2466, "M", "7"), - (0x2467, "M", "8"), - (0x2468, "M", "9"), - (0x2469, "M", "10"), - (0x246A, "M", "11"), - (0x246B, "M", "12"), - (0x246C, "M", "13"), - (0x246D, "M", "14"), - (0x246E, "M", "15"), - (0x246F, "M", "16"), - (0x2470, "M", "17"), - (0x2471, "M", "18"), - (0x2472, "M", "19"), - (0x2473, "M", "20"), - (0x2474, "M", "(1)"), - (0x2475, "M", "(2)"), - (0x2476, "M", "(3)"), - (0x2477, "M", "(4)"), - (0x2478, "M", "(5)"), - (0x2479, "M", "(6)"), - (0x247A, "M", "(7)"), - (0x247B, "M", "(8)"), - (0x247C, "M", "(9)"), - (0x247D, "M", "(10)"), - (0x247E, "M", "(11)"), - (0x247F, "M", "(12)"), - (0x2480, "M", "(13)"), - (0x2481, "M", "(14)"), - (0x2482, "M", "(15)"), - (0x2483, "M", "(16)"), - (0x2484, "M", "(17)"), - (0x2485, "M", "(18)"), - (0x2486, "M", "(19)"), - (0x2487, "M", "(20)"), - (0x2488, "X"), - (0x249C, "M", "(a)"), - (0x249D, "M", "(b)"), - (0x249E, "M", "(c)"), - (0x249F, "M", "(d)"), - ] - - -def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x24A0, "M", "(e)"), - (0x24A1, "M", "(f)"), - (0x24A2, "M", "(g)"), - (0x24A3, "M", "(h)"), - (0x24A4, "M", "(i)"), - (0x24A5, "M", "(j)"), - (0x24A6, "M", "(k)"), - (0x24A7, "M", "(l)"), - (0x24A8, "M", "(m)"), - (0x24A9, "M", "(n)"), - (0x24AA, "M", "(o)"), - (0x24AB, "M", "(p)"), - (0x24AC, "M", "(q)"), - (0x24AD, "M", "(r)"), - (0x24AE, "M", "(s)"), - (0x24AF, "M", "(t)"), - (0x24B0, "M", "(u)"), - (0x24B1, "M", "(v)"), - (0x24B2, "M", "(w)"), - (0x24B3, "M", "(x)"), - (0x24B4, "M", "(y)"), - (0x24B5, "M", "(z)"), - (0x24B6, "M", "a"), - (0x24B7, "M", "b"), - (0x24B8, "M", "c"), - (0x24B9, "M", "d"), - (0x24BA, "M", "e"), - (0x24BB, "M", "f"), - (0x24BC, "M", "g"), - (0x24BD, "M", "h"), - (0x24BE, "M", "i"), - (0x24BF, "M", "j"), - (0x24C0, "M", "k"), - (0x24C1, "M", "l"), - (0x24C2, "M", "m"), - (0x24C3, "M", "n"), - (0x24C4, "M", "o"), - (0x24C5, "M", "p"), - (0x24C6, "M", "q"), - (0x24C7, "M", "r"), - (0x24C8, "M", "s"), - (0x24C9, "M", "t"), - (0x24CA, "M", "u"), - (0x24CB, "M", "v"), - (0x24CC, "M", "w"), - (0x24CD, "M", "x"), - (0x24CE, "M", "y"), - (0x24CF, "M", "z"), - (0x24D0, "M", "a"), - (0x24D1, "M", "b"), - (0x24D2, "M", "c"), - (0x24D3, "M", "d"), - (0x24D4, "M", "e"), - (0x24D5, "M", "f"), - (0x24D6, "M", "g"), - (0x24D7, "M", "h"), - (0x24D8, "M", "i"), - (0x24D9, "M", "j"), - (0x24DA, "M", "k"), - (0x24DB, "M", "l"), - (0x24DC, "M", "m"), - (0x24DD, "M", "n"), - (0x24DE, "M", "o"), - (0x24DF, "M", "p"), - (0x24E0, "M", "q"), - (0x24E1, "M", "r"), - (0x24E2, "M", "s"), - (0x24E3, "M", "t"), - (0x24E4, "M", "u"), - (0x24E5, "M", "v"), - (0x24E6, "M", "w"), - (0x24E7, "M", "x"), - (0x24E8, "M", "y"), - (0x24E9, "M", "z"), - (0x24EA, "M", "0"), - (0x24EB, "V"), - (0x2A0C, "M", "∫∫∫∫"), - (0x2A0D, "V"), - (0x2A74, "M", "::="), - (0x2A75, "M", "=="), - (0x2A76, "M", "==="), - (0x2A77, "V"), - (0x2ADC, "M", "⫝̸"), - (0x2ADD, "V"), - (0x2B74, "X"), - (0x2B76, "V"), - (0x2B96, "X"), - (0x2B97, "V"), - (0x2C00, "M", "ⰰ"), - (0x2C01, "M", "ⰱ"), - (0x2C02, "M", "ⰲ"), - (0x2C03, "M", "ⰳ"), - (0x2C04, "M", "ⰴ"), - (0x2C05, "M", "ⰵ"), - (0x2C06, "M", "ⰶ"), - (0x2C07, "M", "ⰷ"), - (0x2C08, "M", "ⰸ"), - (0x2C09, "M", "ⰹ"), - (0x2C0A, "M", "ⰺ"), - (0x2C0B, "M", "ⰻ"), - ] - - -def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2C0C, "M", "ⰼ"), - (0x2C0D, "M", "ⰽ"), - (0x2C0E, "M", "ⰾ"), - (0x2C0F, "M", "ⰿ"), - (0x2C10, "M", "ⱀ"), - (0x2C11, "M", "ⱁ"), - (0x2C12, "M", "ⱂ"), - (0x2C13, "M", "ⱃ"), - (0x2C14, "M", "ⱄ"), - (0x2C15, "M", "ⱅ"), - (0x2C16, "M", "ⱆ"), - (0x2C17, "M", "ⱇ"), - (0x2C18, "M", "ⱈ"), - (0x2C19, "M", "ⱉ"), - (0x2C1A, "M", "ⱊ"), - (0x2C1B, "M", "ⱋ"), - (0x2C1C, "M", "ⱌ"), - (0x2C1D, "M", "ⱍ"), - (0x2C1E, "M", "ⱎ"), - (0x2C1F, "M", "ⱏ"), - (0x2C20, "M", "ⱐ"), - (0x2C21, "M", "ⱑ"), - (0x2C22, "M", "ⱒ"), - (0x2C23, "M", "ⱓ"), - (0x2C24, "M", "ⱔ"), - (0x2C25, "M", "ⱕ"), - (0x2C26, "M", "ⱖ"), - (0x2C27, "M", "ⱗ"), - (0x2C28, "M", "ⱘ"), - (0x2C29, "M", "ⱙ"), - (0x2C2A, "M", "ⱚ"), - (0x2C2B, "M", "ⱛ"), - (0x2C2C, "M", "ⱜ"), - (0x2C2D, "M", "ⱝ"), - (0x2C2E, "M", "ⱞ"), - (0x2C2F, "M", "ⱟ"), - (0x2C30, "V"), - (0x2C60, "M", "ⱡ"), - (0x2C61, "V"), - (0x2C62, "M", "ɫ"), - (0x2C63, "M", "ᵽ"), - (0x2C64, "M", "ɽ"), - (0x2C65, "V"), - (0x2C67, "M", "ⱨ"), - (0x2C68, "V"), - (0x2C69, "M", "ⱪ"), - (0x2C6A, "V"), - (0x2C6B, "M", "ⱬ"), - (0x2C6C, "V"), - (0x2C6D, "M", "ɑ"), - (0x2C6E, "M", "ɱ"), - (0x2C6F, "M", "ɐ"), - (0x2C70, "M", "ɒ"), - (0x2C71, "V"), - (0x2C72, "M", "ⱳ"), - (0x2C73, "V"), - (0x2C75, "M", "ⱶ"), - (0x2C76, "V"), - (0x2C7C, "M", "j"), - (0x2C7D, "M", "v"), - (0x2C7E, "M", "ȿ"), - (0x2C7F, "M", "ɀ"), - (0x2C80, "M", "ⲁ"), - (0x2C81, "V"), - (0x2C82, "M", "ⲃ"), - (0x2C83, "V"), - (0x2C84, "M", "ⲅ"), - (0x2C85, "V"), - (0x2C86, "M", "ⲇ"), - (0x2C87, "V"), - (0x2C88, "M", "ⲉ"), - (0x2C89, "V"), - (0x2C8A, "M", "ⲋ"), - (0x2C8B, "V"), - (0x2C8C, "M", "ⲍ"), - (0x2C8D, "V"), - (0x2C8E, "M", "ⲏ"), - (0x2C8F, "V"), - (0x2C90, "M", "ⲑ"), - (0x2C91, "V"), - (0x2C92, "M", "ⲓ"), - (0x2C93, "V"), - (0x2C94, "M", "ⲕ"), - (0x2C95, "V"), - (0x2C96, "M", "ⲗ"), - (0x2C97, "V"), - (0x2C98, "M", "ⲙ"), - (0x2C99, "V"), - (0x2C9A, "M", "ⲛ"), - (0x2C9B, "V"), - (0x2C9C, "M", "ⲝ"), - (0x2C9D, "V"), - (0x2C9E, "M", "ⲟ"), - (0x2C9F, "V"), - (0x2CA0, "M", "ⲡ"), - (0x2CA1, "V"), - (0x2CA2, "M", "ⲣ"), - (0x2CA3, "V"), - (0x2CA4, "M", "ⲥ"), - (0x2CA5, "V"), - ] - - -def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2CA6, "M", "ⲧ"), - (0x2CA7, "V"), - (0x2CA8, "M", "ⲩ"), - (0x2CA9, "V"), - (0x2CAA, "M", "ⲫ"), - (0x2CAB, "V"), - (0x2CAC, "M", "ⲭ"), - (0x2CAD, "V"), - (0x2CAE, "M", "ⲯ"), - (0x2CAF, "V"), - (0x2CB0, "M", "ⲱ"), - (0x2CB1, "V"), - (0x2CB2, "M", "ⲳ"), - (0x2CB3, "V"), - (0x2CB4, "M", "ⲵ"), - (0x2CB5, "V"), - (0x2CB6, "M", "ⲷ"), - (0x2CB7, "V"), - (0x2CB8, "M", "ⲹ"), - (0x2CB9, "V"), - (0x2CBA, "M", "ⲻ"), - (0x2CBB, "V"), - (0x2CBC, "M", "ⲽ"), - (0x2CBD, "V"), - (0x2CBE, "M", "ⲿ"), - (0x2CBF, "V"), - (0x2CC0, "M", "ⳁ"), - (0x2CC1, "V"), - (0x2CC2, "M", "ⳃ"), - (0x2CC3, "V"), - (0x2CC4, "M", "ⳅ"), - (0x2CC5, "V"), - (0x2CC6, "M", "ⳇ"), - (0x2CC7, "V"), - (0x2CC8, "M", "ⳉ"), - (0x2CC9, "V"), - (0x2CCA, "M", "ⳋ"), - (0x2CCB, "V"), - (0x2CCC, "M", "ⳍ"), - (0x2CCD, "V"), - (0x2CCE, "M", "ⳏ"), - (0x2CCF, "V"), - (0x2CD0, "M", "ⳑ"), - (0x2CD1, "V"), - (0x2CD2, "M", "ⳓ"), - (0x2CD3, "V"), - (0x2CD4, "M", "ⳕ"), - (0x2CD5, "V"), - (0x2CD6, "M", "ⳗ"), - (0x2CD7, "V"), - (0x2CD8, "M", "ⳙ"), - (0x2CD9, "V"), - (0x2CDA, "M", "ⳛ"), - (0x2CDB, "V"), - (0x2CDC, "M", "ⳝ"), - (0x2CDD, "V"), - (0x2CDE, "M", "ⳟ"), - (0x2CDF, "V"), - (0x2CE0, "M", "ⳡ"), - (0x2CE1, "V"), - (0x2CE2, "M", "ⳣ"), - (0x2CE3, "V"), - (0x2CEB, "M", "ⳬ"), - (0x2CEC, "V"), - (0x2CED, "M", "ⳮ"), - (0x2CEE, "V"), - (0x2CF2, "M", "ⳳ"), - (0x2CF3, "V"), - (0x2CF4, "X"), - (0x2CF9, "V"), - (0x2D26, "X"), - (0x2D27, "V"), - (0x2D28, "X"), - (0x2D2D, "V"), - (0x2D2E, "X"), - (0x2D30, "V"), - (0x2D68, "X"), - (0x2D6F, "M", "ⵡ"), - (0x2D70, "V"), - (0x2D71, "X"), - (0x2D7F, "V"), - (0x2D97, "X"), - (0x2DA0, "V"), - (0x2DA7, "X"), - (0x2DA8, "V"), - (0x2DAF, "X"), - (0x2DB0, "V"), - (0x2DB7, "X"), - (0x2DB8, "V"), - (0x2DBF, "X"), - (0x2DC0, "V"), - (0x2DC7, "X"), - (0x2DC8, "V"), - (0x2DCF, "X"), - (0x2DD0, "V"), - (0x2DD7, "X"), - (0x2DD8, "V"), - (0x2DDF, "X"), - (0x2DE0, "V"), - (0x2E5E, "X"), - ] - - -def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2E80, "V"), - (0x2E9A, "X"), - (0x2E9B, "V"), - (0x2E9F, "M", "母"), - (0x2EA0, "V"), - (0x2EF3, "M", "龟"), - (0x2EF4, "X"), - (0x2F00, "M", "一"), - (0x2F01, "M", "丨"), - (0x2F02, "M", "丶"), - (0x2F03, "M", "丿"), - (0x2F04, "M", "乙"), - (0x2F05, "M", "亅"), - (0x2F06, "M", "二"), - (0x2F07, "M", "亠"), - (0x2F08, "M", "人"), - (0x2F09, "M", "儿"), - (0x2F0A, "M", "入"), - (0x2F0B, "M", "八"), - (0x2F0C, "M", "冂"), - (0x2F0D, "M", "冖"), - (0x2F0E, "M", "冫"), - (0x2F0F, "M", "几"), - (0x2F10, "M", "凵"), - (0x2F11, "M", "刀"), - (0x2F12, "M", "力"), - (0x2F13, "M", "勹"), - (0x2F14, "M", "匕"), - (0x2F15, "M", "匚"), - (0x2F16, "M", "匸"), - (0x2F17, "M", "十"), - (0x2F18, "M", "卜"), - (0x2F19, "M", "卩"), - (0x2F1A, "M", "厂"), - (0x2F1B, "M", "厶"), - (0x2F1C, "M", "又"), - (0x2F1D, "M", "口"), - (0x2F1E, "M", "囗"), - (0x2F1F, "M", "土"), - (0x2F20, "M", "士"), - (0x2F21, "M", "夂"), - (0x2F22, "M", "夊"), - (0x2F23, "M", "夕"), - (0x2F24, "M", "大"), - (0x2F25, "M", "女"), - (0x2F26, "M", "子"), - (0x2F27, "M", "宀"), - (0x2F28, "M", "寸"), - (0x2F29, "M", "小"), - (0x2F2A, "M", "尢"), - (0x2F2B, "M", "尸"), - (0x2F2C, "M", "屮"), - (0x2F2D, "M", "山"), - (0x2F2E, "M", "巛"), - (0x2F2F, "M", "工"), - (0x2F30, "M", "己"), - (0x2F31, "M", "巾"), - (0x2F32, "M", "干"), - (0x2F33, "M", "幺"), - (0x2F34, "M", "广"), - (0x2F35, "M", "廴"), - (0x2F36, "M", "廾"), - (0x2F37, "M", "弋"), - (0x2F38, "M", "弓"), - (0x2F39, "M", "彐"), - (0x2F3A, "M", "彡"), - (0x2F3B, "M", "彳"), - (0x2F3C, "M", "心"), - (0x2F3D, "M", "戈"), - (0x2F3E, "M", "戶"), - (0x2F3F, "M", "手"), - (0x2F40, "M", "支"), - (0x2F41, "M", "攴"), - (0x2F42, "M", "文"), - (0x2F43, "M", "斗"), - (0x2F44, "M", "斤"), - (0x2F45, "M", "方"), - (0x2F46, "M", "无"), - (0x2F47, "M", "日"), - (0x2F48, "M", "曰"), - (0x2F49, "M", "月"), - (0x2F4A, "M", "木"), - (0x2F4B, "M", "欠"), - (0x2F4C, "M", "止"), - (0x2F4D, "M", "歹"), - (0x2F4E, "M", "殳"), - (0x2F4F, "M", "毋"), - (0x2F50, "M", "比"), - (0x2F51, "M", "毛"), - (0x2F52, "M", "氏"), - (0x2F53, "M", "气"), - (0x2F54, "M", "水"), - (0x2F55, "M", "火"), - (0x2F56, "M", "爪"), - (0x2F57, "M", "父"), - (0x2F58, "M", "爻"), - (0x2F59, "M", "爿"), - (0x2F5A, "M", "片"), - (0x2F5B, "M", "牙"), - (0x2F5C, "M", "牛"), - ] - - -def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F5D, "M", "犬"), - (0x2F5E, "M", "玄"), - (0x2F5F, "M", "玉"), - (0x2F60, "M", "瓜"), - (0x2F61, "M", "瓦"), - (0x2F62, "M", "甘"), - (0x2F63, "M", "生"), - (0x2F64, "M", "用"), - (0x2F65, "M", "田"), - (0x2F66, "M", "疋"), - (0x2F67, "M", "疒"), - (0x2F68, "M", "癶"), - (0x2F69, "M", "白"), - (0x2F6A, "M", "皮"), - (0x2F6B, "M", "皿"), - (0x2F6C, "M", "目"), - (0x2F6D, "M", "矛"), - (0x2F6E, "M", "矢"), - (0x2F6F, "M", "石"), - (0x2F70, "M", "示"), - (0x2F71, "M", "禸"), - (0x2F72, "M", "禾"), - (0x2F73, "M", "穴"), - (0x2F74, "M", "立"), - (0x2F75, "M", "竹"), - (0x2F76, "M", "米"), - (0x2F77, "M", "糸"), - (0x2F78, "M", "缶"), - (0x2F79, "M", "网"), - (0x2F7A, "M", "羊"), - (0x2F7B, "M", "羽"), - (0x2F7C, "M", "老"), - (0x2F7D, "M", "而"), - (0x2F7E, "M", "耒"), - (0x2F7F, "M", "耳"), - (0x2F80, "M", "聿"), - (0x2F81, "M", "肉"), - (0x2F82, "M", "臣"), - (0x2F83, "M", "自"), - (0x2F84, "M", "至"), - (0x2F85, "M", "臼"), - (0x2F86, "M", "舌"), - (0x2F87, "M", "舛"), - (0x2F88, "M", "舟"), - (0x2F89, "M", "艮"), - (0x2F8A, "M", "色"), - (0x2F8B, "M", "艸"), - (0x2F8C, "M", "虍"), - (0x2F8D, "M", "虫"), - (0x2F8E, "M", "血"), - (0x2F8F, "M", "行"), - (0x2F90, "M", "衣"), - (0x2F91, "M", "襾"), - (0x2F92, "M", "見"), - (0x2F93, "M", "角"), - (0x2F94, "M", "言"), - (0x2F95, "M", "谷"), - (0x2F96, "M", "豆"), - (0x2F97, "M", "豕"), - (0x2F98, "M", "豸"), - (0x2F99, "M", "貝"), - (0x2F9A, "M", "赤"), - (0x2F9B, "M", "走"), - (0x2F9C, "M", "足"), - (0x2F9D, "M", "身"), - (0x2F9E, "M", "車"), - (0x2F9F, "M", "辛"), - (0x2FA0, "M", "辰"), - (0x2FA1, "M", "辵"), - (0x2FA2, "M", "邑"), - (0x2FA3, "M", "酉"), - (0x2FA4, "M", "釆"), - (0x2FA5, "M", "里"), - (0x2FA6, "M", "金"), - (0x2FA7, "M", "長"), - (0x2FA8, "M", "門"), - (0x2FA9, "M", "阜"), - (0x2FAA, "M", "隶"), - (0x2FAB, "M", "隹"), - (0x2FAC, "M", "雨"), - (0x2FAD, "M", "靑"), - (0x2FAE, "M", "非"), - (0x2FAF, "M", "面"), - (0x2FB0, "M", "革"), - (0x2FB1, "M", "韋"), - (0x2FB2, "M", "韭"), - (0x2FB3, "M", "音"), - (0x2FB4, "M", "頁"), - (0x2FB5, "M", "風"), - (0x2FB6, "M", "飛"), - (0x2FB7, "M", "食"), - (0x2FB8, "M", "首"), - (0x2FB9, "M", "香"), - (0x2FBA, "M", "馬"), - (0x2FBB, "M", "骨"), - (0x2FBC, "M", "高"), - (0x2FBD, "M", "髟"), - (0x2FBE, "M", "鬥"), - (0x2FBF, "M", "鬯"), - (0x2FC0, "M", "鬲"), - ] - - -def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2FC1, "M", "鬼"), - (0x2FC2, "M", "魚"), - (0x2FC3, "M", "鳥"), - (0x2FC4, "M", "鹵"), - (0x2FC5, "M", "鹿"), - (0x2FC6, "M", "麥"), - (0x2FC7, "M", "麻"), - (0x2FC8, "M", "黃"), - (0x2FC9, "M", "黍"), - (0x2FCA, "M", "黑"), - (0x2FCB, "M", "黹"), - (0x2FCC, "M", "黽"), - (0x2FCD, "M", "鼎"), - (0x2FCE, "M", "鼓"), - (0x2FCF, "M", "鼠"), - (0x2FD0, "M", "鼻"), - (0x2FD1, "M", "齊"), - (0x2FD2, "M", "齒"), - (0x2FD3, "M", "龍"), - (0x2FD4, "M", "龜"), - (0x2FD5, "M", "龠"), - (0x2FD6, "X"), - (0x3000, "M", " "), - (0x3001, "V"), - (0x3002, "M", "."), - (0x3003, "V"), - (0x3036, "M", "〒"), - (0x3037, "V"), - (0x3038, "M", "十"), - (0x3039, "M", "卄"), - (0x303A, "M", "卅"), - (0x303B, "V"), - (0x3040, "X"), - (0x3041, "V"), - (0x3097, "X"), - (0x3099, "V"), - (0x309B, "M", " ゙"), - (0x309C, "M", " ゚"), - (0x309D, "V"), - (0x309F, "M", "より"), - (0x30A0, "V"), - (0x30FF, "M", "コト"), - (0x3100, "X"), - (0x3105, "V"), - (0x3130, "X"), - (0x3131, "M", "ᄀ"), - (0x3132, "M", "ᄁ"), - (0x3133, "M", "ᆪ"), - (0x3134, "M", "ᄂ"), - (0x3135, "M", "ᆬ"), - (0x3136, "M", "ᆭ"), - (0x3137, "M", "ᄃ"), - (0x3138, "M", "ᄄ"), - (0x3139, "M", "ᄅ"), - (0x313A, "M", "ᆰ"), - (0x313B, "M", "ᆱ"), - (0x313C, "M", "ᆲ"), - (0x313D, "M", "ᆳ"), - (0x313E, "M", "ᆴ"), - (0x313F, "M", "ᆵ"), - (0x3140, "M", "ᄚ"), - (0x3141, "M", "ᄆ"), - (0x3142, "M", "ᄇ"), - (0x3143, "M", "ᄈ"), - (0x3144, "M", "ᄡ"), - (0x3145, "M", "ᄉ"), - (0x3146, "M", "ᄊ"), - (0x3147, "M", "ᄋ"), - (0x3148, "M", "ᄌ"), - (0x3149, "M", "ᄍ"), - (0x314A, "M", "ᄎ"), - (0x314B, "M", "ᄏ"), - (0x314C, "M", "ᄐ"), - (0x314D, "M", "ᄑ"), - (0x314E, "M", "ᄒ"), - (0x314F, "M", "ᅡ"), - (0x3150, "M", "ᅢ"), - (0x3151, "M", "ᅣ"), - (0x3152, "M", "ᅤ"), - (0x3153, "M", "ᅥ"), - (0x3154, "M", "ᅦ"), - (0x3155, "M", "ᅧ"), - (0x3156, "M", "ᅨ"), - (0x3157, "M", "ᅩ"), - (0x3158, "M", "ᅪ"), - (0x3159, "M", "ᅫ"), - (0x315A, "M", "ᅬ"), - (0x315B, "M", "ᅭ"), - (0x315C, "M", "ᅮ"), - (0x315D, "M", "ᅯ"), - (0x315E, "M", "ᅰ"), - (0x315F, "M", "ᅱ"), - (0x3160, "M", "ᅲ"), - (0x3161, "M", "ᅳ"), - (0x3162, "M", "ᅴ"), - (0x3163, "M", "ᅵ"), - (0x3164, "I"), - (0x3165, "M", "ᄔ"), - (0x3166, "M", "ᄕ"), - (0x3167, "M", "ᇇ"), - ] - - -def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3168, "M", "ᇈ"), - (0x3169, "M", "ᇌ"), - (0x316A, "M", "ᇎ"), - (0x316B, "M", "ᇓ"), - (0x316C, "M", "ᇗ"), - (0x316D, "M", "ᇙ"), - (0x316E, "M", "ᄜ"), - (0x316F, "M", "ᇝ"), - (0x3170, "M", "ᇟ"), - (0x3171, "M", "ᄝ"), - (0x3172, "M", "ᄞ"), - (0x3173, "M", "ᄠ"), - (0x3174, "M", "ᄢ"), - (0x3175, "M", "ᄣ"), - (0x3176, "M", "ᄧ"), - (0x3177, "M", "ᄩ"), - (0x3178, "M", "ᄫ"), - (0x3179, "M", "ᄬ"), - (0x317A, "M", "ᄭ"), - (0x317B, "M", "ᄮ"), - (0x317C, "M", "ᄯ"), - (0x317D, "M", "ᄲ"), - (0x317E, "M", "ᄶ"), - (0x317F, "M", "ᅀ"), - (0x3180, "M", "ᅇ"), - (0x3181, "M", "ᅌ"), - (0x3182, "M", "ᇱ"), - (0x3183, "M", "ᇲ"), - (0x3184, "M", "ᅗ"), - (0x3185, "M", "ᅘ"), - (0x3186, "M", "ᅙ"), - (0x3187, "M", "ᆄ"), - (0x3188, "M", "ᆅ"), - (0x3189, "M", "ᆈ"), - (0x318A, "M", "ᆑ"), - (0x318B, "M", "ᆒ"), - (0x318C, "M", "ᆔ"), - (0x318D, "M", "ᆞ"), - (0x318E, "M", "ᆡ"), - (0x318F, "X"), - (0x3190, "V"), - (0x3192, "M", "一"), - (0x3193, "M", "二"), - (0x3194, "M", "三"), - (0x3195, "M", "四"), - (0x3196, "M", "上"), - (0x3197, "M", "中"), - (0x3198, "M", "下"), - (0x3199, "M", "甲"), - (0x319A, "M", "乙"), - (0x319B, "M", "丙"), - (0x319C, "M", "丁"), - (0x319D, "M", "天"), - (0x319E, "M", "地"), - (0x319F, "M", "人"), - (0x31A0, "V"), - (0x31E6, "X"), - (0x31F0, "V"), - (0x3200, "M", "(ᄀ)"), - (0x3201, "M", "(ᄂ)"), - (0x3202, "M", "(ᄃ)"), - (0x3203, "M", "(ᄅ)"), - (0x3204, "M", "(ᄆ)"), - (0x3205, "M", "(ᄇ)"), - (0x3206, "M", "(ᄉ)"), - (0x3207, "M", "(ᄋ)"), - (0x3208, "M", "(ᄌ)"), - (0x3209, "M", "(ᄎ)"), - (0x320A, "M", "(ᄏ)"), - (0x320B, "M", "(ᄐ)"), - (0x320C, "M", "(ᄑ)"), - (0x320D, "M", "(ᄒ)"), - (0x320E, "M", "(가)"), - (0x320F, "M", "(나)"), - (0x3210, "M", "(다)"), - (0x3211, "M", "(라)"), - (0x3212, "M", "(마)"), - (0x3213, "M", "(바)"), - (0x3214, "M", "(사)"), - (0x3215, "M", "(아)"), - (0x3216, "M", "(자)"), - (0x3217, "M", "(차)"), - (0x3218, "M", "(카)"), - (0x3219, "M", "(타)"), - (0x321A, "M", "(파)"), - (0x321B, "M", "(하)"), - (0x321C, "M", "(주)"), - (0x321D, "M", "(오전)"), - (0x321E, "M", "(오후)"), - (0x321F, "X"), - (0x3220, "M", "(一)"), - (0x3221, "M", "(二)"), - (0x3222, "M", "(三)"), - (0x3223, "M", "(四)"), - (0x3224, "M", "(五)"), - (0x3225, "M", "(六)"), - (0x3226, "M", "(七)"), - (0x3227, "M", "(八)"), - (0x3228, "M", "(九)"), - (0x3229, "M", "(十)"), - ] - - -def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x322A, "M", "(月)"), - (0x322B, "M", "(火)"), - (0x322C, "M", "(水)"), - (0x322D, "M", "(木)"), - (0x322E, "M", "(金)"), - (0x322F, "M", "(土)"), - (0x3230, "M", "(日)"), - (0x3231, "M", "(株)"), - (0x3232, "M", "(有)"), - (0x3233, "M", "(社)"), - (0x3234, "M", "(名)"), - (0x3235, "M", "(特)"), - (0x3236, "M", "(財)"), - (0x3237, "M", "(祝)"), - (0x3238, "M", "(労)"), - (0x3239, "M", "(代)"), - (0x323A, "M", "(呼)"), - (0x323B, "M", "(学)"), - (0x323C, "M", "(監)"), - (0x323D, "M", "(企)"), - (0x323E, "M", "(資)"), - (0x323F, "M", "(協)"), - (0x3240, "M", "(祭)"), - (0x3241, "M", "(休)"), - (0x3242, "M", "(自)"), - (0x3243, "M", "(至)"), - (0x3244, "M", "問"), - (0x3245, "M", "幼"), - (0x3246, "M", "文"), - (0x3247, "M", "箏"), - (0x3248, "V"), - (0x3250, "M", "pte"), - (0x3251, "M", "21"), - (0x3252, "M", "22"), - (0x3253, "M", "23"), - (0x3254, "M", "24"), - (0x3255, "M", "25"), - (0x3256, "M", "26"), - (0x3257, "M", "27"), - (0x3258, "M", "28"), - (0x3259, "M", "29"), - (0x325A, "M", "30"), - (0x325B, "M", "31"), - (0x325C, "M", "32"), - (0x325D, "M", "33"), - (0x325E, "M", "34"), - (0x325F, "M", "35"), - (0x3260, "M", "ᄀ"), - (0x3261, "M", "ᄂ"), - (0x3262, "M", "ᄃ"), - (0x3263, "M", "ᄅ"), - (0x3264, "M", "ᄆ"), - (0x3265, "M", "ᄇ"), - (0x3266, "M", "ᄉ"), - (0x3267, "M", "ᄋ"), - (0x3268, "M", "ᄌ"), - (0x3269, "M", "ᄎ"), - (0x326A, "M", "ᄏ"), - (0x326B, "M", "ᄐ"), - (0x326C, "M", "ᄑ"), - (0x326D, "M", "ᄒ"), - (0x326E, "M", "가"), - (0x326F, "M", "나"), - (0x3270, "M", "다"), - (0x3271, "M", "라"), - (0x3272, "M", "마"), - (0x3273, "M", "바"), - (0x3274, "M", "사"), - (0x3275, "M", "아"), - (0x3276, "M", "자"), - (0x3277, "M", "차"), - (0x3278, "M", "카"), - (0x3279, "M", "타"), - (0x327A, "M", "파"), - (0x327B, "M", "하"), - (0x327C, "M", "참고"), - (0x327D, "M", "주의"), - (0x327E, "M", "우"), - (0x327F, "V"), - (0x3280, "M", "一"), - (0x3281, "M", "二"), - (0x3282, "M", "三"), - (0x3283, "M", "四"), - (0x3284, "M", "五"), - (0x3285, "M", "六"), - (0x3286, "M", "七"), - (0x3287, "M", "八"), - (0x3288, "M", "九"), - (0x3289, "M", "十"), - (0x328A, "M", "月"), - (0x328B, "M", "火"), - (0x328C, "M", "水"), - (0x328D, "M", "木"), - (0x328E, "M", "金"), - (0x328F, "M", "土"), - (0x3290, "M", "日"), - (0x3291, "M", "株"), - (0x3292, "M", "有"), - (0x3293, "M", "社"), - (0x3294, "M", "名"), - ] - - -def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x3295, "M", "特"), - (0x3296, "M", "財"), - (0x3297, "M", "祝"), - (0x3298, "M", "労"), - (0x3299, "M", "秘"), - (0x329A, "M", "男"), - (0x329B, "M", "女"), - (0x329C, "M", "適"), - (0x329D, "M", "優"), - (0x329E, "M", "印"), - (0x329F, "M", "注"), - (0x32A0, "M", "項"), - (0x32A1, "M", "休"), - (0x32A2, "M", "写"), - (0x32A3, "M", "正"), - (0x32A4, "M", "上"), - (0x32A5, "M", "中"), - (0x32A6, "M", "下"), - (0x32A7, "M", "左"), - (0x32A8, "M", "右"), - (0x32A9, "M", "医"), - (0x32AA, "M", "宗"), - (0x32AB, "M", "学"), - (0x32AC, "M", "監"), - (0x32AD, "M", "企"), - (0x32AE, "M", "資"), - (0x32AF, "M", "協"), - (0x32B0, "M", "夜"), - (0x32B1, "M", "36"), - (0x32B2, "M", "37"), - (0x32B3, "M", "38"), - (0x32B4, "M", "39"), - (0x32B5, "M", "40"), - (0x32B6, "M", "41"), - (0x32B7, "M", "42"), - (0x32B8, "M", "43"), - (0x32B9, "M", "44"), - (0x32BA, "M", "45"), - (0x32BB, "M", "46"), - (0x32BC, "M", "47"), - (0x32BD, "M", "48"), - (0x32BE, "M", "49"), - (0x32BF, "M", "50"), - (0x32C0, "M", "1月"), - (0x32C1, "M", "2月"), - (0x32C2, "M", "3月"), - (0x32C3, "M", "4月"), - (0x32C4, "M", "5月"), - (0x32C5, "M", "6月"), - (0x32C6, "M", "7月"), - (0x32C7, "M", "8月"), - (0x32C8, "M", "9月"), - (0x32C9, "M", "10月"), - (0x32CA, "M", "11月"), - (0x32CB, "M", "12月"), - (0x32CC, "M", "hg"), - (0x32CD, "M", "erg"), - (0x32CE, "M", "ev"), - (0x32CF, "M", "ltd"), - (0x32D0, "M", "ア"), - (0x32D1, "M", "イ"), - (0x32D2, "M", "ウ"), - (0x32D3, "M", "エ"), - (0x32D4, "M", "オ"), - (0x32D5, "M", "カ"), - (0x32D6, "M", "キ"), - (0x32D7, "M", "ク"), - (0x32D8, "M", "ケ"), - (0x32D9, "M", "コ"), - (0x32DA, "M", "サ"), - (0x32DB, "M", "シ"), - (0x32DC, "M", "ス"), - (0x32DD, "M", "セ"), - (0x32DE, "M", "ソ"), - (0x32DF, "M", "タ"), - (0x32E0, "M", "チ"), - (0x32E1, "M", "ツ"), - (0x32E2, "M", "テ"), - (0x32E3, "M", "ト"), - (0x32E4, "M", "ナ"), - (0x32E5, "M", "ニ"), - (0x32E6, "M", "ヌ"), - (0x32E7, "M", "ネ"), - (0x32E8, "M", "ノ"), - (0x32E9, "M", "ハ"), - (0x32EA, "M", "ヒ"), - (0x32EB, "M", "フ"), - (0x32EC, "M", "ヘ"), - (0x32ED, "M", "ホ"), - (0x32EE, "M", "マ"), - (0x32EF, "M", "ミ"), - (0x32F0, "M", "ム"), - (0x32F1, "M", "メ"), - (0x32F2, "M", "モ"), - (0x32F3, "M", "ヤ"), - (0x32F4, "M", "ユ"), - (0x32F5, "M", "ヨ"), - (0x32F6, "M", "ラ"), - (0x32F7, "M", "リ"), - (0x32F8, "M", "ル"), - ] - - -def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x32F9, "M", "レ"), - (0x32FA, "M", "ロ"), - (0x32FB, "M", "ワ"), - (0x32FC, "M", "ヰ"), - (0x32FD, "M", "ヱ"), - (0x32FE, "M", "ヲ"), - (0x32FF, "M", "令和"), - (0x3300, "M", "アパート"), - (0x3301, "M", "アルファ"), - (0x3302, "M", "アンペア"), - (0x3303, "M", "アール"), - (0x3304, "M", "イニング"), - (0x3305, "M", "インチ"), - (0x3306, "M", "ウォン"), - (0x3307, "M", "エスクード"), - (0x3308, "M", "エーカー"), - (0x3309, "M", "オンス"), - (0x330A, "M", "オーム"), - (0x330B, "M", "カイリ"), - (0x330C, "M", "カラット"), - (0x330D, "M", "カロリー"), - (0x330E, "M", "ガロン"), - (0x330F, "M", "ガンマ"), - (0x3310, "M", "ギガ"), - (0x3311, "M", "ギニー"), - (0x3312, "M", "キュリー"), - (0x3313, "M", "ギルダー"), - (0x3314, "M", "キロ"), - (0x3315, "M", "キログラム"), - (0x3316, "M", "キロメートル"), - (0x3317, "M", "キロワット"), - (0x3318, "M", "グラム"), - (0x3319, "M", "グラムトン"), - (0x331A, "M", "クルゼイロ"), - (0x331B, "M", "クローネ"), - (0x331C, "M", "ケース"), - (0x331D, "M", "コルナ"), - (0x331E, "M", "コーポ"), - (0x331F, "M", "サイクル"), - (0x3320, "M", "サンチーム"), - (0x3321, "M", "シリング"), - (0x3322, "M", "センチ"), - (0x3323, "M", "セント"), - (0x3324, "M", "ダース"), - (0x3325, "M", "デシ"), - (0x3326, "M", "ドル"), - (0x3327, "M", "トン"), - (0x3328, "M", "ナノ"), - (0x3329, "M", "ノット"), - (0x332A, "M", "ハイツ"), - (0x332B, "M", "パーセント"), - (0x332C, "M", "パーツ"), - (0x332D, "M", "バーレル"), - (0x332E, "M", "ピアストル"), - (0x332F, "M", "ピクル"), - (0x3330, "M", "ピコ"), - (0x3331, "M", "ビル"), - (0x3332, "M", "ファラッド"), - (0x3333, "M", "フィート"), - (0x3334, "M", "ブッシェル"), - (0x3335, "M", "フラン"), - (0x3336, "M", "ヘクタール"), - (0x3337, "M", "ペソ"), - (0x3338, "M", "ペニヒ"), - (0x3339, "M", "ヘルツ"), - (0x333A, "M", "ペンス"), - (0x333B, "M", "ページ"), - (0x333C, "M", "ベータ"), - (0x333D, "M", "ポイント"), - (0x333E, "M", "ボルト"), - (0x333F, "M", "ホン"), - (0x3340, "M", "ポンド"), - (0x3341, "M", "ホール"), - (0x3342, "M", "ホーン"), - (0x3343, "M", "マイクロ"), - (0x3344, "M", "マイル"), - (0x3345, "M", "マッハ"), - (0x3346, "M", "マルク"), - (0x3347, "M", "マンション"), - (0x3348, "M", "ミクロン"), - (0x3349, "M", "ミリ"), - (0x334A, "M", "ミリバール"), - (0x334B, "M", "メガ"), - (0x334C, "M", "メガトン"), - (0x334D, "M", "メートル"), - (0x334E, "M", "ヤード"), - (0x334F, "M", "ヤール"), - (0x3350, "M", "ユアン"), - (0x3351, "M", "リットル"), - (0x3352, "M", "リラ"), - (0x3353, "M", "ルピー"), - (0x3354, "M", "ルーブル"), - (0x3355, "M", "レム"), - (0x3356, "M", "レントゲン"), - (0x3357, "M", "ワット"), - (0x3358, "M", "0点"), - (0x3359, "M", "1点"), - (0x335A, "M", "2点"), - (0x335B, "M", "3点"), - (0x335C, "M", "4点"), - ] - - -def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x335D, "M", "5点"), - (0x335E, "M", "6点"), - (0x335F, "M", "7点"), - (0x3360, "M", "8点"), - (0x3361, "M", "9点"), - (0x3362, "M", "10点"), - (0x3363, "M", "11点"), - (0x3364, "M", "12点"), - (0x3365, "M", "13点"), - (0x3366, "M", "14点"), - (0x3367, "M", "15点"), - (0x3368, "M", "16点"), - (0x3369, "M", "17点"), - (0x336A, "M", "18点"), - (0x336B, "M", "19点"), - (0x336C, "M", "20点"), - (0x336D, "M", "21点"), - (0x336E, "M", "22点"), - (0x336F, "M", "23点"), - (0x3370, "M", "24点"), - (0x3371, "M", "hpa"), - (0x3372, "M", "da"), - (0x3373, "M", "au"), - (0x3374, "M", "bar"), - (0x3375, "M", "ov"), - (0x3376, "M", "pc"), - (0x3377, "M", "dm"), - (0x3378, "M", "dm2"), - (0x3379, "M", "dm3"), - (0x337A, "M", "iu"), - (0x337B, "M", "平成"), - (0x337C, "M", "昭和"), - (0x337D, "M", "大正"), - (0x337E, "M", "明治"), - (0x337F, "M", "株式会社"), - (0x3380, "M", "pa"), - (0x3381, "M", "na"), - (0x3382, "M", "μa"), - (0x3383, "M", "ma"), - (0x3384, "M", "ka"), - (0x3385, "M", "kb"), - (0x3386, "M", "mb"), - (0x3387, "M", "gb"), - (0x3388, "M", "cal"), - (0x3389, "M", "kcal"), - (0x338A, "M", "pf"), - (0x338B, "M", "nf"), - (0x338C, "M", "μf"), - (0x338D, "M", "μg"), - (0x338E, "M", "mg"), - (0x338F, "M", "kg"), - (0x3390, "M", "hz"), - (0x3391, "M", "khz"), - (0x3392, "M", "mhz"), - (0x3393, "M", "ghz"), - (0x3394, "M", "thz"), - (0x3395, "M", "μl"), - (0x3396, "M", "ml"), - (0x3397, "M", "dl"), - (0x3398, "M", "kl"), - (0x3399, "M", "fm"), - (0x339A, "M", "nm"), - (0x339B, "M", "μm"), - (0x339C, "M", "mm"), - (0x339D, "M", "cm"), - (0x339E, "M", "km"), - (0x339F, "M", "mm2"), - (0x33A0, "M", "cm2"), - (0x33A1, "M", "m2"), - (0x33A2, "M", "km2"), - (0x33A3, "M", "mm3"), - (0x33A4, "M", "cm3"), - (0x33A5, "M", "m3"), - (0x33A6, "M", "km3"), - (0x33A7, "M", "m∕s"), - (0x33A8, "M", "m∕s2"), - (0x33A9, "M", "pa"), - (0x33AA, "M", "kpa"), - (0x33AB, "M", "mpa"), - (0x33AC, "M", "gpa"), - (0x33AD, "M", "rad"), - (0x33AE, "M", "rad∕s"), - (0x33AF, "M", "rad∕s2"), - (0x33B0, "M", "ps"), - (0x33B1, "M", "ns"), - (0x33B2, "M", "μs"), - (0x33B3, "M", "ms"), - (0x33B4, "M", "pv"), - (0x33B5, "M", "nv"), - (0x33B6, "M", "μv"), - (0x33B7, "M", "mv"), - (0x33B8, "M", "kv"), - (0x33B9, "M", "mv"), - (0x33BA, "M", "pw"), - (0x33BB, "M", "nw"), - (0x33BC, "M", "μw"), - (0x33BD, "M", "mw"), - (0x33BE, "M", "kw"), - (0x33BF, "M", "mw"), - (0x33C0, "M", "kω"), - ] - - -def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x33C1, "M", "mω"), - (0x33C2, "X"), - (0x33C3, "M", "bq"), - (0x33C4, "M", "cc"), - (0x33C5, "M", "cd"), - (0x33C6, "M", "c∕kg"), - (0x33C7, "X"), - (0x33C8, "M", "db"), - (0x33C9, "M", "gy"), - (0x33CA, "M", "ha"), - (0x33CB, "M", "hp"), - (0x33CC, "M", "in"), - (0x33CD, "M", "kk"), - (0x33CE, "M", "km"), - (0x33CF, "M", "kt"), - (0x33D0, "M", "lm"), - (0x33D1, "M", "ln"), - (0x33D2, "M", "log"), - (0x33D3, "M", "lx"), - (0x33D4, "M", "mb"), - (0x33D5, "M", "mil"), - (0x33D6, "M", "mol"), - (0x33D7, "M", "ph"), - (0x33D8, "X"), - (0x33D9, "M", "ppm"), - (0x33DA, "M", "pr"), - (0x33DB, "M", "sr"), - (0x33DC, "M", "sv"), - (0x33DD, "M", "wb"), - (0x33DE, "M", "v∕m"), - (0x33DF, "M", "a∕m"), - (0x33E0, "M", "1日"), - (0x33E1, "M", "2日"), - (0x33E2, "M", "3日"), - (0x33E3, "M", "4日"), - (0x33E4, "M", "5日"), - (0x33E5, "M", "6日"), - (0x33E6, "M", "7日"), - (0x33E7, "M", "8日"), - (0x33E8, "M", "9日"), - (0x33E9, "M", "10日"), - (0x33EA, "M", "11日"), - (0x33EB, "M", "12日"), - (0x33EC, "M", "13日"), - (0x33ED, "M", "14日"), - (0x33EE, "M", "15日"), - (0x33EF, "M", "16日"), - (0x33F0, "M", "17日"), - (0x33F1, "M", "18日"), - (0x33F2, "M", "19日"), - (0x33F3, "M", "20日"), - (0x33F4, "M", "21日"), - (0x33F5, "M", "22日"), - (0x33F6, "M", "23日"), - (0x33F7, "M", "24日"), - (0x33F8, "M", "25日"), - (0x33F9, "M", "26日"), - (0x33FA, "M", "27日"), - (0x33FB, "M", "28日"), - (0x33FC, "M", "29日"), - (0x33FD, "M", "30日"), - (0x33FE, "M", "31日"), - (0x33FF, "M", "gal"), - (0x3400, "V"), - (0xA48D, "X"), - (0xA490, "V"), - (0xA4C7, "X"), - (0xA4D0, "V"), - (0xA62C, "X"), - (0xA640, "M", "ꙁ"), - (0xA641, "V"), - (0xA642, "M", "ꙃ"), - (0xA643, "V"), - (0xA644, "M", "ꙅ"), - (0xA645, "V"), - (0xA646, "M", "ꙇ"), - (0xA647, "V"), - (0xA648, "M", "ꙉ"), - (0xA649, "V"), - (0xA64A, "M", "ꙋ"), - (0xA64B, "V"), - (0xA64C, "M", "ꙍ"), - (0xA64D, "V"), - (0xA64E, "M", "ꙏ"), - (0xA64F, "V"), - (0xA650, "M", "ꙑ"), - (0xA651, "V"), - (0xA652, "M", "ꙓ"), - (0xA653, "V"), - (0xA654, "M", "ꙕ"), - (0xA655, "V"), - (0xA656, "M", "ꙗ"), - (0xA657, "V"), - (0xA658, "M", "ꙙ"), - (0xA659, "V"), - (0xA65A, "M", "ꙛ"), - (0xA65B, "V"), - (0xA65C, "M", "ꙝ"), - (0xA65D, "V"), - (0xA65E, "M", "ꙟ"), - ] - - -def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA65F, "V"), - (0xA660, "M", "ꙡ"), - (0xA661, "V"), - (0xA662, "M", "ꙣ"), - (0xA663, "V"), - (0xA664, "M", "ꙥ"), - (0xA665, "V"), - (0xA666, "M", "ꙧ"), - (0xA667, "V"), - (0xA668, "M", "ꙩ"), - (0xA669, "V"), - (0xA66A, "M", "ꙫ"), - (0xA66B, "V"), - (0xA66C, "M", "ꙭ"), - (0xA66D, "V"), - (0xA680, "M", "ꚁ"), - (0xA681, "V"), - (0xA682, "M", "ꚃ"), - (0xA683, "V"), - (0xA684, "M", "ꚅ"), - (0xA685, "V"), - (0xA686, "M", "ꚇ"), - (0xA687, "V"), - (0xA688, "M", "ꚉ"), - (0xA689, "V"), - (0xA68A, "M", "ꚋ"), - (0xA68B, "V"), - (0xA68C, "M", "ꚍ"), - (0xA68D, "V"), - (0xA68E, "M", "ꚏ"), - (0xA68F, "V"), - (0xA690, "M", "ꚑ"), - (0xA691, "V"), - (0xA692, "M", "ꚓ"), - (0xA693, "V"), - (0xA694, "M", "ꚕ"), - (0xA695, "V"), - (0xA696, "M", "ꚗ"), - (0xA697, "V"), - (0xA698, "M", "ꚙ"), - (0xA699, "V"), - (0xA69A, "M", "ꚛ"), - (0xA69B, "V"), - (0xA69C, "M", "ъ"), - (0xA69D, "M", "ь"), - (0xA69E, "V"), - (0xA6F8, "X"), - (0xA700, "V"), - (0xA722, "M", "ꜣ"), - (0xA723, "V"), - (0xA724, "M", "ꜥ"), - (0xA725, "V"), - (0xA726, "M", "ꜧ"), - (0xA727, "V"), - (0xA728, "M", "ꜩ"), - (0xA729, "V"), - (0xA72A, "M", "ꜫ"), - (0xA72B, "V"), - (0xA72C, "M", "ꜭ"), - (0xA72D, "V"), - (0xA72E, "M", "ꜯ"), - (0xA72F, "V"), - (0xA732, "M", "ꜳ"), - (0xA733, "V"), - (0xA734, "M", "ꜵ"), - (0xA735, "V"), - (0xA736, "M", "ꜷ"), - (0xA737, "V"), - (0xA738, "M", "ꜹ"), - (0xA739, "V"), - (0xA73A, "M", "ꜻ"), - (0xA73B, "V"), - (0xA73C, "M", "ꜽ"), - (0xA73D, "V"), - (0xA73E, "M", "ꜿ"), - (0xA73F, "V"), - (0xA740, "M", "ꝁ"), - (0xA741, "V"), - (0xA742, "M", "ꝃ"), - (0xA743, "V"), - (0xA744, "M", "ꝅ"), - (0xA745, "V"), - (0xA746, "M", "ꝇ"), - (0xA747, "V"), - (0xA748, "M", "ꝉ"), - (0xA749, "V"), - (0xA74A, "M", "ꝋ"), - (0xA74B, "V"), - (0xA74C, "M", "ꝍ"), - (0xA74D, "V"), - (0xA74E, "M", "ꝏ"), - (0xA74F, "V"), - (0xA750, "M", "ꝑ"), - (0xA751, "V"), - (0xA752, "M", "ꝓ"), - (0xA753, "V"), - (0xA754, "M", "ꝕ"), - (0xA755, "V"), - (0xA756, "M", "ꝗ"), - (0xA757, "V"), - ] - - -def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA758, "M", "ꝙ"), - (0xA759, "V"), - (0xA75A, "M", "ꝛ"), - (0xA75B, "V"), - (0xA75C, "M", "ꝝ"), - (0xA75D, "V"), - (0xA75E, "M", "ꝟ"), - (0xA75F, "V"), - (0xA760, "M", "ꝡ"), - (0xA761, "V"), - (0xA762, "M", "ꝣ"), - (0xA763, "V"), - (0xA764, "M", "ꝥ"), - (0xA765, "V"), - (0xA766, "M", "ꝧ"), - (0xA767, "V"), - (0xA768, "M", "ꝩ"), - (0xA769, "V"), - (0xA76A, "M", "ꝫ"), - (0xA76B, "V"), - (0xA76C, "M", "ꝭ"), - (0xA76D, "V"), - (0xA76E, "M", "ꝯ"), - (0xA76F, "V"), - (0xA770, "M", "ꝯ"), - (0xA771, "V"), - (0xA779, "M", "ꝺ"), - (0xA77A, "V"), - (0xA77B, "M", "ꝼ"), - (0xA77C, "V"), - (0xA77D, "M", "ᵹ"), - (0xA77E, "M", "ꝿ"), - (0xA77F, "V"), - (0xA780, "M", "ꞁ"), - (0xA781, "V"), - (0xA782, "M", "ꞃ"), - (0xA783, "V"), - (0xA784, "M", "ꞅ"), - (0xA785, "V"), - (0xA786, "M", "ꞇ"), - (0xA787, "V"), - (0xA78B, "M", "ꞌ"), - (0xA78C, "V"), - (0xA78D, "M", "ɥ"), - (0xA78E, "V"), - (0xA790, "M", "ꞑ"), - (0xA791, "V"), - (0xA792, "M", "ꞓ"), - (0xA793, "V"), - (0xA796, "M", "ꞗ"), - (0xA797, "V"), - (0xA798, "M", "ꞙ"), - (0xA799, "V"), - (0xA79A, "M", "ꞛ"), - (0xA79B, "V"), - (0xA79C, "M", "ꞝ"), - (0xA79D, "V"), - (0xA79E, "M", "ꞟ"), - (0xA79F, "V"), - (0xA7A0, "M", "ꞡ"), - (0xA7A1, "V"), - (0xA7A2, "M", "ꞣ"), - (0xA7A3, "V"), - (0xA7A4, "M", "ꞥ"), - (0xA7A5, "V"), - (0xA7A6, "M", "ꞧ"), - (0xA7A7, "V"), - (0xA7A8, "M", "ꞩ"), - (0xA7A9, "V"), - (0xA7AA, "M", "ɦ"), - (0xA7AB, "M", "ɜ"), - (0xA7AC, "M", "ɡ"), - (0xA7AD, "M", "ɬ"), - (0xA7AE, "M", "ɪ"), - (0xA7AF, "V"), - (0xA7B0, "M", "ʞ"), - (0xA7B1, "M", "ʇ"), - (0xA7B2, "M", "ʝ"), - (0xA7B3, "M", "ꭓ"), - (0xA7B4, "M", "ꞵ"), - (0xA7B5, "V"), - (0xA7B6, "M", "ꞷ"), - (0xA7B7, "V"), - (0xA7B8, "M", "ꞹ"), - (0xA7B9, "V"), - (0xA7BA, "M", "ꞻ"), - (0xA7BB, "V"), - (0xA7BC, "M", "ꞽ"), - (0xA7BD, "V"), - (0xA7BE, "M", "ꞿ"), - (0xA7BF, "V"), - (0xA7C0, "M", "ꟁ"), - (0xA7C1, "V"), - (0xA7C2, "M", "ꟃ"), - (0xA7C3, "V"), - (0xA7C4, "M", "ꞔ"), - (0xA7C5, "M", "ʂ"), - (0xA7C6, "M", "ᶎ"), - (0xA7C7, "M", "ꟈ"), - (0xA7C8, "V"), - ] - - -def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xA7C9, "M", "ꟊ"), - (0xA7CA, "V"), - (0xA7CB, "M", "ɤ"), - (0xA7CC, "M", "ꟍ"), - (0xA7CD, "V"), - (0xA7CE, "X"), - (0xA7D0, "M", "ꟑ"), - (0xA7D1, "V"), - (0xA7D2, "X"), - (0xA7D3, "V"), - (0xA7D4, "X"), - (0xA7D5, "V"), - (0xA7D6, "M", "ꟗ"), - (0xA7D7, "V"), - (0xA7D8, "M", "ꟙ"), - (0xA7D9, "V"), - (0xA7DA, "M", "ꟛ"), - (0xA7DB, "V"), - (0xA7DC, "M", "ƛ"), - (0xA7DD, "X"), - (0xA7F2, "M", "c"), - (0xA7F3, "M", "f"), - (0xA7F4, "M", "q"), - (0xA7F5, "M", "ꟶ"), - (0xA7F6, "V"), - (0xA7F8, "M", "ħ"), - (0xA7F9, "M", "œ"), - (0xA7FA, "V"), - (0xA82D, "X"), - (0xA830, "V"), - (0xA83A, "X"), - (0xA840, "V"), - (0xA878, "X"), - (0xA880, "V"), - (0xA8C6, "X"), - (0xA8CE, "V"), - (0xA8DA, "X"), - (0xA8E0, "V"), - (0xA954, "X"), - (0xA95F, "V"), - (0xA97D, "X"), - (0xA980, "V"), - (0xA9CE, "X"), - (0xA9CF, "V"), - (0xA9DA, "X"), - (0xA9DE, "V"), - (0xA9FF, "X"), - (0xAA00, "V"), - (0xAA37, "X"), - (0xAA40, "V"), - (0xAA4E, "X"), - (0xAA50, "V"), - (0xAA5A, "X"), - (0xAA5C, "V"), - (0xAAC3, "X"), - (0xAADB, "V"), - (0xAAF7, "X"), - (0xAB01, "V"), - (0xAB07, "X"), - (0xAB09, "V"), - (0xAB0F, "X"), - (0xAB11, "V"), - (0xAB17, "X"), - (0xAB20, "V"), - (0xAB27, "X"), - (0xAB28, "V"), - (0xAB2F, "X"), - (0xAB30, "V"), - (0xAB5C, "M", "ꜧ"), - (0xAB5D, "M", "ꬷ"), - (0xAB5E, "M", "ɫ"), - (0xAB5F, "M", "ꭒ"), - (0xAB60, "V"), - (0xAB69, "M", "ʍ"), - (0xAB6A, "V"), - (0xAB6C, "X"), - (0xAB70, "M", "Ꭰ"), - (0xAB71, "M", "Ꭱ"), - (0xAB72, "M", "Ꭲ"), - (0xAB73, "M", "Ꭳ"), - (0xAB74, "M", "Ꭴ"), - (0xAB75, "M", "Ꭵ"), - (0xAB76, "M", "Ꭶ"), - (0xAB77, "M", "Ꭷ"), - (0xAB78, "M", "Ꭸ"), - (0xAB79, "M", "Ꭹ"), - (0xAB7A, "M", "Ꭺ"), - (0xAB7B, "M", "Ꭻ"), - (0xAB7C, "M", "Ꭼ"), - (0xAB7D, "M", "Ꭽ"), - (0xAB7E, "M", "Ꭾ"), - (0xAB7F, "M", "Ꭿ"), - (0xAB80, "M", "Ꮀ"), - (0xAB81, "M", "Ꮁ"), - (0xAB82, "M", "Ꮂ"), - (0xAB83, "M", "Ꮃ"), - (0xAB84, "M", "Ꮄ"), - (0xAB85, "M", "Ꮅ"), - (0xAB86, "M", "Ꮆ"), - (0xAB87, "M", "Ꮇ"), - ] - - -def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xAB88, "M", "Ꮈ"), - (0xAB89, "M", "Ꮉ"), - (0xAB8A, "M", "Ꮊ"), - (0xAB8B, "M", "Ꮋ"), - (0xAB8C, "M", "Ꮌ"), - (0xAB8D, "M", "Ꮍ"), - (0xAB8E, "M", "Ꮎ"), - (0xAB8F, "M", "Ꮏ"), - (0xAB90, "M", "Ꮐ"), - (0xAB91, "M", "Ꮑ"), - (0xAB92, "M", "Ꮒ"), - (0xAB93, "M", "Ꮓ"), - (0xAB94, "M", "Ꮔ"), - (0xAB95, "M", "Ꮕ"), - (0xAB96, "M", "Ꮖ"), - (0xAB97, "M", "Ꮗ"), - (0xAB98, "M", "Ꮘ"), - (0xAB99, "M", "Ꮙ"), - (0xAB9A, "M", "Ꮚ"), - (0xAB9B, "M", "Ꮛ"), - (0xAB9C, "M", "Ꮜ"), - (0xAB9D, "M", "Ꮝ"), - (0xAB9E, "M", "Ꮞ"), - (0xAB9F, "M", "Ꮟ"), - (0xABA0, "M", "Ꮠ"), - (0xABA1, "M", "Ꮡ"), - (0xABA2, "M", "Ꮢ"), - (0xABA3, "M", "Ꮣ"), - (0xABA4, "M", "Ꮤ"), - (0xABA5, "M", "Ꮥ"), - (0xABA6, "M", "Ꮦ"), - (0xABA7, "M", "Ꮧ"), - (0xABA8, "M", "Ꮨ"), - (0xABA9, "M", "Ꮩ"), - (0xABAA, "M", "Ꮪ"), - (0xABAB, "M", "Ꮫ"), - (0xABAC, "M", "Ꮬ"), - (0xABAD, "M", "Ꮭ"), - (0xABAE, "M", "Ꮮ"), - (0xABAF, "M", "Ꮯ"), - (0xABB0, "M", "Ꮰ"), - (0xABB1, "M", "Ꮱ"), - (0xABB2, "M", "Ꮲ"), - (0xABB3, "M", "Ꮳ"), - (0xABB4, "M", "Ꮴ"), - (0xABB5, "M", "Ꮵ"), - (0xABB6, "M", "Ꮶ"), - (0xABB7, "M", "Ꮷ"), - (0xABB8, "M", "Ꮸ"), - (0xABB9, "M", "Ꮹ"), - (0xABBA, "M", "Ꮺ"), - (0xABBB, "M", "Ꮻ"), - (0xABBC, "M", "Ꮼ"), - (0xABBD, "M", "Ꮽ"), - (0xABBE, "M", "Ꮾ"), - (0xABBF, "M", "Ꮿ"), - (0xABC0, "V"), - (0xABEE, "X"), - (0xABF0, "V"), - (0xABFA, "X"), - (0xAC00, "V"), - (0xD7A4, "X"), - (0xD7B0, "V"), - (0xD7C7, "X"), - (0xD7CB, "V"), - (0xD7FC, "X"), - (0xF900, "M", "豈"), - (0xF901, "M", "更"), - (0xF902, "M", "車"), - (0xF903, "M", "賈"), - (0xF904, "M", "滑"), - (0xF905, "M", "串"), - (0xF906, "M", "句"), - (0xF907, "M", "龜"), - (0xF909, "M", "契"), - (0xF90A, "M", "金"), - (0xF90B, "M", "喇"), - (0xF90C, "M", "奈"), - (0xF90D, "M", "懶"), - (0xF90E, "M", "癩"), - (0xF90F, "M", "羅"), - (0xF910, "M", "蘿"), - (0xF911, "M", "螺"), - (0xF912, "M", "裸"), - (0xF913, "M", "邏"), - (0xF914, "M", "樂"), - (0xF915, "M", "洛"), - (0xF916, "M", "烙"), - (0xF917, "M", "珞"), - (0xF918, "M", "落"), - (0xF919, "M", "酪"), - (0xF91A, "M", "駱"), - (0xF91B, "M", "亂"), - (0xF91C, "M", "卵"), - (0xF91D, "M", "欄"), - (0xF91E, "M", "爛"), - (0xF91F, "M", "蘭"), - (0xF920, "M", "鸞"), - (0xF921, "M", "嵐"), - (0xF922, "M", "濫"), - ] - - -def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF923, "M", "藍"), - (0xF924, "M", "襤"), - (0xF925, "M", "拉"), - (0xF926, "M", "臘"), - (0xF927, "M", "蠟"), - (0xF928, "M", "廊"), - (0xF929, "M", "朗"), - (0xF92A, "M", "浪"), - (0xF92B, "M", "狼"), - (0xF92C, "M", "郎"), - (0xF92D, "M", "來"), - (0xF92E, "M", "冷"), - (0xF92F, "M", "勞"), - (0xF930, "M", "擄"), - (0xF931, "M", "櫓"), - (0xF932, "M", "爐"), - (0xF933, "M", "盧"), - (0xF934, "M", "老"), - (0xF935, "M", "蘆"), - (0xF936, "M", "虜"), - (0xF937, "M", "路"), - (0xF938, "M", "露"), - (0xF939, "M", "魯"), - (0xF93A, "M", "鷺"), - (0xF93B, "M", "碌"), - (0xF93C, "M", "祿"), - (0xF93D, "M", "綠"), - (0xF93E, "M", "菉"), - (0xF93F, "M", "錄"), - (0xF940, "M", "鹿"), - (0xF941, "M", "論"), - (0xF942, "M", "壟"), - (0xF943, "M", "弄"), - (0xF944, "M", "籠"), - (0xF945, "M", "聾"), - (0xF946, "M", "牢"), - (0xF947, "M", "磊"), - (0xF948, "M", "賂"), - (0xF949, "M", "雷"), - (0xF94A, "M", "壘"), - (0xF94B, "M", "屢"), - (0xF94C, "M", "樓"), - (0xF94D, "M", "淚"), - (0xF94E, "M", "漏"), - (0xF94F, "M", "累"), - (0xF950, "M", "縷"), - (0xF951, "M", "陋"), - (0xF952, "M", "勒"), - (0xF953, "M", "肋"), - (0xF954, "M", "凜"), - (0xF955, "M", "凌"), - (0xF956, "M", "稜"), - (0xF957, "M", "綾"), - (0xF958, "M", "菱"), - (0xF959, "M", "陵"), - (0xF95A, "M", "讀"), - (0xF95B, "M", "拏"), - (0xF95C, "M", "樂"), - (0xF95D, "M", "諾"), - (0xF95E, "M", "丹"), - (0xF95F, "M", "寧"), - (0xF960, "M", "怒"), - (0xF961, "M", "率"), - (0xF962, "M", "異"), - (0xF963, "M", "北"), - (0xF964, "M", "磻"), - (0xF965, "M", "便"), - (0xF966, "M", "復"), - (0xF967, "M", "不"), - (0xF968, "M", "泌"), - (0xF969, "M", "數"), - (0xF96A, "M", "索"), - (0xF96B, "M", "參"), - (0xF96C, "M", "塞"), - (0xF96D, "M", "省"), - (0xF96E, "M", "葉"), - (0xF96F, "M", "說"), - (0xF970, "M", "殺"), - (0xF971, "M", "辰"), - (0xF972, "M", "沈"), - (0xF973, "M", "拾"), - (0xF974, "M", "若"), - (0xF975, "M", "掠"), - (0xF976, "M", "略"), - (0xF977, "M", "亮"), - (0xF978, "M", "兩"), - (0xF979, "M", "凉"), - (0xF97A, "M", "梁"), - (0xF97B, "M", "糧"), - (0xF97C, "M", "良"), - (0xF97D, "M", "諒"), - (0xF97E, "M", "量"), - (0xF97F, "M", "勵"), - (0xF980, "M", "呂"), - (0xF981, "M", "女"), - (0xF982, "M", "廬"), - (0xF983, "M", "旅"), - (0xF984, "M", "濾"), - (0xF985, "M", "礪"), - (0xF986, "M", "閭"), - ] - - -def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF987, "M", "驪"), - (0xF988, "M", "麗"), - (0xF989, "M", "黎"), - (0xF98A, "M", "力"), - (0xF98B, "M", "曆"), - (0xF98C, "M", "歷"), - (0xF98D, "M", "轢"), - (0xF98E, "M", "年"), - (0xF98F, "M", "憐"), - (0xF990, "M", "戀"), - (0xF991, "M", "撚"), - (0xF992, "M", "漣"), - (0xF993, "M", "煉"), - (0xF994, "M", "璉"), - (0xF995, "M", "秊"), - (0xF996, "M", "練"), - (0xF997, "M", "聯"), - (0xF998, "M", "輦"), - (0xF999, "M", "蓮"), - (0xF99A, "M", "連"), - (0xF99B, "M", "鍊"), - (0xF99C, "M", "列"), - (0xF99D, "M", "劣"), - (0xF99E, "M", "咽"), - (0xF99F, "M", "烈"), - (0xF9A0, "M", "裂"), - (0xF9A1, "M", "說"), - (0xF9A2, "M", "廉"), - (0xF9A3, "M", "念"), - (0xF9A4, "M", "捻"), - (0xF9A5, "M", "殮"), - (0xF9A6, "M", "簾"), - (0xF9A7, "M", "獵"), - (0xF9A8, "M", "令"), - (0xF9A9, "M", "囹"), - (0xF9AA, "M", "寧"), - (0xF9AB, "M", "嶺"), - (0xF9AC, "M", "怜"), - (0xF9AD, "M", "玲"), - (0xF9AE, "M", "瑩"), - (0xF9AF, "M", "羚"), - (0xF9B0, "M", "聆"), - (0xF9B1, "M", "鈴"), - (0xF9B2, "M", "零"), - (0xF9B3, "M", "靈"), - (0xF9B4, "M", "領"), - (0xF9B5, "M", "例"), - (0xF9B6, "M", "禮"), - (0xF9B7, "M", "醴"), - (0xF9B8, "M", "隸"), - (0xF9B9, "M", "惡"), - (0xF9BA, "M", "了"), - (0xF9BB, "M", "僚"), - (0xF9BC, "M", "寮"), - (0xF9BD, "M", "尿"), - (0xF9BE, "M", "料"), - (0xF9BF, "M", "樂"), - (0xF9C0, "M", "燎"), - (0xF9C1, "M", "療"), - (0xF9C2, "M", "蓼"), - (0xF9C3, "M", "遼"), - (0xF9C4, "M", "龍"), - (0xF9C5, "M", "暈"), - (0xF9C6, "M", "阮"), - (0xF9C7, "M", "劉"), - (0xF9C8, "M", "杻"), - (0xF9C9, "M", "柳"), - (0xF9CA, "M", "流"), - (0xF9CB, "M", "溜"), - (0xF9CC, "M", "琉"), - (0xF9CD, "M", "留"), - (0xF9CE, "M", "硫"), - (0xF9CF, "M", "紐"), - (0xF9D0, "M", "類"), - (0xF9D1, "M", "六"), - (0xF9D2, "M", "戮"), - (0xF9D3, "M", "陸"), - (0xF9D4, "M", "倫"), - (0xF9D5, "M", "崙"), - (0xF9D6, "M", "淪"), - (0xF9D7, "M", "輪"), - (0xF9D8, "M", "律"), - (0xF9D9, "M", "慄"), - (0xF9DA, "M", "栗"), - (0xF9DB, "M", "率"), - (0xF9DC, "M", "隆"), - (0xF9DD, "M", "利"), - (0xF9DE, "M", "吏"), - (0xF9DF, "M", "履"), - (0xF9E0, "M", "易"), - (0xF9E1, "M", "李"), - (0xF9E2, "M", "梨"), - (0xF9E3, "M", "泥"), - (0xF9E4, "M", "理"), - (0xF9E5, "M", "痢"), - (0xF9E6, "M", "罹"), - (0xF9E7, "M", "裏"), - (0xF9E8, "M", "裡"), - (0xF9E9, "M", "里"), - (0xF9EA, "M", "離"), - ] - - -def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xF9EB, "M", "匿"), - (0xF9EC, "M", "溺"), - (0xF9ED, "M", "吝"), - (0xF9EE, "M", "燐"), - (0xF9EF, "M", "璘"), - (0xF9F0, "M", "藺"), - (0xF9F1, "M", "隣"), - (0xF9F2, "M", "鱗"), - (0xF9F3, "M", "麟"), - (0xF9F4, "M", "林"), - (0xF9F5, "M", "淋"), - (0xF9F6, "M", "臨"), - (0xF9F7, "M", "立"), - (0xF9F8, "M", "笠"), - (0xF9F9, "M", "粒"), - (0xF9FA, "M", "狀"), - (0xF9FB, "M", "炙"), - (0xF9FC, "M", "識"), - (0xF9FD, "M", "什"), - (0xF9FE, "M", "茶"), - (0xF9FF, "M", "刺"), - (0xFA00, "M", "切"), - (0xFA01, "M", "度"), - (0xFA02, "M", "拓"), - (0xFA03, "M", "糖"), - (0xFA04, "M", "宅"), - (0xFA05, "M", "洞"), - (0xFA06, "M", "暴"), - (0xFA07, "M", "輻"), - (0xFA08, "M", "行"), - (0xFA09, "M", "降"), - (0xFA0A, "M", "見"), - (0xFA0B, "M", "廓"), - (0xFA0C, "M", "兀"), - (0xFA0D, "M", "嗀"), - (0xFA0E, "V"), - (0xFA10, "M", "塚"), - (0xFA11, "V"), - (0xFA12, "M", "晴"), - (0xFA13, "V"), - (0xFA15, "M", "凞"), - (0xFA16, "M", "猪"), - (0xFA17, "M", "益"), - (0xFA18, "M", "礼"), - (0xFA19, "M", "神"), - (0xFA1A, "M", "祥"), - (0xFA1B, "M", "福"), - (0xFA1C, "M", "靖"), - (0xFA1D, "M", "精"), - (0xFA1E, "M", "羽"), - (0xFA1F, "V"), - (0xFA20, "M", "蘒"), - (0xFA21, "V"), - (0xFA22, "M", "諸"), - (0xFA23, "V"), - (0xFA25, "M", "逸"), - (0xFA26, "M", "都"), - (0xFA27, "V"), - (0xFA2A, "M", "飯"), - (0xFA2B, "M", "飼"), - (0xFA2C, "M", "館"), - (0xFA2D, "M", "鶴"), - (0xFA2E, "M", "郞"), - (0xFA2F, "M", "隷"), - (0xFA30, "M", "侮"), - (0xFA31, "M", "僧"), - (0xFA32, "M", "免"), - (0xFA33, "M", "勉"), - (0xFA34, "M", "勤"), - (0xFA35, "M", "卑"), - (0xFA36, "M", "喝"), - (0xFA37, "M", "嘆"), - (0xFA38, "M", "器"), - (0xFA39, "M", "塀"), - (0xFA3A, "M", "墨"), - (0xFA3B, "M", "層"), - (0xFA3C, "M", "屮"), - (0xFA3D, "M", "悔"), - (0xFA3E, "M", "慨"), - (0xFA3F, "M", "憎"), - (0xFA40, "M", "懲"), - (0xFA41, "M", "敏"), - (0xFA42, "M", "既"), - (0xFA43, "M", "暑"), - (0xFA44, "M", "梅"), - (0xFA45, "M", "海"), - (0xFA46, "M", "渚"), - (0xFA47, "M", "漢"), - (0xFA48, "M", "煮"), - (0xFA49, "M", "爫"), - (0xFA4A, "M", "琢"), - (0xFA4B, "M", "碑"), - (0xFA4C, "M", "社"), - (0xFA4D, "M", "祉"), - (0xFA4E, "M", "祈"), - (0xFA4F, "M", "祐"), - (0xFA50, "M", "祖"), - (0xFA51, "M", "祝"), - (0xFA52, "M", "禍"), - (0xFA53, "M", "禎"), - ] - - -def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFA54, "M", "穀"), - (0xFA55, "M", "突"), - (0xFA56, "M", "節"), - (0xFA57, "M", "練"), - (0xFA58, "M", "縉"), - (0xFA59, "M", "繁"), - (0xFA5A, "M", "署"), - (0xFA5B, "M", "者"), - (0xFA5C, "M", "臭"), - (0xFA5D, "M", "艹"), - (0xFA5F, "M", "著"), - (0xFA60, "M", "褐"), - (0xFA61, "M", "視"), - (0xFA62, "M", "謁"), - (0xFA63, "M", "謹"), - (0xFA64, "M", "賓"), - (0xFA65, "M", "贈"), - (0xFA66, "M", "辶"), - (0xFA67, "M", "逸"), - (0xFA68, "M", "難"), - (0xFA69, "M", "響"), - (0xFA6A, "M", "頻"), - (0xFA6B, "M", "恵"), - (0xFA6C, "M", "𤋮"), - (0xFA6D, "M", "舘"), - (0xFA6E, "X"), - (0xFA70, "M", "並"), - (0xFA71, "M", "况"), - (0xFA72, "M", "全"), - (0xFA73, "M", "侀"), - (0xFA74, "M", "充"), - (0xFA75, "M", "冀"), - (0xFA76, "M", "勇"), - (0xFA77, "M", "勺"), - (0xFA78, "M", "喝"), - (0xFA79, "M", "啕"), - (0xFA7A, "M", "喙"), - (0xFA7B, "M", "嗢"), - (0xFA7C, "M", "塚"), - (0xFA7D, "M", "墳"), - (0xFA7E, "M", "奄"), - (0xFA7F, "M", "奔"), - (0xFA80, "M", "婢"), - (0xFA81, "M", "嬨"), - (0xFA82, "M", "廒"), - (0xFA83, "M", "廙"), - (0xFA84, "M", "彩"), - (0xFA85, "M", "徭"), - (0xFA86, "M", "惘"), - (0xFA87, "M", "慎"), - (0xFA88, "M", "愈"), - (0xFA89, "M", "憎"), - (0xFA8A, "M", "慠"), - (0xFA8B, "M", "懲"), - (0xFA8C, "M", "戴"), - (0xFA8D, "M", "揄"), - (0xFA8E, "M", "搜"), - (0xFA8F, "M", "摒"), - (0xFA90, "M", "敖"), - (0xFA91, "M", "晴"), - (0xFA92, "M", "朗"), - (0xFA93, "M", "望"), - (0xFA94, "M", "杖"), - (0xFA95, "M", "歹"), - (0xFA96, "M", "殺"), - (0xFA97, "M", "流"), - (0xFA98, "M", "滛"), - (0xFA99, "M", "滋"), - (0xFA9A, "M", "漢"), - (0xFA9B, "M", "瀞"), - (0xFA9C, "M", "煮"), - (0xFA9D, "M", "瞧"), - (0xFA9E, "M", "爵"), - (0xFA9F, "M", "犯"), - (0xFAA0, "M", "猪"), - (0xFAA1, "M", "瑱"), - (0xFAA2, "M", "甆"), - (0xFAA3, "M", "画"), - (0xFAA4, "M", "瘝"), - (0xFAA5, "M", "瘟"), - (0xFAA6, "M", "益"), - (0xFAA7, "M", "盛"), - (0xFAA8, "M", "直"), - (0xFAA9, "M", "睊"), - (0xFAAA, "M", "着"), - (0xFAAB, "M", "磌"), - (0xFAAC, "M", "窱"), - (0xFAAD, "M", "節"), - (0xFAAE, "M", "类"), - (0xFAAF, "M", "絛"), - (0xFAB0, "M", "練"), - (0xFAB1, "M", "缾"), - (0xFAB2, "M", "者"), - (0xFAB3, "M", "荒"), - (0xFAB4, "M", "華"), - (0xFAB5, "M", "蝹"), - (0xFAB6, "M", "襁"), - (0xFAB7, "M", "覆"), - (0xFAB8, "M", "視"), - (0xFAB9, "M", "調"), - ] - - -def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFABA, "M", "諸"), - (0xFABB, "M", "請"), - (0xFABC, "M", "謁"), - (0xFABD, "M", "諾"), - (0xFABE, "M", "諭"), - (0xFABF, "M", "謹"), - (0xFAC0, "M", "變"), - (0xFAC1, "M", "贈"), - (0xFAC2, "M", "輸"), - (0xFAC3, "M", "遲"), - (0xFAC4, "M", "醙"), - (0xFAC5, "M", "鉶"), - (0xFAC6, "M", "陼"), - (0xFAC7, "M", "難"), - (0xFAC8, "M", "靖"), - (0xFAC9, "M", "韛"), - (0xFACA, "M", "響"), - (0xFACB, "M", "頋"), - (0xFACC, "M", "頻"), - (0xFACD, "M", "鬒"), - (0xFACE, "M", "龜"), - (0xFACF, "M", "𢡊"), - (0xFAD0, "M", "𢡄"), - (0xFAD1, "M", "𣏕"), - (0xFAD2, "M", "㮝"), - (0xFAD3, "M", "䀘"), - (0xFAD4, "M", "䀹"), - (0xFAD5, "M", "𥉉"), - (0xFAD6, "M", "𥳐"), - (0xFAD7, "M", "𧻓"), - (0xFAD8, "M", "齃"), - (0xFAD9, "M", "龎"), - (0xFADA, "X"), - (0xFB00, "M", "ff"), - (0xFB01, "M", "fi"), - (0xFB02, "M", "fl"), - (0xFB03, "M", "ffi"), - (0xFB04, "M", "ffl"), - (0xFB05, "M", "st"), - (0xFB07, "X"), - (0xFB13, "M", "մն"), - (0xFB14, "M", "մե"), - (0xFB15, "M", "մի"), - (0xFB16, "M", "վն"), - (0xFB17, "M", "մխ"), - (0xFB18, "X"), - (0xFB1D, "M", "יִ"), - (0xFB1E, "V"), - (0xFB1F, "M", "ײַ"), - (0xFB20, "M", "ע"), - (0xFB21, "M", "א"), - (0xFB22, "M", "ד"), - (0xFB23, "M", "ה"), - (0xFB24, "M", "כ"), - (0xFB25, "M", "ל"), - (0xFB26, "M", "ם"), - (0xFB27, "M", "ר"), - (0xFB28, "M", "ת"), - (0xFB29, "M", "+"), - (0xFB2A, "M", "שׁ"), - (0xFB2B, "M", "שׂ"), - (0xFB2C, "M", "שּׁ"), - (0xFB2D, "M", "שּׂ"), - (0xFB2E, "M", "אַ"), - (0xFB2F, "M", "אָ"), - (0xFB30, "M", "אּ"), - (0xFB31, "M", "בּ"), - (0xFB32, "M", "גּ"), - (0xFB33, "M", "דּ"), - (0xFB34, "M", "הּ"), - (0xFB35, "M", "וּ"), - (0xFB36, "M", "זּ"), - (0xFB37, "X"), - (0xFB38, "M", "טּ"), - (0xFB39, "M", "יּ"), - (0xFB3A, "M", "ךּ"), - (0xFB3B, "M", "כּ"), - (0xFB3C, "M", "לּ"), - (0xFB3D, "X"), - (0xFB3E, "M", "מּ"), - (0xFB3F, "X"), - (0xFB40, "M", "נּ"), - (0xFB41, "M", "סּ"), - (0xFB42, "X"), - (0xFB43, "M", "ףּ"), - (0xFB44, "M", "פּ"), - (0xFB45, "X"), - (0xFB46, "M", "צּ"), - (0xFB47, "M", "קּ"), - (0xFB48, "M", "רּ"), - (0xFB49, "M", "שּ"), - (0xFB4A, "M", "תּ"), - (0xFB4B, "M", "וֹ"), - (0xFB4C, "M", "בֿ"), - (0xFB4D, "M", "כֿ"), - (0xFB4E, "M", "פֿ"), - (0xFB4F, "M", "אל"), - (0xFB50, "M", "ٱ"), - (0xFB52, "M", "ٻ"), - (0xFB56, "M", "پ"), - ] - - -def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFB5A, "M", "ڀ"), - (0xFB5E, "M", "ٺ"), - (0xFB62, "M", "ٿ"), - (0xFB66, "M", "ٹ"), - (0xFB6A, "M", "ڤ"), - (0xFB6E, "M", "ڦ"), - (0xFB72, "M", "ڄ"), - (0xFB76, "M", "ڃ"), - (0xFB7A, "M", "چ"), - (0xFB7E, "M", "ڇ"), - (0xFB82, "M", "ڍ"), - (0xFB84, "M", "ڌ"), - (0xFB86, "M", "ڎ"), - (0xFB88, "M", "ڈ"), - (0xFB8A, "M", "ژ"), - (0xFB8C, "M", "ڑ"), - (0xFB8E, "M", "ک"), - (0xFB92, "M", "گ"), - (0xFB96, "M", "ڳ"), - (0xFB9A, "M", "ڱ"), - (0xFB9E, "M", "ں"), - (0xFBA0, "M", "ڻ"), - (0xFBA4, "M", "ۀ"), - (0xFBA6, "M", "ہ"), - (0xFBAA, "M", "ھ"), - (0xFBAE, "M", "ے"), - (0xFBB0, "M", "ۓ"), - (0xFBB2, "V"), - (0xFBC3, "X"), - (0xFBD3, "M", "ڭ"), - (0xFBD7, "M", "ۇ"), - (0xFBD9, "M", "ۆ"), - (0xFBDB, "M", "ۈ"), - (0xFBDD, "M", "ۇٴ"), - (0xFBDE, "M", "ۋ"), - (0xFBE0, "M", "ۅ"), - (0xFBE2, "M", "ۉ"), - (0xFBE4, "M", "ې"), - (0xFBE8, "M", "ى"), - (0xFBEA, "M", "ئا"), - (0xFBEC, "M", "ئە"), - (0xFBEE, "M", "ئو"), - (0xFBF0, "M", "ئۇ"), - (0xFBF2, "M", "ئۆ"), - (0xFBF4, "M", "ئۈ"), - (0xFBF6, "M", "ئې"), - (0xFBF9, "M", "ئى"), - (0xFBFC, "M", "ی"), - (0xFC00, "M", "ئج"), - (0xFC01, "M", "ئح"), - (0xFC02, "M", "ئم"), - (0xFC03, "M", "ئى"), - (0xFC04, "M", "ئي"), - (0xFC05, "M", "بج"), - (0xFC06, "M", "بح"), - (0xFC07, "M", "بخ"), - (0xFC08, "M", "بم"), - (0xFC09, "M", "بى"), - (0xFC0A, "M", "بي"), - (0xFC0B, "M", "تج"), - (0xFC0C, "M", "تح"), - (0xFC0D, "M", "تخ"), - (0xFC0E, "M", "تم"), - (0xFC0F, "M", "تى"), - (0xFC10, "M", "تي"), - (0xFC11, "M", "ثج"), - (0xFC12, "M", "ثم"), - (0xFC13, "M", "ثى"), - (0xFC14, "M", "ثي"), - (0xFC15, "M", "جح"), - (0xFC16, "M", "جم"), - (0xFC17, "M", "حج"), - (0xFC18, "M", "حم"), - (0xFC19, "M", "خج"), - (0xFC1A, "M", "خح"), - (0xFC1B, "M", "خم"), - (0xFC1C, "M", "سج"), - (0xFC1D, "M", "سح"), - (0xFC1E, "M", "سخ"), - (0xFC1F, "M", "سم"), - (0xFC20, "M", "صح"), - (0xFC21, "M", "صم"), - (0xFC22, "M", "ضج"), - (0xFC23, "M", "ضح"), - (0xFC24, "M", "ضخ"), - (0xFC25, "M", "ضم"), - (0xFC26, "M", "طح"), - (0xFC27, "M", "طم"), - (0xFC28, "M", "ظم"), - (0xFC29, "M", "عج"), - (0xFC2A, "M", "عم"), - (0xFC2B, "M", "غج"), - (0xFC2C, "M", "غم"), - (0xFC2D, "M", "فج"), - (0xFC2E, "M", "فح"), - (0xFC2F, "M", "فخ"), - (0xFC30, "M", "فم"), - (0xFC31, "M", "فى"), - (0xFC32, "M", "في"), - (0xFC33, "M", "قح"), - ] - - -def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC34, "M", "قم"), - (0xFC35, "M", "قى"), - (0xFC36, "M", "قي"), - (0xFC37, "M", "كا"), - (0xFC38, "M", "كج"), - (0xFC39, "M", "كح"), - (0xFC3A, "M", "كخ"), - (0xFC3B, "M", "كل"), - (0xFC3C, "M", "كم"), - (0xFC3D, "M", "كى"), - (0xFC3E, "M", "كي"), - (0xFC3F, "M", "لج"), - (0xFC40, "M", "لح"), - (0xFC41, "M", "لخ"), - (0xFC42, "M", "لم"), - (0xFC43, "M", "لى"), - (0xFC44, "M", "لي"), - (0xFC45, "M", "مج"), - (0xFC46, "M", "مح"), - (0xFC47, "M", "مخ"), - (0xFC48, "M", "مم"), - (0xFC49, "M", "مى"), - (0xFC4A, "M", "مي"), - (0xFC4B, "M", "نج"), - (0xFC4C, "M", "نح"), - (0xFC4D, "M", "نخ"), - (0xFC4E, "M", "نم"), - (0xFC4F, "M", "نى"), - (0xFC50, "M", "ني"), - (0xFC51, "M", "هج"), - (0xFC52, "M", "هم"), - (0xFC53, "M", "هى"), - (0xFC54, "M", "هي"), - (0xFC55, "M", "يج"), - (0xFC56, "M", "يح"), - (0xFC57, "M", "يخ"), - (0xFC58, "M", "يم"), - (0xFC59, "M", "يى"), - (0xFC5A, "M", "يي"), - (0xFC5B, "M", "ذٰ"), - (0xFC5C, "M", "رٰ"), - (0xFC5D, "M", "ىٰ"), - (0xFC5E, "M", " ٌّ"), - (0xFC5F, "M", " ٍّ"), - (0xFC60, "M", " َّ"), - (0xFC61, "M", " ُّ"), - (0xFC62, "M", " ِّ"), - (0xFC63, "M", " ّٰ"), - (0xFC64, "M", "ئر"), - (0xFC65, "M", "ئز"), - (0xFC66, "M", "ئم"), - (0xFC67, "M", "ئن"), - (0xFC68, "M", "ئى"), - (0xFC69, "M", "ئي"), - (0xFC6A, "M", "بر"), - (0xFC6B, "M", "بز"), - (0xFC6C, "M", "بم"), - (0xFC6D, "M", "بن"), - (0xFC6E, "M", "بى"), - (0xFC6F, "M", "بي"), - (0xFC70, "M", "تر"), - (0xFC71, "M", "تز"), - (0xFC72, "M", "تم"), - (0xFC73, "M", "تن"), - (0xFC74, "M", "تى"), - (0xFC75, "M", "تي"), - (0xFC76, "M", "ثر"), - (0xFC77, "M", "ثز"), - (0xFC78, "M", "ثم"), - (0xFC79, "M", "ثن"), - (0xFC7A, "M", "ثى"), - (0xFC7B, "M", "ثي"), - (0xFC7C, "M", "فى"), - (0xFC7D, "M", "في"), - (0xFC7E, "M", "قى"), - (0xFC7F, "M", "قي"), - (0xFC80, "M", "كا"), - (0xFC81, "M", "كل"), - (0xFC82, "M", "كم"), - (0xFC83, "M", "كى"), - (0xFC84, "M", "كي"), - (0xFC85, "M", "لم"), - (0xFC86, "M", "لى"), - (0xFC87, "M", "لي"), - (0xFC88, "M", "ما"), - (0xFC89, "M", "مم"), - (0xFC8A, "M", "نر"), - (0xFC8B, "M", "نز"), - (0xFC8C, "M", "نم"), - (0xFC8D, "M", "نن"), - (0xFC8E, "M", "نى"), - (0xFC8F, "M", "ني"), - (0xFC90, "M", "ىٰ"), - (0xFC91, "M", "ير"), - (0xFC92, "M", "يز"), - (0xFC93, "M", "يم"), - (0xFC94, "M", "ين"), - (0xFC95, "M", "يى"), - (0xFC96, "M", "يي"), - (0xFC97, "M", "ئج"), - ] - - -def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFC98, "M", "ئح"), - (0xFC99, "M", "ئخ"), - (0xFC9A, "M", "ئم"), - (0xFC9B, "M", "ئه"), - (0xFC9C, "M", "بج"), - (0xFC9D, "M", "بح"), - (0xFC9E, "M", "بخ"), - (0xFC9F, "M", "بم"), - (0xFCA0, "M", "به"), - (0xFCA1, "M", "تج"), - (0xFCA2, "M", "تح"), - (0xFCA3, "M", "تخ"), - (0xFCA4, "M", "تم"), - (0xFCA5, "M", "ته"), - (0xFCA6, "M", "ثم"), - (0xFCA7, "M", "جح"), - (0xFCA8, "M", "جم"), - (0xFCA9, "M", "حج"), - (0xFCAA, "M", "حم"), - (0xFCAB, "M", "خج"), - (0xFCAC, "M", "خم"), - (0xFCAD, "M", "سج"), - (0xFCAE, "M", "سح"), - (0xFCAF, "M", "سخ"), - (0xFCB0, "M", "سم"), - (0xFCB1, "M", "صح"), - (0xFCB2, "M", "صخ"), - (0xFCB3, "M", "صم"), - (0xFCB4, "M", "ضج"), - (0xFCB5, "M", "ضح"), - (0xFCB6, "M", "ضخ"), - (0xFCB7, "M", "ضم"), - (0xFCB8, "M", "طح"), - (0xFCB9, "M", "ظم"), - (0xFCBA, "M", "عج"), - (0xFCBB, "M", "عم"), - (0xFCBC, "M", "غج"), - (0xFCBD, "M", "غم"), - (0xFCBE, "M", "فج"), - (0xFCBF, "M", "فح"), - (0xFCC0, "M", "فخ"), - (0xFCC1, "M", "فم"), - (0xFCC2, "M", "قح"), - (0xFCC3, "M", "قم"), - (0xFCC4, "M", "كج"), - (0xFCC5, "M", "كح"), - (0xFCC6, "M", "كخ"), - (0xFCC7, "M", "كل"), - (0xFCC8, "M", "كم"), - (0xFCC9, "M", "لج"), - (0xFCCA, "M", "لح"), - (0xFCCB, "M", "لخ"), - (0xFCCC, "M", "لم"), - (0xFCCD, "M", "له"), - (0xFCCE, "M", "مج"), - (0xFCCF, "M", "مح"), - (0xFCD0, "M", "مخ"), - (0xFCD1, "M", "مم"), - (0xFCD2, "M", "نج"), - (0xFCD3, "M", "نح"), - (0xFCD4, "M", "نخ"), - (0xFCD5, "M", "نم"), - (0xFCD6, "M", "نه"), - (0xFCD7, "M", "هج"), - (0xFCD8, "M", "هم"), - (0xFCD9, "M", "هٰ"), - (0xFCDA, "M", "يج"), - (0xFCDB, "M", "يح"), - (0xFCDC, "M", "يخ"), - (0xFCDD, "M", "يم"), - (0xFCDE, "M", "يه"), - (0xFCDF, "M", "ئم"), - (0xFCE0, "M", "ئه"), - (0xFCE1, "M", "بم"), - (0xFCE2, "M", "به"), - (0xFCE3, "M", "تم"), - (0xFCE4, "M", "ته"), - (0xFCE5, "M", "ثم"), - (0xFCE6, "M", "ثه"), - (0xFCE7, "M", "سم"), - (0xFCE8, "M", "سه"), - (0xFCE9, "M", "شم"), - (0xFCEA, "M", "شه"), - (0xFCEB, "M", "كل"), - (0xFCEC, "M", "كم"), - (0xFCED, "M", "لم"), - (0xFCEE, "M", "نم"), - (0xFCEF, "M", "نه"), - (0xFCF0, "M", "يم"), - (0xFCF1, "M", "يه"), - (0xFCF2, "M", "ـَّ"), - (0xFCF3, "M", "ـُّ"), - (0xFCF4, "M", "ـِّ"), - (0xFCF5, "M", "طى"), - (0xFCF6, "M", "طي"), - (0xFCF7, "M", "عى"), - (0xFCF8, "M", "عي"), - (0xFCF9, "M", "غى"), - (0xFCFA, "M", "غي"), - (0xFCFB, "M", "سى"), - ] - - -def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFCFC, "M", "سي"), - (0xFCFD, "M", "شى"), - (0xFCFE, "M", "شي"), - (0xFCFF, "M", "حى"), - (0xFD00, "M", "حي"), - (0xFD01, "M", "جى"), - (0xFD02, "M", "جي"), - (0xFD03, "M", "خى"), - (0xFD04, "M", "خي"), - (0xFD05, "M", "صى"), - (0xFD06, "M", "صي"), - (0xFD07, "M", "ضى"), - (0xFD08, "M", "ضي"), - (0xFD09, "M", "شج"), - (0xFD0A, "M", "شح"), - (0xFD0B, "M", "شخ"), - (0xFD0C, "M", "شم"), - (0xFD0D, "M", "شر"), - (0xFD0E, "M", "سر"), - (0xFD0F, "M", "صر"), - (0xFD10, "M", "ضر"), - (0xFD11, "M", "طى"), - (0xFD12, "M", "طي"), - (0xFD13, "M", "عى"), - (0xFD14, "M", "عي"), - (0xFD15, "M", "غى"), - (0xFD16, "M", "غي"), - (0xFD17, "M", "سى"), - (0xFD18, "M", "سي"), - (0xFD19, "M", "شى"), - (0xFD1A, "M", "شي"), - (0xFD1B, "M", "حى"), - (0xFD1C, "M", "حي"), - (0xFD1D, "M", "جى"), - (0xFD1E, "M", "جي"), - (0xFD1F, "M", "خى"), - (0xFD20, "M", "خي"), - (0xFD21, "M", "صى"), - (0xFD22, "M", "صي"), - (0xFD23, "M", "ضى"), - (0xFD24, "M", "ضي"), - (0xFD25, "M", "شج"), - (0xFD26, "M", "شح"), - (0xFD27, "M", "شخ"), - (0xFD28, "M", "شم"), - (0xFD29, "M", "شر"), - (0xFD2A, "M", "سر"), - (0xFD2B, "M", "صر"), - (0xFD2C, "M", "ضر"), - (0xFD2D, "M", "شج"), - (0xFD2E, "M", "شح"), - (0xFD2F, "M", "شخ"), - (0xFD30, "M", "شم"), - (0xFD31, "M", "سه"), - (0xFD32, "M", "شه"), - (0xFD33, "M", "طم"), - (0xFD34, "M", "سج"), - (0xFD35, "M", "سح"), - (0xFD36, "M", "سخ"), - (0xFD37, "M", "شج"), - (0xFD38, "M", "شح"), - (0xFD39, "M", "شخ"), - (0xFD3A, "M", "طم"), - (0xFD3B, "M", "ظم"), - (0xFD3C, "M", "اً"), - (0xFD3E, "V"), - (0xFD50, "M", "تجم"), - (0xFD51, "M", "تحج"), - (0xFD53, "M", "تحم"), - (0xFD54, "M", "تخم"), - (0xFD55, "M", "تمج"), - (0xFD56, "M", "تمح"), - (0xFD57, "M", "تمخ"), - (0xFD58, "M", "جمح"), - (0xFD5A, "M", "حمي"), - (0xFD5B, "M", "حمى"), - (0xFD5C, "M", "سحج"), - (0xFD5D, "M", "سجح"), - (0xFD5E, "M", "سجى"), - (0xFD5F, "M", "سمح"), - (0xFD61, "M", "سمج"), - (0xFD62, "M", "سمم"), - (0xFD64, "M", "صحح"), - (0xFD66, "M", "صمم"), - (0xFD67, "M", "شحم"), - (0xFD69, "M", "شجي"), - (0xFD6A, "M", "شمخ"), - (0xFD6C, "M", "شمم"), - (0xFD6E, "M", "ضحى"), - (0xFD6F, "M", "ضخم"), - (0xFD71, "M", "طمح"), - (0xFD73, "M", "طمم"), - (0xFD74, "M", "طمي"), - (0xFD75, "M", "عجم"), - (0xFD76, "M", "عمم"), - (0xFD78, "M", "عمى"), - (0xFD79, "M", "غمم"), - (0xFD7A, "M", "غمي"), - (0xFD7B, "M", "غمى"), - (0xFD7C, "M", "فخم"), - ] - - -def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFD7E, "M", "قمح"), - (0xFD7F, "M", "قمم"), - (0xFD80, "M", "لحم"), - (0xFD81, "M", "لحي"), - (0xFD82, "M", "لحى"), - (0xFD83, "M", "لجج"), - (0xFD85, "M", "لخم"), - (0xFD87, "M", "لمح"), - (0xFD89, "M", "محج"), - (0xFD8A, "M", "محم"), - (0xFD8B, "M", "محي"), - (0xFD8C, "M", "مجح"), - (0xFD8D, "M", "مجم"), - (0xFD8E, "M", "مخج"), - (0xFD8F, "M", "مخم"), - (0xFD90, "X"), - (0xFD92, "M", "مجخ"), - (0xFD93, "M", "همج"), - (0xFD94, "M", "همم"), - (0xFD95, "M", "نحم"), - (0xFD96, "M", "نحى"), - (0xFD97, "M", "نجم"), - (0xFD99, "M", "نجى"), - (0xFD9A, "M", "نمي"), - (0xFD9B, "M", "نمى"), - (0xFD9C, "M", "يمم"), - (0xFD9E, "M", "بخي"), - (0xFD9F, "M", "تجي"), - (0xFDA0, "M", "تجى"), - (0xFDA1, "M", "تخي"), - (0xFDA2, "M", "تخى"), - (0xFDA3, "M", "تمي"), - (0xFDA4, "M", "تمى"), - (0xFDA5, "M", "جمي"), - (0xFDA6, "M", "جحى"), - (0xFDA7, "M", "جمى"), - (0xFDA8, "M", "سخى"), - (0xFDA9, "M", "صحي"), - (0xFDAA, "M", "شحي"), - (0xFDAB, "M", "ضحي"), - (0xFDAC, "M", "لجي"), - (0xFDAD, "M", "لمي"), - (0xFDAE, "M", "يحي"), - (0xFDAF, "M", "يجي"), - (0xFDB0, "M", "يمي"), - (0xFDB1, "M", "ممي"), - (0xFDB2, "M", "قمي"), - (0xFDB3, "M", "نحي"), - (0xFDB4, "M", "قمح"), - (0xFDB5, "M", "لحم"), - (0xFDB6, "M", "عمي"), - (0xFDB7, "M", "كمي"), - (0xFDB8, "M", "نجح"), - (0xFDB9, "M", "مخي"), - (0xFDBA, "M", "لجم"), - (0xFDBB, "M", "كمم"), - (0xFDBC, "M", "لجم"), - (0xFDBD, "M", "نجح"), - (0xFDBE, "M", "جحي"), - (0xFDBF, "M", "حجي"), - (0xFDC0, "M", "مجي"), - (0xFDC1, "M", "فمي"), - (0xFDC2, "M", "بحي"), - (0xFDC3, "M", "كمم"), - (0xFDC4, "M", "عجم"), - (0xFDC5, "M", "صمم"), - (0xFDC6, "M", "سخي"), - (0xFDC7, "M", "نجي"), - (0xFDC8, "X"), - (0xFDCF, "V"), - (0xFDD0, "X"), - (0xFDF0, "M", "صلے"), - (0xFDF1, "M", "قلے"), - (0xFDF2, "M", "الله"), - (0xFDF3, "M", "اكبر"), - (0xFDF4, "M", "محمد"), - (0xFDF5, "M", "صلعم"), - (0xFDF6, "M", "رسول"), - (0xFDF7, "M", "عليه"), - (0xFDF8, "M", "وسلم"), - (0xFDF9, "M", "صلى"), - (0xFDFA, "M", "صلى الله عليه وسلم"), - (0xFDFB, "M", "جل جلاله"), - (0xFDFC, "M", "ریال"), - (0xFDFD, "V"), - (0xFE00, "I"), - (0xFE10, "M", ","), - (0xFE11, "M", "、"), - (0xFE12, "X"), - (0xFE13, "M", ":"), - (0xFE14, "M", ";"), - (0xFE15, "M", "!"), - (0xFE16, "M", "?"), - (0xFE17, "M", "〖"), - (0xFE18, "M", "〗"), - (0xFE19, "X"), - (0xFE20, "V"), - (0xFE30, "X"), - (0xFE31, "M", "—"), - (0xFE32, "M", "–"), - ] - - -def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFE33, "M", "_"), - (0xFE35, "M", "("), - (0xFE36, "M", ")"), - (0xFE37, "M", "{"), - (0xFE38, "M", "}"), - (0xFE39, "M", "〔"), - (0xFE3A, "M", "〕"), - (0xFE3B, "M", "【"), - (0xFE3C, "M", "】"), - (0xFE3D, "M", "《"), - (0xFE3E, "M", "》"), - (0xFE3F, "M", "〈"), - (0xFE40, "M", "〉"), - (0xFE41, "M", "「"), - (0xFE42, "M", "」"), - (0xFE43, "M", "『"), - (0xFE44, "M", "』"), - (0xFE45, "V"), - (0xFE47, "M", "["), - (0xFE48, "M", "]"), - (0xFE49, "M", " ̅"), - (0xFE4D, "M", "_"), - (0xFE50, "M", ","), - (0xFE51, "M", "、"), - (0xFE52, "X"), - (0xFE54, "M", ";"), - (0xFE55, "M", ":"), - (0xFE56, "M", "?"), - (0xFE57, "M", "!"), - (0xFE58, "M", "—"), - (0xFE59, "M", "("), - (0xFE5A, "M", ")"), - (0xFE5B, "M", "{"), - (0xFE5C, "M", "}"), - (0xFE5D, "M", "〔"), - (0xFE5E, "M", "〕"), - (0xFE5F, "M", "#"), - (0xFE60, "M", "&"), - (0xFE61, "M", "*"), - (0xFE62, "M", "+"), - (0xFE63, "M", "-"), - (0xFE64, "M", "<"), - (0xFE65, "M", ">"), - (0xFE66, "M", "="), - (0xFE67, "X"), - (0xFE68, "M", "\\"), - (0xFE69, "M", "$"), - (0xFE6A, "M", "%"), - (0xFE6B, "M", "@"), - (0xFE6C, "X"), - (0xFE70, "M", " ً"), - (0xFE71, "M", "ـً"), - (0xFE72, "M", " ٌ"), - (0xFE73, "V"), - (0xFE74, "M", " ٍ"), - (0xFE75, "X"), - (0xFE76, "M", " َ"), - (0xFE77, "M", "ـَ"), - (0xFE78, "M", " ُ"), - (0xFE79, "M", "ـُ"), - (0xFE7A, "M", " ِ"), - (0xFE7B, "M", "ـِ"), - (0xFE7C, "M", " ّ"), - (0xFE7D, "M", "ـّ"), - (0xFE7E, "M", " ْ"), - (0xFE7F, "M", "ـْ"), - (0xFE80, "M", "ء"), - (0xFE81, "M", "آ"), - (0xFE83, "M", "أ"), - (0xFE85, "M", "ؤ"), - (0xFE87, "M", "إ"), - (0xFE89, "M", "ئ"), - (0xFE8D, "M", "ا"), - (0xFE8F, "M", "ب"), - (0xFE93, "M", "ة"), - (0xFE95, "M", "ت"), - (0xFE99, "M", "ث"), - (0xFE9D, "M", "ج"), - (0xFEA1, "M", "ح"), - (0xFEA5, "M", "خ"), - (0xFEA9, "M", "د"), - (0xFEAB, "M", "ذ"), - (0xFEAD, "M", "ر"), - (0xFEAF, "M", "ز"), - (0xFEB1, "M", "س"), - (0xFEB5, "M", "ش"), - (0xFEB9, "M", "ص"), - (0xFEBD, "M", "ض"), - (0xFEC1, "M", "ط"), - (0xFEC5, "M", "ظ"), - (0xFEC9, "M", "ع"), - (0xFECD, "M", "غ"), - (0xFED1, "M", "ف"), - (0xFED5, "M", "ق"), - (0xFED9, "M", "ك"), - (0xFEDD, "M", "ل"), - (0xFEE1, "M", "م"), - (0xFEE5, "M", "ن"), - (0xFEE9, "M", "ه"), - (0xFEED, "M", "و"), - ] - - -def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFEEF, "M", "ى"), - (0xFEF1, "M", "ي"), - (0xFEF5, "M", "لآ"), - (0xFEF7, "M", "لأ"), - (0xFEF9, "M", "لإ"), - (0xFEFB, "M", "لا"), - (0xFEFD, "X"), - (0xFEFF, "I"), - (0xFF00, "X"), - (0xFF01, "M", "!"), - (0xFF02, "M", '"'), - (0xFF03, "M", "#"), - (0xFF04, "M", "$"), - (0xFF05, "M", "%"), - (0xFF06, "M", "&"), - (0xFF07, "M", "'"), - (0xFF08, "M", "("), - (0xFF09, "M", ")"), - (0xFF0A, "M", "*"), - (0xFF0B, "M", "+"), - (0xFF0C, "M", ","), - (0xFF0D, "M", "-"), - (0xFF0E, "M", "."), - (0xFF0F, "M", "/"), - (0xFF10, "M", "0"), - (0xFF11, "M", "1"), - (0xFF12, "M", "2"), - (0xFF13, "M", "3"), - (0xFF14, "M", "4"), - (0xFF15, "M", "5"), - (0xFF16, "M", "6"), - (0xFF17, "M", "7"), - (0xFF18, "M", "8"), - (0xFF19, "M", "9"), - (0xFF1A, "M", ":"), - (0xFF1B, "M", ";"), - (0xFF1C, "M", "<"), - (0xFF1D, "M", "="), - (0xFF1E, "M", ">"), - (0xFF1F, "M", "?"), - (0xFF20, "M", "@"), - (0xFF21, "M", "a"), - (0xFF22, "M", "b"), - (0xFF23, "M", "c"), - (0xFF24, "M", "d"), - (0xFF25, "M", "e"), - (0xFF26, "M", "f"), - (0xFF27, "M", "g"), - (0xFF28, "M", "h"), - (0xFF29, "M", "i"), - (0xFF2A, "M", "j"), - (0xFF2B, "M", "k"), - (0xFF2C, "M", "l"), - (0xFF2D, "M", "m"), - (0xFF2E, "M", "n"), - (0xFF2F, "M", "o"), - (0xFF30, "M", "p"), - (0xFF31, "M", "q"), - (0xFF32, "M", "r"), - (0xFF33, "M", "s"), - (0xFF34, "M", "t"), - (0xFF35, "M", "u"), - (0xFF36, "M", "v"), - (0xFF37, "M", "w"), - (0xFF38, "M", "x"), - (0xFF39, "M", "y"), - (0xFF3A, "M", "z"), - (0xFF3B, "M", "["), - (0xFF3C, "M", "\\"), - (0xFF3D, "M", "]"), - (0xFF3E, "M", "^"), - (0xFF3F, "M", "_"), - (0xFF40, "M", "`"), - (0xFF41, "M", "a"), - (0xFF42, "M", "b"), - (0xFF43, "M", "c"), - (0xFF44, "M", "d"), - (0xFF45, "M", "e"), - (0xFF46, "M", "f"), - (0xFF47, "M", "g"), - (0xFF48, "M", "h"), - (0xFF49, "M", "i"), - (0xFF4A, "M", "j"), - (0xFF4B, "M", "k"), - (0xFF4C, "M", "l"), - (0xFF4D, "M", "m"), - (0xFF4E, "M", "n"), - (0xFF4F, "M", "o"), - (0xFF50, "M", "p"), - (0xFF51, "M", "q"), - (0xFF52, "M", "r"), - (0xFF53, "M", "s"), - (0xFF54, "M", "t"), - (0xFF55, "M", "u"), - (0xFF56, "M", "v"), - (0xFF57, "M", "w"), - (0xFF58, "M", "x"), - (0xFF59, "M", "y"), - (0xFF5A, "M", "z"), - (0xFF5B, "M", "{"), - ] - - -def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFF5C, "M", "|"), - (0xFF5D, "M", "}"), - (0xFF5E, "M", "~"), - (0xFF5F, "M", "⦅"), - (0xFF60, "M", "⦆"), - (0xFF61, "M", "."), - (0xFF62, "M", "「"), - (0xFF63, "M", "」"), - (0xFF64, "M", "、"), - (0xFF65, "M", "・"), - (0xFF66, "M", "ヲ"), - (0xFF67, "M", "ァ"), - (0xFF68, "M", "ィ"), - (0xFF69, "M", "ゥ"), - (0xFF6A, "M", "ェ"), - (0xFF6B, "M", "ォ"), - (0xFF6C, "M", "ャ"), - (0xFF6D, "M", "ュ"), - (0xFF6E, "M", "ョ"), - (0xFF6F, "M", "ッ"), - (0xFF70, "M", "ー"), - (0xFF71, "M", "ア"), - (0xFF72, "M", "イ"), - (0xFF73, "M", "ウ"), - (0xFF74, "M", "エ"), - (0xFF75, "M", "オ"), - (0xFF76, "M", "カ"), - (0xFF77, "M", "キ"), - (0xFF78, "M", "ク"), - (0xFF79, "M", "ケ"), - (0xFF7A, "M", "コ"), - (0xFF7B, "M", "サ"), - (0xFF7C, "M", "シ"), - (0xFF7D, "M", "ス"), - (0xFF7E, "M", "セ"), - (0xFF7F, "M", "ソ"), - (0xFF80, "M", "タ"), - (0xFF81, "M", "チ"), - (0xFF82, "M", "ツ"), - (0xFF83, "M", "テ"), - (0xFF84, "M", "ト"), - (0xFF85, "M", "ナ"), - (0xFF86, "M", "ニ"), - (0xFF87, "M", "ヌ"), - (0xFF88, "M", "ネ"), - (0xFF89, "M", "ノ"), - (0xFF8A, "M", "ハ"), - (0xFF8B, "M", "ヒ"), - (0xFF8C, "M", "フ"), - (0xFF8D, "M", "ヘ"), - (0xFF8E, "M", "ホ"), - (0xFF8F, "M", "マ"), - (0xFF90, "M", "ミ"), - (0xFF91, "M", "ム"), - (0xFF92, "M", "メ"), - (0xFF93, "M", "モ"), - (0xFF94, "M", "ヤ"), - (0xFF95, "M", "ユ"), - (0xFF96, "M", "ヨ"), - (0xFF97, "M", "ラ"), - (0xFF98, "M", "リ"), - (0xFF99, "M", "ル"), - (0xFF9A, "M", "レ"), - (0xFF9B, "M", "ロ"), - (0xFF9C, "M", "ワ"), - (0xFF9D, "M", "ン"), - (0xFF9E, "M", "゙"), - (0xFF9F, "M", "゚"), - (0xFFA0, "I"), - (0xFFA1, "M", "ᄀ"), - (0xFFA2, "M", "ᄁ"), - (0xFFA3, "M", "ᆪ"), - (0xFFA4, "M", "ᄂ"), - (0xFFA5, "M", "ᆬ"), - (0xFFA6, "M", "ᆭ"), - (0xFFA7, "M", "ᄃ"), - (0xFFA8, "M", "ᄄ"), - (0xFFA9, "M", "ᄅ"), - (0xFFAA, "M", "ᆰ"), - (0xFFAB, "M", "ᆱ"), - (0xFFAC, "M", "ᆲ"), - (0xFFAD, "M", "ᆳ"), - (0xFFAE, "M", "ᆴ"), - (0xFFAF, "M", "ᆵ"), - (0xFFB0, "M", "ᄚ"), - (0xFFB1, "M", "ᄆ"), - (0xFFB2, "M", "ᄇ"), - (0xFFB3, "M", "ᄈ"), - (0xFFB4, "M", "ᄡ"), - (0xFFB5, "M", "ᄉ"), - (0xFFB6, "M", "ᄊ"), - (0xFFB7, "M", "ᄋ"), - (0xFFB8, "M", "ᄌ"), - (0xFFB9, "M", "ᄍ"), - (0xFFBA, "M", "ᄎ"), - (0xFFBB, "M", "ᄏ"), - (0xFFBC, "M", "ᄐ"), - (0xFFBD, "M", "ᄑ"), - (0xFFBE, "M", "ᄒ"), - (0xFFBF, "X"), - ] - - -def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0xFFC2, "M", "ᅡ"), - (0xFFC3, "M", "ᅢ"), - (0xFFC4, "M", "ᅣ"), - (0xFFC5, "M", "ᅤ"), - (0xFFC6, "M", "ᅥ"), - (0xFFC7, "M", "ᅦ"), - (0xFFC8, "X"), - (0xFFCA, "M", "ᅧ"), - (0xFFCB, "M", "ᅨ"), - (0xFFCC, "M", "ᅩ"), - (0xFFCD, "M", "ᅪ"), - (0xFFCE, "M", "ᅫ"), - (0xFFCF, "M", "ᅬ"), - (0xFFD0, "X"), - (0xFFD2, "M", "ᅭ"), - (0xFFD3, "M", "ᅮ"), - (0xFFD4, "M", "ᅯ"), - (0xFFD5, "M", "ᅰ"), - (0xFFD6, "M", "ᅱ"), - (0xFFD7, "M", "ᅲ"), - (0xFFD8, "X"), - (0xFFDA, "M", "ᅳ"), - (0xFFDB, "M", "ᅴ"), - (0xFFDC, "M", "ᅵ"), - (0xFFDD, "X"), - (0xFFE0, "M", "¢"), - (0xFFE1, "M", "£"), - (0xFFE2, "M", "¬"), - (0xFFE3, "M", " ̄"), - (0xFFE4, "M", "¦"), - (0xFFE5, "M", "¥"), - (0xFFE6, "M", "₩"), - (0xFFE7, "X"), - (0xFFE8, "M", "│"), - (0xFFE9, "M", "←"), - (0xFFEA, "M", "↑"), - (0xFFEB, "M", "→"), - (0xFFEC, "M", "↓"), - (0xFFED, "M", "■"), - (0xFFEE, "M", "○"), - (0xFFEF, "X"), - (0x10000, "V"), - (0x1000C, "X"), - (0x1000D, "V"), - (0x10027, "X"), - (0x10028, "V"), - (0x1003B, "X"), - (0x1003C, "V"), - (0x1003E, "X"), - (0x1003F, "V"), - (0x1004E, "X"), - (0x10050, "V"), - (0x1005E, "X"), - (0x10080, "V"), - (0x100FB, "X"), - (0x10100, "V"), - (0x10103, "X"), - (0x10107, "V"), - (0x10134, "X"), - (0x10137, "V"), - (0x1018F, "X"), - (0x10190, "V"), - (0x1019D, "X"), - (0x101A0, "V"), - (0x101A1, "X"), - (0x101D0, "V"), - (0x101FE, "X"), - (0x10280, "V"), - (0x1029D, "X"), - (0x102A0, "V"), - (0x102D1, "X"), - (0x102E0, "V"), - (0x102FC, "X"), - (0x10300, "V"), - (0x10324, "X"), - (0x1032D, "V"), - (0x1034B, "X"), - (0x10350, "V"), - (0x1037B, "X"), - (0x10380, "V"), - (0x1039E, "X"), - (0x1039F, "V"), - (0x103C4, "X"), - (0x103C8, "V"), - (0x103D6, "X"), - (0x10400, "M", "𐐨"), - (0x10401, "M", "𐐩"), - (0x10402, "M", "𐐪"), - (0x10403, "M", "𐐫"), - (0x10404, "M", "𐐬"), - (0x10405, "M", "𐐭"), - (0x10406, "M", "𐐮"), - (0x10407, "M", "𐐯"), - (0x10408, "M", "𐐰"), - (0x10409, "M", "𐐱"), - (0x1040A, "M", "𐐲"), - (0x1040B, "M", "𐐳"), - (0x1040C, "M", "𐐴"), - (0x1040D, "M", "𐐵"), - (0x1040E, "M", "𐐶"), - ] - - -def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1040F, "M", "𐐷"), - (0x10410, "M", "𐐸"), - (0x10411, "M", "𐐹"), - (0x10412, "M", "𐐺"), - (0x10413, "M", "𐐻"), - (0x10414, "M", "𐐼"), - (0x10415, "M", "𐐽"), - (0x10416, "M", "𐐾"), - (0x10417, "M", "𐐿"), - (0x10418, "M", "𐑀"), - (0x10419, "M", "𐑁"), - (0x1041A, "M", "𐑂"), - (0x1041B, "M", "𐑃"), - (0x1041C, "M", "𐑄"), - (0x1041D, "M", "𐑅"), - (0x1041E, "M", "𐑆"), - (0x1041F, "M", "𐑇"), - (0x10420, "M", "𐑈"), - (0x10421, "M", "𐑉"), - (0x10422, "M", "𐑊"), - (0x10423, "M", "𐑋"), - (0x10424, "M", "𐑌"), - (0x10425, "M", "𐑍"), - (0x10426, "M", "𐑎"), - (0x10427, "M", "𐑏"), - (0x10428, "V"), - (0x1049E, "X"), - (0x104A0, "V"), - (0x104AA, "X"), - (0x104B0, "M", "𐓘"), - (0x104B1, "M", "𐓙"), - (0x104B2, "M", "𐓚"), - (0x104B3, "M", "𐓛"), - (0x104B4, "M", "𐓜"), - (0x104B5, "M", "𐓝"), - (0x104B6, "M", "𐓞"), - (0x104B7, "M", "𐓟"), - (0x104B8, "M", "𐓠"), - (0x104B9, "M", "𐓡"), - (0x104BA, "M", "𐓢"), - (0x104BB, "M", "𐓣"), - (0x104BC, "M", "𐓤"), - (0x104BD, "M", "𐓥"), - (0x104BE, "M", "𐓦"), - (0x104BF, "M", "𐓧"), - (0x104C0, "M", "𐓨"), - (0x104C1, "M", "𐓩"), - (0x104C2, "M", "𐓪"), - (0x104C3, "M", "𐓫"), - (0x104C4, "M", "𐓬"), - (0x104C5, "M", "𐓭"), - (0x104C6, "M", "𐓮"), - (0x104C7, "M", "𐓯"), - (0x104C8, "M", "𐓰"), - (0x104C9, "M", "𐓱"), - (0x104CA, "M", "𐓲"), - (0x104CB, "M", "𐓳"), - (0x104CC, "M", "𐓴"), - (0x104CD, "M", "𐓵"), - (0x104CE, "M", "𐓶"), - (0x104CF, "M", "𐓷"), - (0x104D0, "M", "𐓸"), - (0x104D1, "M", "𐓹"), - (0x104D2, "M", "𐓺"), - (0x104D3, "M", "𐓻"), - (0x104D4, "X"), - (0x104D8, "V"), - (0x104FC, "X"), - (0x10500, "V"), - (0x10528, "X"), - (0x10530, "V"), - (0x10564, "X"), - (0x1056F, "V"), - (0x10570, "M", "𐖗"), - (0x10571, "M", "𐖘"), - (0x10572, "M", "𐖙"), - (0x10573, "M", "𐖚"), - (0x10574, "M", "𐖛"), - (0x10575, "M", "𐖜"), - (0x10576, "M", "𐖝"), - (0x10577, "M", "𐖞"), - (0x10578, "M", "𐖟"), - (0x10579, "M", "𐖠"), - (0x1057A, "M", "𐖡"), - (0x1057B, "X"), - (0x1057C, "M", "𐖣"), - (0x1057D, "M", "𐖤"), - (0x1057E, "M", "𐖥"), - (0x1057F, "M", "𐖦"), - (0x10580, "M", "𐖧"), - (0x10581, "M", "𐖨"), - (0x10582, "M", "𐖩"), - (0x10583, "M", "𐖪"), - (0x10584, "M", "𐖫"), - (0x10585, "M", "𐖬"), - (0x10586, "M", "𐖭"), - (0x10587, "M", "𐖮"), - (0x10588, "M", "𐖯"), - (0x10589, "M", "𐖰"), - (0x1058A, "M", "𐖱"), - ] - - -def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1058B, "X"), - (0x1058C, "M", "𐖳"), - (0x1058D, "M", "𐖴"), - (0x1058E, "M", "𐖵"), - (0x1058F, "M", "𐖶"), - (0x10590, "M", "𐖷"), - (0x10591, "M", "𐖸"), - (0x10592, "M", "𐖹"), - (0x10593, "X"), - (0x10594, "M", "𐖻"), - (0x10595, "M", "𐖼"), - (0x10596, "X"), - (0x10597, "V"), - (0x105A2, "X"), - (0x105A3, "V"), - (0x105B2, "X"), - (0x105B3, "V"), - (0x105BA, "X"), - (0x105BB, "V"), - (0x105BD, "X"), - (0x105C0, "V"), - (0x105F4, "X"), - (0x10600, "V"), - (0x10737, "X"), - (0x10740, "V"), - (0x10756, "X"), - (0x10760, "V"), - (0x10768, "X"), - (0x10780, "V"), - (0x10781, "M", "ː"), - (0x10782, "M", "ˑ"), - (0x10783, "M", "æ"), - (0x10784, "M", "ʙ"), - (0x10785, "M", "ɓ"), - (0x10786, "X"), - (0x10787, "M", "ʣ"), - (0x10788, "M", "ꭦ"), - (0x10789, "M", "ʥ"), - (0x1078A, "M", "ʤ"), - (0x1078B, "M", "ɖ"), - (0x1078C, "M", "ɗ"), - (0x1078D, "M", "ᶑ"), - (0x1078E, "M", "ɘ"), - (0x1078F, "M", "ɞ"), - (0x10790, "M", "ʩ"), - (0x10791, "M", "ɤ"), - (0x10792, "M", "ɢ"), - (0x10793, "M", "ɠ"), - (0x10794, "M", "ʛ"), - (0x10795, "M", "ħ"), - (0x10796, "M", "ʜ"), - (0x10797, "M", "ɧ"), - (0x10798, "M", "ʄ"), - (0x10799, "M", "ʪ"), - (0x1079A, "M", "ʫ"), - (0x1079B, "M", "ɬ"), - (0x1079C, "M", "𝼄"), - (0x1079D, "M", "ꞎ"), - (0x1079E, "M", "ɮ"), - (0x1079F, "M", "𝼅"), - (0x107A0, "M", "ʎ"), - (0x107A1, "M", "𝼆"), - (0x107A2, "M", "ø"), - (0x107A3, "M", "ɶ"), - (0x107A4, "M", "ɷ"), - (0x107A5, "M", "q"), - (0x107A6, "M", "ɺ"), - (0x107A7, "M", "𝼈"), - (0x107A8, "M", "ɽ"), - (0x107A9, "M", "ɾ"), - (0x107AA, "M", "ʀ"), - (0x107AB, "M", "ʨ"), - (0x107AC, "M", "ʦ"), - (0x107AD, "M", "ꭧ"), - (0x107AE, "M", "ʧ"), - (0x107AF, "M", "ʈ"), - (0x107B0, "M", "ⱱ"), - (0x107B1, "X"), - (0x107B2, "M", "ʏ"), - (0x107B3, "M", "ʡ"), - (0x107B4, "M", "ʢ"), - (0x107B5, "M", "ʘ"), - (0x107B6, "M", "ǀ"), - (0x107B7, "M", "ǁ"), - (0x107B8, "M", "ǂ"), - (0x107B9, "M", "𝼊"), - (0x107BA, "M", "𝼞"), - (0x107BB, "X"), - (0x10800, "V"), - (0x10806, "X"), - (0x10808, "V"), - (0x10809, "X"), - (0x1080A, "V"), - (0x10836, "X"), - (0x10837, "V"), - (0x10839, "X"), - (0x1083C, "V"), - (0x1083D, "X"), - (0x1083F, "V"), - (0x10856, "X"), - ] - - -def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x10857, "V"), - (0x1089F, "X"), - (0x108A7, "V"), - (0x108B0, "X"), - (0x108E0, "V"), - (0x108F3, "X"), - (0x108F4, "V"), - (0x108F6, "X"), - (0x108FB, "V"), - (0x1091C, "X"), - (0x1091F, "V"), - (0x1093A, "X"), - (0x1093F, "V"), - (0x10940, "X"), - (0x10980, "V"), - (0x109B8, "X"), - (0x109BC, "V"), - (0x109D0, "X"), - (0x109D2, "V"), - (0x10A04, "X"), - (0x10A05, "V"), - (0x10A07, "X"), - (0x10A0C, "V"), - (0x10A14, "X"), - (0x10A15, "V"), - (0x10A18, "X"), - (0x10A19, "V"), - (0x10A36, "X"), - (0x10A38, "V"), - (0x10A3B, "X"), - (0x10A3F, "V"), - (0x10A49, "X"), - (0x10A50, "V"), - (0x10A59, "X"), - (0x10A60, "V"), - (0x10AA0, "X"), - (0x10AC0, "V"), - (0x10AE7, "X"), - (0x10AEB, "V"), - (0x10AF7, "X"), - (0x10B00, "V"), - (0x10B36, "X"), - (0x10B39, "V"), - (0x10B56, "X"), - (0x10B58, "V"), - (0x10B73, "X"), - (0x10B78, "V"), - (0x10B92, "X"), - (0x10B99, "V"), - (0x10B9D, "X"), - (0x10BA9, "V"), - (0x10BB0, "X"), - (0x10C00, "V"), - (0x10C49, "X"), - (0x10C80, "M", "𐳀"), - (0x10C81, "M", "𐳁"), - (0x10C82, "M", "𐳂"), - (0x10C83, "M", "𐳃"), - (0x10C84, "M", "𐳄"), - (0x10C85, "M", "𐳅"), - (0x10C86, "M", "𐳆"), - (0x10C87, "M", "𐳇"), - (0x10C88, "M", "𐳈"), - (0x10C89, "M", "𐳉"), - (0x10C8A, "M", "𐳊"), - (0x10C8B, "M", "𐳋"), - (0x10C8C, "M", "𐳌"), - (0x10C8D, "M", "𐳍"), - (0x10C8E, "M", "𐳎"), - (0x10C8F, "M", "𐳏"), - (0x10C90, "M", "𐳐"), - (0x10C91, "M", "𐳑"), - (0x10C92, "M", "𐳒"), - (0x10C93, "M", "𐳓"), - (0x10C94, "M", "𐳔"), - (0x10C95, "M", "𐳕"), - (0x10C96, "M", "𐳖"), - (0x10C97, "M", "𐳗"), - (0x10C98, "M", "𐳘"), - (0x10C99, "M", "𐳙"), - (0x10C9A, "M", "𐳚"), - (0x10C9B, "M", "𐳛"), - (0x10C9C, "M", "𐳜"), - (0x10C9D, "M", "𐳝"), - (0x10C9E, "M", "𐳞"), - (0x10C9F, "M", "𐳟"), - (0x10CA0, "M", "𐳠"), - (0x10CA1, "M", "𐳡"), - (0x10CA2, "M", "𐳢"), - (0x10CA3, "M", "𐳣"), - (0x10CA4, "M", "𐳤"), - (0x10CA5, "M", "𐳥"), - (0x10CA6, "M", "𐳦"), - (0x10CA7, "M", "𐳧"), - (0x10CA8, "M", "𐳨"), - (0x10CA9, "M", "𐳩"), - (0x10CAA, "M", "𐳪"), - (0x10CAB, "M", "𐳫"), - (0x10CAC, "M", "𐳬"), - (0x10CAD, "M", "𐳭"), - ] - - -def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x10CAE, "M", "𐳮"), - (0x10CAF, "M", "𐳯"), - (0x10CB0, "M", "𐳰"), - (0x10CB1, "M", "𐳱"), - (0x10CB2, "M", "𐳲"), - (0x10CB3, "X"), - (0x10CC0, "V"), - (0x10CF3, "X"), - (0x10CFA, "V"), - (0x10D28, "X"), - (0x10D30, "V"), - (0x10D3A, "X"), - (0x10D40, "V"), - (0x10D50, "M", "𐵰"), - (0x10D51, "M", "𐵱"), - (0x10D52, "M", "𐵲"), - (0x10D53, "M", "𐵳"), - (0x10D54, "M", "𐵴"), - (0x10D55, "M", "𐵵"), - (0x10D56, "M", "𐵶"), - (0x10D57, "M", "𐵷"), - (0x10D58, "M", "𐵸"), - (0x10D59, "M", "𐵹"), - (0x10D5A, "M", "𐵺"), - (0x10D5B, "M", "𐵻"), - (0x10D5C, "M", "𐵼"), - (0x10D5D, "M", "𐵽"), - (0x10D5E, "M", "𐵾"), - (0x10D5F, "M", "𐵿"), - (0x10D60, "M", "𐶀"), - (0x10D61, "M", "𐶁"), - (0x10D62, "M", "𐶂"), - (0x10D63, "M", "𐶃"), - (0x10D64, "M", "𐶄"), - (0x10D65, "M", "𐶅"), - (0x10D66, "X"), - (0x10D69, "V"), - (0x10D86, "X"), - (0x10D8E, "V"), - (0x10D90, "X"), - (0x10E60, "V"), - (0x10E7F, "X"), - (0x10E80, "V"), - (0x10EAA, "X"), - (0x10EAB, "V"), - (0x10EAE, "X"), - (0x10EB0, "V"), - (0x10EB2, "X"), - (0x10EC2, "V"), - (0x10EC5, "X"), - (0x10EFC, "V"), - (0x10F28, "X"), - (0x10F30, "V"), - (0x10F5A, "X"), - (0x10F70, "V"), - (0x10F8A, "X"), - (0x10FB0, "V"), - (0x10FCC, "X"), - (0x10FE0, "V"), - (0x10FF7, "X"), - (0x11000, "V"), - (0x1104E, "X"), - (0x11052, "V"), - (0x11076, "X"), - (0x1107F, "V"), - (0x110BD, "X"), - (0x110BE, "V"), - (0x110C3, "X"), - (0x110D0, "V"), - (0x110E9, "X"), - (0x110F0, "V"), - (0x110FA, "X"), - (0x11100, "V"), - (0x11135, "X"), - (0x11136, "V"), - (0x11148, "X"), - (0x11150, "V"), - (0x11177, "X"), - (0x11180, "V"), - (0x111E0, "X"), - (0x111E1, "V"), - (0x111F5, "X"), - (0x11200, "V"), - (0x11212, "X"), - (0x11213, "V"), - (0x11242, "X"), - (0x11280, "V"), - (0x11287, "X"), - (0x11288, "V"), - (0x11289, "X"), - (0x1128A, "V"), - (0x1128E, "X"), - (0x1128F, "V"), - (0x1129E, "X"), - (0x1129F, "V"), - (0x112AA, "X"), - (0x112B0, "V"), - (0x112EB, "X"), - (0x112F0, "V"), - (0x112FA, "X"), - ] - - -def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x11300, "V"), - (0x11304, "X"), - (0x11305, "V"), - (0x1130D, "X"), - (0x1130F, "V"), - (0x11311, "X"), - (0x11313, "V"), - (0x11329, "X"), - (0x1132A, "V"), - (0x11331, "X"), - (0x11332, "V"), - (0x11334, "X"), - (0x11335, "V"), - (0x1133A, "X"), - (0x1133B, "V"), - (0x11345, "X"), - (0x11347, "V"), - (0x11349, "X"), - (0x1134B, "V"), - (0x1134E, "X"), - (0x11350, "V"), - (0x11351, "X"), - (0x11357, "V"), - (0x11358, "X"), - (0x1135D, "V"), - (0x11364, "X"), - (0x11366, "V"), - (0x1136D, "X"), - (0x11370, "V"), - (0x11375, "X"), - (0x11380, "V"), - (0x1138A, "X"), - (0x1138B, "V"), - (0x1138C, "X"), - (0x1138E, "V"), - (0x1138F, "X"), - (0x11390, "V"), - (0x113B6, "X"), - (0x113B7, "V"), - (0x113C1, "X"), - (0x113C2, "V"), - (0x113C3, "X"), - (0x113C5, "V"), - (0x113C6, "X"), - (0x113C7, "V"), - (0x113CB, "X"), - (0x113CC, "V"), - (0x113D6, "X"), - (0x113D7, "V"), - (0x113D9, "X"), - (0x113E1, "V"), - (0x113E3, "X"), - (0x11400, "V"), - (0x1145C, "X"), - (0x1145D, "V"), - (0x11462, "X"), - (0x11480, "V"), - (0x114C8, "X"), - (0x114D0, "V"), - (0x114DA, "X"), - (0x11580, "V"), - (0x115B6, "X"), - (0x115B8, "V"), - (0x115DE, "X"), - (0x11600, "V"), - (0x11645, "X"), - (0x11650, "V"), - (0x1165A, "X"), - (0x11660, "V"), - (0x1166D, "X"), - (0x11680, "V"), - (0x116BA, "X"), - (0x116C0, "V"), - (0x116CA, "X"), - (0x116D0, "V"), - (0x116E4, "X"), - (0x11700, "V"), - (0x1171B, "X"), - (0x1171D, "V"), - (0x1172C, "X"), - (0x11730, "V"), - (0x11747, "X"), - (0x11800, "V"), - (0x1183C, "X"), - (0x118A0, "M", "𑣀"), - (0x118A1, "M", "𑣁"), - (0x118A2, "M", "𑣂"), - (0x118A3, "M", "𑣃"), - (0x118A4, "M", "𑣄"), - (0x118A5, "M", "𑣅"), - (0x118A6, "M", "𑣆"), - (0x118A7, "M", "𑣇"), - (0x118A8, "M", "𑣈"), - (0x118A9, "M", "𑣉"), - (0x118AA, "M", "𑣊"), - (0x118AB, "M", "𑣋"), - (0x118AC, "M", "𑣌"), - (0x118AD, "M", "𑣍"), - (0x118AE, "M", "𑣎"), - (0x118AF, "M", "𑣏"), - ] - - -def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x118B0, "M", "𑣐"), - (0x118B1, "M", "𑣑"), - (0x118B2, "M", "𑣒"), - (0x118B3, "M", "𑣓"), - (0x118B4, "M", "𑣔"), - (0x118B5, "M", "𑣕"), - (0x118B6, "M", "𑣖"), - (0x118B7, "M", "𑣗"), - (0x118B8, "M", "𑣘"), - (0x118B9, "M", "𑣙"), - (0x118BA, "M", "𑣚"), - (0x118BB, "M", "𑣛"), - (0x118BC, "M", "𑣜"), - (0x118BD, "M", "𑣝"), - (0x118BE, "M", "𑣞"), - (0x118BF, "M", "𑣟"), - (0x118C0, "V"), - (0x118F3, "X"), - (0x118FF, "V"), - (0x11907, "X"), - (0x11909, "V"), - (0x1190A, "X"), - (0x1190C, "V"), - (0x11914, "X"), - (0x11915, "V"), - (0x11917, "X"), - (0x11918, "V"), - (0x11936, "X"), - (0x11937, "V"), - (0x11939, "X"), - (0x1193B, "V"), - (0x11947, "X"), - (0x11950, "V"), - (0x1195A, "X"), - (0x119A0, "V"), - (0x119A8, "X"), - (0x119AA, "V"), - (0x119D8, "X"), - (0x119DA, "V"), - (0x119E5, "X"), - (0x11A00, "V"), - (0x11A48, "X"), - (0x11A50, "V"), - (0x11AA3, "X"), - (0x11AB0, "V"), - (0x11AF9, "X"), - (0x11B00, "V"), - (0x11B0A, "X"), - (0x11BC0, "V"), - (0x11BE2, "X"), - (0x11BF0, "V"), - (0x11BFA, "X"), - (0x11C00, "V"), - (0x11C09, "X"), - (0x11C0A, "V"), - (0x11C37, "X"), - (0x11C38, "V"), - (0x11C46, "X"), - (0x11C50, "V"), - (0x11C6D, "X"), - (0x11C70, "V"), - (0x11C90, "X"), - (0x11C92, "V"), - (0x11CA8, "X"), - (0x11CA9, "V"), - (0x11CB7, "X"), - (0x11D00, "V"), - (0x11D07, "X"), - (0x11D08, "V"), - (0x11D0A, "X"), - (0x11D0B, "V"), - (0x11D37, "X"), - (0x11D3A, "V"), - (0x11D3B, "X"), - (0x11D3C, "V"), - (0x11D3E, "X"), - (0x11D3F, "V"), - (0x11D48, "X"), - (0x11D50, "V"), - (0x11D5A, "X"), - (0x11D60, "V"), - (0x11D66, "X"), - (0x11D67, "V"), - (0x11D69, "X"), - (0x11D6A, "V"), - (0x11D8F, "X"), - (0x11D90, "V"), - (0x11D92, "X"), - (0x11D93, "V"), - (0x11D99, "X"), - (0x11DA0, "V"), - (0x11DAA, "X"), - (0x11EE0, "V"), - (0x11EF9, "X"), - (0x11F00, "V"), - (0x11F11, "X"), - (0x11F12, "V"), - (0x11F3B, "X"), - (0x11F3E, "V"), - (0x11F5B, "X"), - ] - - -def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x11FB0, "V"), - (0x11FB1, "X"), - (0x11FC0, "V"), - (0x11FF2, "X"), - (0x11FFF, "V"), - (0x1239A, "X"), - (0x12400, "V"), - (0x1246F, "X"), - (0x12470, "V"), - (0x12475, "X"), - (0x12480, "V"), - (0x12544, "X"), - (0x12F90, "V"), - (0x12FF3, "X"), - (0x13000, "V"), - (0x13430, "X"), - (0x13440, "V"), - (0x13456, "X"), - (0x13460, "V"), - (0x143FB, "X"), - (0x14400, "V"), - (0x14647, "X"), - (0x16100, "V"), - (0x1613A, "X"), - (0x16800, "V"), - (0x16A39, "X"), - (0x16A40, "V"), - (0x16A5F, "X"), - (0x16A60, "V"), - (0x16A6A, "X"), - (0x16A6E, "V"), - (0x16ABF, "X"), - (0x16AC0, "V"), - (0x16ACA, "X"), - (0x16AD0, "V"), - (0x16AEE, "X"), - (0x16AF0, "V"), - (0x16AF6, "X"), - (0x16B00, "V"), - (0x16B46, "X"), - (0x16B50, "V"), - (0x16B5A, "X"), - (0x16B5B, "V"), - (0x16B62, "X"), - (0x16B63, "V"), - (0x16B78, "X"), - (0x16B7D, "V"), - (0x16B90, "X"), - (0x16D40, "V"), - (0x16D7A, "X"), - (0x16E40, "M", "𖹠"), - (0x16E41, "M", "𖹡"), - (0x16E42, "M", "𖹢"), - (0x16E43, "M", "𖹣"), - (0x16E44, "M", "𖹤"), - (0x16E45, "M", "𖹥"), - (0x16E46, "M", "𖹦"), - (0x16E47, "M", "𖹧"), - (0x16E48, "M", "𖹨"), - (0x16E49, "M", "𖹩"), - (0x16E4A, "M", "𖹪"), - (0x16E4B, "M", "𖹫"), - (0x16E4C, "M", "𖹬"), - (0x16E4D, "M", "𖹭"), - (0x16E4E, "M", "𖹮"), - (0x16E4F, "M", "𖹯"), - (0x16E50, "M", "𖹰"), - (0x16E51, "M", "𖹱"), - (0x16E52, "M", "𖹲"), - (0x16E53, "M", "𖹳"), - (0x16E54, "M", "𖹴"), - (0x16E55, "M", "𖹵"), - (0x16E56, "M", "𖹶"), - (0x16E57, "M", "𖹷"), - (0x16E58, "M", "𖹸"), - (0x16E59, "M", "𖹹"), - (0x16E5A, "M", "𖹺"), - (0x16E5B, "M", "𖹻"), - (0x16E5C, "M", "𖹼"), - (0x16E5D, "M", "𖹽"), - (0x16E5E, "M", "𖹾"), - (0x16E5F, "M", "𖹿"), - (0x16E60, "V"), - (0x16E9B, "X"), - (0x16F00, "V"), - (0x16F4B, "X"), - (0x16F4F, "V"), - (0x16F88, "X"), - (0x16F8F, "V"), - (0x16FA0, "X"), - (0x16FE0, "V"), - (0x16FE5, "X"), - (0x16FF0, "V"), - (0x16FF2, "X"), - (0x17000, "V"), - (0x187F8, "X"), - (0x18800, "V"), - (0x18CD6, "X"), - (0x18CFF, "V"), - (0x18D09, "X"), - ] - - -def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1AFF0, "V"), - (0x1AFF4, "X"), - (0x1AFF5, "V"), - (0x1AFFC, "X"), - (0x1AFFD, "V"), - (0x1AFFF, "X"), - (0x1B000, "V"), - (0x1B123, "X"), - (0x1B132, "V"), - (0x1B133, "X"), - (0x1B150, "V"), - (0x1B153, "X"), - (0x1B155, "V"), - (0x1B156, "X"), - (0x1B164, "V"), - (0x1B168, "X"), - (0x1B170, "V"), - (0x1B2FC, "X"), - (0x1BC00, "V"), - (0x1BC6B, "X"), - (0x1BC70, "V"), - (0x1BC7D, "X"), - (0x1BC80, "V"), - (0x1BC89, "X"), - (0x1BC90, "V"), - (0x1BC9A, "X"), - (0x1BC9C, "V"), - (0x1BCA0, "I"), - (0x1BCA4, "X"), - (0x1CC00, "V"), - (0x1CCD6, "M", "a"), - (0x1CCD7, "M", "b"), - (0x1CCD8, "M", "c"), - (0x1CCD9, "M", "d"), - (0x1CCDA, "M", "e"), - (0x1CCDB, "M", "f"), - (0x1CCDC, "M", "g"), - (0x1CCDD, "M", "h"), - (0x1CCDE, "M", "i"), - (0x1CCDF, "M", "j"), - (0x1CCE0, "M", "k"), - (0x1CCE1, "M", "l"), - (0x1CCE2, "M", "m"), - (0x1CCE3, "M", "n"), - (0x1CCE4, "M", "o"), - (0x1CCE5, "M", "p"), - (0x1CCE6, "M", "q"), - (0x1CCE7, "M", "r"), - (0x1CCE8, "M", "s"), - (0x1CCE9, "M", "t"), - (0x1CCEA, "M", "u"), - (0x1CCEB, "M", "v"), - (0x1CCEC, "M", "w"), - (0x1CCED, "M", "x"), - (0x1CCEE, "M", "y"), - (0x1CCEF, "M", "z"), - (0x1CCF0, "M", "0"), - (0x1CCF1, "M", "1"), - (0x1CCF2, "M", "2"), - (0x1CCF3, "M", "3"), - (0x1CCF4, "M", "4"), - (0x1CCF5, "M", "5"), - (0x1CCF6, "M", "6"), - (0x1CCF7, "M", "7"), - (0x1CCF8, "M", "8"), - (0x1CCF9, "M", "9"), - (0x1CCFA, "X"), - (0x1CD00, "V"), - (0x1CEB4, "X"), - (0x1CF00, "V"), - (0x1CF2E, "X"), - (0x1CF30, "V"), - (0x1CF47, "X"), - (0x1CF50, "V"), - (0x1CFC4, "X"), - (0x1D000, "V"), - (0x1D0F6, "X"), - (0x1D100, "V"), - (0x1D127, "X"), - (0x1D129, "V"), - (0x1D15E, "M", "𝅗𝅥"), - (0x1D15F, "M", "𝅘𝅥"), - (0x1D160, "M", "𝅘𝅥𝅮"), - (0x1D161, "M", "𝅘𝅥𝅯"), - (0x1D162, "M", "𝅘𝅥𝅰"), - (0x1D163, "M", "𝅘𝅥𝅱"), - (0x1D164, "M", "𝅘𝅥𝅲"), - (0x1D165, "V"), - (0x1D173, "I"), - (0x1D17B, "V"), - (0x1D1BB, "M", "𝆹𝅥"), - (0x1D1BC, "M", "𝆺𝅥"), - (0x1D1BD, "M", "𝆹𝅥𝅮"), - (0x1D1BE, "M", "𝆺𝅥𝅮"), - (0x1D1BF, "M", "𝆹𝅥𝅯"), - (0x1D1C0, "M", "𝆺𝅥𝅯"), - (0x1D1C1, "V"), - (0x1D1EB, "X"), - (0x1D200, "V"), - (0x1D246, "X"), - ] - - -def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D2C0, "V"), - (0x1D2D4, "X"), - (0x1D2E0, "V"), - (0x1D2F4, "X"), - (0x1D300, "V"), - (0x1D357, "X"), - (0x1D360, "V"), - (0x1D379, "X"), - (0x1D400, "M", "a"), - (0x1D401, "M", "b"), - (0x1D402, "M", "c"), - (0x1D403, "M", "d"), - (0x1D404, "M", "e"), - (0x1D405, "M", "f"), - (0x1D406, "M", "g"), - (0x1D407, "M", "h"), - (0x1D408, "M", "i"), - (0x1D409, "M", "j"), - (0x1D40A, "M", "k"), - (0x1D40B, "M", "l"), - (0x1D40C, "M", "m"), - (0x1D40D, "M", "n"), - (0x1D40E, "M", "o"), - (0x1D40F, "M", "p"), - (0x1D410, "M", "q"), - (0x1D411, "M", "r"), - (0x1D412, "M", "s"), - (0x1D413, "M", "t"), - (0x1D414, "M", "u"), - (0x1D415, "M", "v"), - (0x1D416, "M", "w"), - (0x1D417, "M", "x"), - (0x1D418, "M", "y"), - (0x1D419, "M", "z"), - (0x1D41A, "M", "a"), - (0x1D41B, "M", "b"), - (0x1D41C, "M", "c"), - (0x1D41D, "M", "d"), - (0x1D41E, "M", "e"), - (0x1D41F, "M", "f"), - (0x1D420, "M", "g"), - (0x1D421, "M", "h"), - (0x1D422, "M", "i"), - (0x1D423, "M", "j"), - (0x1D424, "M", "k"), - (0x1D425, "M", "l"), - (0x1D426, "M", "m"), - (0x1D427, "M", "n"), - (0x1D428, "M", "o"), - (0x1D429, "M", "p"), - (0x1D42A, "M", "q"), - (0x1D42B, "M", "r"), - (0x1D42C, "M", "s"), - (0x1D42D, "M", "t"), - (0x1D42E, "M", "u"), - (0x1D42F, "M", "v"), - (0x1D430, "M", "w"), - (0x1D431, "M", "x"), - (0x1D432, "M", "y"), - (0x1D433, "M", "z"), - (0x1D434, "M", "a"), - (0x1D435, "M", "b"), - (0x1D436, "M", "c"), - (0x1D437, "M", "d"), - (0x1D438, "M", "e"), - (0x1D439, "M", "f"), - (0x1D43A, "M", "g"), - (0x1D43B, "M", "h"), - (0x1D43C, "M", "i"), - (0x1D43D, "M", "j"), - (0x1D43E, "M", "k"), - (0x1D43F, "M", "l"), - (0x1D440, "M", "m"), - (0x1D441, "M", "n"), - (0x1D442, "M", "o"), - (0x1D443, "M", "p"), - (0x1D444, "M", "q"), - (0x1D445, "M", "r"), - (0x1D446, "M", "s"), - (0x1D447, "M", "t"), - (0x1D448, "M", "u"), - (0x1D449, "M", "v"), - (0x1D44A, "M", "w"), - (0x1D44B, "M", "x"), - (0x1D44C, "M", "y"), - (0x1D44D, "M", "z"), - (0x1D44E, "M", "a"), - (0x1D44F, "M", "b"), - (0x1D450, "M", "c"), - (0x1D451, "M", "d"), - (0x1D452, "M", "e"), - (0x1D453, "M", "f"), - (0x1D454, "M", "g"), - (0x1D455, "X"), - (0x1D456, "M", "i"), - (0x1D457, "M", "j"), - (0x1D458, "M", "k"), - (0x1D459, "M", "l"), - (0x1D45A, "M", "m"), - (0x1D45B, "M", "n"), - ] - - -def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D45C, "M", "o"), - (0x1D45D, "M", "p"), - (0x1D45E, "M", "q"), - (0x1D45F, "M", "r"), - (0x1D460, "M", "s"), - (0x1D461, "M", "t"), - (0x1D462, "M", "u"), - (0x1D463, "M", "v"), - (0x1D464, "M", "w"), - (0x1D465, "M", "x"), - (0x1D466, "M", "y"), - (0x1D467, "M", "z"), - (0x1D468, "M", "a"), - (0x1D469, "M", "b"), - (0x1D46A, "M", "c"), - (0x1D46B, "M", "d"), - (0x1D46C, "M", "e"), - (0x1D46D, "M", "f"), - (0x1D46E, "M", "g"), - (0x1D46F, "M", "h"), - (0x1D470, "M", "i"), - (0x1D471, "M", "j"), - (0x1D472, "M", "k"), - (0x1D473, "M", "l"), - (0x1D474, "M", "m"), - (0x1D475, "M", "n"), - (0x1D476, "M", "o"), - (0x1D477, "M", "p"), - (0x1D478, "M", "q"), - (0x1D479, "M", "r"), - (0x1D47A, "M", "s"), - (0x1D47B, "M", "t"), - (0x1D47C, "M", "u"), - (0x1D47D, "M", "v"), - (0x1D47E, "M", "w"), - (0x1D47F, "M", "x"), - (0x1D480, "M", "y"), - (0x1D481, "M", "z"), - (0x1D482, "M", "a"), - (0x1D483, "M", "b"), - (0x1D484, "M", "c"), - (0x1D485, "M", "d"), - (0x1D486, "M", "e"), - (0x1D487, "M", "f"), - (0x1D488, "M", "g"), - (0x1D489, "M", "h"), - (0x1D48A, "M", "i"), - (0x1D48B, "M", "j"), - (0x1D48C, "M", "k"), - (0x1D48D, "M", "l"), - (0x1D48E, "M", "m"), - (0x1D48F, "M", "n"), - (0x1D490, "M", "o"), - (0x1D491, "M", "p"), - (0x1D492, "M", "q"), - (0x1D493, "M", "r"), - (0x1D494, "M", "s"), - (0x1D495, "M", "t"), - (0x1D496, "M", "u"), - (0x1D497, "M", "v"), - (0x1D498, "M", "w"), - (0x1D499, "M", "x"), - (0x1D49A, "M", "y"), - (0x1D49B, "M", "z"), - (0x1D49C, "M", "a"), - (0x1D49D, "X"), - (0x1D49E, "M", "c"), - (0x1D49F, "M", "d"), - (0x1D4A0, "X"), - (0x1D4A2, "M", "g"), - (0x1D4A3, "X"), - (0x1D4A5, "M", "j"), - (0x1D4A6, "M", "k"), - (0x1D4A7, "X"), - (0x1D4A9, "M", "n"), - (0x1D4AA, "M", "o"), - (0x1D4AB, "M", "p"), - (0x1D4AC, "M", "q"), - (0x1D4AD, "X"), - (0x1D4AE, "M", "s"), - (0x1D4AF, "M", "t"), - (0x1D4B0, "M", "u"), - (0x1D4B1, "M", "v"), - (0x1D4B2, "M", "w"), - (0x1D4B3, "M", "x"), - (0x1D4B4, "M", "y"), - (0x1D4B5, "M", "z"), - (0x1D4B6, "M", "a"), - (0x1D4B7, "M", "b"), - (0x1D4B8, "M", "c"), - (0x1D4B9, "M", "d"), - (0x1D4BA, "X"), - (0x1D4BB, "M", "f"), - (0x1D4BC, "X"), - (0x1D4BD, "M", "h"), - (0x1D4BE, "M", "i"), - (0x1D4BF, "M", "j"), - (0x1D4C0, "M", "k"), - (0x1D4C1, "M", "l"), - (0x1D4C2, "M", "m"), - ] - - -def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D4C3, "M", "n"), - (0x1D4C4, "X"), - (0x1D4C5, "M", "p"), - (0x1D4C6, "M", "q"), - (0x1D4C7, "M", "r"), - (0x1D4C8, "M", "s"), - (0x1D4C9, "M", "t"), - (0x1D4CA, "M", "u"), - (0x1D4CB, "M", "v"), - (0x1D4CC, "M", "w"), - (0x1D4CD, "M", "x"), - (0x1D4CE, "M", "y"), - (0x1D4CF, "M", "z"), - (0x1D4D0, "M", "a"), - (0x1D4D1, "M", "b"), - (0x1D4D2, "M", "c"), - (0x1D4D3, "M", "d"), - (0x1D4D4, "M", "e"), - (0x1D4D5, "M", "f"), - (0x1D4D6, "M", "g"), - (0x1D4D7, "M", "h"), - (0x1D4D8, "M", "i"), - (0x1D4D9, "M", "j"), - (0x1D4DA, "M", "k"), - (0x1D4DB, "M", "l"), - (0x1D4DC, "M", "m"), - (0x1D4DD, "M", "n"), - (0x1D4DE, "M", "o"), - (0x1D4DF, "M", "p"), - (0x1D4E0, "M", "q"), - (0x1D4E1, "M", "r"), - (0x1D4E2, "M", "s"), - (0x1D4E3, "M", "t"), - (0x1D4E4, "M", "u"), - (0x1D4E5, "M", "v"), - (0x1D4E6, "M", "w"), - (0x1D4E7, "M", "x"), - (0x1D4E8, "M", "y"), - (0x1D4E9, "M", "z"), - (0x1D4EA, "M", "a"), - (0x1D4EB, "M", "b"), - (0x1D4EC, "M", "c"), - (0x1D4ED, "M", "d"), - (0x1D4EE, "M", "e"), - (0x1D4EF, "M", "f"), - (0x1D4F0, "M", "g"), - (0x1D4F1, "M", "h"), - (0x1D4F2, "M", "i"), - (0x1D4F3, "M", "j"), - (0x1D4F4, "M", "k"), - (0x1D4F5, "M", "l"), - (0x1D4F6, "M", "m"), - (0x1D4F7, "M", "n"), - (0x1D4F8, "M", "o"), - (0x1D4F9, "M", "p"), - (0x1D4FA, "M", "q"), - (0x1D4FB, "M", "r"), - (0x1D4FC, "M", "s"), - (0x1D4FD, "M", "t"), - (0x1D4FE, "M", "u"), - (0x1D4FF, "M", "v"), - (0x1D500, "M", "w"), - (0x1D501, "M", "x"), - (0x1D502, "M", "y"), - (0x1D503, "M", "z"), - (0x1D504, "M", "a"), - (0x1D505, "M", "b"), - (0x1D506, "X"), - (0x1D507, "M", "d"), - (0x1D508, "M", "e"), - (0x1D509, "M", "f"), - (0x1D50A, "M", "g"), - (0x1D50B, "X"), - (0x1D50D, "M", "j"), - (0x1D50E, "M", "k"), - (0x1D50F, "M", "l"), - (0x1D510, "M", "m"), - (0x1D511, "M", "n"), - (0x1D512, "M", "o"), - (0x1D513, "M", "p"), - (0x1D514, "M", "q"), - (0x1D515, "X"), - (0x1D516, "M", "s"), - (0x1D517, "M", "t"), - (0x1D518, "M", "u"), - (0x1D519, "M", "v"), - (0x1D51A, "M", "w"), - (0x1D51B, "M", "x"), - (0x1D51C, "M", "y"), - (0x1D51D, "X"), - (0x1D51E, "M", "a"), - (0x1D51F, "M", "b"), - (0x1D520, "M", "c"), - (0x1D521, "M", "d"), - (0x1D522, "M", "e"), - (0x1D523, "M", "f"), - (0x1D524, "M", "g"), - (0x1D525, "M", "h"), - (0x1D526, "M", "i"), - (0x1D527, "M", "j"), - ] - - -def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D528, "M", "k"), - (0x1D529, "M", "l"), - (0x1D52A, "M", "m"), - (0x1D52B, "M", "n"), - (0x1D52C, "M", "o"), - (0x1D52D, "M", "p"), - (0x1D52E, "M", "q"), - (0x1D52F, "M", "r"), - (0x1D530, "M", "s"), - (0x1D531, "M", "t"), - (0x1D532, "M", "u"), - (0x1D533, "M", "v"), - (0x1D534, "M", "w"), - (0x1D535, "M", "x"), - (0x1D536, "M", "y"), - (0x1D537, "M", "z"), - (0x1D538, "M", "a"), - (0x1D539, "M", "b"), - (0x1D53A, "X"), - (0x1D53B, "M", "d"), - (0x1D53C, "M", "e"), - (0x1D53D, "M", "f"), - (0x1D53E, "M", "g"), - (0x1D53F, "X"), - (0x1D540, "M", "i"), - (0x1D541, "M", "j"), - (0x1D542, "M", "k"), - (0x1D543, "M", "l"), - (0x1D544, "M", "m"), - (0x1D545, "X"), - (0x1D546, "M", "o"), - (0x1D547, "X"), - (0x1D54A, "M", "s"), - (0x1D54B, "M", "t"), - (0x1D54C, "M", "u"), - (0x1D54D, "M", "v"), - (0x1D54E, "M", "w"), - (0x1D54F, "M", "x"), - (0x1D550, "M", "y"), - (0x1D551, "X"), - (0x1D552, "M", "a"), - (0x1D553, "M", "b"), - (0x1D554, "M", "c"), - (0x1D555, "M", "d"), - (0x1D556, "M", "e"), - (0x1D557, "M", "f"), - (0x1D558, "M", "g"), - (0x1D559, "M", "h"), - (0x1D55A, "M", "i"), - (0x1D55B, "M", "j"), - (0x1D55C, "M", "k"), - (0x1D55D, "M", "l"), - (0x1D55E, "M", "m"), - (0x1D55F, "M", "n"), - (0x1D560, "M", "o"), - (0x1D561, "M", "p"), - (0x1D562, "M", "q"), - (0x1D563, "M", "r"), - (0x1D564, "M", "s"), - (0x1D565, "M", "t"), - (0x1D566, "M", "u"), - (0x1D567, "M", "v"), - (0x1D568, "M", "w"), - (0x1D569, "M", "x"), - (0x1D56A, "M", "y"), - (0x1D56B, "M", "z"), - (0x1D56C, "M", "a"), - (0x1D56D, "M", "b"), - (0x1D56E, "M", "c"), - (0x1D56F, "M", "d"), - (0x1D570, "M", "e"), - (0x1D571, "M", "f"), - (0x1D572, "M", "g"), - (0x1D573, "M", "h"), - (0x1D574, "M", "i"), - (0x1D575, "M", "j"), - (0x1D576, "M", "k"), - (0x1D577, "M", "l"), - (0x1D578, "M", "m"), - (0x1D579, "M", "n"), - (0x1D57A, "M", "o"), - (0x1D57B, "M", "p"), - (0x1D57C, "M", "q"), - (0x1D57D, "M", "r"), - (0x1D57E, "M", "s"), - (0x1D57F, "M", "t"), - (0x1D580, "M", "u"), - (0x1D581, "M", "v"), - (0x1D582, "M", "w"), - (0x1D583, "M", "x"), - (0x1D584, "M", "y"), - (0x1D585, "M", "z"), - (0x1D586, "M", "a"), - (0x1D587, "M", "b"), - (0x1D588, "M", "c"), - (0x1D589, "M", "d"), - (0x1D58A, "M", "e"), - (0x1D58B, "M", "f"), - (0x1D58C, "M", "g"), - (0x1D58D, "M", "h"), - ] - - -def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D58E, "M", "i"), - (0x1D58F, "M", "j"), - (0x1D590, "M", "k"), - (0x1D591, "M", "l"), - (0x1D592, "M", "m"), - (0x1D593, "M", "n"), - (0x1D594, "M", "o"), - (0x1D595, "M", "p"), - (0x1D596, "M", "q"), - (0x1D597, "M", "r"), - (0x1D598, "M", "s"), - (0x1D599, "M", "t"), - (0x1D59A, "M", "u"), - (0x1D59B, "M", "v"), - (0x1D59C, "M", "w"), - (0x1D59D, "M", "x"), - (0x1D59E, "M", "y"), - (0x1D59F, "M", "z"), - (0x1D5A0, "M", "a"), - (0x1D5A1, "M", "b"), - (0x1D5A2, "M", "c"), - (0x1D5A3, "M", "d"), - (0x1D5A4, "M", "e"), - (0x1D5A5, "M", "f"), - (0x1D5A6, "M", "g"), - (0x1D5A7, "M", "h"), - (0x1D5A8, "M", "i"), - (0x1D5A9, "M", "j"), - (0x1D5AA, "M", "k"), - (0x1D5AB, "M", "l"), - (0x1D5AC, "M", "m"), - (0x1D5AD, "M", "n"), - (0x1D5AE, "M", "o"), - (0x1D5AF, "M", "p"), - (0x1D5B0, "M", "q"), - (0x1D5B1, "M", "r"), - (0x1D5B2, "M", "s"), - (0x1D5B3, "M", "t"), - (0x1D5B4, "M", "u"), - (0x1D5B5, "M", "v"), - (0x1D5B6, "M", "w"), - (0x1D5B7, "M", "x"), - (0x1D5B8, "M", "y"), - (0x1D5B9, "M", "z"), - (0x1D5BA, "M", "a"), - (0x1D5BB, "M", "b"), - (0x1D5BC, "M", "c"), - (0x1D5BD, "M", "d"), - (0x1D5BE, "M", "e"), - (0x1D5BF, "M", "f"), - (0x1D5C0, "M", "g"), - (0x1D5C1, "M", "h"), - (0x1D5C2, "M", "i"), - (0x1D5C3, "M", "j"), - (0x1D5C4, "M", "k"), - (0x1D5C5, "M", "l"), - (0x1D5C6, "M", "m"), - (0x1D5C7, "M", "n"), - (0x1D5C8, "M", "o"), - (0x1D5C9, "M", "p"), - (0x1D5CA, "M", "q"), - (0x1D5CB, "M", "r"), - (0x1D5CC, "M", "s"), - (0x1D5CD, "M", "t"), - (0x1D5CE, "M", "u"), - (0x1D5CF, "M", "v"), - (0x1D5D0, "M", "w"), - (0x1D5D1, "M", "x"), - (0x1D5D2, "M", "y"), - (0x1D5D3, "M", "z"), - (0x1D5D4, "M", "a"), - (0x1D5D5, "M", "b"), - (0x1D5D6, "M", "c"), - (0x1D5D7, "M", "d"), - (0x1D5D8, "M", "e"), - (0x1D5D9, "M", "f"), - (0x1D5DA, "M", "g"), - (0x1D5DB, "M", "h"), - (0x1D5DC, "M", "i"), - (0x1D5DD, "M", "j"), - (0x1D5DE, "M", "k"), - (0x1D5DF, "M", "l"), - (0x1D5E0, "M", "m"), - (0x1D5E1, "M", "n"), - (0x1D5E2, "M", "o"), - (0x1D5E3, "M", "p"), - (0x1D5E4, "M", "q"), - (0x1D5E5, "M", "r"), - (0x1D5E6, "M", "s"), - (0x1D5E7, "M", "t"), - (0x1D5E8, "M", "u"), - (0x1D5E9, "M", "v"), - (0x1D5EA, "M", "w"), - (0x1D5EB, "M", "x"), - (0x1D5EC, "M", "y"), - (0x1D5ED, "M", "z"), - (0x1D5EE, "M", "a"), - (0x1D5EF, "M", "b"), - (0x1D5F0, "M", "c"), - (0x1D5F1, "M", "d"), - ] - - -def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D5F2, "M", "e"), - (0x1D5F3, "M", "f"), - (0x1D5F4, "M", "g"), - (0x1D5F5, "M", "h"), - (0x1D5F6, "M", "i"), - (0x1D5F7, "M", "j"), - (0x1D5F8, "M", "k"), - (0x1D5F9, "M", "l"), - (0x1D5FA, "M", "m"), - (0x1D5FB, "M", "n"), - (0x1D5FC, "M", "o"), - (0x1D5FD, "M", "p"), - (0x1D5FE, "M", "q"), - (0x1D5FF, "M", "r"), - (0x1D600, "M", "s"), - (0x1D601, "M", "t"), - (0x1D602, "M", "u"), - (0x1D603, "M", "v"), - (0x1D604, "M", "w"), - (0x1D605, "M", "x"), - (0x1D606, "M", "y"), - (0x1D607, "M", "z"), - (0x1D608, "M", "a"), - (0x1D609, "M", "b"), - (0x1D60A, "M", "c"), - (0x1D60B, "M", "d"), - (0x1D60C, "M", "e"), - (0x1D60D, "M", "f"), - (0x1D60E, "M", "g"), - (0x1D60F, "M", "h"), - (0x1D610, "M", "i"), - (0x1D611, "M", "j"), - (0x1D612, "M", "k"), - (0x1D613, "M", "l"), - (0x1D614, "M", "m"), - (0x1D615, "M", "n"), - (0x1D616, "M", "o"), - (0x1D617, "M", "p"), - (0x1D618, "M", "q"), - (0x1D619, "M", "r"), - (0x1D61A, "M", "s"), - (0x1D61B, "M", "t"), - (0x1D61C, "M", "u"), - (0x1D61D, "M", "v"), - (0x1D61E, "M", "w"), - (0x1D61F, "M", "x"), - (0x1D620, "M", "y"), - (0x1D621, "M", "z"), - (0x1D622, "M", "a"), - (0x1D623, "M", "b"), - (0x1D624, "M", "c"), - (0x1D625, "M", "d"), - (0x1D626, "M", "e"), - (0x1D627, "M", "f"), - (0x1D628, "M", "g"), - (0x1D629, "M", "h"), - (0x1D62A, "M", "i"), - (0x1D62B, "M", "j"), - (0x1D62C, "M", "k"), - (0x1D62D, "M", "l"), - (0x1D62E, "M", "m"), - (0x1D62F, "M", "n"), - (0x1D630, "M", "o"), - (0x1D631, "M", "p"), - (0x1D632, "M", "q"), - (0x1D633, "M", "r"), - (0x1D634, "M", "s"), - (0x1D635, "M", "t"), - (0x1D636, "M", "u"), - (0x1D637, "M", "v"), - (0x1D638, "M", "w"), - (0x1D639, "M", "x"), - (0x1D63A, "M", "y"), - (0x1D63B, "M", "z"), - (0x1D63C, "M", "a"), - (0x1D63D, "M", "b"), - (0x1D63E, "M", "c"), - (0x1D63F, "M", "d"), - (0x1D640, "M", "e"), - (0x1D641, "M", "f"), - (0x1D642, "M", "g"), - (0x1D643, "M", "h"), - (0x1D644, "M", "i"), - (0x1D645, "M", "j"), - (0x1D646, "M", "k"), - (0x1D647, "M", "l"), - (0x1D648, "M", "m"), - (0x1D649, "M", "n"), - (0x1D64A, "M", "o"), - (0x1D64B, "M", "p"), - (0x1D64C, "M", "q"), - (0x1D64D, "M", "r"), - (0x1D64E, "M", "s"), - (0x1D64F, "M", "t"), - (0x1D650, "M", "u"), - (0x1D651, "M", "v"), - (0x1D652, "M", "w"), - (0x1D653, "M", "x"), - (0x1D654, "M", "y"), - (0x1D655, "M", "z"), - ] - - -def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D656, "M", "a"), - (0x1D657, "M", "b"), - (0x1D658, "M", "c"), - (0x1D659, "M", "d"), - (0x1D65A, "M", "e"), - (0x1D65B, "M", "f"), - (0x1D65C, "M", "g"), - (0x1D65D, "M", "h"), - (0x1D65E, "M", "i"), - (0x1D65F, "M", "j"), - (0x1D660, "M", "k"), - (0x1D661, "M", "l"), - (0x1D662, "M", "m"), - (0x1D663, "M", "n"), - (0x1D664, "M", "o"), - (0x1D665, "M", "p"), - (0x1D666, "M", "q"), - (0x1D667, "M", "r"), - (0x1D668, "M", "s"), - (0x1D669, "M", "t"), - (0x1D66A, "M", "u"), - (0x1D66B, "M", "v"), - (0x1D66C, "M", "w"), - (0x1D66D, "M", "x"), - (0x1D66E, "M", "y"), - (0x1D66F, "M", "z"), - (0x1D670, "M", "a"), - (0x1D671, "M", "b"), - (0x1D672, "M", "c"), - (0x1D673, "M", "d"), - (0x1D674, "M", "e"), - (0x1D675, "M", "f"), - (0x1D676, "M", "g"), - (0x1D677, "M", "h"), - (0x1D678, "M", "i"), - (0x1D679, "M", "j"), - (0x1D67A, "M", "k"), - (0x1D67B, "M", "l"), - (0x1D67C, "M", "m"), - (0x1D67D, "M", "n"), - (0x1D67E, "M", "o"), - (0x1D67F, "M", "p"), - (0x1D680, "M", "q"), - (0x1D681, "M", "r"), - (0x1D682, "M", "s"), - (0x1D683, "M", "t"), - (0x1D684, "M", "u"), - (0x1D685, "M", "v"), - (0x1D686, "M", "w"), - (0x1D687, "M", "x"), - (0x1D688, "M", "y"), - (0x1D689, "M", "z"), - (0x1D68A, "M", "a"), - (0x1D68B, "M", "b"), - (0x1D68C, "M", "c"), - (0x1D68D, "M", "d"), - (0x1D68E, "M", "e"), - (0x1D68F, "M", "f"), - (0x1D690, "M", "g"), - (0x1D691, "M", "h"), - (0x1D692, "M", "i"), - (0x1D693, "M", "j"), - (0x1D694, "M", "k"), - (0x1D695, "M", "l"), - (0x1D696, "M", "m"), - (0x1D697, "M", "n"), - (0x1D698, "M", "o"), - (0x1D699, "M", "p"), - (0x1D69A, "M", "q"), - (0x1D69B, "M", "r"), - (0x1D69C, "M", "s"), - (0x1D69D, "M", "t"), - (0x1D69E, "M", "u"), - (0x1D69F, "M", "v"), - (0x1D6A0, "M", "w"), - (0x1D6A1, "M", "x"), - (0x1D6A2, "M", "y"), - (0x1D6A3, "M", "z"), - (0x1D6A4, "M", "ı"), - (0x1D6A5, "M", "ȷ"), - (0x1D6A6, "X"), - (0x1D6A8, "M", "α"), - (0x1D6A9, "M", "β"), - (0x1D6AA, "M", "γ"), - (0x1D6AB, "M", "δ"), - (0x1D6AC, "M", "ε"), - (0x1D6AD, "M", "ζ"), - (0x1D6AE, "M", "η"), - (0x1D6AF, "M", "θ"), - (0x1D6B0, "M", "ι"), - (0x1D6B1, "M", "κ"), - (0x1D6B2, "M", "λ"), - (0x1D6B3, "M", "μ"), - (0x1D6B4, "M", "ν"), - (0x1D6B5, "M", "ξ"), - (0x1D6B6, "M", "ο"), - (0x1D6B7, "M", "π"), - (0x1D6B8, "M", "ρ"), - (0x1D6B9, "M", "θ"), - (0x1D6BA, "M", "σ"), - ] - - -def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D6BB, "M", "τ"), - (0x1D6BC, "M", "υ"), - (0x1D6BD, "M", "φ"), - (0x1D6BE, "M", "χ"), - (0x1D6BF, "M", "ψ"), - (0x1D6C0, "M", "ω"), - (0x1D6C1, "M", "∇"), - (0x1D6C2, "M", "α"), - (0x1D6C3, "M", "β"), - (0x1D6C4, "M", "γ"), - (0x1D6C5, "M", "δ"), - (0x1D6C6, "M", "ε"), - (0x1D6C7, "M", "ζ"), - (0x1D6C8, "M", "η"), - (0x1D6C9, "M", "θ"), - (0x1D6CA, "M", "ι"), - (0x1D6CB, "M", "κ"), - (0x1D6CC, "M", "λ"), - (0x1D6CD, "M", "μ"), - (0x1D6CE, "M", "ν"), - (0x1D6CF, "M", "ξ"), - (0x1D6D0, "M", "ο"), - (0x1D6D1, "M", "π"), - (0x1D6D2, "M", "ρ"), - (0x1D6D3, "M", "σ"), - (0x1D6D5, "M", "τ"), - (0x1D6D6, "M", "υ"), - (0x1D6D7, "M", "φ"), - (0x1D6D8, "M", "χ"), - (0x1D6D9, "M", "ψ"), - (0x1D6DA, "M", "ω"), - (0x1D6DB, "M", "∂"), - (0x1D6DC, "M", "ε"), - (0x1D6DD, "M", "θ"), - (0x1D6DE, "M", "κ"), - (0x1D6DF, "M", "φ"), - (0x1D6E0, "M", "ρ"), - (0x1D6E1, "M", "π"), - (0x1D6E2, "M", "α"), - (0x1D6E3, "M", "β"), - (0x1D6E4, "M", "γ"), - (0x1D6E5, "M", "δ"), - (0x1D6E6, "M", "ε"), - (0x1D6E7, "M", "ζ"), - (0x1D6E8, "M", "η"), - (0x1D6E9, "M", "θ"), - (0x1D6EA, "M", "ι"), - (0x1D6EB, "M", "κ"), - (0x1D6EC, "M", "λ"), - (0x1D6ED, "M", "μ"), - (0x1D6EE, "M", "ν"), - (0x1D6EF, "M", "ξ"), - (0x1D6F0, "M", "ο"), - (0x1D6F1, "M", "π"), - (0x1D6F2, "M", "ρ"), - (0x1D6F3, "M", "θ"), - (0x1D6F4, "M", "σ"), - (0x1D6F5, "M", "τ"), - (0x1D6F6, "M", "υ"), - (0x1D6F7, "M", "φ"), - (0x1D6F8, "M", "χ"), - (0x1D6F9, "M", "ψ"), - (0x1D6FA, "M", "ω"), - (0x1D6FB, "M", "∇"), - (0x1D6FC, "M", "α"), - (0x1D6FD, "M", "β"), - (0x1D6FE, "M", "γ"), - (0x1D6FF, "M", "δ"), - (0x1D700, "M", "ε"), - (0x1D701, "M", "ζ"), - (0x1D702, "M", "η"), - (0x1D703, "M", "θ"), - (0x1D704, "M", "ι"), - (0x1D705, "M", "κ"), - (0x1D706, "M", "λ"), - (0x1D707, "M", "μ"), - (0x1D708, "M", "ν"), - (0x1D709, "M", "ξ"), - (0x1D70A, "M", "ο"), - (0x1D70B, "M", "π"), - (0x1D70C, "M", "ρ"), - (0x1D70D, "M", "σ"), - (0x1D70F, "M", "τ"), - (0x1D710, "M", "υ"), - (0x1D711, "M", "φ"), - (0x1D712, "M", "χ"), - (0x1D713, "M", "ψ"), - (0x1D714, "M", "ω"), - (0x1D715, "M", "∂"), - (0x1D716, "M", "ε"), - (0x1D717, "M", "θ"), - (0x1D718, "M", "κ"), - (0x1D719, "M", "φ"), - (0x1D71A, "M", "ρ"), - (0x1D71B, "M", "π"), - (0x1D71C, "M", "α"), - (0x1D71D, "M", "β"), - (0x1D71E, "M", "γ"), - (0x1D71F, "M", "δ"), - (0x1D720, "M", "ε"), - ] - - -def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D721, "M", "ζ"), - (0x1D722, "M", "η"), - (0x1D723, "M", "θ"), - (0x1D724, "M", "ι"), - (0x1D725, "M", "κ"), - (0x1D726, "M", "λ"), - (0x1D727, "M", "μ"), - (0x1D728, "M", "ν"), - (0x1D729, "M", "ξ"), - (0x1D72A, "M", "ο"), - (0x1D72B, "M", "π"), - (0x1D72C, "M", "ρ"), - (0x1D72D, "M", "θ"), - (0x1D72E, "M", "σ"), - (0x1D72F, "M", "τ"), - (0x1D730, "M", "υ"), - (0x1D731, "M", "φ"), - (0x1D732, "M", "χ"), - (0x1D733, "M", "ψ"), - (0x1D734, "M", "ω"), - (0x1D735, "M", "∇"), - (0x1D736, "M", "α"), - (0x1D737, "M", "β"), - (0x1D738, "M", "γ"), - (0x1D739, "M", "δ"), - (0x1D73A, "M", "ε"), - (0x1D73B, "M", "ζ"), - (0x1D73C, "M", "η"), - (0x1D73D, "M", "θ"), - (0x1D73E, "M", "ι"), - (0x1D73F, "M", "κ"), - (0x1D740, "M", "λ"), - (0x1D741, "M", "μ"), - (0x1D742, "M", "ν"), - (0x1D743, "M", "ξ"), - (0x1D744, "M", "ο"), - (0x1D745, "M", "π"), - (0x1D746, "M", "ρ"), - (0x1D747, "M", "σ"), - (0x1D749, "M", "τ"), - (0x1D74A, "M", "υ"), - (0x1D74B, "M", "φ"), - (0x1D74C, "M", "χ"), - (0x1D74D, "M", "ψ"), - (0x1D74E, "M", "ω"), - (0x1D74F, "M", "∂"), - (0x1D750, "M", "ε"), - (0x1D751, "M", "θ"), - (0x1D752, "M", "κ"), - (0x1D753, "M", "φ"), - (0x1D754, "M", "ρ"), - (0x1D755, "M", "π"), - (0x1D756, "M", "α"), - (0x1D757, "M", "β"), - (0x1D758, "M", "γ"), - (0x1D759, "M", "δ"), - (0x1D75A, "M", "ε"), - (0x1D75B, "M", "ζ"), - (0x1D75C, "M", "η"), - (0x1D75D, "M", "θ"), - (0x1D75E, "M", "ι"), - (0x1D75F, "M", "κ"), - (0x1D760, "M", "λ"), - (0x1D761, "M", "μ"), - (0x1D762, "M", "ν"), - (0x1D763, "M", "ξ"), - (0x1D764, "M", "ο"), - (0x1D765, "M", "π"), - (0x1D766, "M", "ρ"), - (0x1D767, "M", "θ"), - (0x1D768, "M", "σ"), - (0x1D769, "M", "τ"), - (0x1D76A, "M", "υ"), - (0x1D76B, "M", "φ"), - (0x1D76C, "M", "χ"), - (0x1D76D, "M", "ψ"), - (0x1D76E, "M", "ω"), - (0x1D76F, "M", "∇"), - (0x1D770, "M", "α"), - (0x1D771, "M", "β"), - (0x1D772, "M", "γ"), - (0x1D773, "M", "δ"), - (0x1D774, "M", "ε"), - (0x1D775, "M", "ζ"), - (0x1D776, "M", "η"), - (0x1D777, "M", "θ"), - (0x1D778, "M", "ι"), - (0x1D779, "M", "κ"), - (0x1D77A, "M", "λ"), - (0x1D77B, "M", "μ"), - (0x1D77C, "M", "ν"), - (0x1D77D, "M", "ξ"), - (0x1D77E, "M", "ο"), - (0x1D77F, "M", "π"), - (0x1D780, "M", "ρ"), - (0x1D781, "M", "σ"), - (0x1D783, "M", "τ"), - (0x1D784, "M", "υ"), - (0x1D785, "M", "φ"), - (0x1D786, "M", "χ"), - ] - - -def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D787, "M", "ψ"), - (0x1D788, "M", "ω"), - (0x1D789, "M", "∂"), - (0x1D78A, "M", "ε"), - (0x1D78B, "M", "θ"), - (0x1D78C, "M", "κ"), - (0x1D78D, "M", "φ"), - (0x1D78E, "M", "ρ"), - (0x1D78F, "M", "π"), - (0x1D790, "M", "α"), - (0x1D791, "M", "β"), - (0x1D792, "M", "γ"), - (0x1D793, "M", "δ"), - (0x1D794, "M", "ε"), - (0x1D795, "M", "ζ"), - (0x1D796, "M", "η"), - (0x1D797, "M", "θ"), - (0x1D798, "M", "ι"), - (0x1D799, "M", "κ"), - (0x1D79A, "M", "λ"), - (0x1D79B, "M", "μ"), - (0x1D79C, "M", "ν"), - (0x1D79D, "M", "ξ"), - (0x1D79E, "M", "ο"), - (0x1D79F, "M", "π"), - (0x1D7A0, "M", "ρ"), - (0x1D7A1, "M", "θ"), - (0x1D7A2, "M", "σ"), - (0x1D7A3, "M", "τ"), - (0x1D7A4, "M", "υ"), - (0x1D7A5, "M", "φ"), - (0x1D7A6, "M", "χ"), - (0x1D7A7, "M", "ψ"), - (0x1D7A8, "M", "ω"), - (0x1D7A9, "M", "∇"), - (0x1D7AA, "M", "α"), - (0x1D7AB, "M", "β"), - (0x1D7AC, "M", "γ"), - (0x1D7AD, "M", "δ"), - (0x1D7AE, "M", "ε"), - (0x1D7AF, "M", "ζ"), - (0x1D7B0, "M", "η"), - (0x1D7B1, "M", "θ"), - (0x1D7B2, "M", "ι"), - (0x1D7B3, "M", "κ"), - (0x1D7B4, "M", "λ"), - (0x1D7B5, "M", "μ"), - (0x1D7B6, "M", "ν"), - (0x1D7B7, "M", "ξ"), - (0x1D7B8, "M", "ο"), - (0x1D7B9, "M", "π"), - (0x1D7BA, "M", "ρ"), - (0x1D7BB, "M", "σ"), - (0x1D7BD, "M", "τ"), - (0x1D7BE, "M", "υ"), - (0x1D7BF, "M", "φ"), - (0x1D7C0, "M", "χ"), - (0x1D7C1, "M", "ψ"), - (0x1D7C2, "M", "ω"), - (0x1D7C3, "M", "∂"), - (0x1D7C4, "M", "ε"), - (0x1D7C5, "M", "θ"), - (0x1D7C6, "M", "κ"), - (0x1D7C7, "M", "φ"), - (0x1D7C8, "M", "ρ"), - (0x1D7C9, "M", "π"), - (0x1D7CA, "M", "ϝ"), - (0x1D7CC, "X"), - (0x1D7CE, "M", "0"), - (0x1D7CF, "M", "1"), - (0x1D7D0, "M", "2"), - (0x1D7D1, "M", "3"), - (0x1D7D2, "M", "4"), - (0x1D7D3, "M", "5"), - (0x1D7D4, "M", "6"), - (0x1D7D5, "M", "7"), - (0x1D7D6, "M", "8"), - (0x1D7D7, "M", "9"), - (0x1D7D8, "M", "0"), - (0x1D7D9, "M", "1"), - (0x1D7DA, "M", "2"), - (0x1D7DB, "M", "3"), - (0x1D7DC, "M", "4"), - (0x1D7DD, "M", "5"), - (0x1D7DE, "M", "6"), - (0x1D7DF, "M", "7"), - (0x1D7E0, "M", "8"), - (0x1D7E1, "M", "9"), - (0x1D7E2, "M", "0"), - (0x1D7E3, "M", "1"), - (0x1D7E4, "M", "2"), - (0x1D7E5, "M", "3"), - (0x1D7E6, "M", "4"), - (0x1D7E7, "M", "5"), - (0x1D7E8, "M", "6"), - (0x1D7E9, "M", "7"), - (0x1D7EA, "M", "8"), - (0x1D7EB, "M", "9"), - (0x1D7EC, "M", "0"), - (0x1D7ED, "M", "1"), - ] - - -def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1D7EE, "M", "2"), - (0x1D7EF, "M", "3"), - (0x1D7F0, "M", "4"), - (0x1D7F1, "M", "5"), - (0x1D7F2, "M", "6"), - (0x1D7F3, "M", "7"), - (0x1D7F4, "M", "8"), - (0x1D7F5, "M", "9"), - (0x1D7F6, "M", "0"), - (0x1D7F7, "M", "1"), - (0x1D7F8, "M", "2"), - (0x1D7F9, "M", "3"), - (0x1D7FA, "M", "4"), - (0x1D7FB, "M", "5"), - (0x1D7FC, "M", "6"), - (0x1D7FD, "M", "7"), - (0x1D7FE, "M", "8"), - (0x1D7FF, "M", "9"), - (0x1D800, "V"), - (0x1DA8C, "X"), - (0x1DA9B, "V"), - (0x1DAA0, "X"), - (0x1DAA1, "V"), - (0x1DAB0, "X"), - (0x1DF00, "V"), - (0x1DF1F, "X"), - (0x1DF25, "V"), - (0x1DF2B, "X"), - (0x1E000, "V"), - (0x1E007, "X"), - (0x1E008, "V"), - (0x1E019, "X"), - (0x1E01B, "V"), - (0x1E022, "X"), - (0x1E023, "V"), - (0x1E025, "X"), - (0x1E026, "V"), - (0x1E02B, "X"), - (0x1E030, "M", "а"), - (0x1E031, "M", "б"), - (0x1E032, "M", "в"), - (0x1E033, "M", "г"), - (0x1E034, "M", "д"), - (0x1E035, "M", "е"), - (0x1E036, "M", "ж"), - (0x1E037, "M", "з"), - (0x1E038, "M", "и"), - (0x1E039, "M", "к"), - (0x1E03A, "M", "л"), - (0x1E03B, "M", "м"), - (0x1E03C, "M", "о"), - (0x1E03D, "M", "п"), - (0x1E03E, "M", "р"), - (0x1E03F, "M", "с"), - (0x1E040, "M", "т"), - (0x1E041, "M", "у"), - (0x1E042, "M", "ф"), - (0x1E043, "M", "х"), - (0x1E044, "M", "ц"), - (0x1E045, "M", "ч"), - (0x1E046, "M", "ш"), - (0x1E047, "M", "ы"), - (0x1E048, "M", "э"), - (0x1E049, "M", "ю"), - (0x1E04A, "M", "ꚉ"), - (0x1E04B, "M", "ә"), - (0x1E04C, "M", "і"), - (0x1E04D, "M", "ј"), - (0x1E04E, "M", "ө"), - (0x1E04F, "M", "ү"), - (0x1E050, "M", "ӏ"), - (0x1E051, "M", "а"), - (0x1E052, "M", "б"), - (0x1E053, "M", "в"), - (0x1E054, "M", "г"), - (0x1E055, "M", "д"), - (0x1E056, "M", "е"), - (0x1E057, "M", "ж"), - (0x1E058, "M", "з"), - (0x1E059, "M", "и"), - (0x1E05A, "M", "к"), - (0x1E05B, "M", "л"), - (0x1E05C, "M", "о"), - (0x1E05D, "M", "п"), - (0x1E05E, "M", "с"), - (0x1E05F, "M", "у"), - (0x1E060, "M", "ф"), - (0x1E061, "M", "х"), - (0x1E062, "M", "ц"), - (0x1E063, "M", "ч"), - (0x1E064, "M", "ш"), - (0x1E065, "M", "ъ"), - (0x1E066, "M", "ы"), - (0x1E067, "M", "ґ"), - (0x1E068, "M", "і"), - (0x1E069, "M", "ѕ"), - (0x1E06A, "M", "џ"), - (0x1E06B, "M", "ҫ"), - (0x1E06C, "M", "ꙑ"), - (0x1E06D, "M", "ұ"), - ] - - -def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1E06E, "X"), - (0x1E08F, "V"), - (0x1E090, "X"), - (0x1E100, "V"), - (0x1E12D, "X"), - (0x1E130, "V"), - (0x1E13E, "X"), - (0x1E140, "V"), - (0x1E14A, "X"), - (0x1E14E, "V"), - (0x1E150, "X"), - (0x1E290, "V"), - (0x1E2AF, "X"), - (0x1E2C0, "V"), - (0x1E2FA, "X"), - (0x1E2FF, "V"), - (0x1E300, "X"), - (0x1E4D0, "V"), - (0x1E4FA, "X"), - (0x1E5D0, "V"), - (0x1E5FB, "X"), - (0x1E5FF, "V"), - (0x1E600, "X"), - (0x1E7E0, "V"), - (0x1E7E7, "X"), - (0x1E7E8, "V"), - (0x1E7EC, "X"), - (0x1E7ED, "V"), - (0x1E7EF, "X"), - (0x1E7F0, "V"), - (0x1E7FF, "X"), - (0x1E800, "V"), - (0x1E8C5, "X"), - (0x1E8C7, "V"), - (0x1E8D7, "X"), - (0x1E900, "M", "𞤢"), - (0x1E901, "M", "𞤣"), - (0x1E902, "M", "𞤤"), - (0x1E903, "M", "𞤥"), - (0x1E904, "M", "𞤦"), - (0x1E905, "M", "𞤧"), - (0x1E906, "M", "𞤨"), - (0x1E907, "M", "𞤩"), - (0x1E908, "M", "𞤪"), - (0x1E909, "M", "𞤫"), - (0x1E90A, "M", "𞤬"), - (0x1E90B, "M", "𞤭"), - (0x1E90C, "M", "𞤮"), - (0x1E90D, "M", "𞤯"), - (0x1E90E, "M", "𞤰"), - (0x1E90F, "M", "𞤱"), - (0x1E910, "M", "𞤲"), - (0x1E911, "M", "𞤳"), - (0x1E912, "M", "𞤴"), - (0x1E913, "M", "𞤵"), - (0x1E914, "M", "𞤶"), - (0x1E915, "M", "𞤷"), - (0x1E916, "M", "𞤸"), - (0x1E917, "M", "𞤹"), - (0x1E918, "M", "𞤺"), - (0x1E919, "M", "𞤻"), - (0x1E91A, "M", "𞤼"), - (0x1E91B, "M", "𞤽"), - (0x1E91C, "M", "𞤾"), - (0x1E91D, "M", "𞤿"), - (0x1E91E, "M", "𞥀"), - (0x1E91F, "M", "𞥁"), - (0x1E920, "M", "𞥂"), - (0x1E921, "M", "𞥃"), - (0x1E922, "V"), - (0x1E94C, "X"), - (0x1E950, "V"), - (0x1E95A, "X"), - (0x1E95E, "V"), - (0x1E960, "X"), - (0x1EC71, "V"), - (0x1ECB5, "X"), - (0x1ED01, "V"), - (0x1ED3E, "X"), - (0x1EE00, "M", "ا"), - (0x1EE01, "M", "ب"), - (0x1EE02, "M", "ج"), - (0x1EE03, "M", "د"), - (0x1EE04, "X"), - (0x1EE05, "M", "و"), - (0x1EE06, "M", "ز"), - (0x1EE07, "M", "ح"), - (0x1EE08, "M", "ط"), - (0x1EE09, "M", "ي"), - (0x1EE0A, "M", "ك"), - (0x1EE0B, "M", "ل"), - (0x1EE0C, "M", "م"), - (0x1EE0D, "M", "ن"), - (0x1EE0E, "M", "س"), - (0x1EE0F, "M", "ع"), - (0x1EE10, "M", "ف"), - (0x1EE11, "M", "ص"), - (0x1EE12, "M", "ق"), - (0x1EE13, "M", "ر"), - (0x1EE14, "M", "ش"), - ] - - -def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EE15, "M", "ت"), - (0x1EE16, "M", "ث"), - (0x1EE17, "M", "خ"), - (0x1EE18, "M", "ذ"), - (0x1EE19, "M", "ض"), - (0x1EE1A, "M", "ظ"), - (0x1EE1B, "M", "غ"), - (0x1EE1C, "M", "ٮ"), - (0x1EE1D, "M", "ں"), - (0x1EE1E, "M", "ڡ"), - (0x1EE1F, "M", "ٯ"), - (0x1EE20, "X"), - (0x1EE21, "M", "ب"), - (0x1EE22, "M", "ج"), - (0x1EE23, "X"), - (0x1EE24, "M", "ه"), - (0x1EE25, "X"), - (0x1EE27, "M", "ح"), - (0x1EE28, "X"), - (0x1EE29, "M", "ي"), - (0x1EE2A, "M", "ك"), - (0x1EE2B, "M", "ل"), - (0x1EE2C, "M", "م"), - (0x1EE2D, "M", "ن"), - (0x1EE2E, "M", "س"), - (0x1EE2F, "M", "ع"), - (0x1EE30, "M", "ف"), - (0x1EE31, "M", "ص"), - (0x1EE32, "M", "ق"), - (0x1EE33, "X"), - (0x1EE34, "M", "ش"), - (0x1EE35, "M", "ت"), - (0x1EE36, "M", "ث"), - (0x1EE37, "M", "خ"), - (0x1EE38, "X"), - (0x1EE39, "M", "ض"), - (0x1EE3A, "X"), - (0x1EE3B, "M", "غ"), - (0x1EE3C, "X"), - (0x1EE42, "M", "ج"), - (0x1EE43, "X"), - (0x1EE47, "M", "ح"), - (0x1EE48, "X"), - (0x1EE49, "M", "ي"), - (0x1EE4A, "X"), - (0x1EE4B, "M", "ل"), - (0x1EE4C, "X"), - (0x1EE4D, "M", "ن"), - (0x1EE4E, "M", "س"), - (0x1EE4F, "M", "ع"), - (0x1EE50, "X"), - (0x1EE51, "M", "ص"), - (0x1EE52, "M", "ق"), - (0x1EE53, "X"), - (0x1EE54, "M", "ش"), - (0x1EE55, "X"), - (0x1EE57, "M", "خ"), - (0x1EE58, "X"), - (0x1EE59, "M", "ض"), - (0x1EE5A, "X"), - (0x1EE5B, "M", "غ"), - (0x1EE5C, "X"), - (0x1EE5D, "M", "ں"), - (0x1EE5E, "X"), - (0x1EE5F, "M", "ٯ"), - (0x1EE60, "X"), - (0x1EE61, "M", "ب"), - (0x1EE62, "M", "ج"), - (0x1EE63, "X"), - (0x1EE64, "M", "ه"), - (0x1EE65, "X"), - (0x1EE67, "M", "ح"), - (0x1EE68, "M", "ط"), - (0x1EE69, "M", "ي"), - (0x1EE6A, "M", "ك"), - (0x1EE6B, "X"), - (0x1EE6C, "M", "م"), - (0x1EE6D, "M", "ن"), - (0x1EE6E, "M", "س"), - (0x1EE6F, "M", "ع"), - (0x1EE70, "M", "ف"), - (0x1EE71, "M", "ص"), - (0x1EE72, "M", "ق"), - (0x1EE73, "X"), - (0x1EE74, "M", "ش"), - (0x1EE75, "M", "ت"), - (0x1EE76, "M", "ث"), - (0x1EE77, "M", "خ"), - (0x1EE78, "X"), - (0x1EE79, "M", "ض"), - (0x1EE7A, "M", "ظ"), - (0x1EE7B, "M", "غ"), - (0x1EE7C, "M", "ٮ"), - (0x1EE7D, "X"), - (0x1EE7E, "M", "ڡ"), - (0x1EE7F, "X"), - (0x1EE80, "M", "ا"), - (0x1EE81, "M", "ب"), - (0x1EE82, "M", "ج"), - (0x1EE83, "M", "د"), - ] - - -def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1EE84, "M", "ه"), - (0x1EE85, "M", "و"), - (0x1EE86, "M", "ز"), - (0x1EE87, "M", "ح"), - (0x1EE88, "M", "ط"), - (0x1EE89, "M", "ي"), - (0x1EE8A, "X"), - (0x1EE8B, "M", "ل"), - (0x1EE8C, "M", "م"), - (0x1EE8D, "M", "ن"), - (0x1EE8E, "M", "س"), - (0x1EE8F, "M", "ع"), - (0x1EE90, "M", "ف"), - (0x1EE91, "M", "ص"), - (0x1EE92, "M", "ق"), - (0x1EE93, "M", "ر"), - (0x1EE94, "M", "ش"), - (0x1EE95, "M", "ت"), - (0x1EE96, "M", "ث"), - (0x1EE97, "M", "خ"), - (0x1EE98, "M", "ذ"), - (0x1EE99, "M", "ض"), - (0x1EE9A, "M", "ظ"), - (0x1EE9B, "M", "غ"), - (0x1EE9C, "X"), - (0x1EEA1, "M", "ب"), - (0x1EEA2, "M", "ج"), - (0x1EEA3, "M", "د"), - (0x1EEA4, "X"), - (0x1EEA5, "M", "و"), - (0x1EEA6, "M", "ز"), - (0x1EEA7, "M", "ح"), - (0x1EEA8, "M", "ط"), - (0x1EEA9, "M", "ي"), - (0x1EEAA, "X"), - (0x1EEAB, "M", "ل"), - (0x1EEAC, "M", "م"), - (0x1EEAD, "M", "ن"), - (0x1EEAE, "M", "س"), - (0x1EEAF, "M", "ع"), - (0x1EEB0, "M", "ف"), - (0x1EEB1, "M", "ص"), - (0x1EEB2, "M", "ق"), - (0x1EEB3, "M", "ر"), - (0x1EEB4, "M", "ش"), - (0x1EEB5, "M", "ت"), - (0x1EEB6, "M", "ث"), - (0x1EEB7, "M", "خ"), - (0x1EEB8, "M", "ذ"), - (0x1EEB9, "M", "ض"), - (0x1EEBA, "M", "ظ"), - (0x1EEBB, "M", "غ"), - (0x1EEBC, "X"), - (0x1EEF0, "V"), - (0x1EEF2, "X"), - (0x1F000, "V"), - (0x1F02C, "X"), - (0x1F030, "V"), - (0x1F094, "X"), - (0x1F0A0, "V"), - (0x1F0AF, "X"), - (0x1F0B1, "V"), - (0x1F0C0, "X"), - (0x1F0C1, "V"), - (0x1F0D0, "X"), - (0x1F0D1, "V"), - (0x1F0F6, "X"), - (0x1F101, "M", "0,"), - (0x1F102, "M", "1,"), - (0x1F103, "M", "2,"), - (0x1F104, "M", "3,"), - (0x1F105, "M", "4,"), - (0x1F106, "M", "5,"), - (0x1F107, "M", "6,"), - (0x1F108, "M", "7,"), - (0x1F109, "M", "8,"), - (0x1F10A, "M", "9,"), - (0x1F10B, "V"), - (0x1F110, "M", "(a)"), - (0x1F111, "M", "(b)"), - (0x1F112, "M", "(c)"), - (0x1F113, "M", "(d)"), - (0x1F114, "M", "(e)"), - (0x1F115, "M", "(f)"), - (0x1F116, "M", "(g)"), - (0x1F117, "M", "(h)"), - (0x1F118, "M", "(i)"), - (0x1F119, "M", "(j)"), - (0x1F11A, "M", "(k)"), - (0x1F11B, "M", "(l)"), - (0x1F11C, "M", "(m)"), - (0x1F11D, "M", "(n)"), - (0x1F11E, "M", "(o)"), - (0x1F11F, "M", "(p)"), - (0x1F120, "M", "(q)"), - (0x1F121, "M", "(r)"), - (0x1F122, "M", "(s)"), - (0x1F123, "M", "(t)"), - (0x1F124, "M", "(u)"), - (0x1F125, "M", "(v)"), - ] - - -def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F126, "M", "(w)"), - (0x1F127, "M", "(x)"), - (0x1F128, "M", "(y)"), - (0x1F129, "M", "(z)"), - (0x1F12A, "M", "〔s〕"), - (0x1F12B, "M", "c"), - (0x1F12C, "M", "r"), - (0x1F12D, "M", "cd"), - (0x1F12E, "M", "wz"), - (0x1F12F, "V"), - (0x1F130, "M", "a"), - (0x1F131, "M", "b"), - (0x1F132, "M", "c"), - (0x1F133, "M", "d"), - (0x1F134, "M", "e"), - (0x1F135, "M", "f"), - (0x1F136, "M", "g"), - (0x1F137, "M", "h"), - (0x1F138, "M", "i"), - (0x1F139, "M", "j"), - (0x1F13A, "M", "k"), - (0x1F13B, "M", "l"), - (0x1F13C, "M", "m"), - (0x1F13D, "M", "n"), - (0x1F13E, "M", "o"), - (0x1F13F, "M", "p"), - (0x1F140, "M", "q"), - (0x1F141, "M", "r"), - (0x1F142, "M", "s"), - (0x1F143, "M", "t"), - (0x1F144, "M", "u"), - (0x1F145, "M", "v"), - (0x1F146, "M", "w"), - (0x1F147, "M", "x"), - (0x1F148, "M", "y"), - (0x1F149, "M", "z"), - (0x1F14A, "M", "hv"), - (0x1F14B, "M", "mv"), - (0x1F14C, "M", "sd"), - (0x1F14D, "M", "ss"), - (0x1F14E, "M", "ppv"), - (0x1F14F, "M", "wc"), - (0x1F150, "V"), - (0x1F16A, "M", "mc"), - (0x1F16B, "M", "md"), - (0x1F16C, "M", "mr"), - (0x1F16D, "V"), - (0x1F190, "M", "dj"), - (0x1F191, "V"), - (0x1F1AE, "X"), - (0x1F1E6, "V"), - (0x1F200, "M", "ほか"), - (0x1F201, "M", "ココ"), - (0x1F202, "M", "サ"), - (0x1F203, "X"), - (0x1F210, "M", "手"), - (0x1F211, "M", "字"), - (0x1F212, "M", "双"), - (0x1F213, "M", "デ"), - (0x1F214, "M", "二"), - (0x1F215, "M", "多"), - (0x1F216, "M", "解"), - (0x1F217, "M", "天"), - (0x1F218, "M", "交"), - (0x1F219, "M", "映"), - (0x1F21A, "M", "無"), - (0x1F21B, "M", "料"), - (0x1F21C, "M", "前"), - (0x1F21D, "M", "後"), - (0x1F21E, "M", "再"), - (0x1F21F, "M", "新"), - (0x1F220, "M", "初"), - (0x1F221, "M", "終"), - (0x1F222, "M", "生"), - (0x1F223, "M", "販"), - (0x1F224, "M", "声"), - (0x1F225, "M", "吹"), - (0x1F226, "M", "演"), - (0x1F227, "M", "投"), - (0x1F228, "M", "捕"), - (0x1F229, "M", "一"), - (0x1F22A, "M", "三"), - (0x1F22B, "M", "遊"), - (0x1F22C, "M", "左"), - (0x1F22D, "M", "中"), - (0x1F22E, "M", "右"), - (0x1F22F, "M", "指"), - (0x1F230, "M", "走"), - (0x1F231, "M", "打"), - (0x1F232, "M", "禁"), - (0x1F233, "M", "空"), - (0x1F234, "M", "合"), - (0x1F235, "M", "満"), - (0x1F236, "M", "有"), - (0x1F237, "M", "月"), - (0x1F238, "M", "申"), - (0x1F239, "M", "割"), - (0x1F23A, "M", "営"), - (0x1F23B, "M", "配"), - (0x1F23C, "X"), - ] - - -def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x1F240, "M", "〔本〕"), - (0x1F241, "M", "〔三〕"), - (0x1F242, "M", "〔二〕"), - (0x1F243, "M", "〔安〕"), - (0x1F244, "M", "〔点〕"), - (0x1F245, "M", "〔打〕"), - (0x1F246, "M", "〔盗〕"), - (0x1F247, "M", "〔勝〕"), - (0x1F248, "M", "〔敗〕"), - (0x1F249, "X"), - (0x1F250, "M", "得"), - (0x1F251, "M", "可"), - (0x1F252, "X"), - (0x1F260, "V"), - (0x1F266, "X"), - (0x1F300, "V"), - (0x1F6D8, "X"), - (0x1F6DC, "V"), - (0x1F6ED, "X"), - (0x1F6F0, "V"), - (0x1F6FD, "X"), - (0x1F700, "V"), - (0x1F777, "X"), - (0x1F77B, "V"), - (0x1F7DA, "X"), - (0x1F7E0, "V"), - (0x1F7EC, "X"), - (0x1F7F0, "V"), - (0x1F7F1, "X"), - (0x1F800, "V"), - (0x1F80C, "X"), - (0x1F810, "V"), - (0x1F848, "X"), - (0x1F850, "V"), - (0x1F85A, "X"), - (0x1F860, "V"), - (0x1F888, "X"), - (0x1F890, "V"), - (0x1F8AE, "X"), - (0x1F8B0, "V"), - (0x1F8BC, "X"), - (0x1F8C0, "V"), - (0x1F8C2, "X"), - (0x1F900, "V"), - (0x1FA54, "X"), - (0x1FA60, "V"), - (0x1FA6E, "X"), - (0x1FA70, "V"), - (0x1FA7D, "X"), - (0x1FA80, "V"), - (0x1FA8A, "X"), - (0x1FA8F, "V"), - (0x1FAC7, "X"), - (0x1FACE, "V"), - (0x1FADD, "X"), - (0x1FADF, "V"), - (0x1FAEA, "X"), - (0x1FAF0, "V"), - (0x1FAF9, "X"), - (0x1FB00, "V"), - (0x1FB93, "X"), - (0x1FB94, "V"), - (0x1FBF0, "M", "0"), - (0x1FBF1, "M", "1"), - (0x1FBF2, "M", "2"), - (0x1FBF3, "M", "3"), - (0x1FBF4, "M", "4"), - (0x1FBF5, "M", "5"), - (0x1FBF6, "M", "6"), - (0x1FBF7, "M", "7"), - (0x1FBF8, "M", "8"), - (0x1FBF9, "M", "9"), - (0x1FBFA, "X"), - (0x20000, "V"), - (0x2A6E0, "X"), - (0x2A700, "V"), - (0x2B73A, "X"), - (0x2B740, "V"), - (0x2B81E, "X"), - (0x2B820, "V"), - (0x2CEA2, "X"), - (0x2CEB0, "V"), - (0x2EBE1, "X"), - (0x2EBF0, "V"), - (0x2EE5E, "X"), - (0x2F800, "M", "丽"), - (0x2F801, "M", "丸"), - (0x2F802, "M", "乁"), - (0x2F803, "M", "𠄢"), - (0x2F804, "M", "你"), - (0x2F805, "M", "侮"), - (0x2F806, "M", "侻"), - (0x2F807, "M", "倂"), - (0x2F808, "M", "偺"), - (0x2F809, "M", "備"), - (0x2F80A, "M", "僧"), - (0x2F80B, "M", "像"), - (0x2F80C, "M", "㒞"), - (0x2F80D, "M", "𠘺"), - (0x2F80E, "M", "免"), - ] - - -def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F80F, "M", "兔"), - (0x2F810, "M", "兤"), - (0x2F811, "M", "具"), - (0x2F812, "M", "𠔜"), - (0x2F813, "M", "㒹"), - (0x2F814, "M", "內"), - (0x2F815, "M", "再"), - (0x2F816, "M", "𠕋"), - (0x2F817, "M", "冗"), - (0x2F818, "M", "冤"), - (0x2F819, "M", "仌"), - (0x2F81A, "M", "冬"), - (0x2F81B, "M", "况"), - (0x2F81C, "M", "𩇟"), - (0x2F81D, "M", "凵"), - (0x2F81E, "M", "刃"), - (0x2F81F, "M", "㓟"), - (0x2F820, "M", "刻"), - (0x2F821, "M", "剆"), - (0x2F822, "M", "割"), - (0x2F823, "M", "剷"), - (0x2F824, "M", "㔕"), - (0x2F825, "M", "勇"), - (0x2F826, "M", "勉"), - (0x2F827, "M", "勤"), - (0x2F828, "M", "勺"), - (0x2F829, "M", "包"), - (0x2F82A, "M", "匆"), - (0x2F82B, "M", "北"), - (0x2F82C, "M", "卉"), - (0x2F82D, "M", "卑"), - (0x2F82E, "M", "博"), - (0x2F82F, "M", "即"), - (0x2F830, "M", "卽"), - (0x2F831, "M", "卿"), - (0x2F834, "M", "𠨬"), - (0x2F835, "M", "灰"), - (0x2F836, "M", "及"), - (0x2F837, "M", "叟"), - (0x2F838, "M", "𠭣"), - (0x2F839, "M", "叫"), - (0x2F83A, "M", "叱"), - (0x2F83B, "M", "吆"), - (0x2F83C, "M", "咞"), - (0x2F83D, "M", "吸"), - (0x2F83E, "M", "呈"), - (0x2F83F, "M", "周"), - (0x2F840, "M", "咢"), - (0x2F841, "M", "哶"), - (0x2F842, "M", "唐"), - (0x2F843, "M", "啓"), - (0x2F844, "M", "啣"), - (0x2F845, "M", "善"), - (0x2F847, "M", "喙"), - (0x2F848, "M", "喫"), - (0x2F849, "M", "喳"), - (0x2F84A, "M", "嗂"), - (0x2F84B, "M", "圖"), - (0x2F84C, "M", "嘆"), - (0x2F84D, "M", "圗"), - (0x2F84E, "M", "噑"), - (0x2F84F, "M", "噴"), - (0x2F850, "M", "切"), - (0x2F851, "M", "壮"), - (0x2F852, "M", "城"), - (0x2F853, "M", "埴"), - (0x2F854, "M", "堍"), - (0x2F855, "M", "型"), - (0x2F856, "M", "堲"), - (0x2F857, "M", "報"), - (0x2F858, "M", "墬"), - (0x2F859, "M", "𡓤"), - (0x2F85A, "M", "売"), - (0x2F85B, "M", "壷"), - (0x2F85C, "M", "夆"), - (0x2F85D, "M", "多"), - (0x2F85E, "M", "夢"), - (0x2F85F, "M", "奢"), - (0x2F860, "M", "𡚨"), - (0x2F861, "M", "𡛪"), - (0x2F862, "M", "姬"), - (0x2F863, "M", "娛"), - (0x2F864, "M", "娧"), - (0x2F865, "M", "姘"), - (0x2F866, "M", "婦"), - (0x2F867, "M", "㛮"), - (0x2F868, "M", "㛼"), - (0x2F869, "M", "嬈"), - (0x2F86A, "M", "嬾"), - (0x2F86C, "M", "𡧈"), - (0x2F86D, "M", "寃"), - (0x2F86E, "M", "寘"), - (0x2F86F, "M", "寧"), - (0x2F870, "M", "寳"), - (0x2F871, "M", "𡬘"), - (0x2F872, "M", "寿"), - (0x2F873, "M", "将"), - (0x2F874, "M", "当"), - (0x2F875, "M", "尢"), - (0x2F876, "M", "㞁"), - ] - - -def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F877, "M", "屠"), - (0x2F878, "M", "屮"), - (0x2F879, "M", "峀"), - (0x2F87A, "M", "岍"), - (0x2F87B, "M", "𡷤"), - (0x2F87C, "M", "嵃"), - (0x2F87D, "M", "𡷦"), - (0x2F87E, "M", "嵮"), - (0x2F87F, "M", "嵫"), - (0x2F880, "M", "嵼"), - (0x2F881, "M", "巡"), - (0x2F882, "M", "巢"), - (0x2F883, "M", "㠯"), - (0x2F884, "M", "巽"), - (0x2F885, "M", "帨"), - (0x2F886, "M", "帽"), - (0x2F887, "M", "幩"), - (0x2F888, "M", "㡢"), - (0x2F889, "M", "𢆃"), - (0x2F88A, "M", "㡼"), - (0x2F88B, "M", "庰"), - (0x2F88C, "M", "庳"), - (0x2F88D, "M", "庶"), - (0x2F88E, "M", "廊"), - (0x2F88F, "M", "𪎒"), - (0x2F890, "M", "廾"), - (0x2F891, "M", "𢌱"), - (0x2F893, "M", "舁"), - (0x2F894, "M", "弢"), - (0x2F896, "M", "㣇"), - (0x2F897, "M", "𣊸"), - (0x2F898, "M", "𦇚"), - (0x2F899, "M", "形"), - (0x2F89A, "M", "彫"), - (0x2F89B, "M", "㣣"), - (0x2F89C, "M", "徚"), - (0x2F89D, "M", "忍"), - (0x2F89E, "M", "志"), - (0x2F89F, "M", "忹"), - (0x2F8A0, "M", "悁"), - (0x2F8A1, "M", "㤺"), - (0x2F8A2, "M", "㤜"), - (0x2F8A3, "M", "悔"), - (0x2F8A4, "M", "𢛔"), - (0x2F8A5, "M", "惇"), - (0x2F8A6, "M", "慈"), - (0x2F8A7, "M", "慌"), - (0x2F8A8, "M", "慎"), - (0x2F8A9, "M", "慌"), - (0x2F8AA, "M", "慺"), - (0x2F8AB, "M", "憎"), - (0x2F8AC, "M", "憲"), - (0x2F8AD, "M", "憤"), - (0x2F8AE, "M", "憯"), - (0x2F8AF, "M", "懞"), - (0x2F8B0, "M", "懲"), - (0x2F8B1, "M", "懶"), - (0x2F8B2, "M", "成"), - (0x2F8B3, "M", "戛"), - (0x2F8B4, "M", "扝"), - (0x2F8B5, "M", "抱"), - (0x2F8B6, "M", "拔"), - (0x2F8B7, "M", "捐"), - (0x2F8B8, "M", "𢬌"), - (0x2F8B9, "M", "挽"), - (0x2F8BA, "M", "拼"), - (0x2F8BB, "M", "捨"), - (0x2F8BC, "M", "掃"), - (0x2F8BD, "M", "揤"), - (0x2F8BE, "M", "𢯱"), - (0x2F8BF, "M", "搢"), - (0x2F8C0, "M", "揅"), - (0x2F8C1, "M", "掩"), - (0x2F8C2, "M", "㨮"), - (0x2F8C3, "M", "摩"), - (0x2F8C4, "M", "摾"), - (0x2F8C5, "M", "撝"), - (0x2F8C6, "M", "摷"), - (0x2F8C7, "M", "㩬"), - (0x2F8C8, "M", "敏"), - (0x2F8C9, "M", "敬"), - (0x2F8CA, "M", "𣀊"), - (0x2F8CB, "M", "旣"), - (0x2F8CC, "M", "書"), - (0x2F8CD, "M", "晉"), - (0x2F8CE, "M", "㬙"), - (0x2F8CF, "M", "暑"), - (0x2F8D0, "M", "㬈"), - (0x2F8D1, "M", "㫤"), - (0x2F8D2, "M", "冒"), - (0x2F8D3, "M", "冕"), - (0x2F8D4, "M", "最"), - (0x2F8D5, "M", "暜"), - (0x2F8D6, "M", "肭"), - (0x2F8D7, "M", "䏙"), - (0x2F8D8, "M", "朗"), - (0x2F8D9, "M", "望"), - (0x2F8DA, "M", "朡"), - (0x2F8DB, "M", "杞"), - (0x2F8DC, "M", "杓"), - ] - - -def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F8DD, "M", "𣏃"), - (0x2F8DE, "M", "㭉"), - (0x2F8DF, "M", "柺"), - (0x2F8E0, "M", "枅"), - (0x2F8E1, "M", "桒"), - (0x2F8E2, "M", "梅"), - (0x2F8E3, "M", "𣑭"), - (0x2F8E4, "M", "梎"), - (0x2F8E5, "M", "栟"), - (0x2F8E6, "M", "椔"), - (0x2F8E7, "M", "㮝"), - (0x2F8E8, "M", "楂"), - (0x2F8E9, "M", "榣"), - (0x2F8EA, "M", "槪"), - (0x2F8EB, "M", "檨"), - (0x2F8EC, "M", "𣚣"), - (0x2F8ED, "M", "櫛"), - (0x2F8EE, "M", "㰘"), - (0x2F8EF, "M", "次"), - (0x2F8F0, "M", "𣢧"), - (0x2F8F1, "M", "歔"), - (0x2F8F2, "M", "㱎"), - (0x2F8F3, "M", "歲"), - (0x2F8F4, "M", "殟"), - (0x2F8F5, "M", "殺"), - (0x2F8F6, "M", "殻"), - (0x2F8F7, "M", "𣪍"), - (0x2F8F8, "M", "𡴋"), - (0x2F8F9, "M", "𣫺"), - (0x2F8FA, "M", "汎"), - (0x2F8FB, "M", "𣲼"), - (0x2F8FC, "M", "沿"), - (0x2F8FD, "M", "泍"), - (0x2F8FE, "M", "汧"), - (0x2F8FF, "M", "洖"), - (0x2F900, "M", "派"), - (0x2F901, "M", "海"), - (0x2F902, "M", "流"), - (0x2F903, "M", "浩"), - (0x2F904, "M", "浸"), - (0x2F905, "M", "涅"), - (0x2F906, "M", "𣴞"), - (0x2F907, "M", "洴"), - (0x2F908, "M", "港"), - (0x2F909, "M", "湮"), - (0x2F90A, "M", "㴳"), - (0x2F90B, "M", "滋"), - (0x2F90C, "M", "滇"), - (0x2F90D, "M", "𣻑"), - (0x2F90E, "M", "淹"), - (0x2F90F, "M", "潮"), - (0x2F910, "M", "𣽞"), - (0x2F911, "M", "𣾎"), - (0x2F912, "M", "濆"), - (0x2F913, "M", "瀹"), - (0x2F914, "M", "瀞"), - (0x2F915, "M", "瀛"), - (0x2F916, "M", "㶖"), - (0x2F917, "M", "灊"), - (0x2F918, "M", "災"), - (0x2F919, "M", "灷"), - (0x2F91A, "M", "炭"), - (0x2F91B, "M", "𠔥"), - (0x2F91C, "M", "煅"), - (0x2F91D, "M", "𤉣"), - (0x2F91E, "M", "熜"), - (0x2F91F, "M", "𤎫"), - (0x2F920, "M", "爨"), - (0x2F921, "M", "爵"), - (0x2F922, "M", "牐"), - (0x2F923, "M", "𤘈"), - (0x2F924, "M", "犀"), - (0x2F925, "M", "犕"), - (0x2F926, "M", "𤜵"), - (0x2F927, "M", "𤠔"), - (0x2F928, "M", "獺"), - (0x2F929, "M", "王"), - (0x2F92A, "M", "㺬"), - (0x2F92B, "M", "玥"), - (0x2F92C, "M", "㺸"), - (0x2F92E, "M", "瑇"), - (0x2F92F, "M", "瑜"), - (0x2F930, "M", "瑱"), - (0x2F931, "M", "璅"), - (0x2F932, "M", "瓊"), - (0x2F933, "M", "㼛"), - (0x2F934, "M", "甤"), - (0x2F935, "M", "𤰶"), - (0x2F936, "M", "甾"), - (0x2F937, "M", "𤲒"), - (0x2F938, "M", "異"), - (0x2F939, "M", "𢆟"), - (0x2F93A, "M", "瘐"), - (0x2F93B, "M", "𤾡"), - (0x2F93C, "M", "𤾸"), - (0x2F93D, "M", "𥁄"), - (0x2F93E, "M", "㿼"), - (0x2F93F, "M", "䀈"), - (0x2F940, "M", "直"), - (0x2F941, "M", "𥃳"), - ] - - -def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F942, "M", "𥃲"), - (0x2F943, "M", "𥄙"), - (0x2F944, "M", "𥄳"), - (0x2F945, "M", "眞"), - (0x2F946, "M", "真"), - (0x2F948, "M", "睊"), - (0x2F949, "M", "䀹"), - (0x2F94A, "M", "瞋"), - (0x2F94B, "M", "䁆"), - (0x2F94C, "M", "䂖"), - (0x2F94D, "M", "𥐝"), - (0x2F94E, "M", "硎"), - (0x2F94F, "M", "碌"), - (0x2F950, "M", "磌"), - (0x2F951, "M", "䃣"), - (0x2F952, "M", "𥘦"), - (0x2F953, "M", "祖"), - (0x2F954, "M", "𥚚"), - (0x2F955, "M", "𥛅"), - (0x2F956, "M", "福"), - (0x2F957, "M", "秫"), - (0x2F958, "M", "䄯"), - (0x2F959, "M", "穀"), - (0x2F95A, "M", "穊"), - (0x2F95B, "M", "穏"), - (0x2F95C, "M", "𥥼"), - (0x2F95D, "M", "𥪧"), - (0x2F95F, "M", "竮"), - (0x2F960, "M", "䈂"), - (0x2F961, "M", "𥮫"), - (0x2F962, "M", "篆"), - (0x2F963, "M", "築"), - (0x2F964, "M", "䈧"), - (0x2F965, "M", "𥲀"), - (0x2F966, "M", "糒"), - (0x2F967, "M", "䊠"), - (0x2F968, "M", "糨"), - (0x2F969, "M", "糣"), - (0x2F96A, "M", "紀"), - (0x2F96B, "M", "𥾆"), - (0x2F96C, "M", "絣"), - (0x2F96D, "M", "䌁"), - (0x2F96E, "M", "緇"), - (0x2F96F, "M", "縂"), - (0x2F970, "M", "繅"), - (0x2F971, "M", "䌴"), - (0x2F972, "M", "𦈨"), - (0x2F973, "M", "𦉇"), - (0x2F974, "M", "䍙"), - (0x2F975, "M", "𦋙"), - (0x2F976, "M", "罺"), - (0x2F977, "M", "𦌾"), - (0x2F978, "M", "羕"), - (0x2F979, "M", "翺"), - (0x2F97A, "M", "者"), - (0x2F97B, "M", "𦓚"), - (0x2F97C, "M", "𦔣"), - (0x2F97D, "M", "聠"), - (0x2F97E, "M", "𦖨"), - (0x2F97F, "M", "聰"), - (0x2F980, "M", "𣍟"), - (0x2F981, "M", "䏕"), - (0x2F982, "M", "育"), - (0x2F983, "M", "脃"), - (0x2F984, "M", "䐋"), - (0x2F985, "M", "脾"), - (0x2F986, "M", "媵"), - (0x2F987, "M", "𦞧"), - (0x2F988, "M", "𦞵"), - (0x2F989, "M", "𣎓"), - (0x2F98A, "M", "𣎜"), - (0x2F98B, "M", "舁"), - (0x2F98C, "M", "舄"), - (0x2F98D, "M", "辞"), - (0x2F98E, "M", "䑫"), - (0x2F98F, "M", "芑"), - (0x2F990, "M", "芋"), - (0x2F991, "M", "芝"), - (0x2F992, "M", "劳"), - (0x2F993, "M", "花"), - (0x2F994, "M", "芳"), - (0x2F995, "M", "芽"), - (0x2F996, "M", "苦"), - (0x2F997, "M", "𦬼"), - (0x2F998, "M", "若"), - (0x2F999, "M", "茝"), - (0x2F99A, "M", "荣"), - (0x2F99B, "M", "莭"), - (0x2F99C, "M", "茣"), - (0x2F99D, "M", "莽"), - (0x2F99E, "M", "菧"), - (0x2F99F, "M", "著"), - (0x2F9A0, "M", "荓"), - (0x2F9A1, "M", "菊"), - (0x2F9A2, "M", "菌"), - (0x2F9A3, "M", "菜"), - (0x2F9A4, "M", "𦰶"), - (0x2F9A5, "M", "𦵫"), - (0x2F9A6, "M", "𦳕"), - (0x2F9A7, "M", "䔫"), - ] - - -def _seg_82() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2F9A8, "M", "蓱"), - (0x2F9A9, "M", "蓳"), - (0x2F9AA, "M", "蔖"), - (0x2F9AB, "M", "𧏊"), - (0x2F9AC, "M", "蕤"), - (0x2F9AD, "M", "𦼬"), - (0x2F9AE, "M", "䕝"), - (0x2F9AF, "M", "䕡"), - (0x2F9B0, "M", "𦾱"), - (0x2F9B1, "M", "𧃒"), - (0x2F9B2, "M", "䕫"), - (0x2F9B3, "M", "虐"), - (0x2F9B4, "M", "虜"), - (0x2F9B5, "M", "虧"), - (0x2F9B6, "M", "虩"), - (0x2F9B7, "M", "蚩"), - (0x2F9B8, "M", "蚈"), - (0x2F9B9, "M", "蜎"), - (0x2F9BA, "M", "蛢"), - (0x2F9BB, "M", "蝹"), - (0x2F9BC, "M", "蜨"), - (0x2F9BD, "M", "蝫"), - (0x2F9BE, "M", "螆"), - (0x2F9BF, "M", "䗗"), - (0x2F9C0, "M", "蟡"), - (0x2F9C1, "M", "蠁"), - (0x2F9C2, "M", "䗹"), - (0x2F9C3, "M", "衠"), - (0x2F9C4, "M", "衣"), - (0x2F9C5, "M", "𧙧"), - (0x2F9C6, "M", "裗"), - (0x2F9C7, "M", "裞"), - (0x2F9C8, "M", "䘵"), - (0x2F9C9, "M", "裺"), - (0x2F9CA, "M", "㒻"), - (0x2F9CB, "M", "𧢮"), - (0x2F9CC, "M", "𧥦"), - (0x2F9CD, "M", "䚾"), - (0x2F9CE, "M", "䛇"), - (0x2F9CF, "M", "誠"), - (0x2F9D0, "M", "諭"), - (0x2F9D1, "M", "變"), - (0x2F9D2, "M", "豕"), - (0x2F9D3, "M", "𧲨"), - (0x2F9D4, "M", "貫"), - (0x2F9D5, "M", "賁"), - (0x2F9D6, "M", "贛"), - (0x2F9D7, "M", "起"), - (0x2F9D8, "M", "𧼯"), - (0x2F9D9, "M", "𠠄"), - (0x2F9DA, "M", "跋"), - (0x2F9DB, "M", "趼"), - (0x2F9DC, "M", "跰"), - (0x2F9DD, "M", "𠣞"), - (0x2F9DE, "M", "軔"), - (0x2F9DF, "M", "輸"), - (0x2F9E0, "M", "𨗒"), - (0x2F9E1, "M", "𨗭"), - (0x2F9E2, "M", "邔"), - (0x2F9E3, "M", "郱"), - (0x2F9E4, "M", "鄑"), - (0x2F9E5, "M", "𨜮"), - (0x2F9E6, "M", "鄛"), - (0x2F9E7, "M", "鈸"), - (0x2F9E8, "M", "鋗"), - (0x2F9E9, "M", "鋘"), - (0x2F9EA, "M", "鉼"), - (0x2F9EB, "M", "鏹"), - (0x2F9EC, "M", "鐕"), - (0x2F9ED, "M", "𨯺"), - (0x2F9EE, "M", "開"), - (0x2F9EF, "M", "䦕"), - (0x2F9F0, "M", "閷"), - (0x2F9F1, "M", "𨵷"), - (0x2F9F2, "M", "䧦"), - (0x2F9F3, "M", "雃"), - (0x2F9F4, "M", "嶲"), - (0x2F9F5, "M", "霣"), - (0x2F9F6, "M", "𩅅"), - (0x2F9F7, "M", "𩈚"), - (0x2F9F8, "M", "䩮"), - (0x2F9F9, "M", "䩶"), - (0x2F9FA, "M", "韠"), - (0x2F9FB, "M", "𩐊"), - (0x2F9FC, "M", "䪲"), - (0x2F9FD, "M", "𩒖"), - (0x2F9FE, "M", "頋"), - (0x2FA00, "M", "頩"), - (0x2FA01, "M", "𩖶"), - (0x2FA02, "M", "飢"), - (0x2FA03, "M", "䬳"), - (0x2FA04, "M", "餩"), - (0x2FA05, "M", "馧"), - (0x2FA06, "M", "駂"), - (0x2FA07, "M", "駾"), - (0x2FA08, "M", "䯎"), - (0x2FA09, "M", "𩬰"), - (0x2FA0A, "M", "鬒"), - (0x2FA0B, "M", "鱀"), - (0x2FA0C, "M", "鳽"), - ] - - -def _seg_83() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: - return [ - (0x2FA0D, "M", "䳎"), - (0x2FA0E, "M", "䳭"), - (0x2FA0F, "M", "鵧"), - (0x2FA10, "M", "𪃎"), - (0x2FA11, "M", "䳸"), - (0x2FA12, "M", "𪄅"), - (0x2FA13, "M", "𪈎"), - (0x2FA14, "M", "𪊑"), - (0x2FA15, "M", "麻"), - (0x2FA16, "M", "䵖"), - (0x2FA17, "M", "黹"), - (0x2FA18, "M", "黾"), - (0x2FA19, "M", "鼅"), - (0x2FA1A, "M", "鼏"), - (0x2FA1B, "M", "鼖"), - (0x2FA1C, "M", "鼻"), - (0x2FA1D, "M", "𪘀"), - (0x2FA1E, "X"), - (0x30000, "V"), - (0x3134B, "X"), - (0x31350, "V"), - (0x323B0, "X"), - (0xE0100, "I"), - (0xE01F0, "X"), - ] - - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() - + _seg_79() - + _seg_80() - + _seg_81() - + _seg_82() - + _seg_83() -) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER b/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt b/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt deleted file mode 100644 index 7b190ca..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2011 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/METADATA b/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/METADATA deleted file mode 100644 index ddf5464..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.1 -Name: itsdangerous -Version: 2.2.0 -Summary: Safely pass data to untrusted environments and back. -Maintainer-email: Pallets -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/itsdangerous/ - -# ItsDangerous - -... so better sign this - -Various helpers to pass data to untrusted environments and to get it -back safe and sound. Data is cryptographically signed to ensure that a -token has not been tampered with. - -It's possible to customize how data is serialized. Data is compressed as -needed. A timestamp can be added and verified automatically while -loading a token. - - -## A Simple Example - -Here's how you could generate a token for transmitting a user's id and -name between web requests. - -```python -from itsdangerous import URLSafeSerializer -auth_s = URLSafeSerializer("secret key", "auth") -token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) - -print(token) -# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg - -data = auth_s.loads(token) -print(data["name"]) -# itsdangerous -``` - - -## Donate - -The Pallets organization develops and supports ItsDangerous and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -[please donate today][]. - -[please donate today]: https://palletsprojects.com/donate - diff --git a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/RECORD b/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/RECORD deleted file mode 100644 index 333875c..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 -itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 -itsdangerous-2.2.0.dist-info/RECORD,, -itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 -itsdangerous/__pycache__/__init__.cpython-311.pyc,, -itsdangerous/__pycache__/_json.cpython-311.pyc,, -itsdangerous/__pycache__/encoding.cpython-311.pyc,, -itsdangerous/__pycache__/exc.cpython-311.pyc,, -itsdangerous/__pycache__/serializer.cpython-311.pyc,, -itsdangerous/__pycache__/signer.cpython-311.pyc,, -itsdangerous/__pycache__/timed.cpython-311.pyc,, -itsdangerous/__pycache__/url_safe.cpython-311.pyc,, -itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 -itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 -itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 -itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 -itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 -itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 -itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/WHEEL b/port/lib/python3.11/site-packages/itsdangerous-2.2.0.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous-2.2.0.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/port/lib/python3.11/site-packages/itsdangerous/__init__.py b/port/lib/python3.11/site-packages/itsdangerous/__init__.py deleted file mode 100644 index ea55256..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .encoding import base64_decode as base64_decode -from .encoding import base64_encode as base64_encode -from .encoding import want_bytes as want_bytes -from .exc import BadData as BadData -from .exc import BadHeader as BadHeader -from .exc import BadPayload as BadPayload -from .exc import BadSignature as BadSignature -from .exc import BadTimeSignature as BadTimeSignature -from .exc import SignatureExpired as SignatureExpired -from .serializer import Serializer as Serializer -from .signer import HMACAlgorithm as HMACAlgorithm -from .signer import NoneAlgorithm as NoneAlgorithm -from .signer import Signer as Signer -from .timed import TimedSerializer as TimedSerializer -from .timed import TimestampSigner as TimestampSigner -from .url_safe import URLSafeSerializer as URLSafeSerializer -from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer - - -def __getattr__(name: str) -> t.Any: - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " ItsDangerous 2.3. Use feature detection or" - " 'importlib.metadata.version(\"itsdangerous\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("itsdangerous") - - raise AttributeError(name) diff --git a/port/lib/python3.11/site-packages/itsdangerous/__pycache__/__init__.cpython-311.pyc b/port/lib/python3.11/site-packages/itsdangerous/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 33ddf937662678d98d58966bf24c77a2a27fd771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 zcmZ`(&1)M+6ra_{YPHfzvh4UP#@V<9MTbaD;uZ|1#jVq((3lV>6!x;LHDh_3{SdPw zD@tuBrH9Z<4?U#E^pbw0f6OKry6njidhn&FxVab#eKVFEZ|#nr-u~Wi-oANn=FR@3 zX)1#8KvCj)8ReCx9miBP=<{l?+MZIOU{_G*07;lX0^~7PvId0+tO~ zU>R`E$O)Wt6gO|=1y%s7hAMC#aKR`DtO70?MS%-|HA54)2)JaF1lF9gTQMpEmz*)T zYE%U-10FZV1+D;|FeU^Zb1t}(#-zYiz*EMQz~j!eJ7dfUJOOytm<2qGXTHf87jbGG z)h{0K;_FgeusqLa7PEaXSUZr8No~Ul$a{+>CM_Qm@EQ@s8xm^I@|d~NXC#2>+=muk zwU`Ak5AYVTFri?mVBE3#j&EVGieRnVZO>v|%7a$GzGu56!JQa4A9id?_xE*6o##R-Cp^ZMNmYw6^AZo;XqnD4LIL+iY49@(PeFhPq!~b|lXh-@YGqRrY70(PTKZC5EpJcX2+xL}&wga*(Lrb&5bkAA$jMfBP!x~5xD8Ooypm{p|rfJ%q%}le=>GK0> z!_Ghoa6ngJjcL9Z1@#q*a)rmcFLQHYZZ1+Tha-uUsmEph+gB>zY2RvtR7(3qdMzXE zQZzL^D4_i0Ur5fYe{(eus)Q;td*#c&m+LRf^`9Fr%1e9YrBGS=L!JI%;)OcDr_P6& z`9oM0)ia`gIt7^WWatcM=VH|~H@p0@L!x{$Vwv?ju-&o5VnuvPz@WTyDQ|U}<34Hf zutgPa=DFgZZ(880$Q5s2IOdZN0xfYu4#bV8W$sepYK+ra#;-rEa$=klN|!oj09Tz( zaP9(Ed-{O$w+=s{YNqzEm9N!dr$a3uR^F-%I7G+{PE zjW8(@dMivyglb_@B2*8P5}~VMQX=$jn3VIFcS4kq2we}8avt+`h!S#Mr^W^dME~KeLsBbwMbI2XB#j3JAX0ZDK!kcJ?>#Yv26d?3?$aqd5d)weq|11tauL zDubbA0zRyOu!$(5xQSZ0hOv~DrczVWRjcU=dVr|9fvC2vAhZK-Hfjb{o*-NQAypeE zc@hMnAi@s=UacPmrHh&=`0y?Wo5({oOi@jtxTbmh;*AFq5V8Ktu<@D3$Daqo@le6uZz;1pj(Gi8xC0ny!h}M2%AV8^DPbKHM9-# z&QJ%kxN0kj?n+LHE_dWMW(MToGRo>dbY2qXbUGd9amd6%*z`ju0?BFm^G?(ii(ybM z&CNL+xL*hE%cS9P#}}NEpy5Hm+)0y{qAn{y#+8ZVXH!adlzqS_0M^m>;^gbqt(&{W z>Am7~Y)&776(wpozmyou9l{zsQQ<^Rl&(WaUY7m}giW-D-@*_5n)7xjN3{d&-C#vTa{Kp zy#>;43I^O!qSJOOf(TXwjhzSJau3U5qtb8z;MCEjAB@Ss`vB|cz#RK*PJJ?`wn`ta z?3%NC=4@=v?hmaqA9A~9dCx4zX8CJ+%;mUf!+d)+TVvB^GGEo!(hguFpfFRyIRM+p zxJfxBm|8Rcxb%-Crt1cz<+*N>bKR`NK`yxNi#BNqnwc%E4ekb8=%U+bX(4E+N` z>dH2iTR|PbexVIF4Ju*suP2(kAK8yGL^tw-MuJ63j9mo(U&ej2lGS~iO@l+;Ax;2# kD#mypU5Zc612h>A=02K;2eW77F;G4WKc(&0KO8BAKgn@CyZ`_I diff --git a/port/lib/python3.11/site-packages/itsdangerous/__pycache__/encoding.cpython-311.pyc b/port/lib/python3.11/site-packages/itsdangerous/__pycache__/encoding.cpython-311.pyc deleted file mode 100644 index e4cc160dbe910d0d798084190277affbbb0bb1be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2943 zcma)8-)kF39-q;!){53^%U1mB5;a>pjZqU>7svIvtrM`XF)3V~wn=-fdO5Mytey33 zR_g31jupFAOCL&K>Vt%smQp{ZIog9h=JE0$Xv0Fxf+5hSycx_v2^9LBS4iiyW?7-kih5=B1gzk()C5WaEN3`>I=D$gt`Z6)s&Vyo5y{Npr<|S zk>2m5t*&OjwI=DiAkmNTg{9CPL#Di(YWB(Dw)q~jXSugITSx=9vV6GNCw(y6*X-Sm z!Orl7rO;1aAcG+3069kf0QDe=T|!y?37^j5Ks6kv%nW9g9e4f-7YGJBW)1R&!HlQz zDqGA=1&Yh4Rbl~lpQ_N**Yt%|X1YPbbV_AnIZJ^A!+~N_TBdHGP?J@u6T}5qNeU$q zlv@P)c<*n}xP#aM0tl@kb|5uEQ7vfy8ro`^eYWEoUW-L}*I_5n5YK0&AZfXl<1)i3 znN)>EAR?F8%t|x?UCLdDa{IYlNL|;TzLmdj(EQ5EO8)IKWs7CoD(5TE%G=gLzOu@$ zmYp+Wr%&fyiw z7SILCf;cSbsZyISDK1P-ga?Di@q;T_OnDf%e3?#pyaZafs2DQRBQVC}#{DA@ut5TK z4Q?u)cFfm~)#rB99$y{Vn)B3?zIyVJI{r`{|9Qewr+js)Ax}}hGJ-xNoDh8<8tv#4 zOkzJtcLB{G4-n^P!*>zEy+CxnO+wdflDJVrX!@h5l%ub>;!hiC<76Sa%`HYO&I9I!FiCnrqy ze;8Z0TwzHO0ijWYxZ##8D^RQ@r%cUk>{%4j0g(0y&k?mFZ#vfv+ah{szg%cPq7z6< z^VyEjBP82&=pe91d?FMyICOcnVxH$2DM-F=*wwI2Ih1fF_mcpdE{_7e%~!$==u0ql z6h8M;AP2s3Z{Yr5L!0%qSznv2&uz=eFUf6pbMl`zZ{6Imx8CvkPk3FUo;+Hg+m)sG z^iFr5-#vOy@w)SVcfOIx|GLxJce~b5hk3+LKO;L`eU1JzUe|=*HF5vNM&k8fq3lY) z1GUSM`FDB-qX)QWW>k96o0=Jx9t_8!U6XRfvor$?wb;3LYRA~vpAFkK7HspQj|A>l zPU);#fv)ASD^~)^sa^{tXh&R`yA^zRZw?ymt{iogt=0qt++lfMf|wT(40s1x5e_V} za+nJP#cl@d30U14u$`@Z^c2jV<{U2osiPfra5L?x8DGsjQjb4Wk8l0eQ**wWYsfhf zok54tn9+!C5Kf_Pm!Z+F+yByrwB0LF42U!YdxZs3p*;UYTqs!>q1>m0%0d>dH0Tt> z>2lR&kfL%h9nrXzjgG_YE1Y8lNT~6^_nB`pTOZ#W^@hg%p>a<=B4V+^{QGjRg~SycF&%ylQfyxPOq$FJ$^MUn7?c7x=1<7~zG4Ur2x^E{Laz>1$s@G#y+!;R?s7-@C!Y(J;b+d%v8V>H-^ zzPkxD{RZBZ6s+x{=aAkwesvc`Nh*mUKSaqNj7$EnPQa!cDJUTVZojnuX6RK`yY^SXZn-%=U_Q}=WJYx7>}qMy20*LD?* S#~>L+NCM+O@v-L;f#L6ShMH~w diff --git a/port/lib/python3.11/site-packages/itsdangerous/__pycache__/exc.cpython-311.pyc b/port/lib/python3.11/site-packages/itsdangerous/__pycache__/exc.cpython-311.pyc deleted file mode 100644 index b42f716ac6b0aa10b6ce96a35704b19daaf301d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4814 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 AKmY&$ diff --git a/port/lib/python3.11/site-packages/itsdangerous/__pycache__/signer.cpython-311.pyc b/port/lib/python3.11/site-packages/itsdangerous/__pycache__/signer.cpython-311.pyc deleted file mode 100644 index f2dfddf25f901067d6a52b34fea4ba6cbf84a768..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12473 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 K>nGGQn)@H2B*}{a diff --git a/port/lib/python3.11/site-packages/itsdangerous/__pycache__/timed.cpython-311.pyc b/port/lib/python3.11/site-packages/itsdangerous/__pycache__/timed.cpython-311.pyc deleted file mode 100644 index 3e6dcac6146f2e789ed49849a6fd1000354df28d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9740 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 diff --git a/port/lib/python3.11/site-packages/itsdangerous/__pycache__/url_safe.cpython-311.pyc b/port/lib/python3.11/site-packages/itsdangerous/__pycache__/url_safe.cpython-311.pyc deleted file mode 100644 index c2e273ffda56935a3c4d1efc466919dd4627abf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4125 zcmbVPU1%KF6~41Gv;RNR>Sv|evL}^{wIHwR*l~-ZHt|pGB-DzD6HK>+(P-yN8f$iE zduKLlZC9-+F5S?iq~KBoTo9qS4(@{=O6g-<=tH3oDarQg2eU!W`+*N-L!1wo;d~?;;e61H=406y=R?59 zvvJOc%|yO0+b0koxj^*D4WdVBoc52lcSUZCgxrOn*Rn}27X!ICP41DDKoWi}$pJ2z z0Lea(?CY`FD>7Y8Qt$?&>RBsa)N;-nm*1QNq1b|E z(^Dr^o#rf^?i!$l) z4osS+qB#!D7ahg1l!|FAgcWExa22DrtvJh6u^na^zP4<7gil=yOPG1?5DDmIbB#~3GnpODCd=`GG`U2 z>t89OgzIP2DX~J%=UpDb7?R-!D#Fep^nNWsf(dJKRoG~W^uBc8ZIHT)dc3h{Re(ez zKl61HV@=SdH916_PI3@Z6?*m7{Dp~e;&hUNkO{(4YXPT~>}Xtz;A zc0XLylk21zC&LG7;fImr=aI1ok+F4sGcvvv8E+C_=ul&LY+YMlSYNogQoGO?9jm?3 zl>DKg?Ez&YwKo=Y;-$y;O0*@oXynKR%+@a=_BdM_P{}~9UJYE?O~-c zc%?Bu0Sly(us|va3#5{;z{n^p&_CK*AchPq&^Pg6>HYEt<*mf{#<_Z8=FUkV-gEC% ziw(}$$G|nW6Q{_Z!lzT>eUdz#6z?ZxV=7( zxjmY?uL8Bo3f}^gs?wTI7h%;%dshHgU(|&dc zUT#z`<%{jqVFz(2*v?&7G--h$u%rV_ffqZ1gz4`9O z$<3k3t)aUQ*VeE6s!+S|Ffm+<@4(6=9rj?PA9xQ&29U!q9vei$QH75U zV;8x!``7e|aIpjt+uiyOt2U#bPVAVj56b&2Uhkna^~qxp`%waA3SPfbg?Oj!=9UM07zF{p%L+!NwvG_$y@El@|%Y^4krgYWtIqw3N5 z`6*C`o$b73a zi9_ijOxeW})UuGWOoSoV@2nOfJY2!?U{hAHtl)X;26?Ftv%HYu5bBChK=C@pLk}!C z82%6H$`1a!!w}D15ejmi5&W9@cJ}P^X>itqj_$LB{L7&$C7j)Jf0NAd~gpXa5HFk2L+K1OSTtWIcOFyrn+EnaAB} wCP)Hc)P7PQ$=nP7`NSU+k8tvFS0cV&mh0EYPTW&JyS(+%>w7gix;!5K4N^QD@Bjb+ diff --git a/port/lib/python3.11/site-packages/itsdangerous/_json.py b/port/lib/python3.11/site-packages/itsdangerous/_json.py deleted file mode 100644 index fc23fea..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/_json.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -import json as _json -import typing as t - - -class _CompactJSON: - """Wrapper around json module that strips whitespace.""" - - @staticmethod - def loads(payload: str | bytes) -> t.Any: - return _json.loads(payload) - - @staticmethod - def dumps(obj: t.Any, **kwargs: t.Any) -> str: - kwargs.setdefault("ensure_ascii", False) - kwargs.setdefault("separators", (",", ":")) - return _json.dumps(obj, **kwargs) diff --git a/port/lib/python3.11/site-packages/itsdangerous/encoding.py b/port/lib/python3.11/site-packages/itsdangerous/encoding.py deleted file mode 100644 index f5ca80f..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/encoding.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -import base64 -import string -import struct -import typing as t - -from .exc import BadData - - -def want_bytes( - s: str | bytes, encoding: str = "utf-8", errors: str = "strict" -) -> bytes: - if isinstance(s, str): - s = s.encode(encoding, errors) - - return s - - -def base64_encode(string: str | bytes) -> bytes: - """Base64 encode a string of bytes or text. The resulting bytes are - safe to use in URLs. - """ - string = want_bytes(string) - return base64.urlsafe_b64encode(string).rstrip(b"=") - - -def base64_decode(string: str | bytes) -> bytes: - """Base64 decode a URL-safe string of bytes or text. The result is - bytes. - """ - string = want_bytes(string, encoding="ascii", errors="ignore") - string += b"=" * (-len(string) % 4) - - try: - return base64.urlsafe_b64decode(string) - except (TypeError, ValueError) as e: - raise BadData("Invalid base64-encoded data") from e - - -# The alphabet used by base64.urlsafe_* -_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") - -_int64_struct = struct.Struct(">Q") -_int_to_bytes = _int64_struct.pack -_bytes_to_int = t.cast("t.Callable[[bytes], tuple[int]]", _int64_struct.unpack) - - -def int_to_bytes(num: int) -> bytes: - return _int_to_bytes(num).lstrip(b"\x00") - - -def bytes_to_int(bytestr: bytes) -> int: - return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/port/lib/python3.11/site-packages/itsdangerous/exc.py b/port/lib/python3.11/site-packages/itsdangerous/exc.py deleted file mode 100644 index a75adcd..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/exc.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import annotations - -import typing as t -from datetime import datetime - - -class BadData(Exception): - """Raised if bad data of any sort was encountered. This is the base - for all exceptions that ItsDangerous defines. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str): - super().__init__(message) - self.message = message - - def __str__(self) -> str: - return self.message - - -class BadSignature(BadData): - """Raised if a signature does not match.""" - - def __init__(self, message: str, payload: t.Any | None = None): - super().__init__(message) - - #: The payload that failed the signature test. In some - #: situations you might still want to inspect this, even if - #: you know it was tampered with. - #: - #: .. versionadded:: 0.14 - self.payload: t.Any | None = payload - - -class BadTimeSignature(BadSignature): - """Raised if a time-based signature is invalid. This is a subclass - of :class:`BadSignature`. - """ - - def __init__( - self, - message: str, - payload: t.Any | None = None, - date_signed: datetime | None = None, - ): - super().__init__(message, payload) - - #: If the signature expired this exposes the date of when the - #: signature was created. This can be helpful in order to - #: tell the user how long a link has been gone stale. - #: - #: .. versionchanged:: 2.0 - #: The datetime value is timezone-aware rather than naive. - #: - #: .. versionadded:: 0.14 - self.date_signed = date_signed - - -class SignatureExpired(BadTimeSignature): - """Raised if a signature timestamp is older than ``max_age``. This - is a subclass of :exc:`BadTimeSignature`. - """ - - -class BadHeader(BadSignature): - """Raised if a signed header is invalid in some form. This only - happens for serializers that have a header that goes with the - signature. - - .. versionadded:: 0.24 - """ - - def __init__( - self, - message: str, - payload: t.Any | None = None, - header: t.Any | None = None, - original_error: Exception | None = None, - ): - super().__init__(message, payload) - - #: If the header is actually available but just malformed it - #: might be stored here. - self.header: t.Any | None = header - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: Exception | None = original_error - - -class BadPayload(BadData): - """Raised if a payload is invalid. This could happen if the payload - is loaded despite an invalid signature, or if there is a mismatch - between the serializer and deserializer. The original exception - that occurred during loading is stored on as :attr:`original_error`. - - .. versionadded:: 0.15 - """ - - def __init__(self, message: str, original_error: Exception | None = None): - super().__init__(message) - - #: If available, the error that indicates why the payload was - #: not valid. This might be ``None``. - self.original_error: Exception | None = original_error diff --git a/port/lib/python3.11/site-packages/itsdangerous/py.typed b/port/lib/python3.11/site-packages/itsdangerous/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/port/lib/python3.11/site-packages/itsdangerous/serializer.py b/port/lib/python3.11/site-packages/itsdangerous/serializer.py deleted file mode 100644 index 5ddf387..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/serializer.py +++ /dev/null @@ -1,406 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import json -import typing as t - -from .encoding import want_bytes -from .exc import BadPayload -from .exc import BadSignature -from .signer import _make_keys_list -from .signer import Signer - -if t.TYPE_CHECKING: - import typing_extensions as te - - # This should be either be str or bytes. To avoid having to specify the - # bound type, it falls back to a union if structural matching fails. - _TSerialized = te.TypeVar( - "_TSerialized", bound=t.Union[str, bytes], default=t.Union[str, bytes] - ) -else: - # Still available at runtime on Python < 3.13, but without the default. - _TSerialized = t.TypeVar("_TSerialized", bound=t.Union[str, bytes]) - - -class _PDataSerializer(t.Protocol[_TSerialized]): - def loads(self, payload: _TSerialized, /) -> t.Any: ... - # A signature with additional arguments is not handled correctly by type - # checkers right now, so an overload is used below for serializers that - # don't match this strict protocol. - def dumps(self, obj: t.Any, /) -> _TSerialized: ... - - -# Use TypeIs once it's available in typing_extensions or 3.13. -def is_text_serializer( - serializer: _PDataSerializer[t.Any], -) -> te.TypeGuard[_PDataSerializer[str]]: - """Checks whether a serializer generates text or binary.""" - return isinstance(serializer.dumps({}), str) - - -class Serializer(t.Generic[_TSerialized]): - """A serializer wraps a :class:`~itsdangerous.signer.Signer` to - enable serializing and securely signing data other than bytes. It - can unsign to verify that the data hasn't been changed. - - The serializer provides :meth:`dumps` and :meth:`loads`, similar to - :mod:`json`, and by default uses :mod:`json` internally to serialize - the data to bytes. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param serializer: An object that provides ``dumps`` and ``loads`` - methods for serializing data to a string. Defaults to - :attr:`default_serializer`, which defaults to :mod:`json`. - :param serializer_kwargs: Keyword arguments to pass when calling - ``serializer.dumps``. - :param signer: A ``Signer`` class to instantiate when signing data. - Defaults to :attr:`default_signer`, which defaults to - :class:`~itsdangerous.signer.Signer`. - :param signer_kwargs: Keyword arguments to pass when instantiating - the ``Signer`` class. - :param fallback_signers: List of signer parameters to try when - unsigning with the default signer fails. Each item can be a dict - of ``signer_kwargs``, a ``Signer`` class, or a tuple of - ``(signer, signer_kwargs)``. Defaults to - :attr:`default_fallback_signers`. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 2.0 - Removed the default SHA-512 fallback signer from - ``default_fallback_signers``. - - .. versionchanged:: 1.1 - Added support for ``fallback_signers`` and configured a default - SHA-512 fallback. This fallback is for users who used the yanked - 1.0.0 release which defaulted to SHA-512. - - .. versionchanged:: 0.14 - The ``signer`` and ``signer_kwargs`` parameters were added to - the constructor. - """ - - #: The default serialization module to use to serialize data to a - #: string internally. The default is :mod:`json`, but can be changed - #: to any object that provides ``dumps`` and ``loads`` methods. - default_serializer: _PDataSerializer[t.Any] = json - - #: The default ``Signer`` class to instantiate when signing data. - #: The default is :class:`itsdangerous.signer.Signer`. - default_signer: type[Signer] = Signer - - #: The default fallback signers to try when unsigning fails. - default_fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] = [] - - # Serializer[str] if no data serializer is provided, or if it returns str. - @t.overload - def __init__( - self: Serializer[str], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - serializer: None | _PDataSerializer[str] = None, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Serializer[bytes] with a bytes data serializer positional argument. - @t.overload - def __init__( - self: Serializer[bytes], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None, - serializer: _PDataSerializer[bytes], - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Serializer[bytes] with a bytes data serializer keyword argument. - @t.overload - def __init__( - self: Serializer[bytes], - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - *, - serializer: _PDataSerializer[bytes], - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Fall back with a positional argument. If the strict signature of - # _PDataSerializer doesn't match, fall back to a union, requiring the user - # to specify the type. - @t.overload - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None, - serializer: t.Any, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - # Fall back with a keyword argument. - @t.overload - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - *, - serializer: t.Any, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): ... - - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous", - serializer: t.Any | None = None, - serializer_kwargs: dict[str, t.Any] | None = None, - signer: type[Signer] | None = None, - signer_kwargs: dict[str, t.Any] | None = None, - fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] - | None = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: list[bytes] = _make_keys_list(secret_key) - - if salt is not None: - salt = want_bytes(salt) - # if salt is None then the signer's default is used - - self.salt = salt - - if serializer is None: - serializer = self.default_serializer - - self.serializer: _PDataSerializer[_TSerialized] = serializer - self.is_text_serializer: bool = is_text_serializer(serializer) - - if signer is None: - signer = self.default_signer - - self.signer: type[Signer] = signer - self.signer_kwargs: dict[str, t.Any] = signer_kwargs or {} - - if fallback_signers is None: - fallback_signers = list(self.default_fallback_signers) - - self.fallback_signers: list[ - dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] - ] = fallback_signers - self.serializer_kwargs: dict[str, t.Any] = serializer_kwargs or {} - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def load_payload( - self, payload: bytes, serializer: _PDataSerializer[t.Any] | None = None - ) -> t.Any: - """Loads the encoded object. This function raises - :class:`.BadPayload` if the payload is not valid. The - ``serializer`` parameter can be used to override the serializer - stored on the class. The encoded ``payload`` should always be - bytes. - """ - if serializer is None: - use_serializer = self.serializer - is_text = self.is_text_serializer - else: - use_serializer = serializer - is_text = is_text_serializer(serializer) - - try: - if is_text: - return use_serializer.loads(payload.decode("utf-8")) # type: ignore[arg-type] - - return use_serializer.loads(payload) # type: ignore[arg-type] - except Exception as e: - raise BadPayload( - "Could not load the payload because an exception" - " occurred on unserializing the data.", - original_error=e, - ) from e - - def dump_payload(self, obj: t.Any) -> bytes: - """Dumps the encoded object. The return value is always bytes. - If the internal serializer returns text, the value will be - encoded as UTF-8. - """ - return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) - - def make_signer(self, salt: str | bytes | None = None) -> Signer: - """Creates a new instance of the signer to be used. The default - implementation uses the :class:`.Signer` base class. - """ - if salt is None: - salt = self.salt - - return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) - - def iter_unsigners(self, salt: str | bytes | None = None) -> cabc.Iterator[Signer]: - """Iterates over all signers to be tried for unsigning. Starts - with the configured signer, then constructs each signer - specified in ``fallback_signers``. - """ - if salt is None: - salt = self.salt - - yield self.make_signer(salt) - - for fallback in self.fallback_signers: - if isinstance(fallback, dict): - kwargs = fallback - fallback = self.signer - elif isinstance(fallback, tuple): - fallback, kwargs = fallback - else: - kwargs = self.signer_kwargs - - for secret_key in self.secret_keys: - yield fallback(secret_key, salt=salt, **kwargs) - - def dumps(self, obj: t.Any, salt: str | bytes | None = None) -> _TSerialized: - """Returns a signed string serialized with the internal - serializer. The return value can be either a byte or unicode - string depending on the format of the internal serializer. - """ - payload = want_bytes(self.dump_payload(obj)) - rv = self.make_signer(salt).sign(payload) - - if self.is_text_serializer: - return rv.decode("utf-8") # type: ignore[return-value] - - return rv # type: ignore[return-value] - - def dump(self, obj: t.Any, f: t.IO[t.Any], salt: str | bytes | None = None) -> None: - """Like :meth:`dumps` but dumps into a file. The file handle has - to be compatible with what the internal serializer expects. - """ - f.write(self.dumps(obj, salt)) - - def loads( - self, s: str | bytes, salt: str | bytes | None = None, **kwargs: t.Any - ) -> t.Any: - """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the - signature validation fails. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - return self.load_payload(signer.unsign(s)) - except BadSignature as err: - last_exception = err - - raise t.cast(BadSignature, last_exception) - - def load(self, f: t.IO[t.Any], salt: str | bytes | None = None) -> t.Any: - """Like :meth:`loads` but loads from a file.""" - return self.loads(f.read(), salt) - - def loads_unsafe( - self, s: str | bytes, salt: str | bytes | None = None - ) -> tuple[bool, t.Any]: - """Like :meth:`loads` but without verifying the signature. This - is potentially very dangerous to use depending on how your - serializer works. The return value is ``(signature_valid, - payload)`` instead of just the payload. The first item will be a - boolean that indicates if the signature is valid. This function - never fails. - - Use it for debugging only and if you know that your serializer - module is not exploitable (for example, do not use it with a - pickle serializer). - - .. versionadded:: 0.15 - """ - return self._loads_unsafe_impl(s, salt) - - def _loads_unsafe_impl( - self, - s: str | bytes, - salt: str | bytes | None, - load_kwargs: dict[str, t.Any] | None = None, - load_payload_kwargs: dict[str, t.Any] | None = None, - ) -> tuple[bool, t.Any]: - """Low level helper function to implement :meth:`loads_unsafe` - in serializer subclasses. - """ - if load_kwargs is None: - load_kwargs = {} - - try: - return True, self.loads(s, salt=salt, **load_kwargs) - except BadSignature as e: - if e.payload is None: - return False, None - - if load_payload_kwargs is None: - load_payload_kwargs = {} - - try: - return ( - False, - self.load_payload(e.payload, **load_payload_kwargs), - ) - except BadPayload: - return False, None - - def load_unsafe( - self, f: t.IO[t.Any], salt: str | bytes | None = None - ) -> tuple[bool, t.Any]: - """Like :meth:`loads_unsafe` but loads from a file. - - .. versionadded:: 0.15 - """ - return self.loads_unsafe(f.read(), salt=salt) diff --git a/port/lib/python3.11/site-packages/itsdangerous/signer.py b/port/lib/python3.11/site-packages/itsdangerous/signer.py deleted file mode 100644 index e324dc0..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/signer.py +++ /dev/null @@ -1,266 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import hashlib -import hmac -import typing as t - -from .encoding import _base64_alphabet -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import want_bytes -from .exc import BadSignature - - -class SigningAlgorithm: - """Subclasses must implement :meth:`get_signature` to provide - signature generation functionality. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - """Returns the signature for the given key and value.""" - raise NotImplementedError() - - def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: - """Verifies the given signature matches the expected - signature. - """ - return hmac.compare_digest(sig, self.get_signature(key, value)) - - -class NoneAlgorithm(SigningAlgorithm): - """Provides an algorithm that does not perform any signing and - returns an empty signature. - """ - - def get_signature(self, key: bytes, value: bytes) -> bytes: - return b"" - - -def _lazy_sha1(string: bytes = b"") -> t.Any: - """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include - SHA-1, in which case the import and use as a default would fail before the - developer can configure something else. - """ - return hashlib.sha1(string) - - -class HMACAlgorithm(SigningAlgorithm): - """Provides signature generation using HMACs.""" - - #: The digest method to use with the MAC algorithm. This defaults to - #: SHA1, but can be changed to any other function in the hashlib - #: module. - default_digest_method: t.Any = staticmethod(_lazy_sha1) - - def __init__(self, digest_method: t.Any = None): - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: t.Any = digest_method - - def get_signature(self, key: bytes, value: bytes) -> bytes: - mac = hmac.new(key, msg=value, digestmod=self.digest_method) - return mac.digest() - - -def _make_keys_list( - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], -) -> list[bytes]: - if isinstance(secret_key, (str, bytes)): - return [want_bytes(secret_key)] - - return [want_bytes(s) for s in secret_key] # pyright: ignore - - -class Signer: - """A signer securely signs bytes, then unsigns them to verify that - the value hasn't been changed. - - The secret key should be a random string of ``bytes`` and should not - be saved to code or version control. Different salts should be used - to distinguish signing in different contexts. See :doc:`/concepts` - for information about the security of the secret key and salt. - - :param secret_key: The secret key to sign and verify with. Can be a - list of keys, oldest to newest, to support key rotation. - :param salt: Extra key to combine with ``secret_key`` to distinguish - signatures in different contexts. - :param sep: Separator between the signature and value. - :param key_derivation: How to derive the signing key from the secret - key and salt. Possible values are ``concat``, ``django-concat``, - or ``hmac``. Defaults to :attr:`default_key_derivation`, which - defaults to ``django-concat``. - :param digest_method: Hash function to use when generating the HMAC - signature. Defaults to :attr:`default_digest_method`, which - defaults to :func:`hashlib.sha1`. Note that the security of the - hash alone doesn't apply when used intermediately in HMAC. - :param algorithm: A :class:`SigningAlgorithm` instance to use - instead of building a default :class:`HMACAlgorithm` with the - ``digest_method``. - - .. versionchanged:: 2.0 - Added support for key rotation by passing a list to - ``secret_key``. - - .. versionchanged:: 0.18 - ``algorithm`` was added as an argument to the class constructor. - - .. versionchanged:: 0.14 - ``key_derivation`` and ``digest_method`` were added as arguments - to the class constructor. - """ - - #: The default digest method to use for the signer. The default is - #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or - #: compatible object. Note that the security of the hash alone - #: doesn't apply when used intermediately in HMAC. - #: - #: .. versionadded:: 0.14 - default_digest_method: t.Any = staticmethod(_lazy_sha1) - - #: The default scheme to use to derive the signing key from the - #: secret key and salt. The default is ``django-concat``. Possible - #: values are ``concat``, ``django-concat``, and ``hmac``. - #: - #: .. versionadded:: 0.14 - default_key_derivation: str = "django-concat" - - def __init__( - self, - secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], - salt: str | bytes | None = b"itsdangerous.Signer", - sep: str | bytes = b".", - key_derivation: str | None = None, - digest_method: t.Any | None = None, - algorithm: SigningAlgorithm | None = None, - ): - #: The list of secret keys to try for verifying signatures, from - #: oldest to newest. The newest (last) key is used for signing. - #: - #: This allows a key rotation system to keep a list of allowed - #: keys and remove expired ones. - self.secret_keys: list[bytes] = _make_keys_list(secret_key) - self.sep: bytes = want_bytes(sep) - - if self.sep in _base64_alphabet: - raise ValueError( - "The given separator cannot be used because it may be" - " contained in the signature itself. ASCII letters," - " digits, and '-_=' must not be used." - ) - - if salt is not None: - salt = want_bytes(salt) - else: - salt = b"itsdangerous.Signer" - - self.salt = salt - - if key_derivation is None: - key_derivation = self.default_key_derivation - - self.key_derivation: str = key_derivation - - if digest_method is None: - digest_method = self.default_digest_method - - self.digest_method: t.Any = digest_method - - if algorithm is None: - algorithm = HMACAlgorithm(self.digest_method) - - self.algorithm: SigningAlgorithm = algorithm - - @property - def secret_key(self) -> bytes: - """The newest (last) entry in the :attr:`secret_keys` list. This - is for compatibility from before key rotation support was added. - """ - return self.secret_keys[-1] - - def derive_key(self, secret_key: str | bytes | None = None) -> bytes: - """This method is called to derive the key. The default key - derivation choices can be overridden here. Key derivation is not - intended to be used as a security method to make a complex key - out of a short password. Instead you should use large random - secret keys. - - :param secret_key: A specific secret key to derive from. - Defaults to the last item in :attr:`secret_keys`. - - .. versionchanged:: 2.0 - Added the ``secret_key`` parameter. - """ - if secret_key is None: - secret_key = self.secret_keys[-1] - else: - secret_key = want_bytes(secret_key) - - if self.key_derivation == "concat": - return t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) - elif self.key_derivation == "django-concat": - return t.cast( - bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() - ) - elif self.key_derivation == "hmac": - mac = hmac.new(secret_key, digestmod=self.digest_method) - mac.update(self.salt) - return mac.digest() - elif self.key_derivation == "none": - return secret_key - else: - raise TypeError("Unknown key derivation method") - - def get_signature(self, value: str | bytes) -> bytes: - """Returns the signature for the given value.""" - value = want_bytes(value) - key = self.derive_key() - sig = self.algorithm.get_signature(key, value) - return base64_encode(sig) - - def sign(self, value: str | bytes) -> bytes: - """Signs the given string.""" - value = want_bytes(value) - return value + self.sep + self.get_signature(value) - - def verify_signature(self, value: str | bytes, sig: str | bytes) -> bool: - """Verifies the signature for the given value.""" - try: - sig = base64_decode(sig) - except Exception: - return False - - value = want_bytes(value) - - for secret_key in reversed(self.secret_keys): - key = self.derive_key(secret_key) - - if self.algorithm.verify_signature(key, value, sig): - return True - - return False - - def unsign(self, signed_value: str | bytes) -> bytes: - """Unsigns the given string.""" - signed_value = want_bytes(signed_value) - - if self.sep not in signed_value: - raise BadSignature(f"No {self.sep!r} found in value") - - value, sig = signed_value.rsplit(self.sep, 1) - - if self.verify_signature(value, sig): - return value - - raise BadSignature(f"Signature {sig!r} does not match", payload=value) - - def validate(self, signed_value: str | bytes) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid. - """ - try: - self.unsign(signed_value) - return True - except BadSignature: - return False diff --git a/port/lib/python3.11/site-packages/itsdangerous/timed.py b/port/lib/python3.11/site-packages/itsdangerous/timed.py deleted file mode 100644 index 7384375..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/timed.py +++ /dev/null @@ -1,228 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import time -import typing as t -from datetime import datetime -from datetime import timezone - -from .encoding import base64_decode -from .encoding import base64_encode -from .encoding import bytes_to_int -from .encoding import int_to_bytes -from .encoding import want_bytes -from .exc import BadSignature -from .exc import BadTimeSignature -from .exc import SignatureExpired -from .serializer import _TSerialized -from .serializer import Serializer -from .signer import Signer - - -class TimestampSigner(Signer): - """Works like the regular :class:`.Signer` but also records the time - of the signing and can be used to expire signatures. The - :meth:`unsign` method can raise :exc:`.SignatureExpired` if the - unsigning failed because the signature is expired. - """ - - def get_timestamp(self) -> int: - """Returns the current timestamp. The function must return an - integer. - """ - return int(time.time()) - - def timestamp_to_datetime(self, ts: int) -> datetime: - """Convert the timestamp from :meth:`get_timestamp` into an - aware :class`datetime.datetime` in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - return datetime.fromtimestamp(ts, tz=timezone.utc) - - def sign(self, value: str | bytes) -> bytes: - """Signs the given string and also attaches time information.""" - value = want_bytes(value) - timestamp = base64_encode(int_to_bytes(self.get_timestamp())) - sep = want_bytes(self.sep) - value = value + sep + timestamp - return value + sep + self.get_signature(value) - - # Ignore overlapping signatures check, return_timestamp is the only - # parameter that affects the return type. - - @t.overload - def unsign( # type: ignore[overload-overlap] - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: t.Literal[False] = False, - ) -> bytes: ... - - @t.overload - def unsign( - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: t.Literal[True] = True, - ) -> tuple[bytes, datetime]: ... - - def unsign( - self, - signed_value: str | bytes, - max_age: int | None = None, - return_timestamp: bool = False, - ) -> tuple[bytes, datetime] | bytes: - """Works like the regular :meth:`.Signer.unsign` but can also - validate the time. See the base docstring of the class for - the general behavior. If ``return_timestamp`` is ``True`` the - timestamp of the signature will be returned as an aware - :class:`datetime.datetime` object in UTC. - - .. versionchanged:: 2.0 - The timestamp is returned as a timezone-aware ``datetime`` - in UTC rather than a naive ``datetime`` assumed to be UTC. - """ - try: - result = super().unsign(signed_value) - sig_error = None - except BadSignature as e: - sig_error = e - result = e.payload or b"" - - sep = want_bytes(self.sep) - - # If there is no timestamp in the result there is something - # seriously wrong. In case there was a signature error, we raise - # that one directly, otherwise we have a weird situation in - # which we shouldn't have come except someone uses a time-based - # serializer on non-timestamp data, so catch that. - if sep not in result: - if sig_error: - raise sig_error - - raise BadTimeSignature("timestamp missing", payload=result) - - value, ts_bytes = result.rsplit(sep, 1) - ts_int: int | None = None - ts_dt: datetime | None = None - - try: - ts_int = bytes_to_int(base64_decode(ts_bytes)) - except Exception: - pass - - # Signature is *not* okay. Raise a proper error now that we have - # split the value and the timestamp. - if sig_error is not None: - if ts_int is not None: - try: - ts_dt = self.timestamp_to_datetime(ts_int) - except (ValueError, OSError, OverflowError) as exc: - # Windows raises OSError - # 32-bit raises OverflowError - raise BadTimeSignature( - "Malformed timestamp", payload=value - ) from exc - - raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) - - # Signature was okay but the timestamp is actually not there or - # malformed. Should not happen, but we handle it anyway. - if ts_int is None: - raise BadTimeSignature("Malformed timestamp", payload=value) - - # Check timestamp is not older than max_age - if max_age is not None: - age = self.get_timestamp() - ts_int - - if age > max_age: - raise SignatureExpired( - f"Signature age {age} > {max_age} seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if age < 0: - raise SignatureExpired( - f"Signature age {age} < 0 seconds", - payload=value, - date_signed=self.timestamp_to_datetime(ts_int), - ) - - if return_timestamp: - return value, self.timestamp_to_datetime(ts_int) - - return value - - def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool: - """Only validates the given signed value. Returns ``True`` if - the signature exists and is valid.""" - try: - self.unsign(signed_value, max_age=max_age) - return True - except BadSignature: - return False - - -class TimedSerializer(Serializer[_TSerialized]): - """Uses :class:`TimestampSigner` instead of the default - :class:`.Signer`. - """ - - default_signer: type[TimestampSigner] = TimestampSigner - - def iter_unsigners( - self, salt: str | bytes | None = None - ) -> cabc.Iterator[TimestampSigner]: - return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt)) - - # TODO: Signature is incompatible because parameters were added - # before salt. - - def loads( # type: ignore[override] - self, - s: str | bytes, - max_age: int | None = None, - return_timestamp: bool = False, - salt: str | bytes | None = None, - ) -> t.Any: - """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the - signature validation fails. If a ``max_age`` is provided it will - ensure the signature is not older than that time in seconds. In - case the signature is outdated, :exc:`.SignatureExpired` is - raised. All arguments are forwarded to the signer's - :meth:`~TimestampSigner.unsign` method. - """ - s = want_bytes(s) - last_exception = None - - for signer in self.iter_unsigners(salt): - try: - base64d, timestamp = signer.unsign( - s, max_age=max_age, return_timestamp=True - ) - payload = self.load_payload(base64d) - - if return_timestamp: - return payload, timestamp - - return payload - except SignatureExpired: - # The signature was unsigned successfully but was - # expired. Do not try the next signer. - raise - except BadSignature as err: - last_exception = err - - raise t.cast(BadSignature, last_exception) - - def loads_unsafe( # type: ignore[override] - self, - s: str | bytes, - max_age: int | None = None, - salt: str | bytes | None = None, - ) -> tuple[bool, t.Any]: - return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/port/lib/python3.11/site-packages/itsdangerous/url_safe.py b/port/lib/python3.11/site-packages/itsdangerous/url_safe.py deleted file mode 100644 index 56a0793..0000000 --- a/port/lib/python3.11/site-packages/itsdangerous/url_safe.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import annotations - -import typing as t -import zlib - -from ._json import _CompactJSON -from .encoding import base64_decode -from .encoding import base64_encode -from .exc import BadPayload -from .serializer import _PDataSerializer -from .serializer import Serializer -from .timed import TimedSerializer - - -class URLSafeSerializerMixin(Serializer[str]): - """Mixed in with a regular serializer it will attempt to zlib - compress the string to make it shorter if necessary. It will also - base64 encode the string so that it can safely be placed in a URL. - """ - - default_serializer: _PDataSerializer[str] = _CompactJSON - - def load_payload( - self, - payload: bytes, - *args: t.Any, - serializer: t.Any | None = None, - **kwargs: t.Any, - ) -> t.Any: - decompress = False - - if payload.startswith(b"."): - payload = payload[1:] - decompress = True - - try: - json = base64_decode(payload) - except Exception as e: - raise BadPayload( - "Could not base64 decode the payload because of an exception", - original_error=e, - ) from e - - if decompress: - try: - json = zlib.decompress(json) - except Exception as e: - raise BadPayload( - "Could not zlib decompress the payload before decoding the payload", - original_error=e, - ) from e - - return super().load_payload(json, *args, **kwargs) - - def dump_payload(self, obj: t.Any) -> bytes: - json = super().dump_payload(obj) - is_compressed = False - compressed = zlib.compress(json) - - if len(compressed) < (len(json) - 1): - json = compressed - is_compressed = True - - base64d = base64_encode(json) - - if is_compressed: - base64d = b"." + base64d - - return base64d - - -class URLSafeSerializer(URLSafeSerializerMixin, Serializer[str]): - """Works like :class:`.Serializer` but dumps and loads into a URL - safe string consisting of the upper and lowercase character of the - alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ - - -class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer[str]): - """Works like :class:`.TimedSerializer` but dumps and loads into a - URL safe string consisting of the upper and lowercase character of - the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. - """ diff --git a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER b/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA b/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA deleted file mode 100644 index ffef2ff..0000000 --- a/port/lib/python3.11/site-packages/jinja2-3.1.6.dist-info/METADATA +++ /dev/null @@ -1,84 +0,0 @@ -Metadata-Version: 2.4 -Name: Jinja2 -Version: 3.1.6 -Summary: A very fast and expressive template engine. -Maintainer-email: Pallets -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Classifier: Typing :: Typed -License-File: LICENSE.txt -Requires-Dist: MarkupSafe>=2.0 -Requires-Dist: Babel>=2.7 ; extra == "i18n" -Project-URL: Changes, https://jinja.palletsprojects.com/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://jinja.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/jinja/ -Provides-Extra: i18n - -# Jinja - -Jinja is a fast, expressive, extensible templating engine. Special -placeholders in the template allow writing code similar to Python -syntax. Then the template is passed data to render the final document. - -It includes: - -- Template inheritance and inclusion. -- Define and import macros within templates. -- HTML templates can use autoescaping to prevent XSS from untrusted - user input. -- A sandboxed environment can safely render untrusted templates. -- AsyncIO support for generating templates and calling async - functions. -- I18N support with Babel. -- Templates are compiled to optimized Python code just-in-time and - cached, or can be compiled ahead-of-time. -- Exceptions point to the correct line in templates to make debugging - easier. -- Extensible filters, tests, functions, and even syntax. - -Jinja's philosophy is that while application logic belongs in Python if -possible, it shouldn't make the template designer's job difficult by -restricting functionality too much. - - -## In A Nutshell - -```jinja -{% extends "base.html" %} -{% block title %}Members{% endblock %} -{% block content %} -

CY#Y_&2H(Q;t2JR-~SMaf%}eH5aTC&JC3Vsy{>e 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

=_;e+QsT>g!VlUpaZPMy6T ze(OSJL3?&V`;Cp6Ku0#vp%>)g0Xw}P6^MiPh|T2F_ue%g4o1_!!^ejV^S$GHp&jUeNIN#_LTtj-?wrGL0SC#*Pp6WESkqF4#HaMwy?| z68RY=qq}EHaUK>Kay(}Lcy80wnHyU^>`Tu*l9_uXJNHP+Kdp@w#^R55Bgs@enyq-0 zj~E+O52n$@cW5$o@g@A-Ekj3M@fNCPm|rO5ULfp)={Y+79{$7!+>2v&?!_oTv_`cw zsd(JhBd9)$$1y%VE5G9^%I~=E!S8sED9>R`3P8>`X|%qAM2r<1@wXJ)TF|FB)uF*Z zs}|hY>H-kds*4x|2&zN{3dt3Uz#KZ7`5xe=8nev-lQs8kZOt(pv4EW9^?jKo>#|GM zrR%M~8Q=P>Z~d%bNEs?NRt%nhSwKiRhgT}+DY-yHLkkf*)d*=mV{8^+Y?LHbumaD* zN1_P4V3ndWLN6!;2XuspI`+!TDB`BUzKyz6XL&mC`HKOAAC`S^JhNtZcFpee3hVD5 z)ubDbWEziT8;_(PJ(gK;JiFky1y1CVO0nFR0Y!2?5ONC9OUiNdyhjHE=sf{jTKacS zA|buS3yY2T*t9KZV*r=r&84hbiV?ff$Q?ou%PA=kP1wV?(1gcTy&%zkaX55=stlXt z6hf&0)nosVP!R}b0_AjihN-q@R^>MbTM9!%t)a-Gd^|M2MH7M$A3iWh$5`v?Nv?@2 zQYkHHE>W!DmE9xXg=ViuL6g-1CCu^QrYsYV<)$arYLz)v*8RI#V{=@Q1c zNjkN54C6Q3k-Pc{6C})sHwF}pco~jH>*G#<5Z35konZx0AKXcYYtV?1g)7V?jFd0O z!x{i1j5D0U6^L>OvUW;6H58VQ{}RiH_a*}74-EjXvuDoNFz0+81usBt`v(Q0_G^e5 z4=5>=4ARyl@j4{sE7Y?mU~T@@sf#xbWajP2&fD>!FH?OWTYVtqgTqMb{3Hwjmt_4* z(yk>89!x77l?k-@7BT`6Byq|OR(h3jr58GVjJTt7BvYUs$zk-h>2*N_=&~NoZl=lB zA~Hz+AWlMg(7hpGjky$?bGgRnZiJEmd&G4_A*7`gh{G{9f{dnJi_L0^A_5AJo-&HG ze}M19H2{1V**twqa=rZ+mAfRc9JNhX*QE9fsOl6@mCh?vU^}2YR+*=d<9V>YLuiGm z8USeF=Ye*B~iITbh@wktWh&*^u3Sfo&+qd#CnX!P}mq_K@O5 ztcH)P7EQ_-_-j`!OZy9cUCWBM^7Bl~*C>)F541oa5J$wrz3@urpcn%y4;bxr+Ws)Sn9UogMpNDAzIG0aLib z-q1qiX%&FY93H7);E0q{TdKTy8hKREz?m;dE4z z6-*eBg_&?t{4l>juo=nmHACp(qZThgt9icF&v2PdImn)c27?dlGZcfWcpSBN(De84 zCq8)>C$q01-cbt?4PgWIV~xL-bi4>-ml4PFj&pX+%TW8@>KcAl9Q+}KovQp7Yf8X9 z+H*{s!YEtahioGXBQ#JMP%aou%XlZ{&CB@f5oHLi8m`ylc4?}9jo>x8*8K&_3J)mO zHh-JGlEzCPW^gX5??xN1rr?h>4PQAL5x7reS4wF^3)4_%!hcc3X4{mJ_aNA1tRfyGd=zcA}=I;`OtgwM}Iq$}p7{Zmv(;qAqRG%@$y= z@J+znjxYuHq|=D86m>$F84^uhL0TU~$Vt-OmIlPtX@DAu9bhRggzgVUL3D7FG)xEv zqb_iQvyjEY>eQrR!kMP9MD2s)Xb-Rx$C``9p5eL?=$4l@6edI;2Q-Ks-DJwcA*ka+C*wVEs^I|G!EKP)%JEg?cWS)8L#PATT}*BvC1+Ao2CbOxq_%=%4zadPo8S>1B|=#50W zx+PP+EnB@UU8erh7QpkAxKRmh3drK--SRKK>0dkTArm=zu~CGYe_dxem{mCK>y{l1G@-#~%81i3L76}I|?lTOB4 zm;qhXsrzx!4x)z4iX$P{{VUuTMoIefW=4zO%E>!;welONP+&^K{v=thZ8iSxK7~Z( zmh6h@OjKc(U>4GWpR&VPx@yD?{>B9{AS!>4TFf8Sg{0D8f=t0v$qy3|pM!L&8(SfR z-Uyq-0GjF@*a0?|h=&gL+qh4~qSYuEsGJa77qlHk?1mv4?J(A}5zWsVcxPD*;P$7}%*%%bI`bvfUjH-5ID9z>#m=-{69wl`>vsWYmaW$+cmU=H< z0*t<^F_Evn+!I4jYr> zybhWnCX$tAb%5xEu>8~?#gQO5%bvwaIO;)I4p0rupWHOH=lb$YpgkLCPr2^YkZh!csMC@~sXfzk=1we|Nbun~ zWed~VFImN-2qh4{h{6IZI0fwHlpr~K&&*$$oxhTn!|Hn{6U%PbHB7CaT7TX3X2)9{nYvK6E|i{A z@LLv28-5{FThIp2HT=$aU2ePs2``JcJv%ELIxU0tvMQ6;6EP-MwwdVkq*JoLY{MBo z=zKn67U*?n_`8_deM~P9>VdoZcNw!qcCvb>^Tb|9owZm1?+5E-iK3q{6$wsYn}+J^Xq6d zi#6(kP*53~-$A-{E}^jAEfhA)Y`C{=HgepG98dd>FW#y@egW`d_(Kt}6l(@ttQo%7 zQDDu?60Bi=&vE5lBG#O>e{s7vNF#7~Jpk<;IRTdQB1jV3Nn3_Wy?Dpch{%Re#Ry2|Vv+M0Yl&V`0i$da=EO_7i5X+=k9>$p!2XSzLuUB0*VKjfJ@{^3dpyg^*ai)AO=NQ}iFHIJlb z%hg;57j6y>9vx816it7)v>^6Kx$98X?op2Mj}09;%>7%KTguJ%0~7s=7CGp8`9#>6 zb8d_VOZja=L(rxQR%N+@IYULWCrpDC7vVe&lGQ~*XV30X3&^{$%FR>O)HX6+ZzGG! zT;|FV=xA*@D=N%yi?kiNG=>=@+&zQU=aEMWM{s~@?$pZ1phC3zps6WOLdE>r=(*t+ zuw6^?P}R=OkriL;%PKnTg*eS|9n~X$)v93b5!H}-Wna_Tv&x5x70ifb9S0M0c=qhs zkujVG#ua>!BSdiG858%oo_(F1BAOp)L`BWfw%F&~!}9di__Nr*wO(>PL$gaR%3rN= z1*#Kp2h8uImt+k|n75fNXONHAK$*17$6aif;HVW|CRca8%o5uNP&!SV<=4rTODxO$ zXT<+0`ydaO#&UDJ>&DMaS#`Rm%PLztejrm`ldfH3m3NKz;SdU*cVD&a&4$+-zSK0? zG~v%QwBhoRmtaEqQ>>wnr6W7=n>ql1OIyT)>phiVV=vABQ3Oe^{WB2ps`jdmJ5X@@ z$qjvUY(&4|`HW^>zTrvbQy00V2mQX{T{0!MMHQQcyyCmzF&}bI=;NX?N|4;2yFcG3 z-DU<#{|f)r-=BCEUX1SEA#+1>4%xx6IzH_CM}1w(3dY635bEo`0t~ml=p+7-qD#nL z(=Rr|Sf(sruBO3QrV7R~E^dwlikB5ewBPgO&0a==SGZ=7`+Jsrm%owF;^7y36Z(V( zb67tNnZwu1a`#+D1|0i?tBp@w#6By`AEJYl9)gQYh`}T05WlO5$x)F?u?Qqu-Dj)FlD9jAH>*o#BxI|U^#bTi0$-p*P@*>BC;o^*`3xS zhhNfyy55R+{xH7z2l36B%Id^Oa(}9GdKDH#s<+@yziM9bSIvtU%PXXRtO=QoES9!s z=C=rD2p%I)Bp-&c!`KVT+@^3Y2W;7d`YVE>GJ3#*Na#N(;%boCniGS&5O9(w&y^0TwmYpv?F6QNA3?#-^(yOO7I z%y4X-6%n4P%_AFC*;IFTIbN@{3*AL%0JiB3!wP8=X@&JA~vN+CK$5pLi zdtBL)d=aPgO&`4bVmf+sHhR>G9u<>spD%Pm&%~D{^~oNrQW8melAg)!6Z9XTA_c@`{%Eu4F-ncwDCKP_9>UNDF4-8-=R5|{*oCo>N z&e+~c?cK_Ty=%SM!1I?z_|~%#nxTxnASO-cT;fFRW<<dKs=cUIvlp zWI>S^hRAaXveyD`+rEjwgm)rz!8;PV9z*^WU)SQ=d zA>@vgoaSBuKJ&imJdHJ+yw;f#Vy@NN7-eB*TW^p%;RyWRJC zX5)iad@x;>Th&;!hPzlp@0%L-G<)!0m%Ys;XEzlOb;UmSqzV+K-N;UvPyC4N{W0t4 zLs%>1xw0FO^`EZ$S24e`_TQ}LN@Rg*CIiVp%7=faQ>Uk{eEH1nGqbJRtk!L_b=_87 z_qckUxCA%DvPGyDM7b$@X$m4d>*LZd&R!}J|~) z*mv)iN@eSos*m{-JeOe=_5q>1$Di04262>9nNeeVyrEN$*mWfBDUq~!D3bQ@Z0v{? zJCYtenJzm?QG1G_7Pgx;?WumNy=SI+wtAOUy$hp7MHJoBJ4eU%aT5=Q3Obj?DFyzZ zQJsm#6Z>wyJmDj`6zui+;ZD(R#4|i@|DbvSEYwotEyswc5M2ReQU<@2=4S7u@*A zmh=8ufP(qSs)gn!VklXpzhHwH%_!rq1YlC)zgD8{nZ9d*oasoc*l$wyBizyQPM$Zy(8WNaeMu&h&4$YgC(m(_g@5UP)RXn{GC4yX+WI=^Gyer38ytD&+!Y=& zWBxH~z?YD%fW~}&6muCENU;M-T|^XdeWqvqxfs4bQ?4y~o)7wX*0+fJ~)D4Gr8FI-Hv#+wb&!{gwy zftQ|tPKxxa4{Cg545;x{A6nz>GdUsE2c!=t>GHq%h6E^=-y=VOA0O~k?#)Jm9}?Uq z;81FQ6JTNd^nK#zO5>&XbM{f?|I^}l9ajqu^bHIQz|O219O~=C$k|H7Yy%vCZ!O%R zfg#iYeGnfb@PhhB>EwbwE%-nmSRiTekcbcu`B0|@?ocN!u{E#rghR|?@wi3g zt{R00_sIEinF}Ud^U+|cD>B=Q=!)%ktA>4TLCoZC7wUbY}u4pVLner4t9{~pe^9uyOOYmiaiv%wbTqF2AKsI;~^z&W~^Y`fu z&>|SZBWvs#+;{Mx`5F`cJKt=A*dGzRNsuJ?bAqoDe2w561m7Wehv2&e|3L74fNZ&A zUc}Q3W*NbA9L;|v_&0)|5d56re+Yam*G~{7h!eCBbP;qDY$xa?;FW2-tWT4hdF0j^ z^Dw<92~HFIHo*meYg11cM)7C~*~BippJfxS?0l8|ow6x18|2nD+^{vG zHX3qcj56>Q!_GVOew%=n7UsJIT-}uAJXvFqDRr6C%lh_1aH}tTYJ4(&%K&8ljNW75 zKsL~K@bJ)q6NAcVq>D^h4FEGUeAJFTcYc@IgwBrS+US3xxj_-q^^CSNt?iuCBIEKe zqm_@#zl;_dmw&F1SX#^dGFn5r_?OXEq>F!xrD;lQMZdXXFJd!`gtVl!qTig>nJ)fi zw3X@N-(n#hX|3p&(blGme;KVgUHr=w7ld*%#l(QN#mZ_=Yem0|R-Z2ZWwge0@h_t- zPZ$5@yuRy?+FDqz%J^2K^S?RY>U8nX9jlUMe68u?U&hDFquf8+=P{tRF9eAdlWQ@Z zWmI8eC!Zp$85QGut{QZu>(vI)GDGkKb6#P8CH3-$~&z2 z1J^&r!)X%%)Tbs%_wK93is_C@Cn0Z9ZoZ-Lz`ZdH+A`~ zt21qHue!VP?&bH!?si$dN30D4>G*&ZIcj_H*qjlx4Y;;e40d69aPGvDwzpO9wKafD zMT2-Utt*w=wNANPdz8C-&wJr}Ti%O`PqNKFD$mb*k)ws`c^KTMd-Rrs7Y$i&Nh(Kh z7YN@!MT6dy*fZIWc62Z`JXMt%xpj2vbQ-Owy2sWKIkV^OL#X$Q_b#VT4Bor)-YeFQ zCnTa2?AEo)`Uw-wwQFkcTaV#x%-QHRE4ppG3{3-!IC#YN_Uf1}1rSEiZEd?9npz1C zk4<%9zCluC_V$S@_0K;ck2&>c@KxQXwe*|5cqY}L2h z8h~^^xO0(u+hCxdWdw*JIjAHS)+(zO5f+k3ndYyu%bAMV2_Q3LmR@Ch7=jb8rEF9j z1&5k+%p(9u!EmKu24YTRxg8*e8Sll4lSfhS8au*N%tU}w97E7pJkjx{iO`8EKgV7POU9@}7`Dwx<(1v5?+OpKWbV8Jac!^4o;Dt)u$4Oc1!7kNio>;N&v zO=3%NlX2i?lU+_sD+a5Jm{_Slj;2E>B@&S$C0x}<(4{IQk*HCV9T8NrQW-kjl$g%n zP`O=NT|IkApc(B*13(|Ky>RE^)waPv)li91`r9F5Oy~lb$MM7wT~R4bubXTI5E%h? z4&AOdF+6$RiZt2=WBpn%Vh4yV#W}`-aUnZGjJXLQ*OdHZh?#4H*JkxbOK)^2@XLE6 z6dH(-h@Qlz$wyP0Zf~>VYo<26)jK_W=e)IcM;aTmBiMy4Pbty_U5Yk|RKy7iwSdip zkn}Z?6p#2~9(@gk`5Fp2IH|ZeQ|H7f1!1-UPk>ZYc@U%nXXFu?GaBa&BDUs0rwvJ1 zwd#?t%<3SaNs%Bqk(NvcmY|48PDB*N4&CU+xrgkSP!iP-DM|$C=(fE?K>!DF#90QUZ6{i%0wOC^!Hd&u;?3u0FZdGj`uRz0-hPrBP1|qt7MW&%8vuWFW z^svrhjZoSPk-12PZAdu!dF|w(JjYbJY>!?&KDir>0q#n;=av`RMaDoG**tK!Kb)xIU>tVbKr2hpn5kv@P7 z?ir#72Vzb3B)6oz$?aCWT?K8z;LE7KL*mNdn}1FoR^V)IoQT(EYI!0E*f3xIkX~nN z0GUv&?S;$xj0^_)wem_kKn%U1+71y5YvFP`LafZGzGP9sN<|sN%mg?sgCV$!LJb<)SxKcO+G0z?47|9W1Sp&yNjt^C_$#8PZWR!!eA0!|~vQULH zjF|~=3TFsL$gPK|jyP9e^ zKn7x)o=oQ&<#rzs7m~m>@`)s+0@&~?szF{51-16ocEHg4MH=)&4TG{w?;KvQA>sbK zD$-#^TXShK+%(~k+rnccvtJ~vl2j5C(+=qapmhal1;{|Zq9?PeOSwHzMd24(^NA#- z0t32MyDZbaYd+8+B8@N;skFUB=Atp%kZ^Q^t+q-6vLbfKNo{K`{Folr!S{s#jpw0x zhX0onSYH{dUMsfgz8n~jzF>nDb3@jmqL5dP$iV$MVPynfD zWqBTkY*kWWRXJRoK2`-dSLg=}g)jhS+cVsMKUPXwTD7}f*C_}*@AvqQwg8YXGZ<0vZN zXseuG(I*YdsI|)(1kFx?94n*@>PTP{o~>QZi642mkaB4XFpNTZP^G#jcRqCC6}D%+ z-XsOlZE1zx!B*UwO+wTuQk!XS(j z3h>n^A;J(08hG;!81$rQL0Z<^UO{@c-xf}co%dhz7R7Z2#itcalK162D7S%~^@moW4gkY209mW~}%5Rxv4B3)2L zI#D5=h^;xWK)M8NUO+l*MpXYll_wphB6-I9b$A@o;mMOudlHEi=q4R8iu8J@MUuB5 zBwY|ix}b`5qCz?mTXSH6bP4Je($mqlS$&12uV8l@%+o%Yr+v^(J3J2U@Z@O+3aayv zrK~Jun4`T;Kd$l?gtQByXctt`PE=?oVrvd8&@MsU3u!-@r~PD}_LFYf;c;k(Cr>+2 z(4L2G+7Sl6$L9_l`;2aT$8Bh##I|g`(>rtS4kq;An=>MuTvv(Z3FfFi zsTjO{xn3!+kZyC!t*2ANx6e-vrk=H$H!*|C%p*JA?k-FeKY}Sw1S-K5n{Qqsf3PlMrp-hzh1642qADqjf9J`F$q#cQh>q11tf(S99D}DB_u@{ zRYsD^iQ%KG#*Pxxia{&94gr_~Wb`LPK>gwb^h7)vUua^B?FBaH3s3ah1~3p|luewn z1H^-xQI%L{hlpdHsC?oXJ3_pSX$I|b;uV?^oIn}GE3uX|an-IO9@C6yB4WphS2Inm zT|>N<`CPD<5wFt>>{nQ2FQ=zo72H6)QQ=L*n>8br*k!j6Z&gIJ5nrJSTS;6aXjhRP z#5*-3Jkf2hBEDKPBBNCgRpq&jc(=lP zh;LW;!^C?P4UZ7tq41r=cPac);+Pv2w(imC!|b3iZJ+q|=X?jmC)E`fR2fay3I43@wJSi#9 kix2DZ68E(Dq{=YEu4>FgmuD)L+0Q${j2jQ|pV*%LFN27cf&c&j diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/idtracking.cpython-311.pyc deleted file mode 100644 index 9288b2fffa4dad0be52cd9ad37f6f742edb86618..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19503 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 diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/lexer.cpython-311.pyc deleted file mode 100644 index 0633d2c8008be19d0e3d794f19be5b58dd1f22bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35656 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 FCl-$KBWsTOq9f)T9KVC;`D90CZTyoiP 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 diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/nativetypes.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/nativetypes.cpython-311.pyc deleted file mode 100644 index fa674444c7cf5f706c380c50b7747525ed397de4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7955 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 diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/nodes.cpython-311.pyc deleted file mode 100644 index 362f13c80785531a46ac3520f6f03085d053c53e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64474 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 J62#W_{~txSO1%I8 diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/sandbox.cpython-311.pyc deleted file mode 100644 index c6ae6ba510095036a795f74aa57f0dab9805e303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19215 zcmdUXdu$t5y59`nq)1Wkr!9}Iheg?zY{znJ#dadglH*)Qj%_&)b@x&fXDHLANM(k! zY(>s0xyFqgc<*X&oksVrQz+YPR>67!Et)OdA{R~4Esz3>f^@ksF@SFk6#3&8{e!L( zGzd_jzwZoZIHY86?w=hE&zw1r?>xWf`9{C?`8*u1HxB*ZsSgJ@?tjpWez^*fN6%Y1 z?tShYCvxMQ$cvU3KhCqKW!%D^)^Qu2)|h?TG49~0j4kGzc8$AO+>W?=+|A;Sm}k0T zyn@A@G4Hf*+{fasSmm^T+|S}}#H+@u5ch}`vFhoX@fsHQ#%ibQ#_L$z7ptFc7;j+l zO2iw-8+p#cNwy13diO;?-kOcKD!jGmZxM@;!QHO@*urtY!B4x!Tg963O@OueVZp!bFE*UFjJJ!8ViTSnVzbzSXQ$-4(51Hp zxZ9^VvGtey$2@w3pLRtoDAldM6-sT|uvDO|)aDIJxeE~5*5^fR<2@M34joEae5Wbh zm}ArY*e>icN|@%&yb5BK`3*C=h0Ts2^@>}izKBiScFi`vTWptF@!pE}4!rLXJJA!P zMX^f~kh?eH5Vs@usmJDaBX^&LJI;xLYn<34)qIQ{{u}(XYrLQ3?Lgj6slP05Kg-*N zyk5yymiIKv>qFjd>1oOTu?UO9C6SWDQm^Nqs8gc>UTq=^g}fJs$DTiR z%$(zziUuPx2B+QIT>1gaCYqgYGT zqew}NK9q_jWr3#7r8;QJ(JIHJ zNKyl^ouz6eS*p=Kd!xD-Mk0yTR(-+gR5COfqkSQTRa;1&QfQ3HlpGJEpmEs|bK>{t zGJ^NHq(Q1UZl3!a?kb-&kPInhOI+ zcGf-Biq=)P(Uj^th4qZY60;gQSY)D`s#T6pDa4-y;ro%kOCh;$c6PS!B`kF$5sN1J zW)SO(MJM}at|ZSV;!pMN+0&<>*Slsy;ftXuN$I-~jb8}u?JM-OcjgNA7pP2-^+Mhc z(68X9j3QXzzIAaGRZDe?I~Rt&c6t_{dh7DF%kKs5I$P7u*87#Mc?<6g+;8p3Tk*_u zdhpO{^?SbI5acgWui=_EFAQdF^|=b~!t?UeRMwi9ya4P;CgrdpZXn%(ADfRgq?Th%(p2(-5ib>4 zWZyiWBq)XJ5+_42JIgKc@zzotEP-a=TN$+aa%hShDNIn*8qnd#|5q7wuigWWD}xCL zqU9p%zt*?-e=VzPjE&bf=n-ObSn`{oA(26mlvU*;Own2x=amHv< z$)ZeC(g(4;<*p~R>eC@_(CQ{V&(!L`V_UVALFjx!t9~7FS)B@uRnYT_t*j0#_ZOPk|0&l9Cjn5hjb!29HjrKx(I=mmr@+fyW5J*X4L9R=`ieDAg+n5EvNF zNtZ(qV~7f)j)D0aqfvy3F*zko2oP9UGZR#RG3tpTFc5MENh1OR5Kamw6*MtMAaSQO z!Ku(ysVI#Us0*t-K$K=+;?1*~oF<7Tsiiln1R3!(1~5Tz!R}=_DvDCPK$VUhIiks5 z8u9Jb*+g`j=ryVY^%)5okXYkXal_nhB`NO|woS{4Z2?x2=HmxdNs+Kts5BCaDO#;D z)e2auZzv%rQb`C}V^?M*wPsMc5)U8OxMf0SX_jCxP@{UH3gnDr2x51J!Z%ht_rAhE6_UaxX=}XHgZMC%^#~mLY9X>NS zcIu2-lyjaBDKu~LbJT`jbm-KXQ|HD`j1HTM%7av5YXR8c+1Eygf*XSLU~FZ@4n@X(~s*^S}kL&?e4Rv()}xD%%*yID4|ro;+7?Z^~8p|5Upx zT|sxQwsC3SLo4U){n}l-H1t7zwmFb-_hj8DT2oqdt?o|;Pp9|L&1&VX+}<<1R;@1M zZp*sc@|>U5S?YiH@Zw>;l($(c)OoA-x1HIZ!~c-_>?i5wQyKS5S@%nM&WkGk+QsC3 zy#qTl?p;~;t~}={bf7m~LAL>~?`wC}d-coyjJrGQ?#^>gd(&^n?^yrgT=wuwnO&!| zyH2w-HqMRfrkjjLZ1$$#_vBm^KRuWAbw0FOo^pJ{A;@#c$U8W1)t_qjr7P%W?E~n~ zo_+V(<$ak7AzLA&Z31JeC7hJxPsT}4A_7i|P`{3GKW_aIc+6GHRcnb9%FSEKXrg1D zpSND(!WJH~$c;_JNduNpo~T?2T?(IXf^ab9Wh2t@q)Hd1E6O^`K_u!imHx$#(UPWY{4<(j zwW84XE|;{$hIK+8W7>LQ{>+7J``6cVLKden$S!^U$XkD=5ue#$Wfpb}l&W?;L;zKsPL zSJR?vsq214{Ze@OK&GN2ThRge+Pw|ie|i7Xk+gTKc0=-ZZ+lQtwb-v=0Du{nF4H{v zN8rIbzyXPav5p(JzQx@}^*#u;cOSPhn$T3mFOvXs}Q{r$08Tu zMc*|q%#)QRxqhiiq`5ZcSFDgWMOrl78q%O^(8ItKO z;t?BBQ!r}MOgyfvOKe8jt!3@gJZ#ffjqMPlzInYd0&_W2D^k0;91MM}Xr-g9l}#Ac z4~MWB5IQ%6&<^-*$n9D;zm*rZ8>2Aoa&e1PV#X})4a~X#NZl|`ZV|VY%-a)J-dqy% z-wqgoMeZ^`-UFW0q1J6ApoYlSW-?5GNSef4h{7k5U?-$q$D$WW)`m$$no7Z7VJ-&_ zrg5316pJYZwlqBxjge6!QM9HM#9A~$Iyj&Yiei)$c5tREf|8mH$DmQe7FiI?nP_k7 zk1!p&q6^PjXEZIJnuP6!TGzS=8)kG`g2gkW^~+$m04*EJ0#prHahM4ey$prJk^ zkN|v4;^nY3qnU2m*unrRh_G^kmur&^KF8ja1OrBijFHO%gj(v6W(?M50P|=DNy7_= zQd8%Xnn`Lb;QXH7@jbsw<$J#8`{pct`1K&#sn!+@h{4HdJTVhw7CbOCGWE!>B2a7e z0x2V3tzlXTjX)B$ii%ooPNTAlW|(qZoF!AB+zVi%B_RqrHGzwL=h*WYrafG8at-gUpr&<8mx9i5(&T2&Gh8I01uOg=rDwA5*%g zIP0(o+Q=5grd6JxTz4?YFeez)g^L9yT*zVM&TZZZ@q6`N{BIOdsO|3-xSXr$r}pd4 z8_uk&X}Kfq3aoS?(C+&}&!X*ycj=XkYjdu3OSbi?d#wlVwjRi|4rE&g7Hz1KYiY~2 z?77#n|8C3vOv{06%K_BzFXE5M9wv#%ekl}7NnvAE&^*Oy-5!x)@qMi93ZCmPvCI%W z<1Z1=`Emi>%hn+D+LOo}WJTZ&VHL0_s_3Re;1-kG3#JN&ek8XU#DomNkmfb1lJxpA zQX&X10mTb=1FVk~t7?>ipfNp?&|R}JlfVj$S0L7dt}p@-GdoXacb-i9Urf7Re1h)xJm8dBQQ2{I>0#YWm6;&H zItkghv;^B`wz>Z~L~33^%PZX%U~sx+xK}uO#n={lVsS^5tvcIOsdx;`36-!fumwbI zw-gpivno#%SQo7b(>)oRkx^qR9-SlZ1=exw0?s6`uM=??+cZ;og!D?NpHs#LpJ3Lq z-cSriI3b$LE!0<2QYObYK5s39m!2eI0Z_|*bl}YD6xrD>FcSFd#>|| z%dQvWfxrq8Qm8^zoUd+aDBaw%I-K$D&3gByy|4a$>Q4Cc!|5}xWcI(B-T!LdYN^8E zg2nA&i?2E{Vmc~RUD{!3LRM{bc7?;0DA;4z%oPkuM9mR50uMk;yXH;a0Q1)QGP5cK zEq?C*z(T2^oyHk)`V$Yy5L`h0LrLV(m=vMAU^q1MOGfvV3C&_hv&`s`j&Vd{q|1;y zXakUSO$tG$)$FLc4MA^2w_@Tv%UCj;3d5o)lF&d$r9v`A0d~ctbUt(`ik<;j7-xea z7$bB*xbw+D`?%VPeP5saXWdhLuzw0@L+0w~*aXl|1wTzs**+S81=h_~> zkdzPK8%}8j1V+BA0*lETKUuz<^>?qiM$6ovXHaZeyttl%o`uect|-ZQdTXyatH{wG0VVZ;hTbR@B7!iykPlZQf?o zGGx{ATBRe?%44RgisdjjR-Su}i`UI^m#wdHvpn(*m7C*?e4Cz+vPK*|HVi*Sm|Bl- zml;h#C9QMaXH%0(7-v6_XABvN`JgEJL5ij&j((!q*Hs&Nn*=IUH`)K$p|@IbGLeA8 z2zz06H`R)B4|xVXQ2pe062xl|hd}UJk*6uOs&Gn6QkLc~QaPv}L1{4E!@5qUx{Xo+ zN0Fb&ZvaqHuu-j%>7+u-#VA{Wv=JjDXMnj)8=^xYSHK=n`VasaT($0Fe6F@(>GI9P zX|M3z{i@~2R4Q2e@K$|>Qm7dMDcP+m_e-Q2O zweGpwx@WC@?egdKnbzak*5j}&HV1O;-ODHGF9#S~_TAmGZ|&@z?#z~IC#CLf&4VfYxTvgrA z-hB7XmG;%=7vIeI`?LQ3w5y*fEN?qK+`C;v7VGc)NBb;a@Kr~*SiY!kM#2|6Dg4se zK;ah8(Vg}$0~U(!;3>Y-O7T9=(L?qx53=-Uc#0pQ^#8>32vxTsMVC+?q8yC+j9}4- z`jiTW<=V$pEARp(*I%F%NH@_EVDVePZHD`% z(Pb1MobKe;(NKdrm@qnNm~Y{_Ky*~26$bv7(Spa)p$%!l!VjbcpcJG9N${sCQCN(% zVp0zXijL9DLjw{|&on&RddMvfr!7~KIDaOaN>P{{m9Jt_0xm{5vk*-L&>RayjRn8x29_)m8sd4t=Y9Wl=Igt{v_AfvgE<3+&zEiU4Q3Fc=h0#l<^(EkoF$Ng9 zakK1JT&t2)g2Apx8KslqL{zl;iTouVu0-&uMXDkFy=ya5@9Q=*jVq;_3agtmj*K|& zdYSz8E)IfC?O8SVrFZRREtur3(iY^#WUW3HvRGcX6%W#|55W6 zdIv0Vhd3-N&SFWq)cksw!H*Q!5Kdn~etR{c3`elQ8FNZ-Iy8e+&9J}IP%brF6>7(& zS;GVc_&`JaL|8|3-%29vh6j(BfQpNw0SyC-&_d`L@eovpu3ON=Nr#!hF?)hC$Q6{- z^yv@`{A8Ph+Y36%%D{(6F52Cgoy8DZi%cb8Q61VSRgdwmKc*vim=*LoD8UZr)w_eLBf7c9lMUaqPo z=dFHkI9u28D=FJ`I9+=LGfV7@Sro1ArU$;78-JN@e2%Y{Ow-A1)5*mXizmKr>RH{FY1*A_+P!$*R&_V}T}w{76p%TtgnON}pW!Hs4Q=S&4VYRhBtVe~E$*NEA&!#y$| zJziWZH?1f&C4w7?a{LEn=9jm5m}dE+U@&i)f&u22{22}hgEl%C1d*}KwGV-g{}~&@ zTqCh2`f`S>?Iu$_>nGWttq^UiVg7#2mX-drFr?j?nq%3TV`=ZPoPYD;l^bs^ zOKE@qiikkFS0ja}OY;H>?2s86dxAlDAEofEMo{$zgRiGTF-^8qoxz}(2qW38=++p` zmP-^LMwZkh{6SMO)tQ7_sTjSay6`0eNH${lsAU$J36Y&>${$b#+c7w>F7z*lPJGXO@CFs$)MFhsjzdxkp~4fK&%28>_BU?DRbp)09418GON_ou-Cy#uf~I z!pl*lGB^GLb$OYpQ}8>=2!Wr1auoma7MI@^`lZ)z zzOnLDwsCvf){i@5>(AS4_Jd$P5;BuhTxtW60;oHFT6;YuBE4 zLZ1N=rF>=6o*RTUZo3EL0~JJMRb-Fypuuf_I@j2ix6-p`m-g)6|LHj`HgxO{{Vevt z?YU8(x1$t6Fb54zd+$mkHQ&27#2$L*dcWfTXlE(qK~0l=f3CLfCSX&nqw}NVt3$M? zt1o0bo@R;EVB=Et&H80`x_WEYy)AD?(L7fg?5nXqz04>+BCBV~`S-qfbSM8s_njIL; z_MOUe$S4n9<$d=34{BTTc0A#bTUC7{m3LCyrN!M8_i&hn&U^*My_}~4bL^uy_h$np zpD>&Y1Lus3I6qyFo=0HzVAT8<@xiB|?1@&%A=*k(?2?g8@(6~OG69l^2dFdCY9`1<7)@Nk5g&OI5QxI@@Wu|NrVq>$b1vHZ& zb=)JOp5&%uRv+14C7Do@)>)moz9+8g`foM&Vzxys7RjrC^!x{fT z);~b}xH(tbwABA~ZD6&1HJPd1mxVLBe_z_QPZO&>jN8h;q8`#j$-kz67$f6>nhgE# z=yjTce^0@GKw#!MpHU(OH>p!oh?saz-eM(=LxIO;@7K^55u%@XXcP(&qMmsCvjPqC zsO1vO(@n#VsNbcSC&4?S1kbFZt>BYt2c9`ZhvXEUD4}C7eTr}3X;GzQP)Ms_mqay; zQfALiV7AFvVlD;zHXYZ)&(#H=$O?w%UNTe2w*VR@w)iD^0MGcY@Gb1px z>0whheSip0HA0EPRf+^f!BjMPs_8yq{}OcqR@D}y#@V)}>DA9#|0CjBm)K?|G%W6A zDmd3_kQhUgGF-ZTNn3=ZPi&D~T_c>Z+-A?Nv}+sgWt^7N)416}!%|^<*v$mkl2de= z4I1wwvR0Q8fbtJ?+2<3stM#<^*YjmJ+ z%{%5@r532GjvMVI^~_{Uuf}ay?^&eUBJ}M&KML|f4XSP&)&-gUO8x@xn)FC=BsS1_ zO8Aljns2sbsyz~w6?|Wf&oYvl5!VUp0$KW1KB~}$##(BZW=dcUuz5Ef6cm@0nrFFW zK~dg9edwtUu5r&=OQzvaw&BqA3fSk8xyqWK#ovuDpIbS$+Lfu?ldasdXoX82u-(0z z1=n9#Jic@~=WhV1@a@huwA_r|YuJ9bfzAj|XBzsl4Sh@2CF_I7W#G_ZX?Sri?P}KO zny;L$5vG{v8g0~q(0`WxCjfm5=6n&~dw@Zy_OTSc-jn|emD!Nu5pFUB{g8%D%mv$7 z|I1q}_V(q!pl>1C*YX~N$uz{3jnW(vD z1gbE(Y|FGKR8P^*SyQE*vgV>K`=}PphU%na{g*?syhcf+9Lh8}c`s#JNdc^8F;e{q z3FO~VKn@D>NeV_OIE4UT6>9&1fJ%N!36+Heeed~=0@|+BzT5dD6}3?>o#R^5rFV|ooG!g{Tt~X}&T*U4rS}7_D_wf8 zhx4Em2w>*8&UER$9&(OrOPAgcY`%rTYbO@NP;gsThE}U@*RQ;gZSG6kc4ut6v$ov} zJQN6D?SdPRo?WZ8pVZ&3PjfBHgSUoP+Hbv}O+kk1MRxa&73IU!N2xT|w7m6J=Zf`K zPnz3_JHzcnw$QVBFx}RVDJp;I>Ra=qJDy2%TcM!1y*DazuIfd1-s1LELgOn053Ln$ z*!>XX?UhiE1(eLXT3FF^&9HW7Tq9Z62()b!@UQ}{tU%8DN}AoU9ugD;dAl8jDmk~_ znui+FgNIfxl|zuX`%$jH=LBzA@GZW6V-^bb?DFfkF0F(7CdCJao)@Om!Rw6u`IDidC=zJeTyMrT!`b{ybgXi54;MWD|Eqm6UeMlMKY>>+c?EeGE29s_8 diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/tests.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/tests.cpython-311.pyc deleted file mode 100644 index 6d9e930af3a65115bf355f6d3590248ff0c70aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9264 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 G@m~P-wjI9! diff --git a/port/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc b/port/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc deleted file mode 100644 index 3238d3dd8770543d6dcfd6e0116fec1b6d89dcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5692 zcmb7IU2Gf25#BrA@lRA}NsQzlIX>BzZTd%wWhJ%Sq=s$Tsgpo;Bh_uy2IQHyluka~ z(RU}wQYb(LQa}$z!1TogngDF!xJu&!28sfH$U`3dU?6!Q4FV<(HDI6!(7Z8l3KRhf zbY_>NNJ=h}<=yPw?e5&n?Ci|9{Bvh#m_T{wmH$qE*-6Mh@u6PiTH|RB8aIhXridnJ zq9II)nopAq-<&ih351HX^^wHxVd?dq67N{PeCElN@TK?Et*D zQD8d+#F2m~P`&TZV28XP`A~=vRg_OYV$io)|iQd>DkH$1-Z_ zsya=b;aT0BRY!&wP*%$x$}D-oL?Q)3ClbrOEgB5f--AyP2c=tOzo*b5~7gw)1uq9Hi;w+i2 zdL8x$rReSou9Z?-J|#VGGLLuI9-^>=mcr;9=zH*L-qeN^WfJz&<_UA^lEU3lSx}96 z>L`mddTK^l)PesM%Gkih1jp4jHeQnPNh+}CW-M(e%tl>;ji}MII&Zj4^v&O58yuuS zu^dIUsgg_{WWy2%lS$VL6bu_L2a^LvIZXIgs=!cQcAt0;d-(j+?FXt9_|L7xaee{pBw`R)+PQepg z_a;lxv*qa7V(=`FRgI9|vSgTsSvr`7#!ZqX1*kWdY}<0JNLlH(5s_r2tS~KP#Xkve z5uIdxw}khE2?FoQY-4G+8W9(kdH#Z}#umARxV&Mgjhy5OX$R#-OVi3cI-fckiq#Ikk!VoDu(1>l_2Sr<#R$osuHY=@iE@m zf<70JPv!Sl2~>q^x8_;np75#68lMf^A7qVo((RK+3or|+^=o%v7BoH+?!zo-JQ(-_ zW*0NfDi!&JbW#^?PKK)&`zZt zb(RD;1Q-Yjg3pG$C_2idt(p#`={ahvpF^bh4nPDv-CA@M0DgK}PpO!V9L(Izb8FB5 zp$7#17XC>NF%|*pu$YceAAt=-ZuZ=gEIATj(Vc}4NF?=51USh81d}n;6d(p0nsboB z84JtMcobua8WTBZ%K0GLsY8r*rjSbNnF^<&E_Fmy`vAunY1^7(pUT)2;KaP67#6pI zV!=dvQ3q{w_n=dkPy;sZOp}5evM^{;7mzBR#zp|q5*iUDu+aD~SorS|8vpSdNR=znirj)DWLIi<8fiTd z+SjMaia#quSiQOuXqgpo8!k`UXPssNxWP3WXb-?Efoxz^xN+pWa&&sL{sP9#O(h#> zML`hSFT>a-**2zZG1ka}b{d?rehoRik6p*da{pd=tp)l9+3)c`2Vqc(o)c zI$G{J3aJg`-8GmW{oscMy}0Yl-TgrLb?*SLbHPf_u42!=$FW`cvBF>}cBmXXRAkqe z{MGvQQf#Cg8!5&{{!@wetaWULOSn5&O!y@7}ki*X}Po(C%m1!!rqoO(eBhdxu2Xr_r}HX*Ss!1F2N#|gLuRfUFrod*_LaiEQ9~q z#IPkZL91E54Zgzv#QL#)8a@ueggB3Y0LB%BswfH)Y-S)qBJ>nVH@}{czGCb3#3#Lb zx=JKrQm9CKi}kB23G$=>tGXr4iyw4+&HBD+9ueFl0KD8xzQ%XoY;=qXhlTDc*-Ua* Nzs9%UY|+Kc{67aUojw2n diff --git a/port/lib/python3.11/site-packages/jinja2/_identifier.py b/port/lib/python3.11/site-packages/jinja2/_identifier.py deleted file mode 100644 index 928c150..0000000 --- a/port/lib/python3.11/site-packages/jinja2/_identifier.py +++ /dev/null @@ -1,6 +0,0 @@ -import re - -# generated by scripts/generate_identifier_pattern.py -pattern = re.compile( - r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 -) diff --git a/port/lib/python3.11/site-packages/jinja2/async_utils.py b/port/lib/python3.11/site-packages/jinja2/async_utils.py deleted file mode 100644 index f0c1402..0000000 --- a/port/lib/python3.11/site-packages/jinja2/async_utils.py +++ /dev/null @@ -1,99 +0,0 @@ -import inspect -import typing as t -from functools import WRAPPER_ASSIGNMENTS -from functools import wraps - -from .utils import _PassArg -from .utils import pass_eval_context - -if t.TYPE_CHECKING: - import typing_extensions as te - -V = t.TypeVar("V") - - -def async_variant(normal_func): # type: ignore - def decorator(async_func): # type: ignore - pass_arg = _PassArg.from_obj(normal_func) - need_eval_context = pass_arg is None - - if pass_arg is _PassArg.environment: - - def is_async(args: t.Any) -> bool: - return t.cast(bool, args[0].is_async) - - else: - - def is_async(args: t.Any) -> bool: - return t.cast(bool, args[0].environment.is_async) - - # Take the doc and annotations from the sync function, but the - # name from the async function. Pallets-Sphinx-Themes - # build_function_directive expects __wrapped__ to point to the - # sync function. - async_func_attrs = ("__module__", "__name__", "__qualname__") - normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) - - @wraps(normal_func, assigned=normal_func_attrs) - @wraps(async_func, assigned=async_func_attrs, updated=()) - def wrapper(*args, **kwargs): # type: ignore - b = is_async(args) - - if need_eval_context: - args = args[1:] - - if b: - return async_func(*args, **kwargs) - - return normal_func(*args, **kwargs) - - if need_eval_context: - wrapper = pass_eval_context(wrapper) - - wrapper.jinja_async_variant = True # type: ignore[attr-defined] - return wrapper - - return decorator - - -_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} - - -async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": - # Avoid a costly call to isawaitable - if type(value) in _common_primitives: - return t.cast("V", value) - - if inspect.isawaitable(value): - return await t.cast("t.Awaitable[V]", value) - - return value - - -class _IteratorToAsyncIterator(t.Generic[V]): - def __init__(self, iterator: "t.Iterator[V]"): - self._iterator = iterator - - def __aiter__(self) -> "te.Self": - return self - - async def __anext__(self) -> V: - try: - return next(self._iterator) - except StopIteration as e: - raise StopAsyncIteration(e.value) from e - - -def auto_aiter( - iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> "t.AsyncIterator[V]": - if hasattr(iterable, "__aiter__"): - return iterable.__aiter__() - else: - return _IteratorToAsyncIterator(iter(iterable)) - - -async def auto_to_list( - value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", -) -> t.List["V"]: - return [x async for x in auto_aiter(value)] diff --git a/port/lib/python3.11/site-packages/jinja2/bccache.py b/port/lib/python3.11/site-packages/jinja2/bccache.py deleted file mode 100644 index ada8b09..0000000 --- a/port/lib/python3.11/site-packages/jinja2/bccache.py +++ /dev/null @@ -1,408 +0,0 @@ -"""The optional bytecode cache system. This is useful if you have very -complex template situations and the compilation of all those templates -slows down your application too much. - -Situations where this is useful are often forking web applications that -are initialized on the first request. -""" - -import errno -import fnmatch -import marshal -import os -import pickle -import stat -import sys -import tempfile -import typing as t -from hashlib import sha1 -from io import BytesIO -from types import CodeType - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - - class _MemcachedClient(te.Protocol): - def get(self, key: str) -> bytes: ... - - def set( - self, key: str, value: bytes, timeout: t.Optional[int] = None - ) -> None: ... - - -bc_version = 5 -# Magic bytes to identify Jinja bytecode cache files. Contains the -# Python major and minor version to avoid loading incompatible bytecode -# if a project upgrades its Python version. -bc_magic = ( - b"j2" - + pickle.dumps(bc_version, 2) - + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) -) - - -class Bucket: - """Buckets are used to store the bytecode for one template. It's created - and initialized by the bytecode cache and passed to the loading functions. - - The buckets get an internal checksum from the cache assigned and use this - to automatically reject outdated cache material. Individual bytecode - cache subclasses don't have to care about cache invalidation. - """ - - def __init__(self, environment: "Environment", key: str, checksum: str) -> None: - self.environment = environment - self.key = key - self.checksum = checksum - self.reset() - - def reset(self) -> None: - """Resets the bucket (unloads the bytecode).""" - self.code: t.Optional[CodeType] = None - - def load_bytecode(self, f: t.BinaryIO) -> None: - """Loads bytecode from a file or file like object.""" - # make sure the magic header is correct - magic = f.read(len(bc_magic)) - if magic != bc_magic: - self.reset() - return - # the source code of the file changed, we need to reload - checksum = pickle.load(f) - if self.checksum != checksum: - self.reset() - return - # if marshal_load fails then we need to reload - try: - self.code = marshal.load(f) - except (EOFError, ValueError, TypeError): - self.reset() - return - - def write_bytecode(self, f: t.IO[bytes]) -> None: - """Dump the bytecode into the file or file like object passed.""" - if self.code is None: - raise TypeError("can't write empty bucket") - f.write(bc_magic) - pickle.dump(self.checksum, f, 2) - marshal.dump(self.code, f) - - def bytecode_from_string(self, string: bytes) -> None: - """Load bytecode from bytes.""" - self.load_bytecode(BytesIO(string)) - - def bytecode_to_string(self) -> bytes: - """Return the bytecode as bytes.""" - out = BytesIO() - self.write_bytecode(out) - return out.getvalue() - - -class BytecodeCache: - """To implement your own bytecode cache you have to subclass this class - and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of - these methods are passed a :class:`~jinja2.bccache.Bucket`. - - A very basic bytecode cache that saves the bytecode on the file system:: - - from os import path - - class MyCache(BytecodeCache): - - def __init__(self, directory): - self.directory = directory - - def load_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - if path.exists(filename): - with open(filename, 'rb') as f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - with open(filename, 'wb') as f: - bucket.write_bytecode(f) - - A more advanced version of a filesystem based bytecode cache is part of - Jinja. - """ - - def load_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to load bytecode into a - bucket. If they are not able to find code in the cache for the - bucket, it must not do anything. - """ - raise NotImplementedError() - - def dump_bytecode(self, bucket: Bucket) -> None: - """Subclasses have to override this method to write the bytecode - from a bucket back to the cache. If it unable to do so it must not - fail silently but raise an exception. - """ - raise NotImplementedError() - - def clear(self) -> None: - """Clears the cache. This method is not used by Jinja but should be - implemented to allow applications to clear the bytecode cache used - by a particular environment. - """ - - def get_cache_key( - self, name: str, filename: t.Optional[t.Union[str]] = None - ) -> str: - """Returns the unique hash key for this template name.""" - hash = sha1(name.encode("utf-8")) - - if filename is not None: - hash.update(f"|{filename}".encode()) - - return hash.hexdigest() - - def get_source_checksum(self, source: str) -> str: - """Returns a checksum for the source.""" - return sha1(source.encode("utf-8")).hexdigest() - - def get_bucket( - self, - environment: "Environment", - name: str, - filename: t.Optional[str], - source: str, - ) -> Bucket: - """Return a cache bucket for the given template. All arguments are - mandatory but filename may be `None`. - """ - key = self.get_cache_key(name, filename) - checksum = self.get_source_checksum(source) - bucket = Bucket(environment, key, checksum) - self.load_bytecode(bucket) - return bucket - - def set_bucket(self, bucket: Bucket) -> None: - """Put the bucket into the cache.""" - self.dump_bytecode(bucket) - - -class FileSystemBytecodeCache(BytecodeCache): - """A bytecode cache that stores bytecode on the filesystem. It accepts - two arguments: The directory where the cache items are stored and a - pattern string that is used to build the filename. - - If no directory is specified a default cache directory is selected. On - Windows the user's temp directory is used, on UNIX systems a directory - is created for the user in the system temp directory. - - The pattern can be used to have multiple separate caches operate on the - same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` - is replaced with the cache key. - - >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') - - This bytecode cache supports clearing of the cache using the clear method. - """ - - def __init__( - self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" - ) -> None: - if directory is None: - directory = self._get_default_cache_dir() - self.directory = directory - self.pattern = pattern - - def _get_default_cache_dir(self) -> str: - def _unsafe_dir() -> "te.NoReturn": - raise RuntimeError( - "Cannot determine safe temp directory. You " - "need to explicitly provide one." - ) - - tmpdir = tempfile.gettempdir() - - # On windows the temporary directory is used specific unless - # explicitly forced otherwise. We can just use that. - if os.name == "nt": - return tmpdir - if not hasattr(os, "getuid"): - _unsafe_dir() - - dirname = f"_jinja2-cache-{os.getuid()}" - actual_dir = os.path.join(tmpdir, dirname) - - try: - os.mkdir(actual_dir, stat.S_IRWXU) - except OSError as e: - if e.errno != errno.EEXIST: - raise - try: - os.chmod(actual_dir, stat.S_IRWXU) - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - except OSError as e: - if e.errno != errno.EEXIST: - raise - - actual_dir_stat = os.lstat(actual_dir) - if ( - actual_dir_stat.st_uid != os.getuid() - or not stat.S_ISDIR(actual_dir_stat.st_mode) - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU - ): - _unsafe_dir() - - return actual_dir - - def _get_cache_filename(self, bucket: Bucket) -> str: - return os.path.join(self.directory, self.pattern % (bucket.key,)) - - def load_bytecode(self, bucket: Bucket) -> None: - filename = self._get_cache_filename(bucket) - - # Don't test for existence before opening the file, since the - # file could disappear after the test before the open. - try: - f = open(filename, "rb") - except (FileNotFoundError, IsADirectoryError, PermissionError): - # PermissionError can occur on Windows when an operation is - # in progress, such as calling clear(). - return - - with f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket: Bucket) -> None: - # Write to a temporary file, then rename to the real name after - # writing. This avoids another process reading the file before - # it is fully written. - name = self._get_cache_filename(bucket) - f = tempfile.NamedTemporaryFile( - mode="wb", - dir=os.path.dirname(name), - prefix=os.path.basename(name), - suffix=".tmp", - delete=False, - ) - - def remove_silent() -> None: - try: - os.remove(f.name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - pass - - try: - with f: - bucket.write_bytecode(f) - except BaseException: - remove_silent() - raise - - try: - os.replace(f.name, name) - except OSError: - # Another process may have called clear(). On Windows, - # another program may be holding the file open. - remove_silent() - except BaseException: - remove_silent() - raise - - def clear(self) -> None: - # imported lazily here because google app-engine doesn't support - # write access on the file system and the function does not exist - # normally. - from os import remove - - files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) - for filename in files: - try: - remove(os.path.join(self.directory, filename)) - except OSError: - pass - - -class MemcachedBytecodeCache(BytecodeCache): - """This class implements a bytecode cache that uses a memcache cache for - storing the information. It does not enforce a specific memcache library - (tummy's memcache or cmemcache) but will accept any class that provides - the minimal interface required. - - Libraries compatible with this class: - - - `cachelib `_ - - `python-memcached `_ - - (Unfortunately the django cache interface is not compatible because it - does not support storing binary data, only text. You can however pass - the underlying cache client to the bytecode cache which is available - as `django.core.cache.cache._client`.) - - The minimal interface for the client passed to the constructor is this: - - .. class:: MinimalClientInterface - - .. method:: set(key, value[, timeout]) - - Stores the bytecode in the cache. `value` is a string and - `timeout` the timeout of the key. If timeout is not provided - a default timeout or no timeout should be assumed, if it's - provided it's an integer with the number of seconds the cache - item should exist. - - .. method:: get(key) - - Returns the value for the cache key. If the item does not - exist in the cache the return value must be `None`. - - The other arguments to the constructor are the prefix for all keys that - is added before the actual cache key and the timeout for the bytecode in - the cache system. We recommend a high (or no) timeout. - - This bytecode cache does not support clearing of used items in the cache. - The clear method is a no-operation function. - - .. versionadded:: 2.7 - Added support for ignoring memcache errors through the - `ignore_memcache_errors` parameter. - """ - - def __init__( - self, - client: "_MemcachedClient", - prefix: str = "jinja2/bytecode/", - timeout: t.Optional[int] = None, - ignore_memcache_errors: bool = True, - ): - self.client = client - self.prefix = prefix - self.timeout = timeout - self.ignore_memcache_errors = ignore_memcache_errors - - def load_bytecode(self, bucket: Bucket) -> None: - try: - code = self.client.get(self.prefix + bucket.key) - except Exception: - if not self.ignore_memcache_errors: - raise - else: - bucket.bytecode_from_string(code) - - def dump_bytecode(self, bucket: Bucket) -> None: - key = self.prefix + bucket.key - value = bucket.bytecode_to_string() - - try: - if self.timeout is not None: - self.client.set(key, value, self.timeout) - else: - self.client.set(key, value) - except Exception: - if not self.ignore_memcache_errors: - raise diff --git a/port/lib/python3.11/site-packages/jinja2/compiler.py b/port/lib/python3.11/site-packages/jinja2/compiler.py deleted file mode 100644 index a4ff6a1..0000000 --- a/port/lib/python3.11/site-packages/jinja2/compiler.py +++ /dev/null @@ -1,1998 +0,0 @@ -"""Compiles nodes from the parser into Python code.""" - -import typing as t -from contextlib import contextmanager -from functools import update_wrapper -from io import StringIO -from itertools import chain -from keyword import iskeyword as is_python_keyword - -from markupsafe import escape -from markupsafe import Markup - -from . import nodes -from .exceptions import TemplateAssertionError -from .idtracking import Symbols -from .idtracking import VAR_LOAD_ALIAS -from .idtracking import VAR_LOAD_PARAMETER -from .idtracking import VAR_LOAD_RESOLVE -from .idtracking import VAR_LOAD_UNDEFINED -from .nodes import EvalContext -from .optimizer import Optimizer -from .utils import _PassArg -from .utils import concat -from .visitor import NodeVisitor - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .environment import Environment - -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - -operators = { - "eq": "==", - "ne": "!=", - "gt": ">", - "gteq": ">=", - "lt": "<", - "lteq": "<=", - "in": "in", - "notin": "not in", -} - - -def optimizeconst(f: F) -> F: - def new_func( - self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any - ) -> t.Any: - # Only optimize if the frame is not volatile - if self.optimizer is not None and not frame.eval_ctx.volatile: - new_node = self.optimizer.visit(node, frame.eval_ctx) - - if new_node != node: - return self.visit(new_node, frame) - - return f(self, node, frame, **kwargs) - - return update_wrapper(new_func, f) # type: ignore[return-value] - - -def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore - ): - self.write(f"environment.call_binop(context, {op!r}, ") - self.visit(node.left, frame) - self.write(", ") - self.visit(node.right, frame) - else: - self.write("(") - self.visit(node.left, frame) - self.write(f" {op} ") - self.visit(node.right, frame) - - self.write(")") - - return visitor - - -def _make_unop( - op: str, -) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: - @optimizeconst - def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: - if ( - self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore - ): - self.write(f"environment.call_unop(context, {op!r}, ") - self.visit(node.node, frame) - else: - self.write("(" + op) - self.visit(node.node, frame) - - self.write(")") - - return visitor - - -def generate( - node: nodes.Template, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, -) -> t.Optional[str]: - """Generate the python source for a node tree.""" - if not isinstance(node, nodes.Template): - raise TypeError("Can't compile non template nodes") - - generator = environment.code_generator_class( - environment, name, filename, stream, defer_init, optimized - ) - generator.visit(node) - - if stream is None: - return generator.stream.getvalue() # type: ignore - - return None - - -def has_safe_repr(value: t.Any) -> bool: - """Does the node have a safe representation?""" - if value is None or value is NotImplemented or value is Ellipsis: - return True - - if type(value) in {bool, int, float, complex, range, str, Markup}: - return True - - if type(value) in {tuple, list, set, frozenset}: - return all(has_safe_repr(v) for v in value) - - if type(value) is dict: # noqa E721 - return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) - - return False - - -def find_undeclared( - nodes: t.Iterable[nodes.Node], names: t.Iterable[str] -) -> t.Set[str]: - """Check if the names passed are accessed undeclared. The return value - is a set of all the undeclared names from the sequence of names found. - """ - visitor = UndeclaredNameVisitor(names) - try: - for node in nodes: - visitor.visit(node) - except VisitorExit: - pass - return visitor.undeclared - - -class MacroRef: - def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: - self.node = node - self.accesses_caller = False - self.accesses_kwargs = False - self.accesses_varargs = False - - -class Frame: - """Holds compile time information for us.""" - - def __init__( - self, - eval_ctx: EvalContext, - parent: t.Optional["Frame"] = None, - level: t.Optional[int] = None, - ) -> None: - self.eval_ctx = eval_ctx - - # the parent of this frame - self.parent = parent - - if parent is None: - self.symbols = Symbols(level=level) - - # in some dynamic inheritance situations the compiler needs to add - # write tests around output statements. - self.require_output_check = False - - # inside some tags we are using a buffer rather than yield statements. - # this for example affects {% filter %} or {% macro %}. If a frame - # is buffered this variable points to the name of the list used as - # buffer. - self.buffer: t.Optional[str] = None - - # the name of the block we're in, otherwise None. - self.block: t.Optional[str] = None - - else: - self.symbols = Symbols(parent.symbols, level=level) - self.require_output_check = parent.require_output_check - self.buffer = parent.buffer - self.block = parent.block - - # a toplevel frame is the root + soft frames such as if conditions. - self.toplevel = False - - # the root frame is basically just the outermost frame, so no if - # conditions. This information is used to optimize inheritance - # situations. - self.rootlevel = False - - # variables set inside of loops and blocks should not affect outer frames, - # but they still needs to be kept track of as part of the active context. - self.loop_frame = False - self.block_frame = False - - # track whether the frame is being used in an if-statement or conditional - # expression as it determines which errors should be raised during runtime - # or compile time. - self.soft_frame = False - - def copy(self) -> "te.Self": - """Create a copy of the current one.""" - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.symbols = self.symbols.copy() - return rv - - def inner(self, isolated: bool = False) -> "Frame": - """Return an inner frame.""" - if isolated: - return Frame(self.eval_ctx, level=self.symbols.level + 1) - return Frame(self.eval_ctx, self) - - def soft(self) -> "te.Self": - """Return a soft frame. A soft frame may not be modified as - standalone thing as it shares the resources with the frame it - was created of, but it's not a rootlevel frame any longer. - - This is only used to implement if-statements and conditional - expressions. - """ - rv = self.copy() - rv.rootlevel = False - rv.soft_frame = True - return rv - - __copy__ = copy - - -class VisitorExit(RuntimeError): - """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" - - -class DependencyFinderVisitor(NodeVisitor): - """A visitor that collects filter and test calls.""" - - def __init__(self) -> None: - self.filters: t.Set[str] = set() - self.tests: t.Set[str] = set() - - def visit_Filter(self, node: nodes.Filter) -> None: - self.generic_visit(node) - self.filters.add(node.name) - - def visit_Test(self, node: nodes.Test) -> None: - self.generic_visit(node) - self.tests.add(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting at blocks.""" - - -class UndeclaredNameVisitor(NodeVisitor): - """A visitor that checks if a name is accessed without being - declared. This is different from the frame visitor as it will - not stop at closure frames. - """ - - def __init__(self, names: t.Iterable[str]) -> None: - self.names = set(names) - self.undeclared: t.Set[str] = set() - - def visit_Name(self, node: nodes.Name) -> None: - if node.ctx == "load" and node.name in self.names: - self.undeclared.add(node.name) - if self.undeclared == self.names: - raise VisitorExit() - else: - self.names.discard(node.name) - - def visit_Block(self, node: nodes.Block) -> None: - """Stop visiting a blocks.""" - - -class CompilerExit(Exception): - """Raised if the compiler encountered a situation where it just - doesn't make sense to further process the code. Any block that - raises such an exception is not further processed. - """ - - -class CodeGenerator(NodeVisitor): - def __init__( - self, - environment: "Environment", - name: t.Optional[str], - filename: t.Optional[str], - stream: t.Optional[t.TextIO] = None, - defer_init: bool = False, - optimized: bool = True, - ) -> None: - if stream is None: - stream = StringIO() - self.environment = environment - self.name = name - self.filename = filename - self.stream = stream - self.created_block_context = False - self.defer_init = defer_init - self.optimizer: t.Optional[Optimizer] = None - - if optimized: - self.optimizer = Optimizer(environment) - - # aliases for imports - self.import_aliases: t.Dict[str, str] = {} - - # a registry for all blocks. Because blocks are moved out - # into the global python scope they are registered here - self.blocks: t.Dict[str, nodes.Block] = {} - - # the number of extends statements so far - self.extends_so_far = 0 - - # some templates have a rootlevel extends. In this case we - # can safely assume that we're a child template and do some - # more optimizations. - self.has_known_extends = False - - # the current line number - self.code_lineno = 1 - - # registry of all filters and tests (global, not block local) - self.tests: t.Dict[str, str] = {} - self.filters: t.Dict[str, str] = {} - - # the debug information - self.debug_info: t.List[t.Tuple[int, int]] = [] - self._write_debug_info: t.Optional[int] = None - - # the number of new lines before the next write() - self._new_lines = 0 - - # the line number of the last written statement - self._last_line = 0 - - # true if nothing was written so far. - self._first_write = True - - # used by the `temporary_identifier` method to get new - # unique, temporary identifier - self._last_identifier = 0 - - # the current indentation - self._indentation = 0 - - # Tracks toplevel assignments - self._assign_stack: t.List[t.Set[str]] = [] - - # Tracks parameter definition blocks - self._param_def_block: t.List[t.Set[str]] = [] - - # Tracks the current context. - self._context_reference_stack = ["context"] - - @property - def optimized(self) -> bool: - return self.optimizer is not None - - # -- Various compilation helpers - - def fail(self, msg: str, lineno: int) -> "te.NoReturn": - """Fail with a :exc:`TemplateAssertionError`.""" - raise TemplateAssertionError(msg, lineno, self.name, self.filename) - - def temporary_identifier(self) -> str: - """Get a new unique identifier.""" - self._last_identifier += 1 - return f"t_{self._last_identifier}" - - def buffer(self, frame: Frame) -> None: - """Enable buffering for the frame from that point onwards.""" - frame.buffer = self.temporary_identifier() - self.writeline(f"{frame.buffer} = []") - - def return_buffer_contents( - self, frame: Frame, force_unescaped: bool = False - ) -> None: - """Return the buffer contents of the frame.""" - if not force_unescaped: - if frame.eval_ctx.volatile: - self.writeline("if context.eval_ctx.autoescape:") - self.indent() - self.writeline(f"return Markup(concat({frame.buffer}))") - self.outdent() - self.writeline("else:") - self.indent() - self.writeline(f"return concat({frame.buffer})") - self.outdent() - return - elif frame.eval_ctx.autoescape: - self.writeline(f"return Markup(concat({frame.buffer}))") - return - self.writeline(f"return concat({frame.buffer})") - - def indent(self) -> None: - """Indent by one.""" - self._indentation += 1 - - def outdent(self, step: int = 1) -> None: - """Outdent by step.""" - self._indentation -= step - - def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: - """Yield or write into the frame buffer.""" - if frame.buffer is None: - self.writeline("yield ", node) - else: - self.writeline(f"{frame.buffer}.append(", node) - - def end_write(self, frame: Frame) -> None: - """End the writing process started by `start_write`.""" - if frame.buffer is not None: - self.write(")") - - def simple_write( - self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None - ) -> None: - """Simple shortcut for start_write + write + end_write.""" - self.start_write(frame, node) - self.write(s) - self.end_write(frame) - - def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: - """Visit a list of nodes as block in a frame. If the current frame - is no buffer a dummy ``if 0: yield None`` is written automatically. - """ - try: - self.writeline("pass") - for node in nodes: - self.visit(node, frame) - except CompilerExit: - pass - - def write(self, x: str) -> None: - """Write a string into the output stream.""" - if self._new_lines: - if not self._first_write: - self.stream.write("\n" * self._new_lines) - self.code_lineno += self._new_lines - if self._write_debug_info is not None: - self.debug_info.append((self._write_debug_info, self.code_lineno)) - self._write_debug_info = None - self._first_write = False - self.stream.write(" " * self._indentation) - self._new_lines = 0 - self.stream.write(x) - - def writeline( - self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 - ) -> None: - """Combination of newline and write.""" - self.newline(node, extra) - self.write(x) - - def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: - """Add one or more newlines before the next write.""" - self._new_lines = max(self._new_lines, 1 + extra) - if node is not None and node.lineno != self._last_line: - self._write_debug_info = node.lineno - self._last_line = node.lineno - - def signature( - self, - node: t.Union[nodes.Call, nodes.Filter, nodes.Test], - frame: Frame, - extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - ) -> None: - """Writes a function call to the stream for the current node. - A leading comma is added automatically. The extra keyword - arguments may not include python keywords otherwise a syntax - error could occur. The extra keyword arguments should be given - as python dict. - """ - # if any of the given keyword arguments is a python keyword - # we have to make sure that no invalid call is created. - kwarg_workaround = any( - is_python_keyword(t.cast(str, k)) - for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) - ) - - for arg in node.args: - self.write(", ") - self.visit(arg, frame) - - if not kwarg_workaround: - for kwarg in node.kwargs: - self.write(", ") - self.visit(kwarg, frame) - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f", {key}={value}") - if node.dyn_args: - self.write(", *") - self.visit(node.dyn_args, frame) - - if kwarg_workaround: - if node.dyn_kwargs is not None: - self.write(", **dict({") - else: - self.write(", **{") - for kwarg in node.kwargs: - self.write(f"{kwarg.key!r}: ") - self.visit(kwarg.value, frame) - self.write(", ") - if extra_kwargs is not None: - for key, value in extra_kwargs.items(): - self.write(f"{key!r}: {value}, ") - if node.dyn_kwargs is not None: - self.write("}, **") - self.visit(node.dyn_kwargs, frame) - self.write(")") - else: - self.write("}") - - elif node.dyn_kwargs is not None: - self.write(", **") - self.visit(node.dyn_kwargs, frame) - - def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: - """Find all filter and test names used in the template and - assign them to variables in the compiled namespace. Checking - that the names are registered with the environment is done when - compiling the Filter and Test nodes. If the node is in an If or - CondExpr node, the check is done at runtime instead. - - .. versionchanged:: 3.0 - Filters and tests in If and CondExpr nodes are checked at - runtime instead of compile time. - """ - visitor = DependencyFinderVisitor() - - for node in nodes: - visitor.visit(node) - - for id_map, names, dependency in ( - (self.filters, visitor.filters, "filters"), - ( - self.tests, - visitor.tests, - "tests", - ), - ): - for name in sorted(names): - if name not in id_map: - id_map[name] = self.temporary_identifier() - - # add check during runtime that dependencies used inside of executed - # blocks are defined, as this step may be skipped during compile time - self.writeline("try:") - self.indent() - self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") - self.outdent() - self.writeline("except KeyError:") - self.indent() - self.writeline("@internalcode") - self.writeline(f"def {id_map[name]}(*unused):") - self.indent() - self.writeline( - f'raise TemplateRuntimeError("No {dependency[:-1]}' - f' named {name!r} found.")' - ) - self.outdent() - self.outdent() - - def enter_frame(self, frame: Frame) -> None: - undefs = [] - for target, (action, param) in frame.symbols.loads.items(): - if action == VAR_LOAD_PARAMETER: - pass - elif action == VAR_LOAD_RESOLVE: - self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") - elif action == VAR_LOAD_ALIAS: - self.writeline(f"{target} = {param}") - elif action == VAR_LOAD_UNDEFINED: - undefs.append(target) - else: - raise NotImplementedError("unknown load instruction") - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: - if not with_python_scope: - undefs = [] - for target in frame.symbols.loads: - undefs.append(target) - if undefs: - self.writeline(f"{' = '.join(undefs)} = missing") - - def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: - return async_value if self.environment.is_async else sync_value - - def func(self, name: str) -> str: - return f"{self.choose_async()}def {name}" - - def macro_body( - self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame - ) -> t.Tuple[Frame, MacroRef]: - """Dump the function def of a macro or call block.""" - frame = frame.inner() - frame.symbols.analyze_node(node) - macro_ref = MacroRef(node) - - explicit_caller = None - skip_special_params = set() - args = [] - - for idx, arg in enumerate(node.args): - if arg.name == "caller": - explicit_caller = idx - if arg.name in ("kwargs", "varargs"): - skip_special_params.add(arg.name) - args.append(frame.symbols.ref(arg.name)) - - undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) - - if "caller" in undeclared: - # In older Jinja versions there was a bug that allowed caller - # to retain the special behavior even if it was mentioned in - # the argument list. However thankfully this was only really - # working if it was the last argument. So we are explicitly - # checking this now and error out if it is anywhere else in - # the argument list. - if explicit_caller is not None: - try: - node.defaults[explicit_caller - len(node.args)] - except IndexError: - self.fail( - "When defining macros or call blocks the " - 'special "caller" argument must be omitted ' - "or be given a default.", - node.lineno, - ) - else: - args.append(frame.symbols.declare_parameter("caller")) - macro_ref.accesses_caller = True - if "kwargs" in undeclared and "kwargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("kwargs")) - macro_ref.accesses_kwargs = True - if "varargs" in undeclared and "varargs" not in skip_special_params: - args.append(frame.symbols.declare_parameter("varargs")) - macro_ref.accesses_varargs = True - - # macros are delayed, they never require output checks - frame.require_output_check = False - frame.symbols.analyze_node(node) - self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) - self.indent() - - self.buffer(frame) - self.enter_frame(frame) - - self.push_parameter_definitions(frame) - for idx, arg in enumerate(node.args): - ref = frame.symbols.ref(arg.name) - self.writeline(f"if {ref} is missing:") - self.indent() - try: - default = node.defaults[idx - len(node.args)] - except IndexError: - self.writeline( - f'{ref} = undefined("parameter {arg.name!r} was not provided",' - f" name={arg.name!r})" - ) - else: - self.writeline(f"{ref} = ") - self.visit(default, frame) - self.mark_parameter_stored(ref) - self.outdent() - self.pop_parameter_definitions() - - self.blockvisit(node.body, frame) - self.return_buffer_contents(frame, force_unescaped=True) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - return frame, macro_ref - - def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: - """Dump the macro definition for the def created by macro_body.""" - arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) - name = getattr(macro_ref.node, "name", None) - if len(macro_ref.node.args) == 1: - arg_tuple += "," - self.write( - f"Macro(environment, macro, {name!r}, ({arg_tuple})," - f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," - f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" - ) - - def position(self, node: nodes.Node) -> str: - """Return a human readable position for the node.""" - rv = f"line {node.lineno}" - if self.name is not None: - rv = f"{rv} in {self.name!r}" - return rv - - def dump_local_context(self, frame: Frame) -> str: - items_kv = ", ".join( - f"{name!r}: {target}" - for name, target in frame.symbols.dump_stores().items() - ) - return f"{{{items_kv}}}" - - def write_commons(self) -> None: - """Writes a common preamble that is used by root and block functions. - Primarily this sets up common local helpers and enforces a generator - through a dead branch. - """ - self.writeline("resolve = context.resolve_or_missing") - self.writeline("undefined = environment.undefined") - self.writeline("concat = environment.concat") - # always use the standard Undefined class for the implicit else of - # conditional expressions - self.writeline("cond_expr_undefined = Undefined") - self.writeline("if 0: yield None") - - def push_parameter_definitions(self, frame: Frame) -> None: - """Pushes all parameter targets from the given frame into a local - stack that permits tracking of yet to be assigned parameters. In - particular this enables the optimization from `visit_Name` to skip - undefined expressions for parameters in macros as macros can reference - otherwise unbound parameters. - """ - self._param_def_block.append(frame.symbols.dump_param_targets()) - - def pop_parameter_definitions(self) -> None: - """Pops the current parameter definitions set.""" - self._param_def_block.pop() - - def mark_parameter_stored(self, target: str) -> None: - """Marks a parameter in the current parameter definitions as stored. - This will skip the enforced undefined checks. - """ - if self._param_def_block: - self._param_def_block[-1].discard(target) - - def push_context_reference(self, target: str) -> None: - self._context_reference_stack.append(target) - - def pop_context_reference(self) -> None: - self._context_reference_stack.pop() - - def get_context_ref(self) -> str: - return self._context_reference_stack[-1] - - def get_resolve_func(self) -> str: - target = self._context_reference_stack[-1] - if target == "context": - return "resolve" - return f"{target}.resolve" - - def derive_context(self, frame: Frame) -> str: - return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" - - def parameter_is_undeclared(self, target: str) -> bool: - """Checks if a given target is an undeclared parameter.""" - if not self._param_def_block: - return False - return target in self._param_def_block[-1] - - def push_assign_tracking(self) -> None: - """Pushes a new layer for assignment tracking.""" - self._assign_stack.append(set()) - - def pop_assign_tracking(self, frame: Frame) -> None: - """Pops the topmost level for assignment tracking and updates the - context variables if necessary. - """ - vars = self._assign_stack.pop() - if ( - not frame.block_frame - and not frame.loop_frame - and not frame.toplevel - or not vars - ): - return - public_names = [x for x in vars if x[:1] != "_"] - if len(vars) == 1: - name = next(iter(vars)) - ref = frame.symbols.ref(name) - if frame.loop_frame: - self.writeline(f"_loop_vars[{name!r}] = {ref}") - return - if frame.block_frame: - self.writeline(f"_block_vars[{name!r}] = {ref}") - return - self.writeline(f"context.vars[{name!r}] = {ref}") - else: - if frame.loop_frame: - self.writeline("_loop_vars.update({") - elif frame.block_frame: - self.writeline("_block_vars.update({") - else: - self.writeline("context.vars.update({") - for idx, name in enumerate(sorted(vars)): - if idx: - self.write(", ") - ref = frame.symbols.ref(name) - self.write(f"{name!r}: {ref}") - self.write("})") - if not frame.block_frame and not frame.loop_frame and public_names: - if len(public_names) == 1: - self.writeline(f"context.exported_vars.add({public_names[0]!r})") - else: - names_str = ", ".join(map(repr, sorted(public_names))) - self.writeline(f"context.exported_vars.update(({names_str}))") - - # -- Statement Visitors - - def visit_Template( - self, node: nodes.Template, frame: t.Optional[Frame] = None - ) -> None: - assert frame is None, "no root frame allowed" - eval_ctx = EvalContext(self.environment, self.name) - - from .runtime import async_exported - from .runtime import exported - - if self.environment.is_async: - exported_names = sorted(exported + async_exported) - else: - exported_names = sorted(exported) - - self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) - - # if we want a deferred initialization we cannot move the - # environment into a local name - envenv = "" if self.defer_init else ", environment=environment" - - # do we have an extends tag at all? If not, we can save some - # overhead by just not processing any inheritance code. - have_extends = node.find(nodes.Extends) is not None - - # find all blocks - for block in node.find_all(nodes.Block): - if block.name in self.blocks: - self.fail(f"block {block.name!r} defined twice", block.lineno) - self.blocks[block.name] = block - - # find all imports and import them - for import_ in node.find_all(nodes.ImportedName): - if import_.importname not in self.import_aliases: - imp = import_.importname - self.import_aliases[imp] = alias = self.temporary_identifier() - if "." in imp: - module, obj = imp.rsplit(".", 1) - self.writeline(f"from {module} import {obj} as {alias}") - else: - self.writeline(f"import {imp} as {alias}") - - # add the load name - self.writeline(f"name = {self.name!r}") - - # generate the root render function. - self.writeline( - f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 - ) - self.indent() - self.write_commons() - - # process the root - frame = Frame(eval_ctx) - if "self" in find_undeclared(node.body, ("self",)): - ref = frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - frame.symbols.analyze_node(node) - frame.toplevel = frame.rootlevel = True - frame.require_output_check = have_extends and not self.has_known_extends - if have_extends: - self.writeline("parent_template = None") - self.enter_frame(frame) - self.pull_dependencies(node.body) - self.blockvisit(node.body, frame) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - # make sure that the parent root is called. - if have_extends: - if not self.has_known_extends: - self.indent() - self.writeline("if parent_template is not None:") - self.indent() - if not self.environment.is_async: - self.writeline("yield from parent_template.root_render_func(context)") - else: - self.writeline("agen = parent_template.root_render_func(context)") - self.writeline("try:") - self.indent() - self.writeline("async for event in agen:") - self.indent() - self.writeline("yield event") - self.outdent() - self.outdent() - self.writeline("finally: await agen.aclose()") - self.outdent(1 + (not self.has_known_extends)) - - # at this point we now have the blocks collected and can visit them too. - for name, block in self.blocks.items(): - self.writeline( - f"{self.func('block_' + name)}(context, missing=missing{envenv}):", - block, - 1, - ) - self.indent() - self.write_commons() - # It's important that we do not make this frame a child of the - # toplevel template. This would cause a variety of - # interesting issues with identifier tracking. - block_frame = Frame(eval_ctx) - block_frame.block_frame = True - undeclared = find_undeclared(block.body, ("self", "super")) - if "self" in undeclared: - ref = block_frame.symbols.declare_parameter("self") - self.writeline(f"{ref} = TemplateReference(context)") - if "super" in undeclared: - ref = block_frame.symbols.declare_parameter("super") - self.writeline(f"{ref} = context.super({name!r}, block_{name})") - block_frame.symbols.analyze_node(block) - block_frame.block = name - self.writeline("_block_vars = {}") - self.enter_frame(block_frame) - self.pull_dependencies(block.body) - self.blockvisit(block.body, block_frame) - self.leave_frame(block_frame, with_python_scope=True) - self.outdent() - - blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) - self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) - debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) - self.writeline(f"debug_info = {debug_kv_str!r}") - - def visit_Block(self, node: nodes.Block, frame: Frame) -> None: - """Call a block and register it for the template.""" - level = 0 - if frame.toplevel: - # if we know that we are a child template, there is no need to - # check if we are one - if self.has_known_extends: - return - if self.extends_so_far > 0: - self.writeline("if parent_template is None:") - self.indent() - level += 1 - - if node.scoped: - context = self.derive_context(frame) - else: - context = self.get_context_ref() - - if node.required: - self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) - self.indent() - self.writeline( - f'raise TemplateRuntimeError("Required block {node.name!r} not found")', - node, - ) - self.outdent() - - if not self.environment.is_async and frame.buffer is None: - self.writeline( - f"yield from context.blocks[{node.name!r}][0]({context})", node - ) - else: - self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") - self.writeline("try:") - self.indent() - self.writeline( - f"{self.choose_async()}for event in gen:", - node, - ) - self.indent() - self.simple_write("event", frame) - self.outdent() - self.outdent() - self.writeline( - f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" - ) - - self.outdent(level) - - def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: - """Calls the extender.""" - if not frame.toplevel: - self.fail("cannot use extend from a non top-level scope", node.lineno) - - # if the number of extends statements in general is zero so - # far, we don't have to add a check if something extended - # the template before this one. - if self.extends_so_far > 0: - # if we have a known extends we just add a template runtime - # error into the generated code. We could catch that at compile - # time too, but i welcome it not to confuse users by throwing the - # same error at different times just "because we can". - if not self.has_known_extends: - self.writeline("if parent_template is not None:") - self.indent() - self.writeline('raise TemplateRuntimeError("extended multiple times")') - - # if we have a known extends already we don't need that code here - # as we know that the template execution will end here. - if self.has_known_extends: - raise CompilerExit() - else: - self.outdent() - - self.writeline("parent_template = environment.get_template(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - self.writeline("for name, parent_block in parent_template.blocks.items():") - self.indent() - self.writeline("context.blocks.setdefault(name, []).append(parent_block)") - self.outdent() - - # if this extends statement was in the root level we can take - # advantage of that information and simplify the generated code - # in the top level from this point onwards - if frame.rootlevel: - self.has_known_extends = True - - # and now we have one more - self.extends_so_far += 1 - - def visit_Include(self, node: nodes.Include, frame: Frame) -> None: - """Handles includes.""" - if node.ignore_missing: - self.writeline("try:") - self.indent() - - func_name = "get_or_select_template" - if isinstance(node.template, nodes.Const): - if isinstance(node.template.value, str): - func_name = "get_template" - elif isinstance(node.template.value, (tuple, list)): - func_name = "select_template" - elif isinstance(node.template, (nodes.Tuple, nodes.List)): - func_name = "select_template" - - self.writeline(f"template = environment.{func_name}(", node) - self.visit(node.template, frame) - self.write(f", {self.name!r})") - if node.ignore_missing: - self.outdent() - self.writeline("except TemplateNotFound:") - self.indent() - self.writeline("pass") - self.outdent() - self.writeline("else:") - self.indent() - - def loop_body() -> None: - self.indent() - self.simple_write("event", frame) - self.outdent() - - if node.with_context: - self.writeline( - f"gen = template.root_render_func(" - "template.new_context(context.get_all(), True," - f" {self.dump_local_context(frame)}))" - ) - self.writeline("try:") - self.indent() - self.writeline(f"{self.choose_async()}for event in gen:") - loop_body() - self.outdent() - self.writeline( - f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" - ) - elif self.environment.is_async: - self.writeline( - "for event in (await template._get_default_module_async())" - "._body_stream:" - ) - loop_body() - else: - self.writeline("yield from template._get_default_module()._body_stream") - - if node.ignore_missing: - self.outdent() - - def _import_common( - self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame - ) -> None: - self.write(f"{self.choose_async('await ')}environment.get_template(") - self.visit(node.template, frame) - self.write(f", {self.name!r}).") - - if node.with_context: - f_name = f"make_module{self.choose_async('_async')}" - self.write( - f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" - ) - else: - self.write(f"_get_default_module{self.choose_async('_async')}(context)") - - def visit_Import(self, node: nodes.Import, frame: Frame) -> None: - """Visit regular imports.""" - self.writeline(f"{frame.symbols.ref(node.target)} = ", node) - if frame.toplevel: - self.write(f"context.vars[{node.target!r}] = ") - - self._import_common(node, frame) - - if frame.toplevel and not node.target.startswith("_"): - self.writeline(f"context.exported_vars.discard({node.target!r})") - - def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: - """Visit named imports.""" - self.newline(node) - self.write("included_template = ") - self._import_common(node, frame) - var_names = [] - discarded_names = [] - for name in node.names: - if isinstance(name, tuple): - name, alias = name - else: - alias = name - self.writeline( - f"{frame.symbols.ref(alias)} =" - f" getattr(included_template, {name!r}, missing)" - ) - self.writeline(f"if {frame.symbols.ref(alias)} is missing:") - self.indent() - # The position will contain the template name, and will be formatted - # into a string that will be compiled into an f-string. Curly braces - # in the name must be replaced with escapes so that they will not be - # executed as part of the f-string. - position = self.position(node).replace("{", "{{").replace("}", "}}") - message = ( - "the template {included_template.__name__!r}" - f" (imported on {position})" - f" does not export the requested name {name!r}" - ) - self.writeline( - f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" - ) - self.outdent() - if frame.toplevel: - var_names.append(alias) - if not alias.startswith("_"): - discarded_names.append(alias) - - if var_names: - if len(var_names) == 1: - name = var_names[0] - self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") - else: - names_kv = ", ".join( - f"{name!r}: {frame.symbols.ref(name)}" for name in var_names - ) - self.writeline(f"context.vars.update({{{names_kv}}})") - if discarded_names: - if len(discarded_names) == 1: - self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") - else: - names_str = ", ".join(map(repr, discarded_names)) - self.writeline( - f"context.exported_vars.difference_update(({names_str}))" - ) - - def visit_For(self, node: nodes.For, frame: Frame) -> None: - loop_frame = frame.inner() - loop_frame.loop_frame = True - test_frame = frame.inner() - else_frame = frame.inner() - - # try to figure out if we have an extended loop. An extended loop - # is necessary if the loop is in recursive mode if the special loop - # variable is accessed in the body if the body is a scoped block. - extended_loop = ( - node.recursive - or "loop" - in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) - or any(block.scoped for block in node.find_all(nodes.Block)) - ) - - loop_ref = None - if extended_loop: - loop_ref = loop_frame.symbols.declare_parameter("loop") - - loop_frame.symbols.analyze_node(node, for_branch="body") - if node.else_: - else_frame.symbols.analyze_node(node, for_branch="else") - - if node.test: - loop_filter_func = self.temporary_identifier() - test_frame.symbols.analyze_node(node, for_branch="test") - self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) - self.indent() - self.enter_frame(test_frame) - self.writeline(self.choose_async("async for ", "for ")) - self.visit(node.target, loop_frame) - self.write(" in ") - self.write(self.choose_async("auto_aiter(fiter)", "fiter")) - self.write(":") - self.indent() - self.writeline("if ", node.test) - self.visit(node.test, test_frame) - self.write(":") - self.indent() - self.writeline("yield ") - self.visit(node.target, loop_frame) - self.outdent(3) - self.leave_frame(test_frame, with_python_scope=True) - - # if we don't have an recursive loop we have to find the shadowed - # variables at that point. Because loops can be nested but the loop - # variable is a special one we have to enforce aliasing for it. - if node.recursive: - self.writeline( - f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node - ) - self.indent() - self.buffer(loop_frame) - - # Use the same buffer for the else frame - else_frame.buffer = loop_frame.buffer - - # make sure the loop variable is a special one and raise a template - # assertion error if a loop tries to write to loop - if extended_loop: - self.writeline(f"{loop_ref} = missing") - - for name in node.find_all(nodes.Name): - if name.ctx == "store" and name.name == "loop": - self.fail( - "Can't assign to special loop variable in for-loop target", - name.lineno, - ) - - if node.else_: - iteration_indicator = self.temporary_identifier() - self.writeline(f"{iteration_indicator} = 1") - - self.writeline(self.choose_async("async for ", "for "), node) - self.visit(node.target, loop_frame) - if extended_loop: - self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") - else: - self.write(" in ") - - if node.test: - self.write(f"{loop_filter_func}(") - if node.recursive: - self.write("reciter") - else: - if self.environment.is_async and not extended_loop: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async and not extended_loop: - self.write(")") - if node.test: - self.write(")") - - if node.recursive: - self.write(", undefined, loop_render_func, depth):") - else: - self.write(", undefined):" if extended_loop else ":") - - self.indent() - self.enter_frame(loop_frame) - - self.writeline("_loop_vars = {}") - self.blockvisit(node.body, loop_frame) - if node.else_: - self.writeline(f"{iteration_indicator} = 0") - self.outdent() - self.leave_frame( - loop_frame, with_python_scope=node.recursive and not node.else_ - ) - - if node.else_: - self.writeline(f"if {iteration_indicator}:") - self.indent() - self.enter_frame(else_frame) - self.blockvisit(node.else_, else_frame) - self.leave_frame(else_frame) - self.outdent() - - # if the node was recursive we have to return the buffer contents - # and start the iteration code - if node.recursive: - self.return_buffer_contents(loop_frame) - self.outdent() - self.start_write(frame, node) - self.write(f"{self.choose_async('await ')}loop(") - if self.environment.is_async: - self.write("auto_aiter(") - self.visit(node.iter, frame) - if self.environment.is_async: - self.write(")") - self.write(", loop)") - self.end_write(frame) - - # at the end of the iteration, clear any assignments made in the - # loop from the top level - if self._assign_stack: - self._assign_stack[-1].difference_update(loop_frame.symbols.stores) - - def visit_If(self, node: nodes.If, frame: Frame) -> None: - if_frame = frame.soft() - self.writeline("if ", node) - self.visit(node.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(node.body, if_frame) - self.outdent() - for elif_ in node.elif_: - self.writeline("elif ", elif_) - self.visit(elif_.test, if_frame) - self.write(":") - self.indent() - self.blockvisit(elif_.body, if_frame) - self.outdent() - if node.else_: - self.writeline("else:") - self.indent() - self.blockvisit(node.else_, if_frame) - self.outdent() - - def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: - macro_frame, macro_ref = self.macro_body(node, frame) - self.newline() - if frame.toplevel: - if not node.name.startswith("_"): - self.write(f"context.exported_vars.add({node.name!r})") - self.writeline(f"context.vars[{node.name!r}] = ") - self.write(f"{frame.symbols.ref(node.name)} = ") - self.macro_def(macro_ref, macro_frame) - - def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: - call_frame, macro_ref = self.macro_body(node, frame) - self.writeline("caller = ") - self.macro_def(macro_ref, call_frame) - self.start_write(frame, node) - self.visit_Call(node.call, frame, forward_caller=True) - self.end_write(frame) - - def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: - filter_frame = frame.inner() - filter_frame.symbols.analyze_node(node) - self.enter_frame(filter_frame) - self.buffer(filter_frame) - self.blockvisit(node.body, filter_frame) - self.start_write(frame, node) - self.visit_Filter(node.filter, filter_frame) - self.end_write(frame) - self.leave_frame(filter_frame) - - def visit_With(self, node: nodes.With, frame: Frame) -> None: - with_frame = frame.inner() - with_frame.symbols.analyze_node(node) - self.enter_frame(with_frame) - for target, expr in zip(node.targets, node.values): - self.newline() - self.visit(target, with_frame) - self.write(" = ") - self.visit(expr, frame) - self.blockvisit(node.body, with_frame) - self.leave_frame(with_frame) - - def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: - self.newline(node) - self.visit(node.node, frame) - - class _FinalizeInfo(t.NamedTuple): - const: t.Optional[t.Callable[..., str]] - src: t.Optional[str] - - @staticmethod - def _default_finalize(value: t.Any) -> t.Any: - """The default finalize function if the environment isn't - configured with one. Or, if the environment has one, this is - called on that function's output for constants. - """ - return str(value) - - _finalize: t.Optional[_FinalizeInfo] = None - - def _make_finalize(self) -> _FinalizeInfo: - """Build the finalize function to be used on constants and at - runtime. Cached so it's only created once for all output nodes. - - Returns a ``namedtuple`` with the following attributes: - - ``const`` - A function to finalize constant data at compile time. - - ``src`` - Source code to output around nodes to be evaluated at - runtime. - """ - if self._finalize is not None: - return self._finalize - - finalize: t.Optional[t.Callable[..., t.Any]] - finalize = default = self._default_finalize - src = None - - if self.environment.finalize: - src = "environment.finalize(" - env_finalize = self.environment.finalize - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(env_finalize) # type: ignore - ) - finalize = None - - if pass_arg is None: - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(value)) - - else: - src = f"{src}{pass_arg}, " - - if pass_arg == "environment": - - def finalize(value: t.Any) -> t.Any: # noqa: F811 - return default(env_finalize(self.environment, value)) - - self._finalize = self._FinalizeInfo(finalize, src) - return self._finalize - - def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: - """Given a group of constant values converted from ``Output`` - child nodes, produce a string to write to the template module - source. - """ - return repr(concat(group)) - - def _output_child_to_const( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> str: - """Try to optimize a child of an ``Output`` node by trying to - convert it to constant, finalized data at compile time. - - If :exc:`Impossible` is raised, the node is not constant and - will be evaluated at runtime. Any other exception will also be - evaluated at runtime for easier debugging. - """ - const = node.as_const(frame.eval_ctx) - - if frame.eval_ctx.autoescape: - const = escape(const) - - # Template data doesn't go through finalize. - if isinstance(node, nodes.TemplateData): - return str(const) - - return finalize.const(const) # type: ignore - - def _output_child_pre( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code before visiting a child of an - ``Output`` node. - """ - if frame.eval_ctx.volatile: - self.write("(escape if context.eval_ctx.autoescape else str)(") - elif frame.eval_ctx.autoescape: - self.write("escape(") - else: - self.write("str(") - - if finalize.src is not None: - self.write(finalize.src) - - def _output_child_post( - self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo - ) -> None: - """Output extra source code after visiting a child of an - ``Output`` node. - """ - self.write(")") - - if finalize.src is not None: - self.write(")") - - def visit_Output(self, node: nodes.Output, frame: Frame) -> None: - # If an extends is active, don't render outside a block. - if frame.require_output_check: - # A top-level extends is known to exist at compile time. - if self.has_known_extends: - return - - self.writeline("if parent_template is None:") - self.indent() - - finalize = self._make_finalize() - body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] - - # Evaluate constants at compile time if possible. Each item in - # body will be either a list of static data or a node to be - # evaluated at runtime. - for child in node.nodes: - try: - if not ( - # If the finalize function requires runtime context, - # constants can't be evaluated at compile time. - finalize.const - # Unless it's basic template data that won't be - # finalized anyway. - or isinstance(child, nodes.TemplateData) - ): - raise nodes.Impossible() - - const = self._output_child_to_const(child, frame, finalize) - except (nodes.Impossible, Exception): - # The node was not constant and needs to be evaluated at - # runtime. Or another error was raised, which is easier - # to debug at runtime. - body.append(child) - continue - - if body and isinstance(body[-1], list): - body[-1].append(const) - else: - body.append([const]) - - if frame.buffer is not None: - if len(body) == 1: - self.writeline(f"{frame.buffer}.append(") - else: - self.writeline(f"{frame.buffer}.extend((") - - self.indent() - - for item in body: - if isinstance(item, list): - # A group of constant data to join and output. - val = self._output_const_repr(item) - - if frame.buffer is None: - self.writeline("yield " + val) - else: - self.writeline(val + ",") - else: - if frame.buffer is None: - self.writeline("yield ", item) - else: - self.newline(item) - - # A node to be evaluated at runtime. - self._output_child_pre(item, frame, finalize) - self.visit(item, frame) - self._output_child_post(item, frame, finalize) - - if frame.buffer is not None: - self.write(",") - - if frame.buffer is not None: - self.outdent() - self.writeline(")" if len(body) == 1 else "))") - - if frame.require_output_check: - self.outdent() - - def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: - self.push_assign_tracking() - - # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, - # it is only valid if it references a Namespace object. Emit a check for - # that for each ref here, before assignment code is emitted. This can't - # be done in visit_NSRef as the ref could be in the middle of a tuple. - seen_refs: t.Set[str] = set() - - for nsref in node.find_all(nodes.NSRef): - if nsref.name in seen_refs: - # Only emit the check for each reference once, in case the same - # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. - continue - - seen_refs.add(nsref.name) - ref = frame.symbols.ref(nsref.name) - self.writeline(f"if not isinstance({ref}, Namespace):") - self.indent() - self.writeline( - "raise TemplateRuntimeError" - '("cannot assign attribute on non-namespace object")' - ) - self.outdent() - - self.newline(node) - self.visit(node.target, frame) - self.write(" = ") - self.visit(node.node, frame) - self.pop_assign_tracking(frame) - - def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: - self.push_assign_tracking() - block_frame = frame.inner() - # This is a special case. Since a set block always captures we - # will disable output checks. This way one can use set blocks - # toplevel even in extended templates. - block_frame.require_output_check = False - block_frame.symbols.analyze_node(node) - self.enter_frame(block_frame) - self.buffer(block_frame) - self.blockvisit(node.body, block_frame) - self.newline(node) - self.visit(node.target, frame) - self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") - if node.filter is not None: - self.visit_Filter(node.filter, block_frame) - else: - self.write(f"concat({block_frame.buffer})") - self.write(")") - self.pop_assign_tracking(frame) - self.leave_frame(block_frame) - - # -- Expression Visitors - - def visit_Name(self, node: nodes.Name, frame: Frame) -> None: - if node.ctx == "store" and ( - frame.toplevel or frame.loop_frame or frame.block_frame - ): - if self._assign_stack: - self._assign_stack[-1].add(node.name) - ref = frame.symbols.ref(node.name) - - # If we are looking up a variable we might have to deal with the - # case where it's undefined. We can skip that case if the load - # instruction indicates a parameter which are always defined. - if node.ctx == "load": - load = frame.symbols.find_load(ref) - if not ( - load is not None - and load[0] == VAR_LOAD_PARAMETER - and not self.parameter_is_undeclared(ref) - ): - self.write( - f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" - ) - return - - self.write(ref) - - def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: - # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. - # visit_Assign emits code to validate that each ref is to a Namespace - # object only. That can't be emitted here as the ref could be in the - # middle of a tuple assignment. - ref = frame.symbols.ref(node.name) - self.writeline(f"{ref}[{node.attr!r}]") - - def visit_Const(self, node: nodes.Const, frame: Frame) -> None: - val = node.as_const(frame.eval_ctx) - if isinstance(val, float): - self.write(str(val)) - else: - self.write(repr(val)) - - def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: - try: - self.write(repr(node.as_const(frame.eval_ctx))) - except nodes.Impossible: - self.write( - f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" - ) - - def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: - self.write("(") - idx = -1 - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write(",)" if idx == 0 else ")") - - def visit_List(self, node: nodes.List, frame: Frame) -> None: - self.write("[") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item, frame) - self.write("]") - - def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: - self.write("{") - for idx, item in enumerate(node.items): - if idx: - self.write(", ") - self.visit(item.key, frame) - self.write(": ") - self.visit(item.value, frame) - self.write("}") - - visit_Add = _make_binop("+") - visit_Sub = _make_binop("-") - visit_Mul = _make_binop("*") - visit_Div = _make_binop("/") - visit_FloorDiv = _make_binop("//") - visit_Pow = _make_binop("**") - visit_Mod = _make_binop("%") - visit_And = _make_binop("and") - visit_Or = _make_binop("or") - visit_Pos = _make_unop("+") - visit_Neg = _make_unop("-") - visit_Not = _make_unop("not ") - - @optimizeconst - def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: - if frame.eval_ctx.volatile: - func_name = "(markup_join if context.eval_ctx.volatile else str_join)" - elif frame.eval_ctx.autoescape: - func_name = "markup_join" - else: - func_name = "str_join" - self.write(f"{func_name}((") - for arg in node.nodes: - self.visit(arg, frame) - self.write(", ") - self.write("))") - - @optimizeconst - def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: - self.write("(") - self.visit(node.expr, frame) - for op in node.ops: - self.visit(op, frame) - self.write(")") - - def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: - self.write(f" {operators[node.op]} ") - self.visit(node.expr, frame) - - @optimizeconst - def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getattr(") - self.visit(node.node, frame) - self.write(f", {node.attr!r})") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: - # slices bypass the environment getitem method. - if isinstance(node.arg, nodes.Slice): - self.visit(node.node, frame) - self.write("[") - self.visit(node.arg, frame) - self.write("]") - else: - if self.environment.is_async: - self.write("(await auto_await(") - - self.write("environment.getitem(") - self.visit(node.node, frame) - self.write(", ") - self.visit(node.arg, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: - if node.start is not None: - self.visit(node.start, frame) - self.write(":") - if node.stop is not None: - self.visit(node.stop, frame) - if node.step is not None: - self.write(":") - self.visit(node.step, frame) - - @contextmanager - def _filter_test_common( - self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool - ) -> t.Iterator[None]: - if self.environment.is_async: - self.write("(await auto_await(") - - if is_filter: - self.write(f"{self.filters[node.name]}(") - func = self.environment.filters.get(node.name) - else: - self.write(f"{self.tests[node.name]}(") - func = self.environment.tests.get(node.name) - - # When inside an If or CondExpr frame, allow the filter to be - # undefined at compile time and only raise an error if it's - # actually called at runtime. See pull_dependencies. - if func is None and not frame.soft_frame: - type_name = "filter" if is_filter else "test" - self.fail(f"No {type_name} named {node.name!r}.", node.lineno) - - pass_arg = { - _PassArg.context: "context", - _PassArg.eval_context: "context.eval_ctx", - _PassArg.environment: "environment", - }.get( - _PassArg.from_obj(func) # type: ignore - ) - - if pass_arg is not None: - self.write(f"{pass_arg}, ") - - # Back to the visitor function to handle visiting the target of - # the filter or test. - yield - - self.signature(node, frame) - self.write(")") - - if self.environment.is_async: - self.write("))") - - @optimizeconst - def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: - with self._filter_test_common(node, frame, True): - # if the filter node is None we are inside a filter block - # and want to write to the current buffer - if node.node is not None: - self.visit(node.node, frame) - elif frame.eval_ctx.volatile: - self.write( - f"(Markup(concat({frame.buffer}))" - f" if context.eval_ctx.autoescape else concat({frame.buffer}))" - ) - elif frame.eval_ctx.autoescape: - self.write(f"Markup(concat({frame.buffer}))") - else: - self.write(f"concat({frame.buffer})") - - @optimizeconst - def visit_Test(self, node: nodes.Test, frame: Frame) -> None: - with self._filter_test_common(node, frame, False): - self.visit(node.node, frame) - - @optimizeconst - def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: - frame = frame.soft() - - def write_expr2() -> None: - if node.expr2 is not None: - self.visit(node.expr2, frame) - return - - self.write( - f'cond_expr_undefined("the inline if-expression on' - f" {self.position(node)} evaluated to false and no else" - f' section was defined.")' - ) - - self.write("(") - self.visit(node.expr1, frame) - self.write(" if ") - self.visit(node.test, frame) - self.write(" else ") - write_expr2() - self.write(")") - - @optimizeconst - def visit_Call( - self, node: nodes.Call, frame: Frame, forward_caller: bool = False - ) -> None: - if self.environment.is_async: - self.write("(await auto_await(") - if self.environment.sandboxed: - self.write("environment.call(context, ") - else: - self.write("context.call(") - self.visit(node.node, frame) - extra_kwargs = {"caller": "caller"} if forward_caller else None - loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} - block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} - if extra_kwargs: - extra_kwargs.update(loop_kwargs, **block_kwargs) - elif loop_kwargs or block_kwargs: - extra_kwargs = dict(loop_kwargs, **block_kwargs) - self.signature(node, frame, extra_kwargs) - self.write(")") - if self.environment.is_async: - self.write("))") - - def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: - self.write(node.key + "=") - self.visit(node.value, frame) - - # -- Unused nodes for extensions - - def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: - self.write("Markup(") - self.visit(node.expr, frame) - self.write(")") - - def visit_MarkSafeIfAutoescape( - self, node: nodes.MarkSafeIfAutoescape, frame: Frame - ) -> None: - self.write("(Markup if context.eval_ctx.autoescape else identity)(") - self.visit(node.expr, frame) - self.write(")") - - def visit_EnvironmentAttribute( - self, node: nodes.EnvironmentAttribute, frame: Frame - ) -> None: - self.write("environment." + node.name) - - def visit_ExtensionAttribute( - self, node: nodes.ExtensionAttribute, frame: Frame - ) -> None: - self.write(f"environment.extensions[{node.identifier!r}].{node.name}") - - def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: - self.write(self.import_aliases[node.importname]) - - def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: - self.write(node.name) - - def visit_ContextReference( - self, node: nodes.ContextReference, frame: Frame - ) -> None: - self.write("context") - - def visit_DerivedContextReference( - self, node: nodes.DerivedContextReference, frame: Frame - ) -> None: - self.write(self.derive_context(frame)) - - def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: - self.writeline("continue", node) - - def visit_Break(self, node: nodes.Break, frame: Frame) -> None: - self.writeline("break", node) - - def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: - scope_frame = frame.inner() - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - - def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: - ctx = self.temporary_identifier() - self.writeline(f"{ctx} = {self.derive_context(frame)}") - self.writeline(f"{ctx}.vars = ") - self.visit(node.context, frame) - self.push_context_reference(ctx) - - scope_frame = frame.inner(isolated=True) - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - self.pop_context_reference() - - def visit_EvalContextModifier( - self, node: nodes.EvalContextModifier, frame: Frame - ) -> None: - for keyword in node.options: - self.writeline(f"context.eval_ctx.{keyword.key} = ") - self.visit(keyword.value, frame) - try: - val = keyword.value.as_const(frame.eval_ctx) - except nodes.Impossible: - frame.eval_ctx.volatile = True - else: - setattr(frame.eval_ctx, keyword.key, val) - - def visit_ScopedEvalContextModifier( - self, node: nodes.ScopedEvalContextModifier, frame: Frame - ) -> None: - old_ctx_name = self.temporary_identifier() - saved_ctx = frame.eval_ctx.save() - self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") - self.visit_EvalContextModifier(node, frame) - for child in node.body: - self.visit(child, frame) - frame.eval_ctx.revert(saved_ctx) - self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/port/lib/python3.11/site-packages/jinja2/constants.py b/port/lib/python3.11/site-packages/jinja2/constants.py deleted file mode 100644 index 41a1c23..0000000 --- a/port/lib/python3.11/site-packages/jinja2/constants.py +++ /dev/null @@ -1,20 +0,0 @@ -#: list of lorem ipsum words used by the lipsum() helper function -LOREM_IPSUM_WORDS = """\ -a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at -auctor augue bibendum blandit class commodo condimentum congue consectetuer -consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus -diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend -elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames -faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac -hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum -justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem -luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie -mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non -nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque -penatibus per pharetra phasellus placerat platea porta porttitor posuere -potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus -ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit -sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor -tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices -ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus -viverra volutpat vulputate""" diff --git a/port/lib/python3.11/site-packages/jinja2/debug.py b/port/lib/python3.11/site-packages/jinja2/debug.py deleted file mode 100644 index eeeeee7..0000000 --- a/port/lib/python3.11/site-packages/jinja2/debug.py +++ /dev/null @@ -1,191 +0,0 @@ -import sys -import typing as t -from types import CodeType -from types import TracebackType - -from .exceptions import TemplateSyntaxError -from .utils import internal_code -from .utils import missing - -if t.TYPE_CHECKING: - from .runtime import Context - - -def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: - """Rewrite the current exception to replace any tracebacks from - within compiled template code with tracebacks that look like they - came from the template source. - - This must be called within an ``except`` block. - - :param source: For ``TemplateSyntaxError``, the original source if - known. - :return: The original exception with the rewritten traceback. - """ - _, exc_value, tb = sys.exc_info() - exc_value = t.cast(BaseException, exc_value) - tb = t.cast(TracebackType, tb) - - if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: - exc_value.translated = True - exc_value.source = source - # Remove the old traceback, otherwise the frames from the - # compiler still show up. - exc_value.with_traceback(None) - # Outside of runtime, so the frame isn't executing template - # code, but it still needs to point at the template. - tb = fake_traceback( - exc_value, None, exc_value.filename or "", exc_value.lineno - ) - else: - # Skip the frame for the render function. - tb = tb.tb_next - - stack = [] - - # Build the stack of traceback object, replacing any in template - # code with the source file and line information. - while tb is not None: - # Skip frames decorated with @internalcode. These are internal - # calls that aren't useful in template debugging output. - if tb.tb_frame.f_code in internal_code: - tb = tb.tb_next - continue - - template = tb.tb_frame.f_globals.get("__jinja_template__") - - if template is not None: - lineno = template.get_corresponding_lineno(tb.tb_lineno) - fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) - stack.append(fake_tb) - else: - stack.append(tb) - - tb = tb.tb_next - - tb_next = None - - # Assign tb_next in reverse to avoid circular references. - for tb in reversed(stack): - tb.tb_next = tb_next - tb_next = tb - - return exc_value.with_traceback(tb_next) - - -def fake_traceback( # type: ignore - exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int -) -> TracebackType: - """Produce a new traceback object that looks like it came from the - template source instead of the compiled code. The filename, line - number, and location name will point to the template, and the local - variables will be the current template context. - - :param exc_value: The original exception to be re-raised to create - the new traceback. - :param tb: The original traceback to get the local variables and - code info from. - :param filename: The template filename. - :param lineno: The line number in the template source. - """ - if tb is not None: - # Replace the real locals with the context that would be - # available at that point in the template. - locals = get_template_locals(tb.tb_frame.f_locals) - locals.pop("__jinja_exception__", None) - else: - locals = {} - - globals = { - "__name__": filename, - "__file__": filename, - "__jinja_exception__": exc_value, - } - # Raise an exception at the correct line number. - code: CodeType = compile( - "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" - ) - - # Build a new code object that points to the template file and - # replaces the location with a block name. - location = "template" - - if tb is not None: - function = tb.tb_frame.f_code.co_name - - if function == "root": - location = "top-level template code" - elif function.startswith("block_"): - location = f"block {function[6:]!r}" - - if sys.version_info >= (3, 8): - code = code.replace(co_name=location) - else: - code = CodeType( - code.co_argcount, - code.co_kwonlyargcount, - code.co_nlocals, - code.co_stacksize, - code.co_flags, - code.co_code, - code.co_consts, - code.co_names, - code.co_varnames, - code.co_filename, - location, - code.co_firstlineno, - code.co_lnotab, - code.co_freevars, - code.co_cellvars, - ) - - # Execute the new code, which is guaranteed to raise, and return - # the new traceback without this frame. - try: - exec(code, globals, locals) - except BaseException: - return sys.exc_info()[2].tb_next # type: ignore - - -def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: - """Based on the runtime locals, get the context that would be - available at that point in the template. - """ - # Start with the current template context. - ctx: t.Optional[Context] = real_locals.get("context") - - if ctx is not None: - data: t.Dict[str, t.Any] = ctx.get_all().copy() - else: - data = {} - - # Might be in a derived context that only sets local variables - # rather than pushing a context. Local variables follow the scheme - # l_depth_name. Find the highest-depth local that has a value for - # each name. - local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} - - for name, value in real_locals.items(): - if not name.startswith("l_") or value is missing: - # Not a template variable, or no longer relevant. - continue - - try: - _, depth_str, name = name.split("_", 2) - depth = int(depth_str) - except ValueError: - continue - - cur_depth = local_overrides.get(name, (-1,))[0] - - if cur_depth < depth: - local_overrides[name] = (depth, value) - - # Modify the context with any derived context. - for name, (_, value) in local_overrides.items(): - if value is missing: - data.pop(name, None) - else: - data[name] = value - - return data diff --git a/port/lib/python3.11/site-packages/jinja2/defaults.py b/port/lib/python3.11/site-packages/jinja2/defaults.py deleted file mode 100644 index 638cad3..0000000 --- a/port/lib/python3.11/site-packages/jinja2/defaults.py +++ /dev/null @@ -1,48 +0,0 @@ -import typing as t - -from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 -from .tests import TESTS as DEFAULT_TESTS # noqa: F401 -from .utils import Cycler -from .utils import generate_lorem_ipsum -from .utils import Joiner -from .utils import Namespace - -if t.TYPE_CHECKING: - import typing_extensions as te - -# defaults for the parser / lexer -BLOCK_START_STRING = "{%" -BLOCK_END_STRING = "%}" -VARIABLE_START_STRING = "{{" -VARIABLE_END_STRING = "}}" -COMMENT_START_STRING = "{#" -COMMENT_END_STRING = "#}" -LINE_STATEMENT_PREFIX: t.Optional[str] = None -LINE_COMMENT_PREFIX: t.Optional[str] = None -TRIM_BLOCKS = False -LSTRIP_BLOCKS = False -NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" -KEEP_TRAILING_NEWLINE = False - -# default filters, tests and namespace - -DEFAULT_NAMESPACE = { - "range": range, - "dict": dict, - "lipsum": generate_lorem_ipsum, - "cycler": Cycler, - "joiner": Joiner, - "namespace": Namespace, -} - -# default policies -DEFAULT_POLICIES: t.Dict[str, t.Any] = { - "compiler.ascii_str": True, - "urlize.rel": "noopener", - "urlize.target": None, - "urlize.extra_schemes": None, - "truncate.leeway": 5, - "json.dumps_function": None, - "json.dumps_kwargs": {"sort_keys": True}, - "ext.i18n.trimmed": False, -} diff --git a/port/lib/python3.11/site-packages/jinja2/environment.py b/port/lib/python3.11/site-packages/jinja2/environment.py deleted file mode 100644 index 0fc6e5b..0000000 --- a/port/lib/python3.11/site-packages/jinja2/environment.py +++ /dev/null @@ -1,1672 +0,0 @@ -"""Classes for managing templates and their runtime and compile time -options. -""" - -import os -import typing -import typing as t -import weakref -from collections import ChainMap -from functools import lru_cache -from functools import partial -from functools import reduce -from types import CodeType - -from markupsafe import Markup - -from . import nodes -from .compiler import CodeGenerator -from .compiler import generate -from .defaults import BLOCK_END_STRING -from .defaults import BLOCK_START_STRING -from .defaults import COMMENT_END_STRING -from .defaults import COMMENT_START_STRING -from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] -from .defaults import DEFAULT_NAMESPACE -from .defaults import DEFAULT_POLICIES -from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] -from .defaults import KEEP_TRAILING_NEWLINE -from .defaults import LINE_COMMENT_PREFIX -from .defaults import LINE_STATEMENT_PREFIX -from .defaults import LSTRIP_BLOCKS -from .defaults import NEWLINE_SEQUENCE -from .defaults import TRIM_BLOCKS -from .defaults import VARIABLE_END_STRING -from .defaults import VARIABLE_START_STRING -from .exceptions import TemplateNotFound -from .exceptions import TemplateRuntimeError -from .exceptions import TemplatesNotFound -from .exceptions import TemplateSyntaxError -from .exceptions import UndefinedError -from .lexer import get_lexer -from .lexer import Lexer -from .lexer import TokenStream -from .nodes import EvalContext -from .parser import Parser -from .runtime import Context -from .runtime import new_context -from .runtime import Undefined -from .utils import _PassArg -from .utils import concat -from .utils import consume -from .utils import import_string -from .utils import internalcode -from .utils import LRUCache -from .utils import missing - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .bccache import BytecodeCache - from .ext import Extension - from .loaders import BaseLoader - -_env_bound = t.TypeVar("_env_bound", bound="Environment") - - -# for direct template usage we have up to ten living environments -@lru_cache(maxsize=10) -def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: - """Return a new spontaneous environment. A spontaneous environment - is used for templates created directly rather than through an - existing environment. - - :param cls: Environment class to create. - :param args: Positional arguments passed to environment. - """ - env = cls(*args) - env.shared = True - return env - - -def create_cache( - size: int, -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Return the cache class for the given size.""" - if size == 0: - return None - - if size < 0: - return {} - - return LRUCache(size) # type: ignore - - -def copy_cache( - cache: t.Optional[t.MutableMapping[t.Any, t.Any]], -) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: - """Create an empty copy of the given cache.""" - if cache is None: - return None - - if type(cache) is dict: # noqa E721 - return {} - - return LRUCache(cache.capacity) # type: ignore - - -def load_extensions( - environment: "Environment", - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], -) -> t.Dict[str, "Extension"]: - """Load the extensions from the list and bind it to the environment. - Returns a dict of instantiated extensions. - """ - result = {} - - for extension in extensions: - if isinstance(extension, str): - extension = t.cast(t.Type["Extension"], import_string(extension)) - - result[extension.identifier] = extension(environment) - - return result - - -def _environment_config_check(environment: _env_bound) -> _env_bound: - """Perform a sanity check on the environment.""" - assert issubclass( - environment.undefined, Undefined - ), "'undefined' must be a subclass of 'jinja2.Undefined'." - assert ( - environment.block_start_string - != environment.variable_start_string - != environment.comment_start_string - ), "block, variable and comment start strings must be different." - assert environment.newline_sequence in { - "\r", - "\r\n", - "\n", - }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." - return environment - - -class Environment: - r"""The core component of Jinja is the `Environment`. It contains - important shared variables like configuration, filters, tests, - globals and others. Instances of this class may be modified if - they are not shared and if no template was loaded so far. - Modifications on environments after the first template was loaded - will lead to surprising effects and undefined behavior. - - Here are the possible initialization parameters: - - `block_start_string` - The string marking the beginning of a block. Defaults to ``'{%'``. - - `block_end_string` - The string marking the end of a block. Defaults to ``'%}'``. - - `variable_start_string` - The string marking the beginning of a print statement. - Defaults to ``'{{'``. - - `variable_end_string` - The string marking the end of a print statement. Defaults to - ``'}}'``. - - `comment_start_string` - The string marking the beginning of a comment. Defaults to ``'{#'``. - - `comment_end_string` - The string marking the end of a comment. Defaults to ``'#}'``. - - `line_statement_prefix` - If given and a string, this will be used as prefix for line based - statements. See also :ref:`line-statements`. - - `line_comment_prefix` - If given and a string, this will be used as prefix for line based - comments. See also :ref:`line-statements`. - - .. versionadded:: 2.2 - - `trim_blocks` - If this is set to ``True`` the first newline after a block is - removed (block, not variable tag!). Defaults to `False`. - - `lstrip_blocks` - If this is set to ``True`` leading spaces and tabs are stripped - from the start of a line to a block. Defaults to `False`. - - `newline_sequence` - The sequence that starts a newline. Must be one of ``'\r'``, - ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a - useful default for Linux and OS X systems as well as web - applications. - - `keep_trailing_newline` - Preserve the trailing newline when rendering templates. - The default is ``False``, which causes a single newline, - if present, to be stripped from the end of the template. - - .. versionadded:: 2.7 - - `extensions` - List of Jinja extensions to use. This can either be import paths - as strings or extension classes. For more information have a - look at :ref:`the extensions documentation `. - - `optimized` - should the optimizer be enabled? Default is ``True``. - - `undefined` - :class:`Undefined` or a subclass of it that is used to represent - undefined values in the template. - - `finalize` - A callable that can be used to process the result of a variable - expression before it is output. For example one can convert - ``None`` implicitly into an empty string here. - - `autoescape` - If set to ``True`` the XML/HTML autoescaping feature is enabled by - default. For more details about autoescaping see - :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also - be a callable that is passed the template name and has to - return ``True`` or ``False`` depending on autoescape should be - enabled by default. - - .. versionchanged:: 2.4 - `autoescape` can now be a function - - `loader` - The template loader for this environment. - - `cache_size` - The size of the cache. Per default this is ``400`` which means - that if more than 400 templates are loaded the loader will clean - out the least recently used template. If the cache size is set to - ``0`` templates are recompiled all the time, if the cache size is - ``-1`` the cache will not be cleaned. - - .. versionchanged:: 2.8 - The cache size was increased to 400 from a low 50. - - `auto_reload` - Some loaders load templates from locations where the template - sources may change (ie: file system or database). If - ``auto_reload`` is set to ``True`` (default) every time a template is - requested the loader checks if the source changed and if yes, it - will reload the template. For higher performance it's possible to - disable that. - - `bytecode_cache` - If set to a bytecode cache object, this object will provide a - cache for the internal Jinja bytecode so that templates don't - have to be parsed if they were not changed. - - See :ref:`bytecode-cache` for more information. - - `enable_async` - If set to true this enables async template execution which - allows using async functions and generators. - """ - - #: if this environment is sandboxed. Modifying this variable won't make - #: the environment sandboxed though. For a real sandboxed environment - #: have a look at jinja2.sandbox. This flag alone controls the code - #: generation by the compiler. - sandboxed = False - - #: True if the environment is just an overlay - overlayed = False - - #: the environment this environment is linked to if it is an overlay - linked_to: t.Optional["Environment"] = None - - #: shared environments have this set to `True`. A shared environment - #: must not be modified - shared = False - - #: the class that is used for code generation. See - #: :class:`~jinja2.compiler.CodeGenerator` for more information. - code_generator_class: t.Type["CodeGenerator"] = CodeGenerator - - concat = "".join - - #: the context class that is used for templates. See - #: :class:`~jinja2.runtime.Context` for more information. - context_class: t.Type[Context] = Context - - template_class: t.Type["Template"] - - def __init__( - self, - block_start_string: str = BLOCK_START_STRING, - block_end_string: str = BLOCK_END_STRING, - variable_start_string: str = VARIABLE_START_STRING, - variable_end_string: str = VARIABLE_END_STRING, - comment_start_string: str = COMMENT_START_STRING, - comment_end_string: str = COMMENT_END_STRING, - line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, - line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, - trim_blocks: bool = TRIM_BLOCKS, - lstrip_blocks: bool = LSTRIP_BLOCKS, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, - keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), - optimized: bool = True, - undefined: t.Type[Undefined] = Undefined, - finalize: t.Optional[t.Callable[..., t.Any]] = None, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, - loader: t.Optional["BaseLoader"] = None, - cache_size: int = 400, - auto_reload: bool = True, - bytecode_cache: t.Optional["BytecodeCache"] = None, - enable_async: bool = False, - ): - # !!Important notice!! - # The constructor accepts quite a few arguments that should be - # passed by keyword rather than position. However it's important to - # not change the order of arguments because it's used at least - # internally in those cases: - # - spontaneous environments (i18n extension and Template) - # - unittests - # If parameter changes are required only add parameters at the end - # and don't change the arguments (or the defaults!) of the arguments - # existing already. - - # lexer / parser information - self.block_start_string = block_start_string - self.block_end_string = block_end_string - self.variable_start_string = variable_start_string - self.variable_end_string = variable_end_string - self.comment_start_string = comment_start_string - self.comment_end_string = comment_end_string - self.line_statement_prefix = line_statement_prefix - self.line_comment_prefix = line_comment_prefix - self.trim_blocks = trim_blocks - self.lstrip_blocks = lstrip_blocks - self.newline_sequence = newline_sequence - self.keep_trailing_newline = keep_trailing_newline - - # runtime information - self.undefined: t.Type[Undefined] = undefined - self.optimized = optimized - self.finalize = finalize - self.autoescape = autoescape - - # defaults - self.filters = DEFAULT_FILTERS.copy() - self.tests = DEFAULT_TESTS.copy() - self.globals = DEFAULT_NAMESPACE.copy() - - # set the loader provided - self.loader = loader - self.cache = create_cache(cache_size) - self.bytecode_cache = bytecode_cache - self.auto_reload = auto_reload - - # configurable policies - self.policies = DEFAULT_POLICIES.copy() - - # load extensions - self.extensions = load_extensions(self, extensions) - - self.is_async = enable_async - _environment_config_check(self) - - def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: - """Adds an extension after the environment was created. - - .. versionadded:: 2.5 - """ - self.extensions.update(load_extensions(self, [extension])) - - def extend(self, **attributes: t.Any) -> None: - """Add the items to the instance of the environment if they do not exist - yet. This is used by :ref:`extensions ` to register - callbacks and configuration values without breaking inheritance. - """ - for key, value in attributes.items(): - if not hasattr(self, key): - setattr(self, key, value) - - def overlay( - self, - block_start_string: str = missing, - block_end_string: str = missing, - variable_start_string: str = missing, - variable_end_string: str = missing, - comment_start_string: str = missing, - comment_end_string: str = missing, - line_statement_prefix: t.Optional[str] = missing, - line_comment_prefix: t.Optional[str] = missing, - trim_blocks: bool = missing, - lstrip_blocks: bool = missing, - newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, - keep_trailing_newline: bool = missing, - extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, - optimized: bool = missing, - undefined: t.Type[Undefined] = missing, - finalize: t.Optional[t.Callable[..., t.Any]] = missing, - autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, - loader: t.Optional["BaseLoader"] = missing, - cache_size: int = missing, - auto_reload: bool = missing, - bytecode_cache: t.Optional["BytecodeCache"] = missing, - enable_async: bool = missing, - ) -> "te.Self": - """Create a new overlay environment that shares all the data with the - current environment except for cache and the overridden attributes. - Extensions cannot be removed for an overlayed environment. An overlayed - environment automatically gets all the extensions of the environment it - is linked to plus optional extra extensions. - - Creating overlays should happen after the initial environment was set - up completely. Not all attributes are truly linked, some are just - copied over so modifications on the original environment may not shine - through. - - .. versionchanged:: 3.1.5 - ``enable_async`` is applied correctly. - - .. versionchanged:: 3.1.2 - Added the ``newline_sequence``, ``keep_trailing_newline``, - and ``enable_async`` parameters to match ``__init__``. - """ - args = dict(locals()) - del args["self"], args["cache_size"], args["extensions"], args["enable_async"] - - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.overlayed = True - rv.linked_to = self - - for key, value in args.items(): - if value is not missing: - setattr(rv, key, value) - - if cache_size is not missing: - rv.cache = create_cache(cache_size) - else: - rv.cache = copy_cache(self.cache) - - rv.extensions = {} - for key, value in self.extensions.items(): - rv.extensions[key] = value.bind(rv) - if extensions is not missing: - rv.extensions.update(load_extensions(rv, extensions)) - - if enable_async is not missing: - rv.is_async = enable_async - - return _environment_config_check(rv) - - @property - def lexer(self) -> Lexer: - """The lexer for this environment.""" - return get_lexer(self) - - def iter_extensions(self) -> t.Iterator["Extension"]: - """Iterates over the extensions by priority.""" - return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) - - def getitem( - self, obj: t.Any, argument: t.Union[str, t.Any] - ) -> t.Union[t.Any, Undefined]: - """Get an item or attribute of an object but prefer the item.""" - try: - return obj[argument] - except (AttributeError, TypeError, LookupError): - if isinstance(argument, str): - try: - attr = str(argument) - except Exception: - pass - else: - try: - return getattr(obj, attr) - except AttributeError: - pass - return self.undefined(obj=obj, name=argument) - - def getattr(self, obj: t.Any, attribute: str) -> t.Any: - """Get an item or attribute of an object but prefer the attribute. - Unlike :meth:`getitem` the attribute *must* be a string. - """ - try: - return getattr(obj, attribute) - except AttributeError: - pass - try: - return obj[attribute] - except (TypeError, LookupError, AttributeError): - return self.undefined(obj=obj, name=attribute) - - def _filter_test_common( - self, - name: t.Union[str, Undefined], - value: t.Any, - args: t.Optional[t.Sequence[t.Any]], - kwargs: t.Optional[t.Mapping[str, t.Any]], - context: t.Optional[Context], - eval_ctx: t.Optional[EvalContext], - is_filter: bool, - ) -> t.Any: - if is_filter: - env_map = self.filters - type_name = "filter" - else: - env_map = self.tests - type_name = "test" - - func = env_map.get(name) # type: ignore - - if func is None: - msg = f"No {type_name} named {name!r}." - - if isinstance(name, Undefined): - try: - name._fail_with_undefined_error() - except Exception as e: - msg = f"{msg} ({e}; did you forget to quote the callable name?)" - - raise TemplateRuntimeError(msg) - - args = [value, *(args if args is not None else ())] - kwargs = kwargs if kwargs is not None else {} - pass_arg = _PassArg.from_obj(func) - - if pass_arg is _PassArg.context: - if context is None: - raise TemplateRuntimeError( - f"Attempted to invoke a context {type_name} without context." - ) - - args.insert(0, context) - elif pass_arg is _PassArg.eval_context: - if eval_ctx is None: - if context is not None: - eval_ctx = context.eval_ctx - else: - eval_ctx = EvalContext(self) - - args.insert(0, eval_ctx) - elif pass_arg is _PassArg.environment: - args.insert(0, self) - - return func(*args, **kwargs) - - def call_filter( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a filter on a value the same way the compiler does. - - This might return a coroutine if the filter is running from an - environment in async mode and the filter supports async - execution. It's your responsibility to await this if needed. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, True - ) - - def call_test( - self, - name: str, - value: t.Any, - args: t.Optional[t.Sequence[t.Any]] = None, - kwargs: t.Optional[t.Mapping[str, t.Any]] = None, - context: t.Optional[Context] = None, - eval_ctx: t.Optional[EvalContext] = None, - ) -> t.Any: - """Invoke a test on a value the same way the compiler does. - - This might return a coroutine if the test is running from an - environment in async mode and the test supports async execution. - It's your responsibility to await this if needed. - - .. versionchanged:: 3.0 - Tests support ``@pass_context``, etc. decorators. Added - the ``context`` and ``eval_ctx`` parameters. - - .. versionadded:: 2.7 - """ - return self._filter_test_common( - name, value, args, kwargs, context, eval_ctx, False - ) - - @internalcode - def parse( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> nodes.Template: - """Parse the sourcecode and return the abstract syntax tree. This - tree of nodes is used by the compiler to convert the template into - executable source- or bytecode. This is useful for debugging or to - extract information from templates. - - If you are :ref:`developing Jinja extensions ` - this gives you a good overview of the node tree generated. - """ - try: - return self._parse(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def _parse( - self, source: str, name: t.Optional[str], filename: t.Optional[str] - ) -> nodes.Template: - """Internal parsing function used by `parse` and `compile`.""" - return Parser(self, source, name, filename).parse() - - def lex( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> t.Iterator[t.Tuple[int, str, str]]: - """Lex the given sourcecode and return a generator that yields - tokens as tuples in the form ``(lineno, token_type, value)``. - This can be useful for :ref:`extension development ` - and debugging templates. - - This does not perform preprocessing. If you want the preprocessing - of the extensions to be applied you have to filter source through - the :meth:`preprocess` method. - """ - source = str(source) - try: - return self.lexer.tokeniter(source, name, filename) - except TemplateSyntaxError: - self.handle_exception(source=source) - - def preprocess( - self, - source: str, - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - ) -> str: - """Preprocesses the source with all extensions. This is automatically - called for all parsing and compiling methods but *not* for :meth:`lex` - because there you usually only want the actual source tokenized. - """ - return reduce( - lambda s, e: e.preprocess(s, name, filename), - self.iter_extensions(), - str(source), - ) - - def _tokenize( - self, - source: str, - name: t.Optional[str], - filename: t.Optional[str] = None, - state: t.Optional[str] = None, - ) -> TokenStream: - """Called by the parser to do the preprocessing and filtering - for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. - """ - source = self.preprocess(source, name, filename) - stream = self.lexer.tokenize(source, name, filename, state) - - for ext in self.iter_extensions(): - stream = ext.filter_stream(stream) # type: ignore - - if not isinstance(stream, TokenStream): - stream = TokenStream(stream, name, filename) - - return stream - - def _generate( - self, - source: nodes.Template, - name: t.Optional[str], - filename: t.Optional[str], - defer_init: bool = False, - ) -> str: - """Internal hook that can be overridden to hook a different generate - method in. - - .. versionadded:: 2.5 - """ - return generate( # type: ignore - source, - self, - name, - filename, - defer_init=defer_init, - optimized=self.optimized, - ) - - def _compile(self, source: str, filename: str) -> CodeType: - """Internal hook that can be overridden to hook a different compile - method in. - - .. versionadded:: 2.5 - """ - return compile(source, filename, "exec") - - @typing.overload - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[False]" = False, - defer_init: bool = False, - ) -> CodeType: ... - - @typing.overload - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: "te.Literal[True]" = ..., - defer_init: bool = False, - ) -> str: ... - - @internalcode - def compile( - self, - source: t.Union[str, nodes.Template], - name: t.Optional[str] = None, - filename: t.Optional[str] = None, - raw: bool = False, - defer_init: bool = False, - ) -> t.Union[str, CodeType]: - """Compile a node or template source code. The `name` parameter is - the load name of the template after it was joined using - :meth:`join_path` if necessary, not the filename on the file system. - the `filename` parameter is the estimated filename of the template on - the file system. If the template came from a database or memory this - can be omitted. - - The return value of this method is a python code object. If the `raw` - parameter is `True` the return value will be a string with python - code equivalent to the bytecode returned otherwise. This method is - mainly used internally. - - `defer_init` is use internally to aid the module code generator. This - causes the generated code to be able to import without the global - environment variable to be set. - - .. versionadded:: 2.4 - `defer_init` parameter added. - """ - source_hint = None - try: - if isinstance(source, str): - source_hint = source - source = self._parse(source, name, filename) - source = self._generate(source, name, filename, defer_init=defer_init) - if raw: - return source - if filename is None: - filename = "