From ef5f57e67808728ed06a3a97115f917295b7d484 Mon Sep 17 00:00:00 2001 From: Julia Date: Sun, 2 Feb 2025 00:02:31 -0500 Subject: [PATCH] fixed subscription table --- .venv/bin/Activate.ps1 | 247 + .venv/bin/activate | 70 + .venv/bin/activate.csh | 27 + .venv/bin/activate.fish | 69 + .venv/bin/ipython | 8 + .venv/bin/ipython3 | 8 + .venv/bin/markdown-it | 8 + .venv/bin/pip | 8 + .venv/bin/pip3 | 8 + .venv/bin/pip3.12 | 8 + .venv/bin/pygmentize | 8 + .venv/bin/python | 1 + .venv/bin/python3 | 1 + .venv/bin/python3.12 | 1 + .venv/bin/uwsgi | Bin 0 -> 1200232 bytes .../site-packages/IPython/__init__.py | 163 + .../site-packages/IPython/__main__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5900 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 308 bytes .../__pycache__/conftest.cpython-312.pyc | Bin 0 -> 3983 bytes .../__pycache__/consoleapp.cpython-312.pyc | Bin 0 -> 560 bytes .../__pycache__/display.cpython-312.pyc | Bin 0 -> 960 bytes .../IPython/__pycache__/paths.cpython-312.pyc | Bin 0 -> 5769 bytes .../site-packages/IPython/conftest.py | 87 + .../site-packages/IPython/consoleapp.py | 12 + .../site-packages/IPython/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 188 bytes .../core/__pycache__/alias.cpython-312.pyc | Bin 0 -> 10530 bytes .../__pycache__/application.cpython-312.pyc | Bin 0 -> 22891 bytes .../__pycache__/async_helpers.cpython-312.pyc | Bin 0 -> 6264 bytes .../core/__pycache__/autocall.cpython-312.pyc | Bin 0 -> 2367 bytes .../__pycache__/builtin_trap.cpython-312.pyc | Bin 0 -> 4031 bytes .../__pycache__/compilerop.cpython-312.pyc | Bin 0 -> 7046 bytes .../__pycache__/completer.cpython-312.pyc | Bin 0 -> 125529 bytes .../__pycache__/completerlib.cpython-312.pyc | Bin 0 -> 14282 bytes .../__pycache__/crashhandler.cpython-312.pyc | Bin 0 -> 9232 bytes .../core/__pycache__/debugger.cpython-312.pyc | Bin 0 -> 44328 bytes .../core/__pycache__/display.cpython-312.pyc | Bin 0 -> 52332 bytes .../display_functions.cpython-312.pyc | Bin 0 -> 13502 bytes .../__pycache__/display_trap.cpython-312.pyc | Bin 0 -> 2302 bytes .../__pycache__/displayhook.cpython-312.pyc | Bin 0 -> 15112 bytes .../__pycache__/displaypub.cpython-312.pyc | Bin 0 -> 6073 bytes .../core/__pycache__/error.cpython-312.pyc | Bin 0 -> 1802 bytes .../core/__pycache__/events.cpython-312.pyc | Bin 0 -> 6287 bytes .../core/__pycache__/excolors.cpython-312.pyc | Bin 0 -> 5323 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 6303 bytes .../__pycache__/formatters.cpython-312.pyc | Bin 0 -> 40845 bytes .../__pycache__/getipython.cpython-312.pyc | Bin 0 -> 687 bytes .../__pycache__/guarded_eval.cpython-312.pyc | Bin 0 -> 34286 bytes .../core/__pycache__/history.cpython-312.pyc | Bin 0 -> 41410 bytes .../__pycache__/historyapp.cpython-312.pyc | Bin 0 -> 7633 bytes .../core/__pycache__/hooks.cpython-312.pyc | Bin 0 -> 6249 bytes .../__pycache__/inputsplitter.cpython-312.pyc | Bin 0 -> 28868 bytes .../inputtransformer.cpython-312.pyc | Bin 0 -> 23986 bytes .../inputtransformer2.cpython-312.pyc | Bin 0 -> 35719 bytes .../interactiveshell.cpython-312.pyc | Bin 0 -> 151869 bytes .../__pycache__/latex_symbols.cpython-312.pyc | Bin 0 -> 53880 bytes .../core/__pycache__/logger.cpython-312.pyc | Bin 0 -> 9192 bytes .../core/__pycache__/macro.cpython-312.pyc | Bin 0 -> 2498 bytes .../core/__pycache__/magic.cpython-312.pyc | Bin 0 -> 28127 bytes .../magic_arguments.cpython-312.pyc | Bin 0 -> 11800 bytes .../core/__pycache__/oinspect.cpython-312.pyc | Bin 0 -> 43663 bytes .../core/__pycache__/page.cpython-312.pyc | Bin 0 -> 12712 bytes .../core/__pycache__/payload.cpython-312.pyc | Bin 0 -> 1834 bytes .../__pycache__/payloadpage.cpython-312.pyc | Bin 0 -> 1706 bytes .../__pycache__/prefilter.cpython-312.pyc | Bin 0 -> 28510 bytes .../__pycache__/profileapp.cpython-312.pyc | Bin 0 -> 13236 bytes .../__pycache__/profiledir.cpython-312.pyc | Bin 0 -> 11297 bytes .../core/__pycache__/prompts.cpython-312.pyc | Bin 0 -> 1460 bytes .../__pycache__/pylabtools.cpython-312.pyc | Bin 0 -> 17184 bytes .../core/__pycache__/release.cpython-312.pyc | Bin 0 -> 846 bytes .../core/__pycache__/shellapp.cpython-312.pyc | Bin 0 -> 24057 bytes .../__pycache__/splitinput.cpython-312.pyc | Bin 0 -> 4975 bytes .../core/__pycache__/ultratb.cpython-312.pyc | Bin 0 -> 57927 bytes .../core/__pycache__/usage.cpython-312.pyc | Bin 0 -> 13514 bytes .../site-packages/IPython/core/alias.py | 267 + .../site-packages/IPython/core/application.py | 492 + .../IPython/core/async_helpers.py | 155 + .../site-packages/IPython/core/autocall.py | 70 + .../IPython/core/builtin_trap.py | 86 + .../site-packages/IPython/core/compilerop.py | 214 + .../site-packages/IPython/core/completer.py | 3421 +++++++ .../IPython/core/completerlib.py | 382 + .../IPython/core/crashhandler.py | 248 + .../site-packages/IPython/core/debugger.py | 1136 +++ .../site-packages/IPython/core/display.py | 1373 +++ .../IPython/core/display_functions.py | 391 + .../IPython/core/display_trap.py | 70 + .../site-packages/IPython/core/displayhook.py | 336 + .../site-packages/IPython/core/displaypub.py | 149 + .../site-packages/IPython/core/error.py | 60 + .../site-packages/IPython/core/events.py | 158 + .../site-packages/IPython/core/excolors.py | 192 + .../site-packages/IPython/core/extensions.py | 135 + .../site-packages/IPython/core/formatters.py | 1090 +++ .../site-packages/IPython/core/getipython.py | 24 + .../IPython/core/guarded_eval.py | 895 ++ .../site-packages/IPython/core/history.py | 989 ++ .../site-packages/IPython/core/historyapp.py | 158 + .../site-packages/IPython/core/hooks.py | 173 + .../IPython/core/inputsplitter.py | 799 ++ .../IPython/core/inputtransformer.py | 577 ++ .../IPython/core/inputtransformer2.py | 830 ++ .../IPython/core/interactiveshell.py | 3989 ++++++++ .../IPython/core/latex_symbols.py | 1301 +++ .../site-packages/IPython/core/logger.py | 231 + .../site-packages/IPython/core/macro.py | 53 + .../site-packages/IPython/core/magic.py | 759 ++ .../IPython/core/magic_arguments.py | 310 + .../IPython/core/magics/__init__.py | 42 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1478 bytes .../__pycache__/ast_mod.cpython-312.pyc | Bin 0 -> 13237 bytes .../magics/__pycache__/auto.cpython-312.pyc | Bin 0 -> 5392 bytes .../magics/__pycache__/basic.cpython-312.pyc | Bin 0 -> 28878 bytes .../magics/__pycache__/code.cpython-312.pyc | Bin 0 -> 29107 bytes .../magics/__pycache__/config.cpython-312.pyc | Bin 0 -> 5097 bytes .../__pycache__/display.cpython-312.pyc | Bin 0 -> 3678 bytes .../__pycache__/execution.cpython-312.pyc | Bin 0 -> 65944 bytes .../__pycache__/extension.cpython-312.pyc | Bin 0 -> 2602 bytes .../__pycache__/history.cpython-312.pyc | Bin 0 -> 13177 bytes .../__pycache__/logging.cpython-312.pyc | Bin 0 -> 7072 bytes .../__pycache__/namespace.cpython-312.pyc | Bin 0 -> 26387 bytes .../magics/__pycache__/osm.cpython-312.pyc | Bin 0 -> 36224 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 6964 bytes .../magics/__pycache__/pylab.cpython-312.pyc | Bin 0 -> 6943 bytes .../magics/__pycache__/script.cpython-312.pyc | Bin 0 -> 17692 bytes .../IPython/core/magics/ast_mod.py | 330 + .../site-packages/IPython/core/magics/auto.py | 144 + .../IPython/core/magics/basic.py | 666 ++ .../site-packages/IPython/core/magics/code.py | 757 ++ .../IPython/core/magics/config.py | 140 + .../IPython/core/magics/display.py | 93 + .../IPython/core/magics/execution.py | 1638 ++++ .../IPython/core/magics/extension.py | 63 + .../IPython/core/magics/history.py | 338 + .../IPython/core/magics/logging.py | 195 + .../IPython/core/magics/namespace.py | 711 ++ .../site-packages/IPython/core/magics/osm.py | 855 ++ .../IPython/core/magics/packaging.py | 181 + .../IPython/core/magics/pylab.py | 173 + .../IPython/core/magics/script.py | 393 + .../site-packages/IPython/core/oinspect.py | 1283 +++ .../site-packages/IPython/core/page.py | 348 + .../site-packages/IPython/core/payload.py | 54 + .../site-packages/IPython/core/payloadpage.py | 51 + .../site-packages/IPython/core/prefilter.py | 707 ++ .../IPython/core/profile/README_STARTUP | 11 + .../site-packages/IPython/core/profileapp.py | 315 + .../site-packages/IPython/core/profiledir.py | 244 + .../site-packages/IPython/core/prompts.py | 23 + .../site-packages/IPython/core/pylabtools.py | 542 ++ .../site-packages/IPython/core/release.py | 45 + .../site-packages/IPython/core/shellapp.py | 495 + .../site-packages/IPython/core/splitinput.py | 145 + .../site-packages/IPython/core/tests/2x2.jpg | Bin 0 -> 331 bytes .../site-packages/IPython/core/tests/2x2.png | Bin 0 -> 71 bytes .../IPython/core/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 194 bytes .../tests/__pycache__/bad_all.cpython-312.pyc | Bin 0 -> 525 bytes .../__pycache__/nonascii.cpython-312.pyc | Bin 0 -> 219 bytes .../__pycache__/nonascii2.cpython-312.pyc | Bin 0 -> 224 bytes .../__pycache__/print_argv.cpython-312.pyc | Bin 0 -> 292 bytes .../tests/__pycache__/refbug.cpython-312.pyc | Bin 0 -> 1529 bytes .../__pycache__/simpleerr.cpython-312.pyc | Bin 0 -> 1273 bytes .../tests/__pycache__/tclass.cpython-312.pyc | Bin 0 -> 1448 bytes .../__pycache__/test_alias.cpython-312.pyc | Bin 0 -> 3577 bytes .../test_application.cpython-312.pyc | Bin 0 -> 3931 bytes .../test_async_helpers.cpython-312.pyc | Bin 0 -> 12352 bytes .../__pycache__/test_autocall.cpython-312.pyc | Bin 0 -> 1962 bytes .../test_compilerop.cpython-312.pyc | Bin 0 -> 2750 bytes .../test_completer.cpython-312.pyc | Bin 0 -> 85107 bytes .../test_completerlib.cpython-312.pyc | Bin 0 -> 10344 bytes .../__pycache__/test_debugger.cpython-312.pyc | Bin 0 -> 19670 bytes .../__pycache__/test_display.cpython-312.pyc | Bin 0 -> 25942 bytes .../test_displayhook.cpython-312.pyc | Bin 0 -> 6695 bytes .../__pycache__/test_events.cpython-312.pyc | Bin 0 -> 5327 bytes .../test_exceptiongroup_tb.cpython-312.pyc | Bin 0 -> 4380 bytes .../test_extension.cpython-312.pyc | Bin 0 -> 5323 bytes .../test_formatters.cpython-312.pyc | Bin 0 -> 29114 bytes .../test_guarded_eval.cpython-312.pyc | Bin 0 -> 38890 bytes .../__pycache__/test_handlers.cpython-312.pyc | Bin 0 -> 2528 bytes .../__pycache__/test_history.cpython-312.pyc | Bin 0 -> 15090 bytes .../__pycache__/test_hooks.cpython-312.pyc | Bin 0 -> 3131 bytes .../__pycache__/test_imports.cpython-312.pyc | Bin 0 -> 2739 bytes .../test_inputsplitter.cpython-312.pyc | Bin 0 -> 35840 bytes .../test_inputtransformer.cpython-312.pyc | Bin 0 -> 13429 bytes .../test_inputtransformer2.cpython-312.pyc | Bin 0 -> 16530 bytes ...est_inputtransformer2_line.cpython-312.pyc | Bin 0 -> 3984 bytes .../test_interactiveshell.cpython-312.pyc | Bin 0 -> 72602 bytes .../__pycache__/test_iplib.cpython-312.pyc | Bin 0 -> 7678 bytes .../__pycache__/test_logger.cpython-312.pyc | Bin 0 -> 1755 bytes .../__pycache__/test_magic.cpython-312.pyc | Bin 0 -> 82333 bytes .../test_magic_arguments.cpython-312.pyc | Bin 0 -> 6040 bytes .../test_magic_terminal.cpython-312.pyc | Bin 0 -> 9934 bytes .../__pycache__/test_oinspect.cpython-312.pyc | Bin 0 -> 29343 bytes .../__pycache__/test_page.cpython-312.pyc | Bin 0 -> 660 bytes .../__pycache__/test_paths.cpython-312.pyc | Bin 0 -> 13358 bytes .../test_prefilter.cpython-312.pyc | Bin 0 -> 7535 bytes .../__pycache__/test_profile.cpython-312.pyc | Bin 0 -> 6937 bytes .../__pycache__/test_prompts.cpython-312.pyc | Bin 0 -> 2354 bytes .../test_pylabtools.cpython-312.pyc | Bin 0 -> 17193 bytes .../__pycache__/test_run.cpython-312.pyc | Bin 0 -> 32019 bytes .../__pycache__/test_shellapp.cpython-312.pyc | Bin 0 -> 2311 bytes .../test_splitinput.cpython-312.pyc | Bin 0 -> 1622 bytes .../__pycache__/test_ultratb.cpython-312.pyc | Bin 0 -> 25829 bytes .../IPython/core/tests/bad_all.py | 14 + .../daft_extension.cpython-312.pyc | Bin 0 -> 707 bytes .../tests/daft_extension/daft_extension.py | 12 + .../IPython/core/tests/nonascii.py | 4 + .../IPython/core/tests/nonascii2.py | 4 + .../IPython/core/tests/print_argv.py | 3 + .../IPython/core/tests/refbug.py | 46 + .../IPython/core/tests/simpleerr.py | 33 + .../IPython/core/tests/tclass.py | 34 + .../IPython/core/tests/test_alias.py | 66 + .../IPython/core/tests/test_application.py | 70 + .../IPython/core/tests/test_async_helpers.py | 325 + .../IPython/core/tests/test_autocall.py | 68 + .../IPython/core/tests/test_compilerop.py | 68 + .../IPython/core/tests/test_completer.py | 1819 ++++ .../IPython/core/tests/test_completerlib.py | 193 + .../IPython/core/tests/test_debugger.py | 592 ++ .../IPython/core/tests/test_display.py | 513 + .../IPython/core/tests/test_displayhook.py | 112 + .../IPython/core/tests/test_events.py | 78 + .../core/tests/test_exceptiongroup_tb.py | 112 + .../IPython/core/tests/test_extension.py | 95 + .../IPython/core/tests/test_formatters.py | 545 ++ .../IPython/core/tests/test_guarded_eval.py | 785 ++ .../IPython/core/tests/test_handlers.py | 75 + .../IPython/core/tests/test_history.py | 306 + .../IPython/core/tests/test_hooks.py | 76 + .../IPython/core/tests/test_imports.py | 52 + .../IPython/core/tests/test_inputsplitter.py | 643 ++ .../core/tests/test_inputtransformer.py | 469 + .../core/tests/test_inputtransformer2.py | 448 + .../core/tests/test_inputtransformer2_line.py | 167 + .../core/tests/test_interactiveshell.py | 1221 +++ .../IPython/core/tests/test_iplib.py | 246 + .../IPython/core/tests/test_logger.py | 27 + .../IPython/core/tests/test_magic.py | 1623 ++++ .../core/tests/test_magic_arguments.py | 142 + .../IPython/core/tests/test_magic_terminal.py | 216 + .../IPython/core/tests/test_oinspect.py | 589 ++ .../IPython/core/tests/test_page.py | 20 + .../IPython/core/tests/test_paths.py | 202 + .../IPython/core/tests/test_prefilter.py | 149 + .../IPython/core/tests/test_profile.py | 161 + .../IPython/core/tests/test_prompts.py | 30 + .../IPython/core/tests/test_pylabtools.py | 375 + .../IPython/core/tests/test_run.py | 626 ++ .../IPython/core/tests/test_shellapp.py | 56 + .../IPython/core/tests/test_splitinput.py | 41 + .../IPython/core/tests/test_ultratb.py | 457 + .../site-packages/IPython/core/ultratb.py | 1547 +++ .../site-packages/IPython/core/usage.py | 341 + .../site-packages/IPython/display.py | 44 + .../IPython/extensions/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 256 bytes .../__pycache__/autoreload.cpython-312.pyc | Bin 0 -> 26819 bytes .../__pycache__/storemagic.cpython-312.pyc | Bin 0 -> 10147 bytes .../IPython/extensions/autoreload.py | 727 ++ .../IPython/extensions/storemagic.py | 236 + .../IPython/extensions/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../test_autoreload.cpython-312.pyc | Bin 0 -> 32445 bytes .../test_storemagic.cpython-312.pyc | Bin 0 -> 4477 bytes .../extensions/tests/test_autoreload.py | 712 ++ .../extensions/tests/test_storemagic.py | 71 + .../IPython/external/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 393 bytes .../__pycache__/qt_for_kernel.cpython-312.pyc | Bin 0 -> 3683 bytes .../__pycache__/qt_loaders.cpython-312.pyc | Bin 0 -> 14213 bytes .../IPython/external/qt_for_kernel.py | 124 + .../IPython/external/qt_loaders.py | 423 + .../IPython/external/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../test_qt_loaders.cpython-312.pyc | Bin 0 -> 950 bytes .../IPython/external/tests/test_qt_loaders.py | 11 + .../site-packages/IPython/lib/__init__.py | 11 + .../lib/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 236 bytes .../backgroundjobs.cpython-312.pyc | Bin 0 -> 21441 bytes .../lib/__pycache__/clipboard.cpython-312.pyc | Bin 0 -> 4964 bytes .../__pycache__/deepreload.cpython-312.pyc | Bin 0 -> 9158 bytes .../lib/__pycache__/demo.cpython-312.pyc | Bin 0 -> 29149 bytes .../lib/__pycache__/display.cpython-312.pyc | Bin 0 -> 29281 bytes .../__pycache__/editorhooks.cpython-312.pyc | Bin 0 -> 4977 bytes .../__pycache__/guisupport.cpython-312.pyc | Bin 0 -> 5905 bytes .../__pycache__/latextools.cpython-312.pyc | Bin 0 -> 10400 bytes .../lib/__pycache__/lexers.cpython-312.pyc | Bin 0 -> 19475 bytes .../lib/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 44489 bytes .../IPython/lib/backgroundjobs.py | 491 + .../site-packages/IPython/lib/clipboard.py | 102 + .../site-packages/IPython/lib/deepreload.py | 310 + .../site-packages/IPython/lib/demo.py | 672 ++ .../site-packages/IPython/lib/display.py | 677 ++ .../site-packages/IPython/lib/editorhooks.py | 127 + .../site-packages/IPython/lib/guisupport.py | 155 + .../site-packages/IPython/lib/latextools.py | 257 + .../site-packages/IPython/lib/lexers.py | 540 ++ .../site-packages/IPython/lib/pretty.py | 961 ++ .../IPython/lib/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 193 bytes .../test_backgroundjobs.cpython-312.pyc | Bin 0 -> 3177 bytes .../test_clipboard.cpython-312.pyc | Bin 0 -> 827 bytes .../test_deepreload.cpython-312.pyc | Bin 0 -> 3022 bytes .../__pycache__/test_display.cpython-312.pyc | Bin 0 -> 15423 bytes .../test_editorhooks.cpython-312.pyc | Bin 0 -> 1733 bytes .../__pycache__/test_imports.cpython-312.pyc | Bin 0 -> 727 bytes .../test_latextools.cpython-312.pyc | Bin 0 -> 8751 bytes .../__pycache__/test_lexers.cpython-312.pyc | Bin 0 -> 8823 bytes .../__pycache__/test_pretty.cpython-312.pyc | Bin 0 -> 24482 bytes .../__pycache__/test_pygments.cpython-312.pyc | Bin 0 -> 1422 bytes .../site-packages/IPython/lib/tests/test.wav | Bin 0 -> 44144 bytes .../IPython/lib/tests/test_backgroundjobs.py | 85 + .../IPython/lib/tests/test_clipboard.py | 20 + .../IPython/lib/tests/test_deepreload.py | 57 + .../IPython/lib/tests/test_display.py | 272 + .../IPython/lib/tests/test_editorhooks.py | 32 + .../IPython/lib/tests/test_imports.py | 14 + .../IPython/lib/tests/test_latextools.py | 192 + .../IPython/lib/tests/test_lexers.py | 184 + .../IPython/lib/tests/test_pretty.py | 540 ++ .../IPython/lib/tests/test_pygments.py | 26 + .../python3.12/site-packages/IPython/paths.py | 125 + .../python3.12/site-packages/IPython/py.typed | 0 .../IPython/sphinxext/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 193 bytes .../custom_doctests.cpython-312.pyc | Bin 0 -> 4855 bytes ...ython_console_highlighting.cpython-312.pyc | Bin 0 -> 875 bytes .../ipython_directive.cpython-312.pyc | Bin 0 -> 40320 bytes .../IPython/sphinxext/custom_doctests.py | 155 + .../sphinxext/ipython_console_highlighting.py | 28 + .../IPython/sphinxext/ipython_directive.py | 1278 +++ .../IPython/terminal/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 192 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 739 bytes .../__pycache__/debugger.cpython-312.pyc | Bin 0 -> 9306 bytes .../__pycache__/embed.cpython-312.pyc | Bin 0 -> 17571 bytes .../interactiveshell.cpython-312.pyc | Bin 0 -> 45800 bytes .../__pycache__/ipapp.cpython-312.pyc | Bin 0 -> 14101 bytes .../__pycache__/magics.cpython-312.pyc | Bin 0 -> 10133 bytes .../__pycache__/prompts.cpython-312.pyc | Bin 0 -> 7556 bytes .../__pycache__/ptutils.cpython-312.pyc | Bin 0 -> 9760 bytes .../site-packages/IPython/terminal/console.py | 19 + .../IPython/terminal/debugger.py | 187 + .../site-packages/IPython/terminal/embed.py | 426 + .../IPython/terminal/interactiveshell.py | 1075 +++ .../site-packages/IPython/terminal/ipapp.py | 338 + .../site-packages/IPython/terminal/magics.py | 214 + .../site-packages/IPython/terminal/prompts.py | 128 + .../terminal/pt_inputhooks/__init__.py | 139 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4492 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 0 -> 2023 bytes .../__pycache__/glut.cpython-312.pyc | Bin 0 -> 4258 bytes .../__pycache__/gtk.cpython-312.pyc | Bin 0 -> 1272 bytes .../__pycache__/gtk3.cpython-312.pyc | Bin 0 -> 899 bytes .../__pycache__/gtk4.cpython-312.pyc | Bin 0 -> 1579 bytes .../__pycache__/osx.cpython-312.pyc | Bin 0 -> 5685 bytes .../__pycache__/pyglet.cpython-312.pyc | Bin 0 -> 2275 bytes .../__pycache__/qt.cpython-312.pyc | Bin 0 -> 3881 bytes .../__pycache__/tk.cpython-312.pyc | Bin 0 -> 2869 bytes .../__pycache__/wx.cpython-312.pyc | Bin 0 -> 8426 bytes .../IPython/terminal/pt_inputhooks/asyncio.py | 63 + .../IPython/terminal/pt_inputhooks/glut.py | 140 + .../IPython/terminal/pt_inputhooks/gtk.py | 60 + .../IPython/terminal/pt_inputhooks/gtk3.py | 14 + .../IPython/terminal/pt_inputhooks/gtk4.py | 27 + .../IPython/terminal/pt_inputhooks/osx.py | 147 + .../IPython/terminal/pt_inputhooks/pyglet.py | 66 + .../IPython/terminal/pt_inputhooks/qt.py | 90 + .../IPython/terminal/pt_inputhooks/tk.py | 90 + .../IPython/terminal/pt_inputhooks/wx.py | 219 + .../site-packages/IPython/terminal/ptutils.py | 204 + .../IPython/terminal/shortcuts/__init__.py | 638 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 21950 bytes .../__pycache__/auto_match.cpython-312.pyc | Bin 0 -> 4793 bytes .../__pycache__/auto_suggest.cpython-312.pyc | Bin 0 -> 29366 bytes .../__pycache__/filters.cpython-312.pyc | Bin 0 -> 13715 bytes .../IPython/terminal/shortcuts/auto_match.py | 105 + .../terminal/shortcuts/auto_suggest.py | 648 ++ .../IPython/terminal/shortcuts/filters.py | 322 + .../IPython/terminal/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../test_debug_magic.cpython-312.pyc | Bin 0 -> 2940 bytes .../__pycache__/test_embed.cpython-312.pyc | Bin 0 -> 5717 bytes .../__pycache__/test_help.cpython-312.pyc | Bin 0 -> 1693 bytes .../test_interactivshell.cpython-312.pyc | Bin 0 -> 12928 bytes .../test_pt_inputhooks.cpython-312.pyc | Bin 0 -> 2002 bytes .../test_shortcuts.cpython-312.pyc | Bin 0 -> 20195 bytes .../terminal/tests/test_debug_magic.py | 82 + .../IPython/terminal/tests/test_embed.py | 138 + .../IPython/terminal/tests/test_help.py | 30 + .../terminal/tests/test_interactivshell.py | 255 + .../terminal/tests/test_pt_inputhooks.py | 50 + .../IPython/terminal/tests/test_shortcuts.py | 485 + .../site-packages/IPython/testing/__init__.py | 20 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 417 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 7623 bytes .../__pycache__/globalipapp.cpython-312.pyc | Bin 0 -> 3868 bytes .../__pycache__/ipunittest.cpython-312.pyc | Bin 0 -> 7383 bytes .../__pycache__/skipdoctest.cpython-312.pyc | Bin 0 -> 899 bytes .../testing/__pycache__/tools.cpython-312.pyc | Bin 0 -> 18439 bytes .../IPython/testing/decorators.py | 204 + .../IPython/testing/globalipapp.py | 114 + .../IPython/testing/ipunittest.py | 186 + .../IPython/testing/plugin/README.txt | 34 + .../IPython/testing/plugin/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../__pycache__/dtexample.cpython-312.pyc | Bin 0 -> 3642 bytes .../__pycache__/ipdoctest.cpython-312.pyc | Bin 0 -> 11820 bytes .../pytest_ipdoctest.cpython-312.pyc | Bin 0 -> 38368 bytes .../plugin/__pycache__/setup.cpython-312.pyc | Bin 0 -> 672 bytes .../plugin/__pycache__/simple.cpython-312.pyc | Bin 0 -> 1060 bytes .../__pycache__/simplevars.cpython-312.pyc | Bin 0 -> 256 bytes .../test_ipdoctest.cpython-312.pyc | Bin 0 -> 2493 bytes .../__pycache__/test_refs.cpython-312.pyc | Bin 0 -> 1084 bytes .../IPython/testing/plugin/dtexample.py | 167 + .../IPython/testing/plugin/ipdoctest.py | 299 + .../testing/plugin/pytest_ipdoctest.py | 879 ++ .../IPython/testing/plugin/setup.py | 18 + .../IPython/testing/plugin/simple.py | 44 + .../IPython/testing/plugin/simplevars.py | 2 + .../IPython/testing/plugin/test_combo.txt | 36 + .../IPython/testing/plugin/test_example.txt | 24 + .../IPython/testing/plugin/test_exampleip.txt | 30 + .../IPython/testing/plugin/test_ipdoctest.py | 92 + .../IPython/testing/plugin/test_refs.py | 39 + .../IPython/testing/skipdoctest.py | 19 + .../IPython/testing/tests/__init__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 239 bytes .../test_decorators.cpython-312.pyc | Bin 0 -> 5649 bytes .../test_ipunittest.cpython-312.pyc | Bin 0 -> 3422 bytes .../__pycache__/test_tools.cpython-312.pyc | Bin 0 -> 5917 bytes .../IPython/testing/tests/test_decorators.py | 168 + .../IPython/testing/tests/test_ipunittest.py | 131 + .../IPython/testing/tests/test_tools.py | 133 + .../site-packages/IPython/testing/tools.py | 471 + .../site-packages/IPython/utils/PyColorize.py | 331 + .../site-packages/IPython/utils/__init__.py | 0 .../__pycache__/PyColorize.cpython-312.pyc | Bin 0 -> 11730 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 189 bytes .../__pycache__/_process_cli.cpython-312.pyc | Bin 0 -> 2864 bytes .../_process_common.cpython-312.pyc | Bin 0 -> 7741 bytes .../_process_emscripten.cpython-312.pyc | Bin 0 -> 847 bytes .../_process_posix.cpython-312.pyc | Bin 0 -> 6366 bytes .../_process_win32.cpython-312.pyc | Bin 0 -> 7203 bytes .../_process_win32_controller.cpython-312.pyc | Bin 0 -> 21723 bytes .../__pycache__/_sysinfo.cpython-312.pyc | Bin 0 -> 214 bytes .../utils/__pycache__/capture.cpython-312.pyc | Bin 0 -> 8176 bytes .../__pycache__/colorable.cpython-312.pyc | Bin 0 -> 1083 bytes .../__pycache__/coloransi.cpython-312.pyc | Bin 0 -> 9123 bytes .../__pycache__/contexts.cpython-312.pyc | Bin 0 -> 2247 bytes .../__pycache__/daemonize.cpython-312.pyc | Bin 0 -> 450 bytes .../utils/__pycache__/data.cpython-312.pyc | Bin 0 -> 1182 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 2524 bytes .../utils/__pycache__/dir2.cpython-312.pyc | Bin 0 -> 2555 bytes .../utils/__pycache__/docs.cpython-312.pyc | Bin 0 -> 351 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2177 bytes .../__pycache__/eventful.cpython-312.pyc | Bin 0 -> 373 bytes .../utils/__pycache__/frame.cpython-312.pyc | Bin 0 -> 3791 bytes .../__pycache__/generics.cpython-312.pyc | Bin 0 -> 1081 bytes .../__pycache__/importstring.cpython-312.pyc | Bin 0 -> 1304 bytes .../utils/__pycache__/io.cpython-312.pyc | Bin 0 -> 6786 bytes .../__pycache__/ipstruct.cpython-312.pyc | Bin 0 -> 12608 bytes .../__pycache__/jsonutil.cpython-312.pyc | Bin 0 -> 383 bytes .../localinterfaces.cpython-312.pyc | Bin 0 -> 412 bytes .../utils/__pycache__/log.cpython-312.pyc | Bin 0 -> 353 bytes .../__pycache__/module_paths.cpython-312.pyc | Bin 0 -> 1571 bytes .../utils/__pycache__/openpy.cpython-312.pyc | Bin 0 -> 4610 bytes .../utils/__pycache__/path.cpython-312.pyc | Bin 0 -> 15904 bytes .../utils/__pycache__/process.cpython-312.pyc | Bin 0 -> 2766 bytes .../__pycache__/py3compat.cpython-312.pyc | Bin 0 -> 2382 bytes .../__pycache__/sentinel.cpython-312.pyc | Bin 0 -> 907 bytes .../__pycache__/shimmodule.cpython-312.pyc | Bin 0 -> 4777 bytes .../__pycache__/signatures.cpython-312.pyc | Bin 0 -> 813 bytes .../__pycache__/strdispatch.cpython-312.pyc | Bin 0 -> 3159 bytes .../utils/__pycache__/sysinfo.cpython-312.pyc | Bin 0 -> 4929 bytes .../syspathcontext.cpython-312.pyc | Bin 0 -> 2822 bytes .../utils/__pycache__/tempdir.cpython-312.pyc | Bin 0 -> 3491 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 4351 bytes .../utils/__pycache__/text.cpython-312.pyc | Bin 0 -> 31824 bytes .../utils/__pycache__/timing.cpython-312.pyc | Bin 0 -> 4419 bytes .../__pycache__/tokenutil.cpython-312.pyc | Bin 0 -> 5760 bytes .../__pycache__/traitlets.cpython-312.pyc | Bin 0 -> 379 bytes .../utils/__pycache__/tz.cpython-312.pyc | Bin 0 -> 2351 bytes .../__pycache__/ulinecache.cpython-312.pyc | Bin 0 -> 1033 bytes .../utils/__pycache__/version.cpython-312.pyc | Bin 0 -> 1200 bytes .../__pycache__/wildcard.cpython-312.pyc | Bin 0 -> 4684 bytes .../IPython/utils/_process_cli.py | 71 + .../IPython/utils/_process_common.py | 210 + .../IPython/utils/_process_emscripten.py | 22 + .../IPython/utils/_process_posix.py | 219 + .../IPython/utils/_process_win32.py | 184 + .../utils/_process_win32_controller.py | 573 ++ .../site-packages/IPython/utils/_sysinfo.py | 2 + .../site-packages/IPython/utils/capture.py | 170 + .../site-packages/IPython/utils/colorable.py | 25 + .../site-packages/IPython/utils/coloransi.py | 246 + .../site-packages/IPython/utils/contexts.py | 61 + .../site-packages/IPython/utils/daemonize.py | 4 + .../site-packages/IPython/utils/data.py | 30 + .../site-packages/IPython/utils/decorators.py | 83 + .../site-packages/IPython/utils/dir2.py | 84 + .../site-packages/IPython/utils/docs.py | 3 + .../site-packages/IPython/utils/encoding.py | 71 + .../site-packages/IPython/utils/eventful.py | 5 + .../site-packages/IPython/utils/frame.py | 94 + .../site-packages/IPython/utils/generics.py | 29 + .../IPython/utils/importstring.py | 39 + .../site-packages/IPython/utils/io.py | 153 + .../site-packages/IPython/utils/ipstruct.py | 379 + .../site-packages/IPython/utils/jsonutil.py | 5 + .../IPython/utils/localinterfaces.py | 5 + .../site-packages/IPython/utils/log.py | 5 + .../IPython/utils/module_paths.py | 72 + .../site-packages/IPython/utils/openpy.py | 105 + .../site-packages/IPython/utils/path.py | 407 + .../site-packages/IPython/utils/process.py | 71 + .../site-packages/IPython/utils/py3compat.py | 68 + .../site-packages/IPython/utils/sentinel.py | 17 + .../site-packages/IPython/utils/shimmodule.py | 89 + .../site-packages/IPython/utils/signatures.py | 12 + .../IPython/utils/strdispatch.py | 68 + .../site-packages/IPython/utils/sysinfo.py | 143 + .../IPython/utils/syspathcontext.py | 71 + .../site-packages/IPython/utils/tempdir.py | 59 + .../site-packages/IPython/utils/terminal.py | 131 + .../IPython/utils/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 195 bytes .../__pycache__/test_capture.cpython-312.pyc | Bin 0 -> 7337 bytes .../test_decorators.cpython-312.pyc | Bin 0 -> 654 bytes .../test_deprecated.cpython-312.pyc | Bin 0 -> 611 bytes .../__pycache__/test_dir2.cpython-312.pyc | Bin 0 -> 3525 bytes .../__pycache__/test_imports.cpython-312.pyc | Bin 0 -> 1120 bytes .../test_importstring.cpython-312.pyc | Bin 0 -> 1116 bytes .../tests/__pycache__/test_io.cpython-312.pyc | Bin 0 -> 2806 bytes .../test_module_paths.cpython-312.pyc | Bin 0 -> 4154 bytes .../__pycache__/test_openpy.cpython-312.pyc | Bin 0 -> 2344 bytes .../__pycache__/test_path.cpython-312.pyc | Bin 0 -> 27713 bytes .../__pycache__/test_process.cpython-312.pyc | Bin 0 -> 8805 bytes .../test_pycolorize.cpython-312.pyc | Bin 0 -> 1923 bytes .../test_shimmodule.cpython-312.pyc | Bin 0 -> 839 bytes .../__pycache__/test_sysinfo.cpython-312.pyc | Bin 0 -> 972 bytes .../__pycache__/test_tempdir.cpython-312.pyc | Bin 0 -> 1640 bytes .../__pycache__/test_text.cpython-312.pyc | Bin 0 -> 10882 bytes .../test_tokenutil.cpython-312.pyc | Bin 0 -> 5775 bytes .../__pycache__/test_wildcard.cpython-312.pyc | Bin 0 -> 6252 bytes .../IPython/utils/tests/test_capture.py | 166 + .../IPython/utils/tests/test_decorators.py | 10 + .../IPython/utils/tests/test_deprecated.py | 7 + .../IPython/utils/tests/test_dir2.py | 66 + .../IPython/utils/tests/test_imports.py | 20 + .../IPython/utils/tests/test_importstring.py | 40 + .../IPython/utils/tests/test_io.py | 61 + .../IPython/utils/tests/test_module_paths.py | 107 + .../IPython/utils/tests/test_openpy.py | 38 + .../IPython/utils/tests/test_path.py | 506 + .../IPython/utils/tests/test_process.py | 188 + .../IPython/utils/tests/test_pycolorize.py | 70 + .../IPython/utils/tests/test_shimmodule.py | 12 + .../IPython/utils/tests/test_sysinfo.py | 22 + .../IPython/utils/tests/test_tempdir.py | 29 + .../IPython/utils/tests/test_text.py | 268 + .../IPython/utils/tests/test_tokenutil.py | 141 + .../IPython/utils/tests/test_wildcard.py | 143 + .../site-packages/IPython/utils/text.py | 886 ++ .../site-packages/IPython/utils/timing.py | 123 + .../site-packages/IPython/utils/tokenutil.py | 160 + .../site-packages/IPython/utils/traitlets.py | 6 + .../site-packages/IPython/utils/tz.py | 82 + .../site-packages/IPython/utils/ulinecache.py | 21 + .../site-packages/IPython/utils/version.py | 43 + .../site-packages/IPython/utils/wildcard.py | 111 + .../__pycache__/decorator.cpython-312.pyc | Bin 0 -> 20920 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 139469 bytes .../uwsgidecorators.cpython-312.pyc | Bin 0 -> 21537 bytes .../annotated_types-0.7.0.dist-info/INSTALLER | 1 + .../annotated_types-0.7.0.dist-info/METADATA | 295 + .../annotated_types-0.7.0.dist-info/RECORD | 10 + .../annotated_types-0.7.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/annotated_types/__init__.py | 432 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18622 bytes .../__pycache__/test_cases.cpython-312.pyc | Bin 0 -> 13241 bytes .../site-packages/annotated_types/py.typed | 0 .../annotated_types/test_cases.py | 151 + .../asttokens-3.0.0.dist-info/INSTALLER | 1 + .../asttokens-3.0.0.dist-info/LICENSE | 201 + .../asttokens-3.0.0.dist-info/METADATA | 118 + .../asttokens-3.0.0.dist-info/RECORD | 21 + .../asttokens-3.0.0.dist-info/WHEEL | 5 + .../asttokens-3.0.0.dist-info/top_level.txt | 1 + .../site-packages/asttokens/__init__.py | 24 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 597 bytes .../astroid_compat.cpython-312.pyc | Bin 0 -> 665 bytes .../__pycache__/asttokens.cpython-312.pyc | Bin 0 -> 18003 bytes .../__pycache__/line_numbers.cpython-312.pyc | Bin 0 -> 3643 bytes .../__pycache__/mark_tokens.cpython-312.pyc | Bin 0 -> 19997 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 20502 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 210 bytes .../site-packages/asttokens/astroid_compat.py | 18 + .../site-packages/asttokens/asttokens.py | 450 + .../site-packages/asttokens/line_numbers.py | 76 + .../site-packages/asttokens/mark_tokens.py | 467 + .../site-packages/asttokens/py.typed | 0 .../site-packages/asttokens/util.py | 485 + .../site-packages/asttokens/version.py | 1 + .../decorator-5.1.1.dist-info/INSTALLER | 1 + .../decorator-5.1.1.dist-info/LICENSE.txt | 26 + .../decorator-5.1.1.dist-info/METADATA | 127 + .../decorator-5.1.1.dist-info/RECORD | 9 + .../decorator-5.1.1.dist-info/WHEEL | 5 + .../decorator-5.1.1.dist-info/pbr.json | 1 + .../decorator-5.1.1.dist-info/top_level.txt | 1 + .../lib/python3.12/site-packages/decorator.py | 451 + .../executing-2.2.0.dist-info/INSTALLER | 1 + .../executing-2.2.0.dist-info/LICENSE.txt | 21 + .../executing-2.2.0.dist-info/METADATA | 170 + .../executing-2.2.0.dist-info/RECORD | 19 + .../executing-2.2.0.dist-info/WHEEL | 6 + .../executing-2.2.0.dist-info/top_level.txt | 1 + .../site-packages/executing/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1112 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 0 -> 1130 bytes .../_position_node_finder.cpython-312.pyc | Bin 0 -> 35164 bytes .../__pycache__/_pytest_utils.cpython-312.pyc | Bin 0 -> 739 bytes .../__pycache__/executing.cpython-312.pyc | Bin 0 -> 48963 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 210 bytes .../site-packages/executing/_exceptions.py | 22 + .../executing/_position_node_finder.py | 992 ++ .../site-packages/executing/_pytest_utils.py | 16 + .../site-packages/executing/executing.py | 1160 +++ .../site-packages/executing/py.typed | 0 .../site-packages/executing/version.py | 1 + .../ipython-8.32.0.dist-info/INSTALLER | 1 + .../ipython-8.32.0.dist-info/LICENSE | 33 + .../ipython-8.32.0.dist-info/METADATA | 128 + .../ipython-8.32.0.dist-info/RECORD | 570 ++ .../ipython-8.32.0.dist-info/REQUESTED | 0 .../ipython-8.32.0.dist-info/WHEEL | 5 + .../ipython-8.32.0.dist-info/entry_points.txt | 8 + .../ipython-8.32.0.dist-info/top_level.txt | 1 + .../jedi-0.19.2.dist-info/AUTHORS.txt | 72 + .../jedi-0.19.2.dist-info/INSTALLER | 1 + .../jedi-0.19.2.dist-info/LICENSE.txt | 24 + .../jedi-0.19.2.dist-info/METADATA | 623 ++ .../jedi-0.19.2.dist-info/RECORD | 1965 ++++ .../site-packages/jedi-0.19.2.dist-info/WHEEL | 6 + .../jedi-0.19.2.dist-info/top_level.txt | 1 + .../python3.12/site-packages/jedi/__init__.py | 42 + .../python3.12/site-packages/jedi/__main__.py | 72 + .../jedi/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1800 bytes .../jedi/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 3323 bytes .../_compatibility.cpython-312.pyc | Bin 0 -> 1808 bytes .../jedi/__pycache__/cache.cpython-312.pyc | Bin 0 -> 5376 bytes .../jedi/__pycache__/common.cpython-312.pyc | Bin 0 -> 1346 bytes .../jedi/__pycache__/debug.cpython-312.pyc | Bin 0 -> 5076 bytes .../jedi/__pycache__/file_io.cpython-312.pyc | Bin 0 -> 5354 bytes .../__pycache__/parser_utils.cpython-312.pyc | Bin 0 -> 14422 bytes .../jedi/__pycache__/settings.cpython-312.pyc | Bin 0 -> 2454 bytes .../jedi/__pycache__/utils.cpython-312.pyc | Bin 0 -> 5763 bytes .../site-packages/jedi/_compatibility.py | 45 + .../site-packages/jedi/api/__init__.py | 798 ++ .../api/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 36912 bytes .../api/__pycache__/classes.cpython-312.pyc | Bin 0 -> 39448 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 31523 bytes .../completion_cache.cpython-312.pyc | Bin 0 -> 1697 bytes .../__pycache__/environment.cpython-312.pyc | Bin 0 -> 19358 bytes .../api/__pycache__/errors.cpython-312.pyc | Bin 0 -> 2626 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 1685 bytes .../api/__pycache__/file_name.cpython-312.pyc | Bin 0 -> 7209 bytes .../api/__pycache__/helpers.cpython-312.pyc | Bin 0 -> 21263 bytes .../__pycache__/interpreter.cpython-312.pyc | Bin 0 -> 4247 bytes .../api/__pycache__/keywords.cpython-312.pyc | Bin 0 -> 2308 bytes .../api/__pycache__/project.cpython-312.pyc | Bin 0 -> 19267 bytes .../__pycache__/replstartup.cpython-312.pyc | Bin 0 -> 1151 bytes .../api/__pycache__/strings.cpython-312.pyc | Bin 0 -> 4731 bytes .../site-packages/jedi/api/classes.py | 895 ++ .../site-packages/jedi/api/completion.py | 696 ++ .../jedi/api/completion_cache.py | 31 + .../site-packages/jedi/api/environment.py | 480 + .../site-packages/jedi/api/errors.py | 46 + .../site-packages/jedi/api/exceptions.py | 31 + .../site-packages/jedi/api/file_name.py | 155 + .../site-packages/jedi/api/helpers.py | 522 + .../site-packages/jedi/api/interpreter.py | 74 + .../site-packages/jedi/api/keywords.py | 51 + .../site-packages/jedi/api/project.py | 448 + .../jedi/api/refactoring/__init__.py | 264 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14130 bytes .../__pycache__/extract.cpython-312.pyc | Bin 0 -> 16117 bytes .../jedi/api/refactoring/extract.py | 386 + .../site-packages/jedi/api/replstartup.py | 29 + .../site-packages/jedi/api/strings.py | 111 + .../python3.12/site-packages/jedi/cache.py | 115 + .../python3.12/site-packages/jedi/common.py | 24 + .../python3.12/site-packages/jedi/debug.py | 132 + .../python3.12/site-packages/jedi/file_io.py | 83 + .../site-packages/jedi/inference/__init__.py | 199 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 10341 bytes .../__pycache__/analysis.cpython-312.pyc | Bin 0 -> 10970 bytes .../__pycache__/arguments.cpython-312.pyc | Bin 0 -> 15935 bytes .../__pycache__/base_value.cpython-312.pyc | Bin 0 -> 31511 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 5620 bytes .../__pycache__/context.cpython-312.pyc | Bin 0 -> 24329 bytes .../docstring_utils.cpython-312.pyc | Bin 0 -> 1842 bytes .../__pycache__/docstrings.cpython-312.pyc | Bin 0 -> 13213 bytes .../dynamic_params.cpython-312.pyc | Bin 0 -> 8955 bytes .../__pycache__/filters.cpython-312.pyc | Bin 0 -> 21522 bytes .../__pycache__/finder.cpython-312.pyc | Bin 0 -> 6582 bytes .../__pycache__/flow_analysis.cpython-312.pyc | Bin 0 -> 5272 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 7780 bytes .../__pycache__/imports.cpython-312.pyc | Bin 0 -> 22223 bytes .../__pycache__/lazy_value.cpython-312.pyc | Bin 0 -> 4166 bytes .../__pycache__/names.cpython-312.pyc | Bin 0 -> 34219 bytes .../__pycache__/param.cpython-312.pyc | Bin 0 -> 10909 bytes .../__pycache__/parser_cache.cpython-312.pyc | Bin 0 -> 531 bytes .../__pycache__/recursion.cpython-312.pyc | Bin 0 -> 6075 bytes .../__pycache__/references.cpython-312.pyc | Bin 0 -> 13946 bytes .../__pycache__/signature.cpython-312.pyc | Bin 0 -> 8349 bytes .../__pycache__/star_args.cpython-312.pyc | Bin 0 -> 9194 bytes .../__pycache__/syntax_tree.cpython-312.pyc | Bin 0 -> 39877 bytes .../__pycache__/sys_path.cpython-312.pyc | Bin 0 -> 11904 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5018 bytes .../site-packages/jedi/inference/analysis.py | 213 + .../site-packages/jedi/inference/arguments.py | 335 + .../jedi/inference/base_value.py | 558 ++ .../site-packages/jedi/inference/cache.py | 126 + .../jedi/inference/compiled/__init__.py | 70 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3946 bytes .../__pycache__/access.cpython-312.pyc | Bin 0 -> 26841 bytes .../getattr_static.cpython-312.pyc | Bin 0 -> 4894 bytes .../__pycache__/mixed.cpython-312.pyc | Bin 0 -> 13746 bytes .../__pycache__/value.cpython-312.pyc | Bin 0 -> 32910 bytes .../jedi/inference/compiled/access.py | 562 ++ .../jedi/inference/compiled/getattr_static.py | 121 + .../jedi/inference/compiled/mixed.py | 309 + .../inference/compiled/subprocess/__init__.py | 512 + .../inference/compiled/subprocess/__main__.py | 40 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 23964 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 2104 bytes .../__pycache__/functions.cpython-312.pyc | Bin 0 -> 10541 bytes .../compiled/subprocess/functions.py | 257 + .../jedi/inference/compiled/value.py | 626 ++ .../site-packages/jedi/inference/context.py | 499 + .../jedi/inference/docstring_utils.py | 21 + .../jedi/inference/docstrings.py | 286 + .../jedi/inference/dynamic_params.py | 224 + .../site-packages/jedi/inference/filters.py | 371 + .../site-packages/jedi/inference/finder.py | 146 + .../jedi/inference/flow_analysis.py | 125 + .../jedi/inference/gradual/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 351 bytes .../__pycache__/annotation.cpython-312.pyc | Bin 0 -> 18998 bytes .../gradual/__pycache__/base.cpython-312.pyc | Bin 0 -> 22706 bytes .../__pycache__/conversion.cpython-312.pyc | Bin 0 -> 8788 bytes .../__pycache__/generics.cpython-312.pyc | Bin 0 -> 7081 bytes .../__pycache__/stub_value.cpython-312.pyc | Bin 0 -> 5707 bytes .../__pycache__/type_var.cpython-312.pyc | Bin 0 -> 6783 bytes .../__pycache__/typeshed.cpython-312.pyc | Bin 0 -> 11656 bytes .../__pycache__/typing.cpython-312.pyc | Bin 0 -> 24384 bytes .../gradual/__pycache__/utils.cpython-312.pyc | Bin 0 -> 1415 bytes .../jedi/inference/gradual/annotation.py | 474 + .../jedi/inference/gradual/base.py | 434 + .../jedi/inference/gradual/conversion.py | 209 + .../jedi/inference/gradual/generics.py | 101 + .../jedi/inference/gradual/stub_value.py | 102 + .../jedi/inference/gradual/type_var.py | 127 + .../jedi/inference/gradual/typeshed.py | 310 + .../jedi/inference/gradual/typing.py | 488 + .../jedi/inference/gradual/utils.py | 35 + .../site-packages/jedi/inference/helpers.py | 202 + .../site-packages/jedi/inference/imports.py | 592 ++ .../jedi/inference/lazy_value.py | 61 + .../site-packages/jedi/inference/names.py | 677 ++ .../site-packages/jedi/inference/param.py | 257 + .../jedi/inference/parser_cache.py | 6 + .../site-packages/jedi/inference/recursion.py | 153 + .../jedi/inference/references.py | 319 + .../site-packages/jedi/inference/signature.py | 152 + .../site-packages/jedi/inference/star_args.py | 220 + .../jedi/inference/syntax_tree.py | 903 ++ .../site-packages/jedi/inference/sys_path.py | 272 + .../site-packages/jedi/inference/utils.py | 90 + .../jedi/inference/value/__init__.py | 9 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 601 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 0 -> 2075 bytes .../dynamic_arrays.cpython-312.pyc | Bin 0 -> 10690 bytes .../__pycache__/function.cpython-312.pyc | Bin 0 -> 25993 bytes .../__pycache__/instance.cpython-312.pyc | Bin 0 -> 35317 bytes .../__pycache__/iterable.cpython-312.pyc | Bin 0 -> 36726 bytes .../value/__pycache__/klass.cpython-312.pyc | Bin 0 -> 18862 bytes .../value/__pycache__/module.cpython-312.pyc | Bin 0 -> 10850 bytes .../__pycache__/namespace.cpython-312.pyc | Bin 0 -> 4256 bytes .../jedi/inference/value/decorator.py | 34 + .../jedi/inference/value/dynamic_arrays.py | 200 + .../jedi/inference/value/function.py | 461 + .../jedi/inference/value/instance.py | 610 ++ .../jedi/inference/value/iterable.py | 647 ++ .../jedi/inference/value/klass.py | 390 + .../jedi/inference/value/module.py | 230 + .../jedi/inference/value/namespace.py | 74 + .../site-packages/jedi/parser_utils.py | 345 + .../site-packages/jedi/plugins/__init__.py | 47 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2479 bytes .../__pycache__/django.cpython-312.pyc | Bin 0 -> 16686 bytes .../plugins/__pycache__/flask.cpython-312.pyc | Bin 0 -> 1128 bytes .../__pycache__/pytest.cpython-312.pyc | Bin 0 -> 13249 bytes .../__pycache__/registry.cpython-312.pyc | Bin 0 -> 534 bytes .../__pycache__/stdlib.cpython-312.pyc | Bin 0 -> 44022 bytes .../site-packages/jedi/plugins/django.py | 296 + .../site-packages/jedi/plugins/flask.py | 21 + .../site-packages/jedi/plugins/pytest.py | 269 + .../site-packages/jedi/plugins/registry.py | 12 + .../site-packages/jedi/plugins/stdlib.py | 879 ++ .../python3.12/site-packages/jedi/settings.py | 163 + .../jedi/third_party/django-stubs/LICENSE.txt | 8 + .../django-stubs/django-stubs/__init__.pyi | 12 + .../django-stubs/apps/__init__.pyi | 3 + .../django-stubs/django-stubs/apps/config.pyi | 23 + .../django-stubs/apps/registry.pyi | 40 + .../django-stubs/conf/__init__.pyi | 29 + .../django-stubs/conf/global_settings.pyi | 504 + .../django-stubs/conf/locale/__init__.pyi | 3 + .../django-stubs/conf/urls/__init__.pyi | 25 + .../django-stubs/conf/urls/i18n.pyi | 8 + .../django-stubs/conf/urls/static.pyi | 5 + .../django-stubs/contrib/__init__.pyi | 0 .../django-stubs/contrib/admin/__init__.pyi | 24 + .../django-stubs/contrib/admin/actions.pyi | 8 + .../django-stubs/contrib/admin/apps.pyi | 6 + .../django-stubs/contrib/admin/checks.pyi | 21 + .../django-stubs/contrib/admin/decorators.pyi | 5 + .../django-stubs/contrib/admin/filters.pyi | 110 + .../django-stubs/contrib/admin/forms.pyi | 7 + .../django-stubs/contrib/admin/helpers.pyi | 155 + .../django-stubs/contrib/admin/models.pyi | 39 + .../django-stubs/contrib/admin/options.pyi | 275 + .../django-stubs/contrib/admin/sites.pyi | 75 + .../contrib/admin/templatetags/__init__.pyi | 0 .../contrib/admin/templatetags/admin_list.pyi | 42 + .../admin/templatetags/admin_modify.pyi | 16 + .../admin/templatetags/admin_static.pyi | 5 + .../contrib/admin/templatetags/admin_urls.pyi | 17 + .../contrib/admin/templatetags/base.pyi | 17 + .../contrib/admin/templatetags/log.pyi | 16 + .../django-stubs/contrib/admin/tests.pyi | 23 + .../django-stubs/contrib/admin/utils.pyi | 68 + .../contrib/admin/views/__init__.pyi | 0 .../contrib/admin/views/autocomplete.pyi | 10 + .../contrib/admin/views/decorators.pyi | 7 + .../django-stubs/contrib/admin/views/main.pyi | 89 + .../django-stubs/contrib/admin/widgets.pyi | 102 + .../contrib/admindocs/__init__.pyi | 0 .../contrib/admindocs/middleware.pyi | 10 + .../django-stubs/contrib/admindocs/urls.pyi | 3 + .../django-stubs/contrib/admindocs/utils.pyi | 27 + .../django-stubs/contrib/admindocs/views.pyi | 21 + .../django-stubs/contrib/auth/__init__.pyi | 34 + .../django-stubs/contrib/auth/admin.pyi | 18 + .../django-stubs/contrib/auth/apps.pyi | 3 + .../django-stubs/contrib/auth/backends.pyi | 40 + .../django-stubs/contrib/auth/base_user.pyi | 44 + .../django-stubs/contrib/auth/checks.pyi | 8 + .../contrib/auth/context_processors.pyi | 20 + .../django-stubs/contrib/auth/decorators.pyi | 21 + .../django-stubs/contrib/auth/forms.pyi | 91 + .../contrib/auth/handlers/__init__.pyi | 0 .../contrib/auth/handlers/modwsgi.pyi | 6 + .../django-stubs/contrib/auth/hashers.pyi | 45 + .../contrib/auth/management/__init__.pyi | 15 + .../auth/management/commands/__init__.pyi | 0 .../management/commands/changepassword.pyi | 7 + .../management/commands/createsuperuser.pyi | 9 + .../django-stubs/contrib/auth/middleware.pyi | 20 + .../django-stubs/contrib/auth/mixins.pyi | 28 + .../django-stubs/contrib/auth/models.pyi | 117 + .../contrib/auth/password_validation.pyi | 46 + .../django-stubs/contrib/auth/signals.pyi | 5 + .../django-stubs/contrib/auth/tokens.pyi | 11 + .../django-stubs/contrib/auth/urls.pyi | 3 + .../django-stubs/contrib/auth/validators.pyi | 4 + .../django-stubs/contrib/auth/views.pyi | 72 + .../contrib/contenttypes/__init__.pyi | 0 .../contrib/contenttypes/admin.pyi | 14 + .../contrib/contenttypes/apps.pyi | 3 + .../contrib/contenttypes/checks.pyi | 6 + .../contrib/contenttypes/fields.pyi | 95 + .../contrib/contenttypes/forms.pyi | 41 + .../contenttypes/management/__init__.pyi | 33 + .../management/commands/__init__.pyi | 0 .../commands/remove_stale_contenttypes.pyi | 15 + .../contrib/contenttypes/models.pyi | 24 + .../contrib/contenttypes/views.pyi | 8 + .../contrib/flatpages/__init__.pyi | 0 .../django-stubs/contrib/flatpages/forms.pyi | 7 + .../contrib/flatpages/middleware.pyi | 6 + .../django-stubs/contrib/flatpages/models.pyi | 13 + .../contrib/flatpages/sitemaps.pyi | 3 + .../flatpages/templatetags/__init__.pyi | 0 .../flatpages/templatetags/flatpages.pyi | 16 + .../django-stubs/contrib/flatpages/urls.pyi | 3 + .../django-stubs/contrib/flatpages/views.pyi | 8 + .../django-stubs/contrib/gis/__init__.pyi | 0 .../django-stubs/contrib/gis/db/__init__.pyi | 0 .../contrib/gis/db/models/__init__.pyi | 13 + .../contrib/gis/db/models/fields.pyi | 91 + .../contrib/humanize/__init__.pyi | 0 .../humanize/templatetags/__init__.pyi | 0 .../humanize/templatetags/humanize.pyi | 14 + .../contrib/messages/__init__.pyi | 24 + .../django-stubs/contrib/messages/api.pyi | 26 + .../contrib/messages/constants.pyi | 11 + .../contrib/messages/context_processors.pyi | 6 + .../contrib/messages/middleware.pyi | 7 + .../contrib/messages/storage/__init__.pyi | 6 + .../contrib/messages/storage/base.pyi | 28 + .../contrib/messages/storage/cookie.pyi | 20 + .../contrib/messages/storage/fallback.pyi | 8 + .../contrib/messages/storage/session.pyi | 10 + .../django-stubs/contrib/messages/utils.pyi | 3 + .../django-stubs/contrib/messages/views.pyi | 9 + .../contrib/postgres/__init__.pyi | 0 .../contrib/postgres/aggregates/__init__.pyi | 24 + .../contrib/postgres/aggregates/general.pyi | 11 + .../contrib/postgres/aggregates/mixins.pyi | 1 + .../postgres/aggregates/statistics.pyi | 14 + .../contrib/postgres/constraints.pyi | 18 + .../contrib/postgres/fields/__init__.pyi | 20 + .../contrib/postgres/fields/array.pyi | 51 + .../contrib/postgres/fields/citext.pyi | 6 + .../contrib/postgres/fields/hstore.pyi | 17 + .../contrib/postgres/fields/jsonb.pyi | 32 + .../contrib/postgres/fields/mixins.pyi | 4 + .../contrib/postgres/fields/ranges.pyi | 48 + .../contrib/postgres/functions.pyi | 4 + .../django-stubs/contrib/postgres/indexes.pyi | 82 + .../django-stubs/contrib/postgres/lookups.pyi | 18 + .../contrib/postgres/operations.pyi | 27 + .../django-stubs/contrib/postgres/search.pyi | 63 + .../django-stubs/contrib/postgres/signals.pyi | 5 + .../contrib/postgres/validators.pyi | 17 + .../contrib/redirects/__init__.pyi | 0 .../contrib/redirects/middleware.pyi | 10 + .../django-stubs/contrib/redirects/models.pyi | 6 + .../contrib/sessions/__init__.pyi | 0 .../contrib/sessions/backends/__init__.pyi | 0 .../contrib/sessions/backends/base.pyi | 40 + .../contrib/sessions/backends/cache.pyi | 11 + .../contrib/sessions/backends/cached_db.pyi | 11 + .../contrib/sessions/backends/db.pyi | 13 + .../contrib/sessions/backends/file.pyi | 9 + .../sessions/backends/signed_cookies.pyi | 3 + .../contrib/sessions/base_session.pyi | 19 + .../contrib/sessions/exceptions.pyi | 4 + .../contrib/sessions/management/__init__.pyi | 0 .../sessions/management/commands/__init__.pyi | 0 .../management/commands/clearsessions.pyi | 3 + .../contrib/sessions/middleware.pyi | 11 + .../django-stubs/contrib/sessions/models.pyi | 4 + .../contrib/sessions/serializers.pyi | 10 + .../contrib/sitemaps/__init__.pyi | 50 + .../contrib/sitemaps/management/__init__.pyi | 0 .../sitemaps/management/commands/__init__.pyi | 0 .../management/commands/ping_google.pyi | 3 + .../django-stubs/contrib/sitemaps/views.pyi | 23 + .../django-stubs/contrib/sites/__init__.pyi | 0 .../django-stubs/contrib/sites/apps.pyi | 3 + .../django-stubs/contrib/sites/management.pyi | 13 + .../django-stubs/contrib/sites/managers.pyi | 6 + .../django-stubs/contrib/sites/middleware.pyi | 5 + .../django-stubs/contrib/sites/models.pyi | 21 + .../django-stubs/contrib/sites/requests.pyi | 10 + .../django-stubs/contrib/sites/shortcuts.pyi | 7 + .../contrib/staticfiles/__init__.pyi | 0 .../django-stubs/contrib/staticfiles/apps.pyi | 6 + .../contrib/staticfiles/checks.pyi | 7 + .../contrib/staticfiles/finders.pyi | 43 + .../contrib/staticfiles/handlers.pyi | 12 + .../staticfiles/management/__init__.pyi | 0 .../management/commands/__init__.pyi | 0 .../management/commands/collectstatic.pyi | 28 + .../management/commands/findstatic.pyi | 3 + .../management/commands/runserver.pyi | 3 + .../contrib/staticfiles/storage.pyi | 55 + .../staticfiles/templatetags/__init__.pyi | 0 .../staticfiles/templatetags/staticfiles.pyi | 9 + .../contrib/staticfiles/testing.pyi | 3 + .../django-stubs/contrib/staticfiles/urls.pyi | 7 + .../contrib/staticfiles/utils.pyi | 8 + .../contrib/staticfiles/views.pyi | 6 + .../contrib/syndication/__init__.pyi | 0 .../contrib/syndication/views.pyi | 27 + .../django-stubs/core/__init__.pyi | 0 .../django-stubs/core/cache/__init__.pyi | 24 + .../core/cache/backends/__init__.pyi | 0 .../django-stubs/core/cache/backends/base.pyi | 41 + .../django-stubs/core/cache/backends/db.pyi | 22 + .../core/cache/backends/dummy.pyi | 6 + .../core/cache/backends/filebased.pyi | 7 + .../core/cache/backends/locmem.pyi | 6 + .../core/cache/backends/memcached.pyi | 10 + .../django-stubs/core/cache/utils.pyi | 5 + .../django-stubs/core/checks/__init__.pyi | 17 + .../django-stubs/core/checks/caches.pyi | 9 + .../django-stubs/core/checks/database.pyi | 3 + .../django-stubs/core/checks/messages.pyi | 34 + .../django-stubs/core/checks/model_checks.pyi | 8 + .../django-stubs/core/checks/registry.pyi | 36 + .../core/checks/security/__init__.pyi | 0 .../core/checks/security/base.pyi | 33 + .../core/checks/security/csrf.pyi | 11 + .../core/checks/security/sessions.pyi | 20 + .../django-stubs/core/checks/templates.pyi | 11 + .../django-stubs/core/checks/translation.pyi | 7 + .../django-stubs/core/checks/urls.pyi | 13 + .../django-stubs/core/exceptions.pyi | 43 + .../django-stubs/core/files/__init__.pyi | 3 + .../django-stubs/core/files/base.pyi | 41 + .../django-stubs/core/files/images.pyi | 13 + .../django-stubs/core/files/locks.pyi | 15 + .../django-stubs/core/files/move.pyi | 3 + .../django-stubs/core/files/storage.pyi | 47 + .../django-stubs/core/files/temp.pyi | 5 + .../django-stubs/core/files/uploadedfile.pyi | 46 + .../django-stubs/core/files/uploadhandler.pyi | 86 + .../django-stubs/core/files/utils.pyi | 23 + .../django-stubs/core/handlers/__init__.pyi | 0 .../django-stubs/core/handlers/base.pyi | 13 + .../django-stubs/core/handlers/exception.pyi | 12 + .../django-stubs/core/handlers/wsgi.pyi | 35 + .../django-stubs/core/mail/__init__.pyi | 48 + .../core/mail/backends/__init__.pyi | 0 .../django-stubs/core/mail/backends/base.pyi | 16 + .../core/mail/backends/console.pyi | 3 + .../django-stubs/core/mail/backends/dummy.pyi | 3 + .../core/mail/backends/filebased.pyi | 3 + .../core/mail/backends/locmem.pyi | 3 + .../django-stubs/core/mail/backends/smtp.pyi | 18 + .../django-stubs/core/mail/message.pyi | 110 + .../django-stubs/core/mail/utils.pyi | 6 + .../django-stubs/core/management/__init__.pyi | 20 + .../django-stubs/core/management/base.pyi | 78 + .../django-stubs/core/management/color.pyi | 25 + .../core/management/commands/__init__.pyi | 0 .../core/management/commands/dumpdata.pyi | 4 + .../core/management/commands/loaddata.pyi | 19 + .../core/management/commands/makemessages.pyi | 38 + .../core/management/commands/runserver.pyi | 7 + .../core/management/commands/testserver.pyi | 3 + .../django-stubs/core/management/sql.pyi | 9 + .../core/management/templates.pyi | 17 + .../django-stubs/core/management/utils.pyi | 10 + .../django-stubs/core/paginator.pyi | 62 + .../core/serializers/__init__.pyi | 31 + .../django-stubs/core/serializers/base.pyi | 87 + .../django-stubs/core/serializers/json.pyi | 17 + .../django-stubs/core/serializers/python.pyi | 15 + .../django-stubs/core/servers/__init__.pyi | 0 .../django-stubs/core/servers/basehttp.pyi | 36 + .../django-stubs/core/signals.pyi | 6 + .../django-stubs/core/signing.pyi | 42 + .../django-stubs/core/validators.pyi | 121 + .../django-stubs/django-stubs/core/wsgi.pyi | 3 + .../django-stubs/django-stubs/db/__init__.pyi | 31 + .../django-stubs/db/backends/__init__.pyi | 0 .../db/backends/base/__init__.pyi | 0 .../django-stubs/db/backends/base/base.pyi | 102 + .../django-stubs/db/backends/base/client.pyi | 9 + .../db/backends/base/creation.pyi | 24 + .../db/backends/base/features.pyi | 100 + .../db/backends/base/introspection.pyi | 27 + .../db/backends/base/operations.pyi | 104 + .../django-stubs/db/backends/base/schema.pyi | 77 + .../db/backends/base/validation.pyi | 11 + .../db/backends/ddl_references.pyi | 66 + .../db/backends/dummy/__init__.pyi | 0 .../django-stubs/db/backends/dummy/base.pyi | 31 + .../db/backends/mysql/__init__.pyi | 0 .../django-stubs/db/backends/mysql/client.pyi | 11 + .../db/backends/postgresql/__init__.pyi | 0 .../db/backends/postgresql/base.pyi | 17 + .../db/backends/postgresql/client.pyi | 9 + .../db/backends/postgresql/creation.pyi | 3 + .../db/backends/postgresql/operations.pyi | 3 + .../django-stubs/db/backends/signals.pyi | 3 + .../db/backends/sqlite3/__init__.pyi | 0 .../django-stubs/db/backends/sqlite3/base.pyi | 14 + .../db/backends/sqlite3/creation.pyi | 3 + .../db/backends/sqlite3/features.pyi | 3 + .../db/backends/sqlite3/introspection.pyi | 13 + .../db/backends/sqlite3/operations.pyi | 3 + .../db/backends/sqlite3/schema.pyi | 3 + .../django-stubs/db/backends/utils.pyi | 47 + .../django-stubs/db/migrations/__init__.pyi | 6 + .../db/migrations/autodetector.pyi | 67 + .../django-stubs/db/migrations/exceptions.pyi | 20 + .../django-stubs/db/migrations/executor.pyi | 40 + .../django-stubs/db/migrations/graph.pyi | 54 + .../django-stubs/db/migrations/loader.pyi | 31 + .../django-stubs/db/migrations/migration.pyi | 28 + .../db/migrations/operations/__init__.pyi | 22 + .../db/migrations/operations/base.pyi | 17 + .../db/migrations/operations/fields.pyi | 32 + .../db/migrations/operations/models.pyi | 87 + .../db/migrations/operations/special.pyi | 43 + .../db/migrations/operations/utils.pyi | 5 + .../django-stubs/db/migrations/optimizer.pyi | 7 + .../django-stubs/db/migrations/questioner.pyi | 26 + .../django-stubs/db/migrations/recorder.pyi | 22 + .../django-stubs/db/migrations/serializer.pyi | 46 + .../django-stubs/db/migrations/state.pyi | 68 + .../db/migrations/topological_sort.pyi | 8 + .../django-stubs/db/migrations/utils.pyi | 10 + .../django-stubs/db/migrations/writer.pyi | 40 + .../django-stubs/db/models/__init__.pyi | 136 + .../django-stubs/db/models/aggregates.pyi | 17 + .../django-stubs/db/models/base.pyi | 60 + .../django-stubs/db/models/constraints.pyi | 27 + .../django-stubs/db/models/deletion.pyi | 30 + .../django-stubs/db/models/enums.pyi | 30 + .../django-stubs/db/models/expressions.pyi | 219 + .../db/models/fields/__init__.pyi | 409 + .../django-stubs/db/models/fields/files.pyi | 101 + .../django-stubs/db/models/fields/mixins.pyi | 12 + .../django-stubs/db/models/fields/proxy.pyi | 6 + .../django-stubs/db/models/fields/related.pyi | 243 + .../db/models/fields/related_descriptors.pyi | 70 + .../db/models/fields/related_lookups.pyi | 48 + .../db/models/fields/reverse_related.pyi | 110 + .../db/models/functions/__init__.pyi | 93 + .../db/models/functions/comparison.pyi | 12 + .../db/models/functions/datetime.pyi | 32 + .../django-stubs/db/models/functions/math.pyi | 26 + .../db/models/functions/mixins.pyi | 3 + .../django-stubs/db/models/functions/text.pyi | 65 + .../db/models/functions/window.pyi | 26 + .../django-stubs/db/models/indexes.pyi | 34 + .../django-stubs/db/models/lookups.pyi | 104 + .../django-stubs/db/models/manager.pyi | 45 + .../django-stubs/db/models/options.pyi | 123 + .../django-stubs/db/models/query.pyi | 213 + .../django-stubs/db/models/query_utils.pyi | 79 + .../django-stubs/db/models/signals.pyi | 34 + .../django-stubs/db/models/sql/__init__.pyi | 8 + .../django-stubs/db/models/sql/compiler.pyi | 109 + .../django-stubs/db/models/sql/constants.pyi | 14 + .../db/models/sql/datastructures.pyi | 49 + .../django-stubs/db/models/sql/query.pyi | 194 + .../django-stubs/db/models/sql/subqueries.pyi | 45 + .../django-stubs/db/models/sql/where.pyi | 46 + .../django-stubs/db/models/utils.pyi | 5 + .../django-stubs/db/transaction.pyi | 49 + .../django-stubs/django-stubs/db/utils.pyi | 35 + .../django-stubs/dispatch/__init__.pyi | 1 + .../django-stubs/dispatch/dispatcher.pyi | 23 + .../django-stubs/forms/__init__.pyi | 86 + .../django-stubs/forms/boundfield.pyi | 60 + .../django-stubs/forms/fields.pyi | 394 + .../django-stubs/django-stubs/forms/forms.pyi | 78 + .../django-stubs/forms/formsets.pyi | 89 + .../django-stubs/forms/models.pyi | 289 + .../django-stubs/forms/renderers.pyi | 26 + .../django-stubs/django-stubs/forms/utils.pyi | 33 + .../django-stubs/forms/widgets.pyi | 172 + .../django-stubs/http/__init__.pyi | 26 + .../django-stubs/django-stubs/http/cookie.pyi | 5 + .../django-stubs/http/multipartparser.pyi | 54 + .../django-stubs/http/request.pyi | 111 + .../django-stubs/http/response.pyi | 137 + .../django-stubs/middleware/__init__.pyi | 0 .../django-stubs/middleware/cache.pyi | 31 + .../django-stubs/middleware/clickjacking.pyi | 7 + .../django-stubs/middleware/common.pyi | 17 + .../django-stubs/middleware/csrf.pyi | 33 + .../django-stubs/middleware/gzip.pyi | 10 + .../django-stubs/middleware/http.pyi | 7 + .../django-stubs/middleware/locale.pyi | 10 + .../django-stubs/middleware/security.pyi | 17 + .../django-stubs/django-stubs/shortcuts.pyi | 54 + .../django-stubs/template/__init__.pyi | 16 + .../template/backends/__init__.pyi | 0 .../django-stubs/template/backends/base.pyi | 16 + .../django-stubs/template/backends/django.pyi | 16 + .../django-stubs/template/backends/dummy.pyi | 14 + .../django-stubs/template/backends/jinja2.pyi | 18 + .../django-stubs/template/backends/utils.pyi | 9 + .../django-stubs/template/base.pyi | 174 + .../django-stubs/template/context.pyi | 76 + .../template/context_processors.pyi | 13 + .../django-stubs/template/defaultfilters.pyi | 66 + .../django-stubs/template/defaulttags.pyi | 204 + .../django-stubs/template/engine.pyi | 53 + .../django-stubs/template/exceptions.pyi | 18 + .../django-stubs/template/library.pyi | 97 + .../django-stubs/template/loader.pyi | 14 + .../django-stubs/template/loader_tags.pyi | 68 + .../template/loaders/__init__.pyi | 0 .../template/loaders/app_directories.pyi | 3 + .../django-stubs/template/loaders/base.pyi | 12 + .../django-stubs/template/loaders/cached.pyi | 14 + .../template/loaders/filesystem.pyi | 12 + .../django-stubs/template/loaders/locmem.pyi | 11 + .../django-stubs/template/response.pyi | 68 + .../django-stubs/template/smartif.pyi | 43 + .../django-stubs/template/utils.pyi | 16 + .../django-stubs/templatetags/__init__.pyi | 0 .../django-stubs/templatetags/cache.pyi | 24 + .../django-stubs/templatetags/i18n.pyi | 83 + .../django-stubs/templatetags/l10n.pyi | 17 + .../django-stubs/templatetags/static.pyi | 33 + .../django-stubs/templatetags/tz.pyi | 33 + .../django-stubs/test/__init__.pyi | 20 + .../django-stubs/django-stubs/test/client.pyi | 132 + .../django-stubs/django-stubs/test/html.pyi | 38 + .../django-stubs/django-stubs/test/runner.pyi | 133 + .../django-stubs/test/selenium.pyi | 14 + .../django-stubs/test/signals.pyi | 21 + .../django-stubs/test/testcases.pyi | 229 + .../django-stubs/django-stubs/test/utils.pyi | 155 + .../django-stubs/urls/__init__.pyi | 36 + .../django-stubs/django-stubs/urls/base.pyi | 23 + .../django-stubs/django-stubs/urls/conf.pyi | 8 + .../django-stubs/urls/converters.pyi | 27 + .../django-stubs/urls/exceptions.pyi | 4 + .../django-stubs/urls/resolvers.pyi | 110 + .../django-stubs/django-stubs/urls/utils.pyi | 4 + .../django-stubs/utils/__init__.pyi | 0 .../django-stubs/django-stubs/utils/_os.pyi | 11 + .../django-stubs/utils/archive.pyi | 30 + .../django-stubs/utils/autoreload.pyi | 67 + .../django-stubs/utils/baseconv.pyi | 24 + .../django-stubs/django-stubs/utils/cache.pyi | 31 + .../django-stubs/utils/crypto.pyi | 15 + .../django-stubs/utils/datastructures.pyi | 75 + .../django-stubs/utils/dateformat.pyi | 63 + .../django-stubs/utils/dateparse.pyi | 14 + .../django-stubs/django-stubs/utils/dates.pyi | 8 + .../django-stubs/utils/datetime_safe.pyi | 10 + .../django-stubs/utils/deconstruct.pyi | 3 + .../django-stubs/utils/decorators.pyi | 20 + .../django-stubs/utils/deprecation.pyi | 35 + .../django-stubs/utils/duration.pyi | 5 + .../django-stubs/utils/encoding.pyi | 59 + .../django-stubs/utils/feedgenerator.pyi | 76 + .../django-stubs/utils/formats.pyi | 31 + .../django-stubs/utils/functional.pyi | 59 + .../django-stubs/utils/hashable.pyi | 3 + .../django-stubs/django-stubs/utils/html.pyi | 37 + .../django-stubs/django-stubs/utils/http.pyi | 37 + .../django-stubs/utils/inspect.pyi | 8 + .../django-stubs/django-stubs/utils/ipv6.pyi | 4 + .../django-stubs/utils/itercompat.pyi | 3 + .../django-stubs/django-stubs/utils/jslex.pyi | 26 + .../django-stubs/django-stubs/utils/log.pyi | 45 + .../django-stubs/utils/lorem_ipsum.pyi | 10 + .../django-stubs/utils/module_loading.pyi | 6 + .../django-stubs/utils/numberformat.pyi | 12 + .../django-stubs/utils/regex_helper.pyi | 16 + .../django-stubs/utils/safestring.pyi | 26 + .../django-stubs/django-stubs/utils/six.pyi | 106 + .../django-stubs/utils/termcolors.pyi | 18 + .../django-stubs/django-stubs/utils/text.pyi | 47 + .../django-stubs/utils/timesince.pyi | 10 + .../django-stubs/utils/timezone.pyi | 62 + .../django-stubs/utils/topological_sort.pyi | 6 + .../utils/translation/__init__.pyi | 72 + .../utils/translation/reloader.pyi | 7 + .../utils/translation/template.pyi | 14 + .../utils/translation/trans_null.pyi | 25 + .../utils/translation/trans_real.pyi | 42 + .../django-stubs/django-stubs/utils/tree.pyi | 21 + .../django-stubs/utils/version.pyi | 13 + .../django-stubs/utils/xmlutils.pyi | 11 + .../django-stubs/views/__init__.pyi | 1 + .../django-stubs/django-stubs/views/csrf.pyi | 7 + .../django-stubs/django-stubs/views/debug.pyi | 66 + .../views/decorators/__init__.pyi | 0 .../django-stubs/views/decorators/cache.pyi | 7 + .../views/decorators/clickjacking.pyi | 7 + .../django-stubs/views/decorators/csrf.pyi | 19 + .../django-stubs/views/decorators/debug.pyi | 4 + .../django-stubs/views/decorators/gzip.pyi | 5 + .../django-stubs/views/decorators/http.pyi | 12 + .../django-stubs/views/decorators/vary.pyi | 6 + .../django-stubs/views/defaults.pyi | 23 + .../django-stubs/views/generic/__init__.pyi | 15 + .../django-stubs/views/generic/base.pyi | 44 + .../django-stubs/views/generic/dates.pyi | 82 + .../django-stubs/views/generic/detail.pyi | 28 + .../django-stubs/views/generic/edit.pyi | 46 + .../django-stubs/views/generic/list.pyi | 37 + .../django-stubs/django-stubs/views/i18n.pyi | 31 + .../django-stubs/views/static.pyi | 12 + .../jedi/third_party/typeshed/LICENSE | 238 + .../typeshed/stdlib/2/BaseHTTPServer.pyi | 41 + .../typeshed/stdlib/2/CGIHTTPServer.pyi | 6 + .../typeshed/stdlib/2/ConfigParser.pyi | 97 + .../third_party/typeshed/stdlib/2/Cookie.pyi | 40 + .../typeshed/stdlib/2/HTMLParser.pyi | 28 + .../third_party/typeshed/stdlib/2/Queue.pyi | 29 + .../typeshed/stdlib/2/SimpleHTTPServer.pyi | 14 + .../typeshed/stdlib/2/SocketServer.pyi | 115 + .../typeshed/stdlib/2/StringIO.pyi | 28 + .../typeshed/stdlib/2/UserDict.pyi | 53 + .../typeshed/stdlib/2/UserList.pyi | 19 + .../typeshed/stdlib/2/UserString.pyi | 75 + .../typeshed/stdlib/2/__builtin__.pyi | 1195 +++ .../third_party/typeshed/stdlib/2/_ast.pyi | 303 + .../typeshed/stdlib/2/_collections.pyi | 36 + .../typeshed/stdlib/2/_functools.pyi | 15 + .../typeshed/stdlib/2/_hotshot.pyi | 19 + .../third_party/typeshed/stdlib/2/_io.pyi | 184 + .../third_party/typeshed/stdlib/2/_json.pyi | 7 + .../third_party/typeshed/stdlib/2/_md5.pyi | 13 + .../third_party/typeshed/stdlib/2/_sha.pyi | 15 + .../third_party/typeshed/stdlib/2/_sha256.pyi | 23 + .../third_party/typeshed/stdlib/2/_sha512.pyi | 23 + .../third_party/typeshed/stdlib/2/_socket.pyi | 281 + .../third_party/typeshed/stdlib/2/_sre.pyi | 51 + .../third_party/typeshed/stdlib/2/_struct.pyi | 19 + .../typeshed/stdlib/2/_symtable.pyi | 37 + .../typeshed/stdlib/2/_threading_local.pyi | 11 + .../third_party/typeshed/stdlib/2/_winreg.pyi | 97 + .../third_party/typeshed/stdlib/2/abc.pyi | 31 + .../third_party/typeshed/stdlib/2/ast.pyi | 28 + .../third_party/typeshed/stdlib/2/atexit.pyi | 5 + .../typeshed/stdlib/2/builtins.pyi | 1195 +++ .../third_party/typeshed/stdlib/2/cPickle.pyi | 26 + .../typeshed/stdlib/2/cStringIO.pyi | 48 + .../typeshed/stdlib/2/collections.pyi | 129 + .../typeshed/stdlib/2/commands.pyi | 10 + .../typeshed/stdlib/2/compileall.pyi | 16 + .../typeshed/stdlib/2/cookielib.pyi | 142 + .../typeshed/stdlib/2/copy_reg.pyi | 16 + .../typeshed/stdlib/2/dircache.pyi | 8 + .../typeshed/stdlib/2/distutils/__init__.pyi | 0 .../stdlib/2/distutils/archive_util.pyi | 12 + .../stdlib/2/distutils/bcppcompiler.pyi | 3 + .../typeshed/stdlib/2/distutils/ccompiler.pyi | 150 + .../typeshed/stdlib/2/distutils/cmd.pyi | 67 + .../stdlib/2/distutils/command/__init__.pyi | 0 .../stdlib/2/distutils/command/bdist.pyi | 0 .../stdlib/2/distutils/command/bdist_dumb.pyi | 0 .../stdlib/2/distutils/command/bdist_msi.pyi | 6 + .../2/distutils/command/bdist_packager.pyi | 0 .../stdlib/2/distutils/command/bdist_rpm.pyi | 0 .../2/distutils/command/bdist_wininst.pyi | 0 .../stdlib/2/distutils/command/build.pyi | 0 .../stdlib/2/distutils/command/build_clib.pyi | 0 .../stdlib/2/distutils/command/build_ext.pyi | 0 .../stdlib/2/distutils/command/build_py.pyi | 6 + .../2/distutils/command/build_scripts.pyi | 0 .../stdlib/2/distutils/command/check.pyi | 0 .../stdlib/2/distutils/command/clean.pyi | 0 .../stdlib/2/distutils/command/config.pyi | 87 + .../stdlib/2/distutils/command/install.pyi | 12 + .../2/distutils/command/install_data.pyi | 0 .../2/distutils/command/install_egg_info.pyi | 10 + .../2/distutils/command/install_headers.pyi | 0 .../2/distutils/command/install_lib.pyi | 0 .../2/distutils/command/install_scripts.pyi | 0 .../stdlib/2/distutils/command/register.pyi | 0 .../stdlib/2/distutils/command/sdist.pyi | 0 .../stdlib/2/distutils/command/upload.pyi | 8 + .../typeshed/stdlib/2/distutils/config.pyi | 17 + .../typeshed/stdlib/2/distutils/core.pyi | 48 + .../stdlib/2/distutils/cygwinccompiler.pyi | 4 + .../typeshed/stdlib/2/distutils/debug.pyi | 1 + .../typeshed/stdlib/2/distutils/dep_util.pyi | 5 + .../typeshed/stdlib/2/distutils/dir_util.pyi | 15 + .../typeshed/stdlib/2/distutils/dist.pyi | 9 + .../stdlib/2/distutils/emxccompiler.pyi | 3 + .../typeshed/stdlib/2/distutils/errors.pyi | 19 + .../typeshed/stdlib/2/distutils/extension.pyi | 21 + .../stdlib/2/distutils/fancy_getopt.pyi | 21 + .../typeshed/stdlib/2/distutils/file_util.pyi | 14 + .../typeshed/stdlib/2/distutils/filelist.pyi | 1 + .../typeshed/stdlib/2/distutils/log.pyi | 25 + .../stdlib/2/distutils/msvccompiler.pyi | 3 + .../typeshed/stdlib/2/distutils/spawn.pyi | 4 + .../typeshed/stdlib/2/distutils/sysconfig.pyi | 14 + .../typeshed/stdlib/2/distutils/text_file.pyi | 21 + .../stdlib/2/distutils/unixccompiler.pyi | 3 + .../typeshed/stdlib/2/distutils/util.pyi | 23 + .../typeshed/stdlib/2/distutils/version.pyi | 33 + .../typeshed/stdlib/2/dummy_thread.pyi | 21 + .../typeshed/stdlib/2/email/MIMEText.pyi | 4 + .../typeshed/stdlib/2/email/__init__.pyi | 6 + .../typeshed/stdlib/2/email/_parseaddr.pyi | 40 + .../typeshed/stdlib/2/email/base64mime.pyi | 11 + .../typeshed/stdlib/2/email/charset.pyi | 26 + .../typeshed/stdlib/2/email/encoders.pyi | 4 + .../typeshed/stdlib/2/email/feedparser.pyi | 17 + .../typeshed/stdlib/2/email/generator.pyi | 8 + .../typeshed/stdlib/2/email/header.pyi | 10 + .../typeshed/stdlib/2/email/iterators.pyi | 5 + .../typeshed/stdlib/2/email/message.pyi | 45 + .../typeshed/stdlib/2/email/mime/__init__.pyi | 0 .../stdlib/2/email/mime/application.pyi | 9 + .../typeshed/stdlib/2/email/mime/audio.pyi | 4 + .../typeshed/stdlib/2/email/mime/base.pyi | 4 + .../typeshed/stdlib/2/email/mime/image.pyi | 4 + .../typeshed/stdlib/2/email/mime/message.pyi | 4 + .../stdlib/2/email/mime/multipart.pyi | 4 + .../stdlib/2/email/mime/nonmultipart.pyi | 4 + .../typeshed/stdlib/2/email/mime/text.pyi | 4 + .../typeshed/stdlib/2/email/parser.pyi | 10 + .../typeshed/stdlib/2/email/quoprimime.pyi | 18 + .../typeshed/stdlib/2/email/utils.pyi | 21 + .../typeshed/stdlib/2/encodings/__init__.pyi | 7 + .../typeshed/stdlib/2/encodings/utf_8.pyi | 15 + .../typeshed/stdlib/2/exceptions.pyi | 50 + .../third_party/typeshed/stdlib/2/fcntl.pyi | 82 + .../third_party/typeshed/stdlib/2/fnmatch.pyi | 8 + .../typeshed/stdlib/2/functools.pyi | 30 + .../typeshed/stdlib/2/future_builtins.pyi | 10 + .../jedi/third_party/typeshed/stdlib/2/gc.pyi | 25 + .../third_party/typeshed/stdlib/2/getopt.pyi | 12 + .../third_party/typeshed/stdlib/2/getpass.pyi | 6 + .../third_party/typeshed/stdlib/2/gettext.pyi | 48 + .../third_party/typeshed/stdlib/2/glob.pyi | 7 + .../third_party/typeshed/stdlib/2/gzip.pyi | 38 + .../third_party/typeshed/stdlib/2/hashlib.pyi | 28 + .../third_party/typeshed/stdlib/2/heapq.pyi | 15 + .../typeshed/stdlib/2/htmlentitydefs.pyi | 5 + .../third_party/typeshed/stdlib/2/httplib.pyi | 218 + .../third_party/typeshed/stdlib/2/imp.pyi | 33 + .../typeshed/stdlib/2/importlib.pyi | 4 + .../third_party/typeshed/stdlib/2/inspect.pyi | 129 + .../jedi/third_party/typeshed/stdlib/2/io.pyi | 40 + .../typeshed/stdlib/2/itertools.pyi | 164 + .../third_party/typeshed/stdlib/2/json.pyi | 93 + .../typeshed/stdlib/2/markupbase.pyi | 8 + .../third_party/typeshed/stdlib/2/md5.pyi | 5 + .../typeshed/stdlib/2/mimetools.pyi | 27 + .../stdlib/2/multiprocessing/__init__.pyi | 50 + .../2/multiprocessing/dummy/__init__.pyi | 46 + .../2/multiprocessing/dummy/connection.pyi | 25 + .../stdlib/2/multiprocessing/pool.pyi | 52 + .../stdlib/2/multiprocessing/process.pyi | 37 + .../stdlib/2/multiprocessing/util.pyi | 29 + .../third_party/typeshed/stdlib/2/mutex.pyi | 12 + .../third_party/typeshed/stdlib/2/ntpath.pyi | 85 + .../typeshed/stdlib/2/nturl2path.pyi | 4 + .../typeshed/stdlib/2/os/__init__.pyi | 385 + .../third_party/typeshed/stdlib/2/os/path.pyi | 85 + .../typeshed/stdlib/2/os2emxpath.pyi | 85 + .../third_party/typeshed/stdlib/2/pipes.pyi | 13 + .../typeshed/stdlib/2/platform.pyi | 41 + .../third_party/typeshed/stdlib/2/popen2.pyi | 27 + .../third_party/typeshed/stdlib/2/posix.pyi | 201 + .../typeshed/stdlib/2/posixpath.pyi | 85 + .../third_party/typeshed/stdlib/2/random.pyi | 67 + .../jedi/third_party/typeshed/stdlib/2/re.pyi | 108 + .../third_party/typeshed/stdlib/2/repr.pyi | 34 + .../typeshed/stdlib/2/resource.pyi | 46 + .../third_party/typeshed/stdlib/2/rfc822.pyi | 75 + .../typeshed/stdlib/2/robotparser.pyi | 7 + .../third_party/typeshed/stdlib/2/runpy.pyi | 17 + .../third_party/typeshed/stdlib/2/sets.pyi | 60 + .../third_party/typeshed/stdlib/2/sha.pyi | 10 + .../third_party/typeshed/stdlib/2/shelve.pyi | 36 + .../third_party/typeshed/stdlib/2/shlex.pyi | 30 + .../third_party/typeshed/stdlib/2/signal.pyi | 68 + .../third_party/typeshed/stdlib/2/smtplib.pyi | 86 + .../third_party/typeshed/stdlib/2/spwd.pyi | 15 + .../typeshed/stdlib/2/sre_constants.pyi | 93 + .../typeshed/stdlib/2/sre_parse.pyi | 62 + .../third_party/typeshed/stdlib/2/stat.pyi | 58 + .../third_party/typeshed/stdlib/2/string.pyi | 68 + .../typeshed/stdlib/2/stringold.pyi | 44 + .../third_party/typeshed/stdlib/2/strop.pyi | 27 + .../typeshed/stdlib/2/subprocess.pyi | 115 + .../third_party/typeshed/stdlib/2/symbol.pyi | 89 + .../third_party/typeshed/stdlib/2/sys.pyi | 130 + .../typeshed/stdlib/2/tempfile.pyi | 102 + .../typeshed/stdlib/2/textwrap.pyi | 61 + .../third_party/typeshed/stdlib/2/thread.pyi | 27 + .../third_party/typeshed/stdlib/2/toaiff.pyi | 11 + .../typeshed/stdlib/2/tokenize.pyi | 133 + .../third_party/typeshed/stdlib/2/types.pyi | 195 + .../third_party/typeshed/stdlib/2/typing.pyi | 495 + .../typeshed/stdlib/2/unittest.pyi | 280 + .../third_party/typeshed/stdlib/2/urllib.pyi | 133 + .../third_party/typeshed/stdlib/2/urllib2.pyi | 186 + .../typeshed/stdlib/2/urlparse.pyi | 61 + .../third_party/typeshed/stdlib/2/user.pyi | 6 + .../third_party/typeshed/stdlib/2/whichdb.pyi | 3 + .../typeshed/stdlib/2/xmlrpclib.pyi | 248 + .../typeshed/stdlib/2and3/__future__.pyi | 25 + .../typeshed/stdlib/2and3/_bisect.pyi | 8 + .../typeshed/stdlib/2and3/_codecs.pyi | 82 + .../typeshed/stdlib/2and3/_csv.pyi | 51 + .../typeshed/stdlib/2and3/_curses.pyi | 490 + .../stdlib/2and3/_dummy_threading.pyi | 187 + .../typeshed/stdlib/2and3/_heapq.pyi | 14 + .../typeshed/stdlib/2and3/_msi.pyi | 49 + .../typeshed/stdlib/2and3/_random.pyi | 15 + .../stdlib/2and3/_typeshed/__init__.pyi | 183 + .../typeshed/stdlib/2and3/_typeshed/wsgi.pyi | 35 + .../typeshed/stdlib/2and3/_typeshed/xml.pyi | 10 + .../typeshed/stdlib/2and3/_warnings.pyi | 67 + .../typeshed/stdlib/2and3/_weakref.pyi | 34 + .../typeshed/stdlib/2and3/_weakrefset.pyi | 47 + .../typeshed/stdlib/2and3/aifc.pyi | 88 + .../typeshed/stdlib/2and3/antigravity.pyi | 4 + .../typeshed/stdlib/2and3/argparse.pyi | 487 + .../typeshed/stdlib/2and3/array.pyi | 77 + .../typeshed/stdlib/2and3/asynchat.pyi | 39 + .../typeshed/stdlib/2and3/asyncore.pyi | 119 + .../typeshed/stdlib/2and3/audioop.pyi | 42 + .../typeshed/stdlib/2and3/base64.pyi | 37 + .../third_party/typeshed/stdlib/2and3/bdb.pyi | 98 + .../typeshed/stdlib/2and3/binascii.pyi | 50 + .../typeshed/stdlib/2and3/binhex.pyi | 42 + .../typeshed/stdlib/2and3/bisect.pyi | 4 + .../third_party/typeshed/stdlib/2and3/bz2.pyi | 70 + .../typeshed/stdlib/2and3/cProfile.pyi | 28 + .../typeshed/stdlib/2and3/calendar.pyi | 123 + .../third_party/typeshed/stdlib/2and3/cgi.pyi | 162 + .../typeshed/stdlib/2and3/cgitb.pyi | 33 + .../typeshed/stdlib/2and3/chunk.pyi | 20 + .../typeshed/stdlib/2and3/cmath.pyi | 42 + .../third_party/typeshed/stdlib/2and3/cmd.pyi | 39 + .../typeshed/stdlib/2and3/code.pyi | 36 + .../typeshed/stdlib/2and3/codecs.pyi | 301 + .../typeshed/stdlib/2and3/codeop.pyi | 14 + .../typeshed/stdlib/2and3/colorsys.pyi | 13 + .../typeshed/stdlib/2and3/contextlib.pyi | 102 + .../typeshed/stdlib/2and3/copy.pyi | 14 + .../typeshed/stdlib/2and3/crypt.pyi | 22 + .../third_party/typeshed/stdlib/2and3/csv.pyi | 101 + .../typeshed/stdlib/2and3/ctypes/__init__.pyi | 309 + .../typeshed/stdlib/2and3/ctypes/util.pyi | 7 + .../typeshed/stdlib/2and3/ctypes/wintypes.pyi | 234 + .../typeshed/stdlib/2and3/curses/__init__.pyi | 15 + .../typeshed/stdlib/2and3/curses/ascii.pyi | 62 + .../typeshed/stdlib/2and3/curses/panel.pyi | 20 + .../typeshed/stdlib/2and3/curses/textpad.pyi | 11 + .../typeshed/stdlib/2and3/datetime.pyi | 373 + .../typeshed/stdlib/2and3/decimal.pyi | 339 + .../typeshed/stdlib/2and3/difflib.pyi | 153 + .../third_party/typeshed/stdlib/2and3/dis.pyi | 83 + .../typeshed/stdlib/2and3/doctest.pyi | 224 + .../typeshed/stdlib/2and3/dummy_threading.pyi | 2 + .../stdlib/2and3/ensurepip/__init__.pyi | 25 + .../typeshed/stdlib/2and3/errno.pyi | 137 + .../typeshed/stdlib/2and3/filecmp.pyi | 73 + .../typeshed/stdlib/2and3/fileinput.pyi | 78 + .../typeshed/stdlib/2and3/formatter.pyi | 103 + .../typeshed/stdlib/2and3/fractions.pyi | 159 + .../typeshed/stdlib/2and3/ftplib.pyi | 165 + .../typeshed/stdlib/2and3/genericpath.pyi | 27 + .../third_party/typeshed/stdlib/2and3/grp.pyi | 11 + .../typeshed/stdlib/2and3/hmac.pyi | 44 + .../typeshed/stdlib/2and3/imaplib.pyi | 172 + .../typeshed/stdlib/2and3/imghdr.pyi | 20 + .../typeshed/stdlib/2and3/keyword.pyi | 10 + .../stdlib/2and3/lib2to3/__init__.pyi | 0 .../stdlib/2and3/lib2to3/pgen2/__init__.pyi | 0 .../stdlib/2and3/lib2to3/pgen2/driver.pyi | 20 + .../stdlib/2and3/lib2to3/pgen2/grammar.pyi | 26 + .../stdlib/2and3/lib2to3/pgen2/literals.pyi | 7 + .../stdlib/2and3/lib2to3/pgen2/parse.pyi | 26 + .../stdlib/2and3/lib2to3/pgen2/pgen.pyi | 46 + .../stdlib/2and3/lib2to3/pgen2/token.pyi | 71 + .../stdlib/2and3/lib2to3/pgen2/tokenize.pyi | 23 + .../typeshed/stdlib/2and3/lib2to3/pygram.pyi | 113 + .../typeshed/stdlib/2and3/lib2to3/pytree.pyi | 97 + .../typeshed/stdlib/2and3/linecache.pyi | 13 + .../typeshed/stdlib/2and3/locale.pyi | 111 + .../stdlib/2and3/logging/__init__.pyi | 918 ++ .../typeshed/stdlib/2and3/logging/config.pyi | 32 + .../stdlib/2and3/logging/handlers.pyi | 258 + .../typeshed/stdlib/2and3/macpath.pyi | 132 + .../typeshed/stdlib/2and3/mailbox.pyi | 207 + .../typeshed/stdlib/2and3/mailcap.pyi | 8 + .../typeshed/stdlib/2and3/marshal.pyi | 8 + .../typeshed/stdlib/2and3/math.pyi | 121 + .../typeshed/stdlib/2and3/mimetypes.pyi | 36 + .../typeshed/stdlib/2and3/mmap.pyi | 107 + .../typeshed/stdlib/2and3/modulefinder.pyi | 76 + .../typeshed/stdlib/2and3/msilib/__init__.pyi | 196 + .../typeshed/stdlib/2and3/msilib/schema.pyi | 97 + .../typeshed/stdlib/2and3/msilib/sequence.pyi | 14 + .../typeshed/stdlib/2and3/msilib/text.pyi | 9 + .../typeshed/stdlib/2and3/msvcrt.pyi | 24 + .../typeshed/stdlib/2and3/netrc.pyi | 15 + .../third_party/typeshed/stdlib/2and3/nis.pyi | 9 + .../typeshed/stdlib/2and3/numbers.pyi | 140 + .../typeshed/stdlib/2and3/opcode.pyi | 25 + .../typeshed/stdlib/2and3/operator.pyi | 206 + .../typeshed/stdlib/2and3/optparse.pyi | 232 + .../typeshed/stdlib/2and3/parser.pyi | 22 + .../third_party/typeshed/stdlib/2and3/pdb.pyi | 250 + .../typeshed/stdlib/2and3/pickle.pyi | 186 + .../typeshed/stdlib/2and3/pickletools.pyi | 179 + .../typeshed/stdlib/2and3/pkgutil.pyi | 38 + .../typeshed/stdlib/2and3/plistlib.pyi | 72 + .../typeshed/stdlib/2and3/poplib.pyi | 73 + .../typeshed/stdlib/2and3/pprint.pyi | 97 + .../typeshed/stdlib/2and3/profile.pyi | 25 + .../typeshed/stdlib/2and3/pstats.pyi | 52 + .../third_party/typeshed/stdlib/2and3/pty.pyi | 21 + .../third_party/typeshed/stdlib/2and3/pwd.pyi | 14 + .../typeshed/stdlib/2and3/py_compile.pyi | 52 + .../typeshed/stdlib/2and3/pyclbr.pyi | 37 + .../typeshed/stdlib/2and3/pydoc.pyi | 273 + .../stdlib/2and3/pydoc_data/__init__.pyi | 0 .../stdlib/2and3/pydoc_data/topics.pyi | 3 + .../stdlib/2and3/pyexpat/__init__.pyi | 79 + .../typeshed/stdlib/2and3/pyexpat/errors.pyi | 44 + .../typeshed/stdlib/2and3/pyexpat/model.pyi | 11 + .../typeshed/stdlib/2and3/quopri.pyi | 6 + .../typeshed/stdlib/2and3/readline.pyi | 39 + .../typeshed/stdlib/2and3/rlcompleter.pyi | 11 + .../typeshed/stdlib/2and3/sched.pyi | 39 + .../typeshed/stdlib/2and3/select.pyi | 152 + .../typeshed/stdlib/2and3/shutil.pyi | 166 + .../typeshed/stdlib/2and3/site.pyi | 15 + .../typeshed/stdlib/2and3/smtpd.pyi | 86 + .../typeshed/stdlib/2and3/sndhdr.pyi | 17 + .../typeshed/stdlib/2and3/socket.pyi | 803 ++ .../stdlib/2and3/sqlite3/__init__.pyi | 1 + .../typeshed/stdlib/2and3/sqlite3/dbapi2.pyi | 300 + .../typeshed/stdlib/2and3/sre_compile.pyi | 31 + .../third_party/typeshed/stdlib/2and3/ssl.pyi | 429 + .../typeshed/stdlib/2and3/stringprep.pyi | 21 + .../typeshed/stdlib/2and3/struct.pyi | 38 + .../typeshed/stdlib/2and3/sunau.pyi | 86 + .../typeshed/stdlib/2and3/symtable.pyi | 45 + .../typeshed/stdlib/2and3/sysconfig.pyi | 17 + .../typeshed/stdlib/2and3/syslog.pyi | 43 + .../typeshed/stdlib/2and3/tabnanny.pyi | 14 + .../typeshed/stdlib/2and3/tarfile.pyi | 246 + .../typeshed/stdlib/2and3/telnetlib.pyi | 114 + .../typeshed/stdlib/2and3/termios.pyi | 246 + .../typeshed/stdlib/2and3/this.pyi | 4 + .../typeshed/stdlib/2and3/threading.pyi | 187 + .../typeshed/stdlib/2and3/time.pyi | 116 + .../typeshed/stdlib/2and3/timeit.pyi | 42 + .../typeshed/stdlib/2and3/token.pyi | 85 + .../typeshed/stdlib/2and3/trace.pyi | 43 + .../typeshed/stdlib/2and3/traceback.pyi | 140 + .../third_party/typeshed/stdlib/2and3/tty.pyi | 15 + .../typeshed/stdlib/2and3/turtle.pyi | 558 ++ .../typeshed/stdlib/2and3/unicodedata.pyi | 42 + .../third_party/typeshed/stdlib/2and3/uu.pyi | 16 + .../typeshed/stdlib/2and3/uuid.pyi | 111 + .../typeshed/stdlib/2and3/warnings.pyi | 73 + .../typeshed/stdlib/2and3/wave.pyi | 73 + .../typeshed/stdlib/2and3/weakref.pyi | 119 + .../typeshed/stdlib/2and3/webbrowser.pyi | 105 + .../typeshed/stdlib/2and3/winsound.pyi | 27 + .../stdlib/2and3/wsgiref/__init__.pyi | 0 .../stdlib/2and3/wsgiref/handlers.pyi | 93 + .../typeshed/stdlib/2and3/wsgiref/headers.pyi | 31 + .../stdlib/2and3/wsgiref/simple_server.pyi | 41 + .../typeshed/stdlib/2and3/wsgiref/types.pyi | 3 + .../typeshed/stdlib/2and3/wsgiref/util.pyi | 23 + .../stdlib/2and3/wsgiref/validate.pyi | 52 + .../typeshed/stdlib/2and3/xdrlib.pyi | 55 + .../typeshed/stdlib/2and3/xml/__init__.pyi | 1 + .../stdlib/2and3/xml/dom/NodeFilter.pyi | 19 + .../stdlib/2and3/xml/dom/__init__.pyi | 68 + .../typeshed/stdlib/2and3/xml/dom/domreg.pyi | 10 + .../stdlib/2and3/xml/dom/expatbuilder.pyi | 3 + .../stdlib/2and3/xml/dom/minicompat.pyi | 3 + .../typeshed/stdlib/2and3/xml/dom/minidom.pyi | 6 + .../typeshed/stdlib/2and3/xml/dom/pulldom.pyi | 3 + .../stdlib/2and3/xml/dom/xmlbuilder.pyi | 3 + .../stdlib/2and3/xml/etree/ElementInclude.pyi | 25 + .../stdlib/2and3/xml/etree/ElementPath.pyi | 33 + .../stdlib/2and3/xml/etree/ElementTree.pyi | 376 + .../stdlib/2and3/xml/etree/__init__.pyi | 0 .../stdlib/2and3/xml/etree/cElementTree.pyi | 1 + .../stdlib/2and3/xml/parsers/__init__.pyi | 1 + .../2and3/xml/parsers/expat/__init__.pyi | 1 + .../stdlib/2and3/xml/parsers/expat/errors.pyi | 1 + .../stdlib/2and3/xml/parsers/expat/model.pyi | 1 + .../stdlib/2and3/xml/sax/__init__.pyi | 33 + .../typeshed/stdlib/2and3/xml/sax/handler.pyi | 46 + .../stdlib/2and3/xml/sax/saxutils.pyi | 68 + .../stdlib/2and3/xml/sax/xmlreader.pyi | 73 + .../typeshed/stdlib/2and3/zipfile.pyi | 220 + .../typeshed/stdlib/2and3/zipimport.pyi | 30 + .../typeshed/stdlib/2and3/zlib.pyi | 59 + .../typeshed/stdlib/3.7/_py_abc.pyi | 10 + .../typeshed/stdlib/3.7/contextvars.pyi | 42 + .../typeshed/stdlib/3.7/dataclasses.pyi | 95 + .../typeshed/stdlib/3.9/graphlib.pyi | 16 + .../typeshed/stdlib/3.9/zoneinfo/__init__.pyi | 32 + .../third_party/typeshed/stdlib/3/_ast.pyi | 376 + .../typeshed/stdlib/3/_bootlocale.pyi | 1 + .../typeshed/stdlib/3/_compat_pickle.pyi | 10 + .../typeshed/stdlib/3/_compression.pyi | 23 + .../typeshed/stdlib/3/_decimal.pyi | 1 + .../typeshed/stdlib/3/_dummy_thread.pyi | 21 + .../third_party/typeshed/stdlib/3/_imp.pyi | 17 + .../stdlib/3/_importlib_modulespec.pyi | 50 + .../third_party/typeshed/stdlib/3/_json.pyi | 38 + .../typeshed/stdlib/3/_markupbase.pyi | 8 + .../typeshed/stdlib/3/_operator.pyi | 60 + .../typeshed/stdlib/3/_osx_support.pyi | 33 + .../typeshed/stdlib/3/_posixsubprocess.pyi | 24 + .../typeshed/stdlib/3/_pydecimal.pyi | 3 + .../typeshed/stdlib/3/_sitebuiltins.pyi | 16 + .../third_party/typeshed/stdlib/3/_stat.pyi | 65 + .../third_party/typeshed/stdlib/3/_thread.pyi | 41 + .../typeshed/stdlib/3/_threading_local.pyi | 16 + .../typeshed/stdlib/3/_tkinter.pyi | 93 + .../typeshed/stdlib/3/_tracemalloc.pyi | 17 + .../third_party/typeshed/stdlib/3/_winapi.pyi | 134 + .../third_party/typeshed/stdlib/3/abc.pyi | 20 + .../third_party/typeshed/stdlib/3/ast.pyi | 207 + .../typeshed/stdlib/3/asyncio/__init__.pyi | 116 + .../typeshed/stdlib/3/asyncio/base_events.pyi | 354 + .../stdlib/3/asyncio/base_futures.pyi | 22 + .../stdlib/3/asyncio/base_subprocess.pyi | 72 + .../typeshed/stdlib/3/asyncio/base_tasks.pyi | 9 + .../typeshed/stdlib/3/asyncio/compat.pyi | 8 + .../typeshed/stdlib/3/asyncio/constants.pyi | 14 + .../typeshed/stdlib/3/asyncio/coroutines.pyi | 7 + .../typeshed/stdlib/3/asyncio/events.pyi | 502 + .../typeshed/stdlib/3/asyncio/exceptions.pyi | 15 + .../stdlib/3/asyncio/format_helpers.pyi | 20 + .../typeshed/stdlib/3/asyncio/futures.pyi | 65 + .../typeshed/stdlib/3/asyncio/locks.pyi | 68 + .../typeshed/stdlib/3/asyncio/log.pyi | 3 + .../stdlib/3/asyncio/proactor_events.pyi | 73 + .../typeshed/stdlib/3/asyncio/protocols.pyi | 27 + .../typeshed/stdlib/3/asyncio/queues.pyi | 36 + .../typeshed/stdlib/3/asyncio/runners.pyi | 10 + .../stdlib/3/asyncio/selector_events.pyi | 7 + .../typeshed/stdlib/3/asyncio/sslproto.pyi | 133 + .../typeshed/stdlib/3/asyncio/staggered.pyi | 12 + .../typeshed/stdlib/3/asyncio/streams.pyi | 104 + .../typeshed/stdlib/3/asyncio/subprocess.pyi | 60 + .../typeshed/stdlib/3/asyncio/tasks.pyi | 204 + .../typeshed/stdlib/3/asyncio/threads.pyi | 7 + .../typeshed/stdlib/3/asyncio/transports.pyi | 46 + .../typeshed/stdlib/3/asyncio/trsock.pyi | 86 + .../typeshed/stdlib/3/asyncio/unix_events.pyi | 57 + .../stdlib/3/asyncio/windows_events.pyi | 76 + .../stdlib/3/asyncio/windows_utils.pyi | 26 + .../third_party/typeshed/stdlib/3/atexit.pyi | 7 + .../typeshed/stdlib/3/builtins.pyi | 1387 +++ .../stdlib/3/collections/__init__.pyi | 327 + .../typeshed/stdlib/3/collections/abc.pyi | 27 + .../typeshed/stdlib/3/compileall.pyi | 108 + .../typeshed/stdlib/3/concurrent/__init__.pyi | 0 .../stdlib/3/concurrent/futures/__init__.pyi | 20 + .../stdlib/3/concurrent/futures/_base.pyi | 133 + .../stdlib/3/concurrent/futures/process.pyi | 28 + .../stdlib/3/concurrent/futures/thread.pyi | 42 + .../typeshed/stdlib/3/configparser.pyi | 252 + .../third_party/typeshed/stdlib/3/copyreg.pyi | 16 + .../typeshed/stdlib/3/dbm/__init__.pyi | 24 + .../typeshed/stdlib/3/dbm/dumb.pyi | 25 + .../third_party/typeshed/stdlib/3/dbm/gnu.pyi | 35 + .../typeshed/stdlib/3/dbm/ndbm.pyi | 34 + .../typeshed/stdlib/3/distutils/__init__.pyi | 0 .../stdlib/3/distutils/archive_util.pyi | 12 + .../stdlib/3/distutils/bcppcompiler.pyi | 3 + .../typeshed/stdlib/3/distutils/ccompiler.pyi | 150 + .../typeshed/stdlib/3/distutils/cmd.pyi | 67 + .../stdlib/3/distutils/command/__init__.pyi | 0 .../stdlib/3/distutils/command/bdist.pyi | 0 .../stdlib/3/distutils/command/bdist_dumb.pyi | 0 .../stdlib/3/distutils/command/bdist_msi.pyi | 6 + .../3/distutils/command/bdist_packager.pyi | 0 .../stdlib/3/distutils/command/bdist_rpm.pyi | 0 .../3/distutils/command/bdist_wininst.pyi | 0 .../stdlib/3/distutils/command/build.pyi | 0 .../stdlib/3/distutils/command/build_clib.pyi | 0 .../stdlib/3/distutils/command/build_ext.pyi | 0 .../stdlib/3/distutils/command/build_py.pyi | 8 + .../3/distutils/command/build_scripts.pyi | 0 .../stdlib/3/distutils/command/check.pyi | 0 .../stdlib/3/distutils/command/clean.pyi | 0 .../stdlib/3/distutils/command/config.pyi | 87 + .../stdlib/3/distutils/command/install.pyi | 14 + .../3/distutils/command/install_data.pyi | 0 .../3/distutils/command/install_egg_info.pyi | 10 + .../3/distutils/command/install_headers.pyi | 0 .../3/distutils/command/install_lib.pyi | 0 .../3/distutils/command/install_scripts.pyi | 0 .../stdlib/3/distutils/command/register.pyi | 0 .../stdlib/3/distutils/command/sdist.pyi | 0 .../stdlib/3/distutils/command/upload.pyi | 8 + .../typeshed/stdlib/3/distutils/config.pyi | 17 + .../typeshed/stdlib/3/distutils/core.pyi | 48 + .../stdlib/3/distutils/cygwinccompiler.pyi | 4 + .../typeshed/stdlib/3/distutils/debug.pyi | 1 + .../typeshed/stdlib/3/distutils/dep_util.pyi | 5 + .../typeshed/stdlib/3/distutils/dir_util.pyi | 15 + .../typeshed/stdlib/3/distutils/dist.pyi | 58 + .../typeshed/stdlib/3/distutils/errors.pyi | 19 + .../typeshed/stdlib/3/distutils/extension.pyi | 22 + .../stdlib/3/distutils/fancy_getopt.pyi | 21 + .../typeshed/stdlib/3/distutils/file_util.pyi | 14 + .../typeshed/stdlib/3/distutils/filelist.pyi | 1 + .../typeshed/stdlib/3/distutils/log.pyi | 25 + .../stdlib/3/distutils/msvccompiler.pyi | 3 + .../typeshed/stdlib/3/distutils/spawn.pyi | 4 + .../typeshed/stdlib/3/distutils/sysconfig.pyi | 14 + .../typeshed/stdlib/3/distutils/text_file.pyi | 21 + .../stdlib/3/distutils/unixccompiler.pyi | 3 + .../typeshed/stdlib/3/distutils/util.pyi | 23 + .../typeshed/stdlib/3/distutils/version.pyi | 38 + .../typeshed/stdlib/3/email/__init__.pyi | 23 + .../typeshed/stdlib/3/email/charset.pyi | 28 + .../stdlib/3/email/contentmanager.pyi | 11 + .../typeshed/stdlib/3/email/encoders.pyi | 6 + .../typeshed/stdlib/3/email/errors.pyi | 17 + .../typeshed/stdlib/3/email/feedparser.pyi | 21 + .../typeshed/stdlib/3/email/generator.pyi | 18 + .../typeshed/stdlib/3/email/header.pyi | 26 + .../stdlib/3/email/headerregistry.pyi | 90 + .../typeshed/stdlib/3/email/iterators.pyi | 5 + .../typeshed/stdlib/3/email/message.pyi | 87 + .../typeshed/stdlib/3/email/mime/__init__.pyi | 0 .../stdlib/3/email/mime/application.pyi | 16 + .../typeshed/stdlib/3/email/mime/audio.pyi | 16 + .../typeshed/stdlib/3/email/mime/base.pyi | 8 + .../typeshed/stdlib/3/email/mime/image.pyi | 16 + .../typeshed/stdlib/3/email/mime/message.pyi | 7 + .../stdlib/3/email/mime/multipart.pyi | 17 + .../stdlib/3/email/mime/nonmultipart.pyi | 3 + .../typeshed/stdlib/3/email/mime/text.pyi | 8 + .../typeshed/stdlib/3/email/parser.pyi | 27 + .../typeshed/stdlib/3/email/policy.pyi | 54 + .../typeshed/stdlib/3/email/utils.pyi | 40 + .../typeshed/stdlib/3/encodings/__init__.pyi | 7 + .../typeshed/stdlib/3/encodings/utf_8.pyi | 15 + .../third_party/typeshed/stdlib/3/enum.pyi | 73 + .../typeshed/stdlib/3/faulthandler.pyi | 13 + .../third_party/typeshed/stdlib/3/fcntl.pyi | 99 + .../third_party/typeshed/stdlib/3/fnmatch.pyi | 6 + .../typeshed/stdlib/3/functools.pyi | 123 + .../jedi/third_party/typeshed/stdlib/3/gc.pyi | 40 + .../third_party/typeshed/stdlib/3/getopt.pyi | 10 + .../third_party/typeshed/stdlib/3/getpass.pyi | 6 + .../third_party/typeshed/stdlib/3/gettext.pyi | 80 + .../third_party/typeshed/stdlib/3/glob.pyi | 8 + .../third_party/typeshed/stdlib/3/gzip.pyi | 94 + .../third_party/typeshed/stdlib/3/hashlib.pyi | 123 + .../third_party/typeshed/stdlib/3/heapq.pyi | 14 + .../typeshed/stdlib/3/html/__init__.pyi | 4 + .../typeshed/stdlib/3/html/entities.pyi | 6 + .../typeshed/stdlib/3/html/parser.pyi | 20 + .../typeshed/stdlib/3/http/__init__.pyi | 74 + .../typeshed/stdlib/3/http/client.pyi | 211 + .../typeshed/stdlib/3/http/cookiejar.pyi | 129 + .../typeshed/stdlib/3/http/cookies.pyi | 31 + .../typeshed/stdlib/3/http/server.pyi | 72 + .../third_party/typeshed/stdlib/3/imp.pyi | 64 + .../typeshed/stdlib/3/importlib/__init__.pyi | 15 + .../typeshed/stdlib/3/importlib/abc.pyi | 97 + .../typeshed/stdlib/3/importlib/machinery.pyi | 98 + .../typeshed/stdlib/3/importlib/metadata.pyi | 87 + .../typeshed/stdlib/3/importlib/resources.pyi | 22 + .../typeshed/stdlib/3/importlib/util.pyi | 40 + .../third_party/typeshed/stdlib/3/inspect.pyi | 309 + .../jedi/third_party/typeshed/stdlib/3/io.pyi | 186 + .../typeshed/stdlib/3/ipaddress.pyi | 152 + .../typeshed/stdlib/3/itertools.pyi | 109 + .../typeshed/stdlib/3/json/__init__.pyi | 57 + .../typeshed/stdlib/3/json/decoder.pyi | 29 + .../typeshed/stdlib/3/json/encoder.pyi | 27 + .../typeshed/stdlib/3/json/tool.pyi | 1 + .../third_party/typeshed/stdlib/3/lzma.pyi | 164 + .../typeshed/stdlib/3/macurl2path.pyi | 7 + .../stdlib/3/multiprocessing/__init__.pyi | 87 + .../stdlib/3/multiprocessing/connection.pyi | 62 + .../stdlib/3/multiprocessing/context.pyi | 151 + .../3/multiprocessing/dummy/__init__.pyi | 52 + .../3/multiprocessing/dummy/connection.pyi | 39 + .../stdlib/3/multiprocessing/managers.pyi | 137 + .../stdlib/3/multiprocessing/pool.pyi | 84 + .../stdlib/3/multiprocessing/process.pyi | 39 + .../stdlib/3/multiprocessing/queues.pyi | 35 + .../3/multiprocessing/shared_memory.pyi | 33 + .../stdlib/3/multiprocessing/sharedctypes.pyi | 43 + .../stdlib/3/multiprocessing/spawn.pyi | 21 + .../stdlib/3/multiprocessing/synchronize.pyi | 47 + .../third_party/typeshed/stdlib/3/nntplib.pyi | 113 + .../third_party/typeshed/stdlib/3/ntpath.pyi | 144 + .../typeshed/stdlib/3/nturl2path.pyi | 2 + .../typeshed/stdlib/3/os/__init__.pyi | 831 ++ .../third_party/typeshed/stdlib/3/os/path.pyi | 144 + .../third_party/typeshed/stdlib/3/pathlib.pyi | 178 + .../third_party/typeshed/stdlib/3/pipes.pyi | 15 + .../typeshed/stdlib/3/platform.pyi | 66 + .../third_party/typeshed/stdlib/3/posix.pyi | 165 + .../typeshed/stdlib/3/posixpath.pyi | 144 + .../third_party/typeshed/stdlib/3/queue.pyi | 52 + .../third_party/typeshed/stdlib/3/random.pyi | 87 + .../jedi/third_party/typeshed/stdlib/3/re.pyi | 123 + .../third_party/typeshed/stdlib/3/reprlib.pyi | 36 + .../typeshed/stdlib/3/resource.pyi | 55 + .../third_party/typeshed/stdlib/3/runpy.pyi | 22 + .../third_party/typeshed/stdlib/3/secrets.pyi | 12 + .../typeshed/stdlib/3/selectors.pyi | 69 + .../third_party/typeshed/stdlib/3/shelve.pyi | 34 + .../third_party/typeshed/stdlib/3/shlex.pyi | 45 + .../third_party/typeshed/stdlib/3/signal.pyi | 194 + .../third_party/typeshed/stdlib/3/smtplib.pyi | 159 + .../typeshed/stdlib/3/socketserver.pyi | 133 + .../third_party/typeshed/stdlib/3/spwd.pyi | 15 + .../typeshed/stdlib/3/sre_constants.pyi | 111 + .../typeshed/stdlib/3/sre_parse.pyi | 101 + .../third_party/typeshed/stdlib/3/stat.pyi | 91 + .../typeshed/stdlib/3/statistics.pyi | 72 + .../third_party/typeshed/stdlib/3/string.pyi | 30 + .../typeshed/stdlib/3/subprocess.pyi | 1054 ++ .../third_party/typeshed/stdlib/3/symbol.pyi | 90 + .../third_party/typeshed/stdlib/3/sys.pyi | 235 + .../typeshed/stdlib/3/tempfile.pyi | 304 + .../typeshed/stdlib/3/textwrap.pyi | 100 + .../typeshed/stdlib/3/tkinter/__init__.pyi | 3276 +++++++ .../stdlib/3/tkinter/commondialog.pyi | 8 + .../typeshed/stdlib/3/tkinter/constants.pyi | 80 + .../typeshed/stdlib/3/tkinter/dialog.pyi | 10 + .../typeshed/stdlib/3/tkinter/filedialog.pyi | 67 + .../typeshed/stdlib/3/tkinter/font.pyi | 96 + .../typeshed/stdlib/3/tkinter/messagebox.pyi | 31 + .../typeshed/stdlib/3/tkinter/ttk.pyi | 1232 +++ .../typeshed/stdlib/3/tokenize.pyi | 116 + .../typeshed/stdlib/3/tracemalloc.pyi | 86 + .../third_party/typeshed/stdlib/3/types.pyi | 334 + .../third_party/typeshed/stdlib/3/typing.pyi | 687 ++ .../typeshed/stdlib/3/unittest/__init__.pyi | 11 + .../typeshed/stdlib/3/unittest/async_case.pyi | 10 + .../typeshed/stdlib/3/unittest/case.pyi | 285 + .../typeshed/stdlib/3/unittest/loader.pyi | 50 + .../typeshed/stdlib/3/unittest/main.pyi | 49 + .../typeshed/stdlib/3/unittest/mock.pyi | 441 + .../typeshed/stdlib/3/unittest/result.pyi | 41 + .../typeshed/stdlib/3/unittest/runner.pyi | 35 + .../typeshed/stdlib/3/unittest/signals.pyi | 12 + .../typeshed/stdlib/3/unittest/suite.pyi | 20 + .../typeshed/stdlib/3/unittest/util.pyi | 21 + .../typeshed/stdlib/3/urllib/__init__.pyi | 0 .../typeshed/stdlib/3/urllib/error.pyi | 13 + .../typeshed/stdlib/3/urllib/parse.pyi | 152 + .../typeshed/stdlib/3/urllib/request.pyi | 341 + .../typeshed/stdlib/3/urllib/response.pyi | 51 + .../typeshed/stdlib/3/urllib/robotparser.pyi | 19 + .../typeshed/stdlib/3/venv/__init__.pyi | 85 + .../third_party/typeshed/stdlib/3/winreg.pyi | 100 + .../typeshed/stdlib/3/xmlrpc/__init__.pyi | 0 .../typeshed/stdlib/3/xmlrpc/client.pyi | 308 + .../typeshed/stdlib/3/xmlrpc/server.pyi | 160 + .../typeshed/stdlib/3/xxlimited.pyi | 13 + .../third_party/typeshed/stdlib/3/zipapp.pyi | 24 + .../third_party/2/OpenSSL/__init__.pyi | 0 .../typeshed/third_party/2/OpenSSL/crypto.pyi | 191 + .../third_party/2/concurrent/__init__.pyi | 0 .../2/concurrent/futures/__init__.pyi | 13 + .../2/concurrent/futures/_base.pyi | 92 + .../2/concurrent/futures/process.pyi | 8 + .../2/concurrent/futures/thread.pyi | 16 + .../typeshed/third_party/2/enum.pyi | 73 + .../third_party/2/fb303/FacebookService.pyi | 298 + .../typeshed/third_party/2/fb303/__init__.pyi | 0 .../typeshed/third_party/2/ipaddress.pyi | 148 + .../typeshed/third_party/2/kazoo/__init__.pyi | 0 .../typeshed/third_party/2/kazoo/client.pyi | 109 + .../third_party/2/kazoo/exceptions.pyi | 58 + .../third_party/2/kazoo/recipe/__init__.pyi | 0 .../third_party/2/kazoo/recipe/watchers.pyi | 21 + .../typeshed/third_party/2/pathlib2.pyi | 103 + .../typeshed/third_party/2/pymssql.pyi | 44 + .../third_party/2/routes/__init__.pyi | 14 + .../typeshed/third_party/2/routes/mapper.pyi | 77 + .../typeshed/third_party/2/routes/util.pyi | 20 + .../third_party/2/scribe/__init__.pyi | 0 .../typeshed/third_party/2/scribe/scribe.pyi | 40 + .../typeshed/third_party/2/scribe/ttypes.pyi | 18 + .../typeshed/third_party/2/six/__init__.pyi | 130 + .../2/six/moves/BaseHTTPServer.pyi | 1 + .../third_party/2/six/moves/CGIHTTPServer.pyi | 1 + .../2/six/moves/SimpleHTTPServer.pyi | 1 + .../third_party/2/six/moves/__init__.pyi | 78 + .../third_party/2/six/moves/_dummy_thread.pyi | 1 + .../third_party/2/six/moves/_thread.pyi | 1 + .../third_party/2/six/moves/cPickle.pyi | 1 + .../2/six/moves/collections_abc.pyi | 1 + .../third_party/2/six/moves/configparser.pyi | 1 + .../2/six/moves/email_mime_base.pyi | 1 + .../2/six/moves/email_mime_multipart.pyi | 1 + .../2/six/moves/email_mime_nonmultipart.pyi | 1 + .../2/six/moves/email_mime_text.pyi | 1 + .../third_party/2/six/moves/html_entities.pyi | 1 + .../third_party/2/six/moves/html_parser.pyi | 1 + .../third_party/2/six/moves/http_client.pyi | 1 + .../2/six/moves/http_cookiejar.pyi | 1 + .../third_party/2/six/moves/http_cookies.pyi | 1 + .../third_party/2/six/moves/queue.pyi | 1 + .../third_party/2/six/moves/reprlib.pyi | 1 + .../third_party/2/six/moves/socketserver.pyi | 1 + .../2/six/moves/urllib/__init__.pyi | 5 + .../third_party/2/six/moves/urllib/error.pyi | 2 + .../third_party/2/six/moves/urllib/parse.pyi | 29 + .../2/six/moves/urllib/request.pyi | 39 + .../2/six/moves/urllib/response.pyi | 1 + .../2/six/moves/urllib/robotparser.pyi | 1 + .../third_party/2/six/moves/urllib_error.pyi | 1 + .../third_party/2/six/moves/urllib_parse.pyi | 1 + .../2/six/moves/urllib_request.pyi | 1 + .../2/six/moves/urllib_response.pyi | 1 + .../2/six/moves/urllib_robotparser.pyi | 1 + .../third_party/2/six/moves/xmlrpc_client.pyi | 1 + .../third_party/2/tornado/__init__.pyi | 0 .../third_party/2/tornado/concurrent.pyi | 43 + .../typeshed/third_party/2/tornado/gen.pyi | 110 + .../third_party/2/tornado/httpclient.pyi | 127 + .../third_party/2/tornado/httpserver.pyi | 57 + .../third_party/2/tornado/httputil.pyi | 99 + .../typeshed/third_party/2/tornado/ioloop.pyi | 85 + .../typeshed/third_party/2/tornado/locks.pyi | 45 + .../third_party/2/tornado/netutil.pyi | 46 + .../third_party/2/tornado/process.pyi | 24 + .../third_party/2/tornado/tcpserver.pyi | 17 + .../third_party/2/tornado/testing.pyi | 63 + .../typeshed/third_party/2/tornado/util.pyi | 46 + .../typeshed/third_party/2/tornado/web.pyi | 266 + .../2and3/atomicwrites/__init__.pyi | 16 + .../third_party/2and3/attr/__init__.pyi | 257 + .../third_party/2and3/attr/_version_info.pyi | 9 + .../third_party/2and3/attr/converters.pyi | 11 + .../third_party/2and3/attr/exceptions.pyi | 15 + .../third_party/2and3/attr/filters.pyi | 6 + .../third_party/2and3/attr/validators.pyi | 54 + .../third_party/2and3/backports/__init__.pyi | 4 + .../2and3/backports/ssl_match_hostname.pyi | 3 + .../third_party/2and3/backports_abc.pyi | 15 + .../third_party/2and3/bleach/__init__.pyi | 27 + .../third_party/2and3/bleach/callbacks.pyi | 6 + .../third_party/2and3/bleach/linkifier.pyi | 31 + .../third_party/2and3/bleach/sanitizer.pyi | 34 + .../third_party/2and3/bleach/utils.pyi | 8 + .../third_party/2and3/boto/__init__.pyi | 109 + .../typeshed/third_party/2and3/boto/auth.pyi | 109 + .../third_party/2and3/boto/auth_handler.pyi | 10 + .../third_party/2and3/boto/compat.pyi | 20 + .../third_party/2and3/boto/connection.pyi | 174 + .../third_party/2and3/boto/ec2/__init__.pyi | 10 + .../third_party/2and3/boto/elb/__init__.pyi | 59 + .../third_party/2and3/boto/exception.pyi | 147 + .../third_party/2and3/boto/kms/__init__.pyi | 6 + .../third_party/2and3/boto/kms/exceptions.pyi | 17 + .../third_party/2and3/boto/kms/layer1.pyi | 82 + .../third_party/2and3/boto/plugin.pyi | 9 + .../third_party/2and3/boto/regioninfo.pyi | 22 + .../third_party/2and3/boto/s3/__init__.pyi | 18 + .../third_party/2and3/boto/s3/acl.pyi | 48 + .../third_party/2and3/boto/s3/bucket.pyi | 187 + .../2and3/boto/s3/bucketlistresultset.pyi | 80 + .../2and3/boto/s3/bucketlogging.pyi | 11 + .../third_party/2and3/boto/s3/connection.pyi | 128 + .../third_party/2and3/boto/s3/cors.pyi | 35 + .../2and3/boto/s3/deletemarker.pyi | 12 + .../third_party/2and3/boto/s3/key.pyi | 233 + .../third_party/2and3/boto/s3/keyfile.pyi | 29 + .../third_party/2and3/boto/s3/lifecycle.pyi | 65 + .../third_party/2and3/boto/s3/multidelete.pyi | 35 + .../third_party/2and3/boto/s3/multipart.pyi | 70 + .../third_party/2and3/boto/s3/prefix.pyi | 10 + .../third_party/2and3/boto/s3/tagging.pyi | 22 + .../third_party/2and3/boto/s3/user.pyi | 10 + .../third_party/2and3/boto/s3/website.pyi | 82 + .../typeshed/third_party/2and3/boto/utils.pyi | 175 + .../third_party/2and3/cachetools/__init__.pyi | 6 + .../third_party/2and3/cachetools/abc.pyi | 7 + .../third_party/2and3/cachetools/cache.pyi | 20 + .../2and3/cachetools/decorators.pyi | 16 + .../third_party/2and3/cachetools/func.pyi | 11 + .../third_party/2and3/cachetools/lfu.pyi | 14 + .../third_party/2and3/cachetools/lru.pyi | 13 + .../third_party/2and3/cachetools/rr.pyi | 21 + .../third_party/2and3/cachetools/ttl.pyi | 23 + .../typeshed/third_party/2and3/certifi.pyi | 1 + .../2and3/characteristic/__init__.pyi | 35 + .../third_party/2and3/chardet/__init__.pyi | 26 + .../third_party/2and3/chardet/enums.pyi | 39 + .../2and3/chardet/langbulgarianmodel.pyi | 9 + .../2and3/chardet/langcyrillicmodel.pyi | 17 + .../2and3/chardet/langgreekmodel.pyi | 9 + .../2and3/chardet/langhebrewmodel.pyi | 7 + .../2and3/chardet/langhungarianmodel.pyi | 9 + .../2and3/chardet/langthaimodel.pyi | 7 + .../2and3/chardet/langturkishmodel.pyi | 7 + .../2and3/chardet/universaldetector.pyi | 29 + .../third_party/2and3/chardet/version.pyi | 4 + .../third_party/2and3/click/__init__.pyi | 84 + .../third_party/2and3/click/_termui_impl.pyi | 14 + .../typeshed/third_party/2and3/click/core.pyi | 285 + .../third_party/2and3/click/decorators.pyi | 293 + .../third_party/2and3/click/exceptions.pyi | 60 + .../third_party/2and3/click/formatting.pyi | 34 + .../third_party/2and3/click/globals.pyi | 8 + .../third_party/2and3/click/parser.pyi | 65 + .../third_party/2and3/click/termui.pyi | 103 + .../third_party/2and3/click/testing.pyi | 67 + .../third_party/2and3/click/types.pyi | 125 + .../third_party/2and3/click/utils.pyi | 43 + .../typeshed/third_party/2and3/croniter.pyi | 43 + .../2and3/cryptography/__init__.pyi | 0 .../2and3/cryptography/exceptions.pyi | 7 + .../third_party/2and3/cryptography/fernet.pyi | 25 + .../2and3/cryptography/hazmat/__init__.pyi | 3 + .../cryptography/hazmat/backends/__init__.pyi | 6 + .../hazmat/backends/interfaces.pyi | 196 + .../cryptography/hazmat/bindings/__init__.pyi | 0 .../hazmat/bindings/openssl/__init__.pyi | 0 .../hazmat/bindings/openssl/binding.pyi | 6 + .../hazmat/primitives/__init__.pyi | 3 + .../hazmat/primitives/asymmetric/__init__.pyi | 3 + .../hazmat/primitives/asymmetric/dh.pyi | 79 + .../hazmat/primitives/asymmetric/dsa.pyi | 79 + .../hazmat/primitives/asymmetric/ec.pyi | 196 + .../hazmat/primitives/asymmetric/ed25519.pyi | 25 + .../hazmat/primitives/asymmetric/ed448.pyi | 25 + .../hazmat/primitives/asymmetric/padding.pyi | 27 + .../hazmat/primitives/asymmetric/rsa.pyi | 83 + .../hazmat/primitives/asymmetric/utils.pyi | 12 + .../hazmat/primitives/asymmetric/x25519.pyi | 23 + .../hazmat/primitives/asymmetric/x448.pyi | 23 + .../hazmat/primitives/ciphers/__init__.pyi | 44 + .../hazmat/primitives/ciphers/aead.pyi | 22 + .../hazmat/primitives/ciphers/algorithms.pyi | 76 + .../hazmat/primitives/ciphers/modes.pyi | 94 + .../cryptography/hazmat/primitives/cmac.pyi | 11 + .../hazmat/primitives/constant_time.pyi | 1 + .../cryptography/hazmat/primitives/hashes.pyi | 44 + .../cryptography/hazmat/primitives/hmac.pyi | 11 + .../hazmat/primitives/kdf/__init__.pyi | 7 + .../hazmat/primitives/kdf/concatkdf.pyi | 24 + .../hazmat/primitives/kdf/hkdf.pyi | 22 + .../hazmat/primitives/kdf/kbkdf.pyi | 30 + .../hazmat/primitives/kdf/pbkdf2.pyi | 12 + .../hazmat/primitives/kdf/scrypt.pyi | 9 + .../hazmat/primitives/kdf/x963kdf.pyi | 12 + .../hazmat/primitives/keywrap.pyi | 10 + .../hazmat/primitives/padding.pyi | 17 + .../hazmat/primitives/poly1305.pyi | 9 + .../primitives/serialization/__init__.pyi | 63 + .../primitives/serialization/pkcs12.pyi | 18 + .../hazmat/primitives/twofactor/__init__.pyi | 1 + .../hazmat/primitives/twofactor/hotp.pyi | 12 + .../hazmat/primitives/twofactor/totp.pyi | 18 + .../2and3/cryptography/x509/__init__.pyi | 420 + .../2and3/cryptography/x509/extensions.pyi | 22 + .../2and3/cryptography/x509/oid.pyi | 106 + .../typeshed/third_party/2and3/dateparser.pyi | 14 + .../2and3/datetimerange/__init__.pyi | 47 + .../third_party/2and3/dateutil/__init__.pyi | 0 .../third_party/2and3/dateutil/_common.pyi | 12 + .../third_party/2and3/dateutil/easter.pyi | 8 + .../third_party/2and3/dateutil/parser.pyi | 51 + .../2and3/dateutil/relativedelta.pyi | 97 + .../third_party/2and3/dateutil/rrule.pyi | 105 + .../2and3/dateutil/tz/__init__.pyi | 15 + .../third_party/2and3/dateutil/tz/_common.pyi | 24 + .../third_party/2and3/dateutil/tz/tz.pyi | 101 + .../third_party/2and3/dateutil/utils.pyi | 6 + .../typeshed/third_party/2and3/decorator.pyi | 81 + .../third_party/2and3/deprecated/__init__.pyi | 1 + .../third_party/2and3/deprecated/classic.pyi | 21 + .../third_party/2and3/deprecated/sphinx.pyi | 31 + .../third_party/2and3/emoji/__init__.pyi | 13 + .../typeshed/third_party/2and3/emoji/core.pyi | 9 + .../third_party/2and3/emoji/unicode_codes.pyi | 6 + .../typeshed/third_party/2and3/first.pyi | 12 + .../third_party/2and3/flask/__init__.pyi | 41 + .../typeshed/third_party/2and3/flask/app.pyi | 195 + .../third_party/2and3/flask/blueprints.pyi | 80 + .../typeshed/third_party/2and3/flask/cli.pyi | 68 + .../third_party/2and3/flask/config.pyi | 18 + .../typeshed/third_party/2and3/flask/ctx.pyi | 40 + .../third_party/2and3/flask/debughelpers.pyi | 14 + .../third_party/2and3/flask/globals.pyi | 16 + .../third_party/2and3/flask/helpers.pyi | 55 + .../third_party/2and3/flask/json/__init__.pyi | 19 + .../third_party/2and3/flask/json/tag.pyi | 67 + .../third_party/2and3/flask/logging.pyi | 8 + .../third_party/2and3/flask/sessions.pyi | 57 + .../third_party/2and3/flask/signals.pyi | 29 + .../third_party/2and3/flask/templating.pyi | 16 + .../third_party/2and3/flask/testing.pyi | 56 + .../third_party/2and3/flask/views.pyi | 17 + .../third_party/2and3/flask/wrappers.pyi | 32 + .../third_party/2and3/geoip2/__init__.pyi | 0 .../third_party/2and3/geoip2/database.pyi | 27 + .../third_party/2and3/geoip2/errors.pyi | 14 + .../third_party/2and3/geoip2/mixins.pyi | 3 + .../third_party/2and3/geoip2/models.pyi | 62 + .../third_party/2and3/geoip2/records.pyi | 83 + .../typeshed/third_party/2and3/gflags.pyi | 312 + .../third_party/2and3/google/__init__.pyi | 0 .../2and3/google/protobuf/__init__.pyi | 1 + .../2and3/google/protobuf/any_pb2.pyi | 47 + .../2and3/google/protobuf/api_pb2.pyi | 114 + .../google/protobuf/compiler/__init__.pyi | 0 .../google/protobuf/compiler/plugin_pb2.pyi | 136 + .../2and3/google/protobuf/descriptor.pyi | 330 + .../2and3/google/protobuf/descriptor_pb2.pyi | 734 ++ .../2and3/google/protobuf/descriptor_pool.pyi | 18 + .../2and3/google/protobuf/duration_pb2.pyi | 46 + .../2and3/google/protobuf/empty_pb2.pyi | 22 + .../2and3/google/protobuf/field_mask_pb2.pyi | 50 + .../google/protobuf/internal/__init__.pyi | 0 .../google/protobuf/internal/containers.pyi | 90 + .../google/protobuf/internal/decoder.pyi | 30 + .../google/protobuf/internal/encoder.pyi | 34 + .../protobuf/internal/enum_type_wrapper.pyi | 18 + .../protobuf/internal/extension_dict.pyi | 36 + .../protobuf/internal/message_listener.pyi | 5 + .../protobuf/internal/python_message.pyi | 1 + .../protobuf/internal/well_known_types.pyi | 94 + .../google/protobuf/internal/wire_format.pyi | 50 + .../2and3/google/protobuf/json_format.pyi | 26 + .../2and3/google/protobuf/message.pyi | 56 + .../2and3/google/protobuf/message_factory.pyi | 14 + .../2and3/google/protobuf/reflection.pyi | 6 + .../2and3/google/protobuf/service.pyi | 39 + .../google/protobuf/source_context_pb2.pyi | 41 + .../2and3/google/protobuf/struct_pb2.pyi | 126 + .../2and3/google/protobuf/symbol_database.pyi | 16 + .../2and3/google/protobuf/timestamp_pb2.pyi | 46 + .../2and3/google/protobuf/type_pb2.pyi | 237 + .../2and3/google/protobuf/util/__init__.pyi | 0 .../2and3/google/protobuf/wrappers_pb2.pyi | 129 + .../third_party/2and3/itsdangerous.pyi | 184 + .../third_party/2and3/jinja2/__init__.pyi | 45 + .../third_party/2and3/jinja2/_compat.pyi | 36 + .../third_party/2and3/jinja2/_stringdefs.pyi | 40 + .../third_party/2and3/jinja2/bccache.pyi | 44 + .../third_party/2and3/jinja2/compiler.pyi | 177 + .../third_party/2and3/jinja2/constants.pyi | 1 + .../third_party/2and3/jinja2/debug.pyi | 37 + .../third_party/2and3/jinja2/defaults.pyi | 22 + .../third_party/2and3/jinja2/environment.pyi | 224 + .../third_party/2and3/jinja2/exceptions.pyi | 31 + .../typeshed/third_party/2and3/jinja2/ext.pyi | 66 + .../third_party/2and3/jinja2/filters.pyi | 56 + .../third_party/2and3/jinja2/lexer.pyi | 117 + .../third_party/2and3/jinja2/loaders.pyi | 80 + .../third_party/2and3/jinja2/meta.pyi | 12 + .../third_party/2and3/jinja2/nodes.pyi | 255 + .../third_party/2and3/jinja2/optimizer.pyi | 30 + .../third_party/2and3/jinja2/parser.pyi | 68 + .../third_party/2and3/jinja2/runtime.pyi | 132 + .../third_party/2and3/jinja2/sandbox.pyi | 35 + .../third_party/2and3/jinja2/tests.pyi | 24 + .../third_party/2and3/jinja2/utils.pyi | 87 + .../third_party/2and3/jinja2/visitor.pyi | 8 + .../third_party/2and3/markdown/__init__.pyi | 2 + .../third_party/2and3/markdown/__meta__.pyi | 3 + .../2and3/markdown/blockparser.pyi | 18 + .../2and3/markdown/blockprocessors.pyi | 59 + .../third_party/2and3/markdown/core.pyi | 63 + .../2and3/markdown/extensions/__init__.pyi | 13 + .../2and3/markdown/extensions/abbr.pyi | 16 + .../2and3/markdown/extensions/admonition.pyi | 15 + .../2and3/markdown/extensions/attr_list.pyi | 20 + .../2and3/markdown/extensions/codehilite.pyi | 42 + .../2and3/markdown/extensions/def_list.pyi | 13 + .../2and3/markdown/extensions/extra.pyi | 10 + .../2and3/markdown/extensions/fenced_code.pyi | 16 + .../2and3/markdown/extensions/footnotes.pyi | 57 + .../markdown/extensions/legacy_attrs.pyi | 13 + .../2and3/markdown/extensions/legacy_em.pyi | 13 + .../2and3/markdown/extensions/md_in_html.pyi | 9 + .../2and3/markdown/extensions/meta.pyi | 18 + .../2and3/markdown/extensions/nl2br.pyi | 9 + .../2and3/markdown/extensions/sane_lists.pyi | 14 + .../2and3/markdown/extensions/smarty.pyi | 39 + .../2and3/markdown/extensions/tables.pyi | 19 + .../2and3/markdown/extensions/toc.pyi | 44 + .../2and3/markdown/extensions/wikilinks.pyi | 16 + .../2and3/markdown/inlinepatterns.pyi | 103 + .../third_party/2and3/markdown/pep562.pyi | 9 + .../2and3/markdown/postprocessors.pyi | 17 + .../2and3/markdown/preprocessors.pyi | 23 + .../2and3/markdown/serializers.pyi | 4 + .../2and3/markdown/treeprocessors.pyi | 19 + .../third_party/2and3/markdown/util.pyi | 56 + .../third_party/2and3/markupsafe/__init__.pyi | 55 + .../third_party/2and3/markupsafe/_compat.pyi | 21 + .../2and3/markupsafe/_constants.pyi | 3 + .../third_party/2and3/markupsafe/_native.pyi | 8 + .../2and3/markupsafe/_speedups.pyi | 8 + .../third_party/2and3/maxminddb/__init__.pyi | 6 + .../third_party/2and3/maxminddb/compat.pyi | 6 + .../third_party/2and3/maxminddb/const.pyi | 6 + .../third_party/2and3/maxminddb/decoder.pyi | 5 + .../third_party/2and3/maxminddb/errors.pyi | 1 + .../third_party/2and3/maxminddb/extension.pyi | 33 + .../third_party/2and3/maxminddb/reader.pyi | 34 + .../typeshed/third_party/2and3/mock.pyi | 441 + .../third_party/2and3/mypy_extensions.pyi | 46 + .../third_party/2and3/nmap/__init__.pyi | 1 + .../typeshed/third_party/2and3/nmap/nmap.pyi | 122 + .../third_party/2and3/paramiko/__init__.pyi | 41 + .../third_party/2and3/paramiko/_version.pyi | 3 + .../third_party/2and3/paramiko/_winapi.pyi | 97 + .../third_party/2and3/paramiko/agent.pyi | 67 + .../2and3/paramiko/auth_handler.pyi | 49 + .../third_party/2and3/paramiko/ber.pyi | 17 + .../2and3/paramiko/buffered_pipe.pyi | 16 + .../third_party/2and3/paramiko/channel.pyi | 99 + .../third_party/2and3/paramiko/client.pyi | 74 + .../third_party/2and3/paramiko/common.pyi | 139 + .../third_party/2and3/paramiko/compress.pyi | 11 + .../third_party/2and3/paramiko/config.pyi | 31 + .../third_party/2and3/paramiko/dsskey.pyi | 34 + .../third_party/2and3/paramiko/ecdsakey.pyi | 53 + .../third_party/2and3/paramiko/ed25519key.pyi | 22 + .../third_party/2and3/paramiko/file.pyi | 38 + .../third_party/2and3/paramiko/hostkeys.pyi | 47 + .../2and3/paramiko/kex_curve25519.pyi | 25 + .../2and3/paramiko/kex_ecdh_nist.pyi | 37 + .../third_party/2and3/paramiko/kex_gex.pyi | 39 + .../third_party/2and3/paramiko/kex_group1.pyi | 29 + .../2and3/paramiko/kex_group14.pyi | 20 + .../2and3/paramiko/kex_group16.pyi | 16 + .../third_party/2and3/paramiko/kex_gss.pyi | 66 + .../third_party/2and3/paramiko/message.pyi | 42 + .../third_party/2and3/paramiko/packet.pyi | 60 + .../third_party/2and3/paramiko/pipe.pyi | 35 + .../third_party/2and3/paramiko/pkey.pyi | 44 + .../third_party/2and3/paramiko/primes.pyi | 8 + .../third_party/2and3/paramiko/proxy.pyi | 16 + .../third_party/2and3/paramiko/py3compat.pyi | 41 + .../third_party/2and3/paramiko/rsakey.pyi | 33 + .../third_party/2and3/paramiko/server.pyi | 51 + .../third_party/2and3/paramiko/sftp.pyi | 61 + .../third_party/2and3/paramiko/sftp_attr.pyi | 22 + .../2and3/paramiko/sftp_client.pyi | 67 + .../third_party/2and3/paramiko/sftp_file.pyi | 29 + .../2and3/paramiko/sftp_handle.pyi | 13 + .../2and3/paramiko/sftp_server.pyi | 28 + .../third_party/2and3/paramiko/sftp_si.pyi | 23 + .../2and3/paramiko/ssh_exception.pyi | 41 + .../third_party/2and3/paramiko/ssh_gss.pyi | 54 + .../third_party/2and3/paramiko/transport.pyi | 194 + .../third_party/2and3/paramiko/util.pyi | 52 + .../2and3/paramiko/win_pageant.pyi | 16 + .../typeshed/third_party/2and3/polib.pyi | 156 + .../third_party/2and3/pyVmomi/__init__.pyi | 0 .../2and3/pyVmomi/vim/__init__.pyi | 69 + .../third_party/2and3/pyVmomi/vim/event.pyi | 16 + .../third_party/2and3/pyVmomi/vim/fault.pyi | 7 + .../third_party/2and3/pyVmomi/vim/option.pyi | 9 + .../third_party/2and3/pyVmomi/vim/view.pyi | 15 + .../2and3/pyVmomi/vmodl/__init__.pyi | 5 + .../third_party/2and3/pyVmomi/vmodl/fault.pyi | 5 + .../third_party/2and3/pyVmomi/vmodl/query.pyi | 38 + .../typeshed/third_party/2and3/pycurl.pyi | 644 ++ .../third_party/2and3/pymysql/__init__.pyi | 63 + .../third_party/2and3/pymysql/charset.pyi | 16 + .../third_party/2and3/pymysql/connections.pyi | 172 + .../2and3/pymysql/constants/CLIENT.pyi | 18 + .../2and3/pymysql/constants/COMMAND.pyi | 22 + .../2and3/pymysql/constants/ER.pyi | 471 + .../2and3/pymysql/constants/FIELD_TYPE.pyi | 29 + .../2and3/pymysql/constants/FLAG.pyi | 17 + .../2and3/pymysql/constants/SERVER_STATUS.pyi | 10 + .../2and3/pymysql/constants/__init__.pyi | 0 .../third_party/2and3/pymysql/converters.pyi | 47 + .../third_party/2and3/pymysql/cursors.pyi | 52 + .../third_party/2and3/pymysql/err.pyi | 20 + .../third_party/2and3/pymysql/times.pyi | 10 + .../third_party/2and3/pymysql/util.pyi | 3 + .../third_party/2and3/pynamodb/__init__.pyi | 1 + .../third_party/2and3/pynamodb/attributes.pyi | 118 + .../2and3/pynamodb/connection/__init__.pyi | 2 + .../2and3/pynamodb/connection/base.pyi | 158 + .../2and3/pynamodb/connection/table.pyi | 108 + .../2and3/pynamodb/connection/util.pyi | 3 + .../third_party/2and3/pynamodb/constants.pyi | 166 + .../third_party/2and3/pynamodb/exceptions.pyi | 23 + .../third_party/2and3/pynamodb/indexes.pyi | 39 + .../third_party/2and3/pynamodb/models.pyi | 159 + .../third_party/2and3/pynamodb/settings.pyi | 8 + .../third_party/2and3/pynamodb/throttle.pyi | 19 + .../third_party/2and3/pynamodb/types.pyi | 5 + .../third_party/2and3/pyre_extensions.pyi | 7 + .../third_party/2and3/pytz/__init__.pyi | 43 + .../third_party/2and3/redis/__init__.pyi | 21 + .../third_party/2and3/redis/client.pyi | 633 ++ .../third_party/2and3/redis/connection.pyi | 177 + .../third_party/2and3/redis/exceptions.pyi | 17 + .../third_party/2and3/redis/utils.pyi | 8 + .../third_party/2and3/requests/__init__.pyi | 36 + .../third_party/2and3/requests/adapters.pyi | 73 + .../third_party/2and3/requests/api.pyi | 28 + .../third_party/2and3/requests/auth.pyi | 39 + .../third_party/2and3/requests/compat.pyi | 3 + .../third_party/2and3/requests/cookies.pyi | 64 + .../third_party/2and3/requests/exceptions.pyi | 31 + .../third_party/2and3/requests/hooks.pyi | 6 + .../third_party/2and3/requests/models.pyi | 129 + .../2and3/requests/packages/__init__.pyi | 4 + .../requests/packages/urllib3/__init__.pyi | 26 + .../packages/urllib3/_collections.pyi | 52 + .../requests/packages/urllib3/connection.pyi | 65 + .../packages/urllib3/connectionpool.pyi | 121 + .../packages/urllib3/contrib/__init__.pyi | 0 .../requests/packages/urllib3/exceptions.pyi | 50 + .../requests/packages/urllib3/fields.pyi | 13 + .../requests/packages/urllib3/filepost.pyi | 12 + .../packages/urllib3/packages/__init__.pyi | 0 .../packages/ssl_match_hostname/__init__.pyi | 4 + .../ssl_match_hostname/_implementation.pyi | 3 + .../requests/packages/urllib3/poolmanager.pyi | 28 + .../requests/packages/urllib3/request.pyi | 11 + .../requests/packages/urllib3/response.pyi | 66 + .../packages/urllib3/util/__init__.pyi | 20 + .../packages/urllib3/util/connection.pyi | 8 + .../packages/urllib3/util/request.pyi | 11 + .../packages/urllib3/util/response.pyi | 1 + .../requests/packages/urllib3/util/retry.pyi | 43 + .../requests/packages/urllib3/util/ssl_.pyi | 30 + .../packages/urllib3/util/timeout.pyi | 21 + .../requests/packages/urllib3/util/url.pyi | 23 + .../third_party/2and3/requests/sessions.pyi | 101 + .../2and3/requests/status_codes.pyi | 3 + .../third_party/2and3/requests/structures.pyi | 20 + .../third_party/2and3/requests/utils.pyi | 54 + .../third_party/2and3/retry/__init__.pyi | 1 + .../typeshed/third_party/2and3/retry/api.pyi | 28 + .../third_party/2and3/simplejson/__init__.pyi | 12 + .../third_party/2and3/simplejson/decoder.pyi | 6 + .../third_party/2and3/simplejson/encoder.pyi | 9 + .../third_party/2and3/simplejson/scanner.pyi | 11 + .../third_party/2and3/singledispatch.pyi | 15 + .../third_party/2and3/slugify/__init__.pyi | 2 + .../third_party/2and3/slugify/slugify.pyi | 19 + .../third_party/2and3/slugify/special.pyi | 8 + .../typeshed/third_party/2and3/tabulate.pyi | 43 + .../typeshed/third_party/2and3/termcolor.pyi | 8 + .../typeshed/third_party/2and3/toml.pyi | 19 + .../third_party/2and3/typing_extensions.pyi | 114 + .../third_party/2and3/tzlocal/__init__.pyi | 4 + .../typeshed/third_party/2and3/ujson.pyi | 35 + .../third_party/2and3/werkzeug/__init__.pyi | 151 + .../third_party/2and3/werkzeug/_compat.pyi | 53 + .../third_party/2and3/werkzeug/_internal.pyi | 26 + .../third_party/2and3/werkzeug/_reloader.pyi | 29 + .../2and3/werkzeug/contrib/__init__.pyi | 0 .../2and3/werkzeug/contrib/atom.pyi | 50 + .../2and3/werkzeug/contrib/cache.pyi | 92 + .../2and3/werkzeug/contrib/fixers.pyi | 35 + .../2and3/werkzeug/contrib/iterio.pyi | 39 + .../2and3/werkzeug/contrib/jsrouting.pyi | 10 + .../2and3/werkzeug/contrib/limiter.pyi | 7 + .../2and3/werkzeug/contrib/lint.pyi | 1 + .../2and3/werkzeug/contrib/profiler.pyi | 9 + .../2and3/werkzeug/contrib/securecookie.pyi | 39 + .../2and3/werkzeug/contrib/sessions.pyi | 77 + .../2and3/werkzeug/contrib/testtools.pyi | 8 + .../2and3/werkzeug/contrib/wrappers.pyi | 27 + .../2and3/werkzeug/datastructures.pyi | 458 + .../2and3/werkzeug/debug/__init__.pyi | 51 + .../2and3/werkzeug/debug/console.pyi | 44 + .../third_party/2and3/werkzeug/debug/repr.pyi | 33 + .../2and3/werkzeug/debug/tbtools.pyi | 63 + .../third_party/2and3/werkzeug/exceptions.pyi | 183 + .../third_party/2and3/werkzeug/filesystem.pyi | 7 + .../third_party/2and3/werkzeug/formparser.pyi | 102 + .../third_party/2and3/werkzeug/http.pyi | 137 + .../third_party/2and3/werkzeug/local.pyi | 100 + .../2and3/werkzeug/middleware/__init__.pyi | 0 .../2and3/werkzeug/middleware/dispatcher.pyi | 8 + .../2and3/werkzeug/middleware/http_proxy.pyi | 14 + .../2and3/werkzeug/middleware/lint.pyi | 62 + .../2and3/werkzeug/middleware/profiler.pyi | 14 + .../2and3/werkzeug/middleware/proxy_fix.pyi | 23 + .../2and3/werkzeug/middleware/shared_data.pyi | 29 + .../2and3/werkzeug/posixemulation.pyi | 8 + .../third_party/2and3/werkzeug/routing.pyi | 230 + .../third_party/2and3/werkzeug/script.pyi | 24 + .../third_party/2and3/werkzeug/security.pyi | 12 + .../third_party/2and3/werkzeug/serving.pyi | 140 + .../third_party/2and3/werkzeug/test.pyi | 175 + .../third_party/2and3/werkzeug/testapp.pyi | 10 + .../third_party/2and3/werkzeug/urls.pyi | 94 + .../third_party/2and3/werkzeug/useragents.pyi | 18 + .../third_party/2and3/werkzeug/utils.pyi | 58 + .../third_party/2and3/werkzeug/wrappers.pyi | 289 + .../third_party/2and3/werkzeug/wsgi.pyi | 74 + .../third_party/2and3/yaml/__init__.pyi | 275 + .../third_party/2and3/yaml/composer.pyi | 17 + .../third_party/2and3/yaml/constructor.pyi | 86 + .../typeshed/third_party/2and3/yaml/cyaml.pyi | 63 + .../third_party/2and3/yaml/dumper.pyi | 61 + .../third_party/2and3/yaml/emitter.pyi | 109 + .../typeshed/third_party/2and3/yaml/error.pyi | 21 + .../third_party/2and3/yaml/events.pyi | 62 + .../third_party/2and3/yaml/loader.pyi | 18 + .../typeshed/third_party/2and3/yaml/nodes.pyi | 31 + .../third_party/2and3/yaml/parser.pyi | 45 + .../third_party/2and3/yaml/reader.pyi | 35 + .../third_party/2and3/yaml/representer.pyi | 60 + .../third_party/2and3/yaml/resolver.pyi | 25 + .../third_party/2and3/yaml/scanner.pyi | 97 + .../third_party/2and3/yaml/serializer.pyi | 24 + .../third_party/2and3/yaml/tokens.pyi | 93 + .../third_party/3/aiofiles/__init__.pyi | 1 + .../typeshed/third_party/3/aiofiles/base.pyi | 35 + .../typeshed/third_party/3/aiofiles/os.pyi | 26 + .../3/aiofiles/threadpool/__init__.pyi | 91 + .../3/aiofiles/threadpool/binary.pyi | 41 + .../3/aiofiles/threadpool/text.pyi | 38 + .../typeshed/third_party/3/contextvars.pyi | 38 + .../typeshed/third_party/3/dataclasses.pyi | 95 + .../third_party/3/docutils/__init__.pyi | 3 + .../third_party/3/docutils/examples.pyi | 5 + .../typeshed/third_party/3/docutils/nodes.pyi | 6 + .../3/docutils/parsers/__init__.pyi | 3 + .../3/docutils/parsers/rst/__init__.pyi | 3 + .../3/docutils/parsers/rst/nodes.pyi | 3 + .../3/docutils/parsers/rst/roles.pyi | 12 + .../3/docutils/parsers/rst/states.pyi | 6 + .../third_party/3/filelock/__init__.pyi | 54 + .../third_party/3/freezegun/__init__.pyi | 1 + .../typeshed/third_party/3/freezegun/api.pyi | 56 + .../typeshed/third_party/3/frozendict.pyi | 27 + .../typeshed/third_party/3/jwt/__init__.pyi | 49 + .../typeshed/third_party/3/jwt/algorithms.pyi | 101 + .../third_party/3/jwt/contrib/__init__.pyi | 0 .../3/jwt/contrib/algorithms/__init__.pyi | 0 .../3/jwt/contrib/algorithms/py_ecdsa.pyi | 10 + .../3/jwt/contrib/algorithms/pycrypto.pyi | 10 + .../typeshed/third_party/3/orjson.pyi | 24 + .../third_party/3/pkg_resources/__init__.pyi | 271 + .../3/pkg_resources/py31compat.pyi | 5 + .../third_party/3/pyrfc3339/__init__.pyi | 2 + .../third_party/3/pyrfc3339/generator.pyi | 3 + .../third_party/3/pyrfc3339/parser.pyi | 3 + .../third_party/3/pyrfc3339/utils.pyi | 11 + .../typeshed/third_party/3/six/__init__.pyi | 125 + .../3/six/moves/BaseHTTPServer.pyi | 1 + .../third_party/3/six/moves/CGIHTTPServer.pyi | 1 + .../3/six/moves/SimpleHTTPServer.pyi | 1 + .../third_party/3/six/moves/__init__.pyi | 65 + .../third_party/3/six/moves/_dummy_thread.pyi | 1 + .../third_party/3/six/moves/_thread.pyi | 1 + .../third_party/3/six/moves/builtins.pyi | 1 + .../third_party/3/six/moves/cPickle.pyi | 1 + .../3/six/moves/collections_abc.pyi | 1 + .../third_party/3/six/moves/configparser.pyi | 1 + .../3/six/moves/email_mime_base.pyi | 1 + .../3/six/moves/email_mime_multipart.pyi | 1 + .../3/six/moves/email_mime_nonmultipart.pyi | 1 + .../3/six/moves/email_mime_text.pyi | 1 + .../third_party/3/six/moves/html_entities.pyi | 1 + .../third_party/3/six/moves/html_parser.pyi | 1 + .../third_party/3/six/moves/http_client.pyi | 1 + .../3/six/moves/http_cookiejar.pyi | 1 + .../third_party/3/six/moves/http_cookies.pyi | 1 + .../third_party/3/six/moves/queue.pyi | 1 + .../third_party/3/six/moves/reprlib.pyi | 1 + .../third_party/3/six/moves/socketserver.pyi | 1 + .../third_party/3/six/moves/tkinter.pyi | 1 + .../3/six/moves/tkinter_commondialog.pyi | 1 + .../3/six/moves/tkinter_constants.pyi | 1 + .../3/six/moves/tkinter_dialog.pyi | 1 + .../3/six/moves/tkinter_filedialog.pyi | 1 + .../3/six/moves/tkinter_tkfiledialog.pyi | 1 + .../third_party/3/six/moves/tkinter_ttk.pyi | 1 + .../3/six/moves/urllib/__init__.pyi | 5 + .../third_party/3/six/moves/urllib/error.pyi | 1 + .../third_party/3/six/moves/urllib/parse.pyi | 30 + .../3/six/moves/urllib/request.pyi | 41 + .../3/six/moves/urllib/response.pyi | 8 + .../3/six/moves/urllib/robotparser.pyi | 1 + .../third_party/3/six/moves/urllib_error.pyi | 1 + .../third_party/3/six/moves/urllib_parse.pyi | 1 + .../3/six/moves/urllib_request.pyi | 1 + .../3/six/moves/urllib_response.pyi | 1 + .../3/six/moves/urllib_robotparser.pyi | 1 + .../third_party/3/typed_ast/__init__.pyi | 0 .../third_party/3/typed_ast/ast27.pyi | 335 + .../typeshed/third_party/3/typed_ast/ast3.pyi | 384 + .../third_party/3/typed_ast/conversions.pyi | 3 + .../third_party/3/waitress/__init__.pyi | 7 + .../third_party/3/waitress/adjustments.pyi | 61 + .../third_party/3/waitress/buffers.pyi | 57 + .../third_party/3/waitress/channel.pyi | 49 + .../third_party/3/waitress/compat.pyi | 39 + .../third_party/3/waitress/parser.pyi | 43 + .../third_party/3/waitress/proxy_headers.pyi | 32 + .../third_party/3/waitress/receiver.pyi | 32 + .../third_party/3/waitress/rfc7230.pyi | 16 + .../third_party/3/waitress/runner.pyi | 11 + .../third_party/3/waitress/server.pyi | 103 + .../typeshed/third_party/3/waitress/task.pyi | 69 + .../third_party/3/waitress/trigger.pyi | 31 + .../third_party/3/waitress/utilities.pyi | 76 + .../third_party/3/waitress/wasyncore.pyi | 94 + .../python3.12/site-packages/jedi/utils.py | 134 + .../site-packages/markdown_it/__init__.py | 5 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 322 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 519 bytes .../__pycache__/_punycode.cpython-312.pyc | Bin 0 -> 2611 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 17001 bytes .../__pycache__/parser_block.cpython-312.pyc | Bin 0 -> 4056 bytes .../__pycache__/parser_core.cpython-312.pyc | Bin 0 -> 1819 bytes .../__pycache__/parser_inline.cpython-312.pyc | Bin 0 -> 5309 bytes .../__pycache__/renderer.cpython-312.pyc | Bin 0 -> 11826 bytes .../__pycache__/ruler.cpython-312.pyc | Bin 0 -> 12214 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 7814 bytes .../__pycache__/tree.cpython-312.pyc | Bin 0 -> 15825 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 8347 bytes .../site-packages/markdown_it/_compat.py | 11 + .../site-packages/markdown_it/_punycode.py | 67 + .../site-packages/markdown_it/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 191 bytes .../cli/__pycache__/parse.cpython-312.pyc | Bin 0 -> 4518 bytes .../site-packages/markdown_it/cli/parse.py | 109 + .../markdown_it/common/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 194 bytes .../__pycache__/entities.cpython-312.pyc | Bin 0 -> 554 bytes .../__pycache__/html_blocks.cpython-312.pyc | Bin 0 -> 778 bytes .../__pycache__/html_re.cpython-312.pyc | Bin 0 -> 1340 bytes .../__pycache__/normalize_url.cpython-312.pyc | Bin 0 -> 3325 bytes .../common/__pycache__/utils.cpython-312.pyc | Bin 0 -> 10074 bytes .../markdown_it/common/entities.py | 4 + .../markdown_it/common/html_blocks.py | 68 + .../markdown_it/common/html_re.py | 40 + .../markdown_it/common/normalize_url.py | 81 + .../site-packages/markdown_it/common/utils.py | 318 + .../markdown_it/helpers/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 460 bytes .../parse_link_destination.cpython-312.pyc | Bin 0 -> 2183 bytes .../parse_link_label.cpython-312.pyc | Bin 0 -> 1427 bytes .../parse_link_title.cpython-312.pyc | Bin 0 -> 1945 bytes .../helpers/parse_link_destination.py | 86 + .../markdown_it/helpers/parse_link_label.py | 43 + .../markdown_it/helpers/parse_link_title.py | 60 + .../site-packages/markdown_it/main.py | 355 + .../site-packages/markdown_it/parser_block.py | 111 + .../site-packages/markdown_it/parser_core.py | 45 + .../markdown_it/parser_inline.py | 147 + .../site-packages/markdown_it/port.yaml | 48 + .../markdown_it/presets/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1610 bytes .../__pycache__/commonmark.cpython-312.pyc | Bin 0 -> 1155 bytes .../__pycache__/default.cpython-312.pyc | Bin 0 -> 671 bytes .../presets/__pycache__/zero.cpython-312.pyc | Bin 0 -> 932 bytes .../markdown_it/presets/commonmark.py | 74 + .../markdown_it/presets/default.py | 35 + .../site-packages/markdown_it/presets/zero.py | 43 + .../site-packages/markdown_it/py.typed | 1 + .../site-packages/markdown_it/renderer.py | 336 + .../site-packages/markdown_it/ruler.py | 276 + .../markdown_it/rules_block/__init__.py | 27 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 681 bytes .../__pycache__/blockquote.cpython-312.pyc | Bin 0 -> 6916 bytes .../__pycache__/code.cpython-312.pyc | Bin 0 -> 1380 bytes .../__pycache__/fence.cpython-312.pyc | Bin 0 -> 2526 bytes .../__pycache__/heading.cpython-312.pyc | Bin 0 -> 2625 bytes .../__pycache__/hr.cpython-312.pyc | Bin 0 -> 1755 bytes .../__pycache__/html_block.cpython-312.pyc | Bin 0 -> 3614 bytes .../__pycache__/lheading.cpython-312.pyc | Bin 0 -> 2936 bytes .../__pycache__/list.cpython-312.pyc | Bin 0 -> 8037 bytes .../__pycache__/paragraph.cpython-312.pyc | Bin 0 -> 2176 bytes .../__pycache__/reference.cpython-312.pyc | Bin 0 -> 5697 bytes .../__pycache__/state_block.cpython-312.pyc | Bin 0 -> 9201 bytes .../__pycache__/table.cpython-312.pyc | Bin 0 -> 7220 bytes .../markdown_it/rules_block/blockquote.py | 299 + .../markdown_it/rules_block/code.py | 35 + .../markdown_it/rules_block/fence.py | 101 + .../markdown_it/rules_block/heading.py | 68 + .../markdown_it/rules_block/hr.py | 55 + .../markdown_it/rules_block/html_block.py | 90 + .../markdown_it/rules_block/lheading.py | 86 + .../markdown_it/rules_block/list.py | 345 + .../markdown_it/rules_block/paragraph.py | 65 + .../markdown_it/rules_block/reference.py | 215 + .../markdown_it/rules_block/state_block.py | 261 + .../markdown_it/rules_block/table.py | 236 + .../markdown_it/rules_core/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 545 bytes .../__pycache__/block.cpython-312.pyc | Bin 0 -> 977 bytes .../__pycache__/inline.cpython-312.pyc | Bin 0 -> 823 bytes .../__pycache__/linkify.cpython-312.pyc | Bin 0 -> 5311 bytes .../__pycache__/normalize.cpython-312.pyc | Bin 0 -> 805 bytes .../__pycache__/replacements.cpython-312.pyc | Bin 0 -> 4933 bytes .../__pycache__/smartquotes.cpython-312.pyc | Bin 0 -> 6179 bytes .../__pycache__/state_core.cpython-312.pyc | Bin 0 -> 1087 bytes .../__pycache__/text_join.cpython-312.pyc | Bin 0 -> 1467 bytes .../markdown_it/rules_core/block.py | 13 + .../markdown_it/rules_core/inline.py | 10 + .../markdown_it/rules_core/linkify.py | 149 + .../markdown_it/rules_core/normalize.py | 18 + .../markdown_it/rules_core/replacements.py | 126 + .../markdown_it/rules_core/smartquotes.py | 202 + .../markdown_it/rules_core/state_core.py | 25 + .../markdown_it/rules_core/text_join.py | 34 + .../markdown_it/rules_inline/__init__.py | 31 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 812 bytes .../__pycache__/autolink.cpython-312.pyc | Bin 0 -> 2772 bytes .../__pycache__/backticks.cpython-312.pyc | Bin 0 -> 2560 bytes .../__pycache__/balance_pairs.cpython-312.pyc | Bin 0 -> 3248 bytes .../__pycache__/emphasis.cpython-312.pyc | Bin 0 -> 3868 bytes .../__pycache__/entity.cpython-312.pyc | Bin 0 -> 2461 bytes .../__pycache__/escape.cpython-312.pyc | Bin 0 -> 1918 bytes .../fragments_join.cpython-312.pyc | Bin 0 -> 1943 bytes .../__pycache__/html_inline.cpython-312.pyc | Bin 0 -> 1984 bytes .../__pycache__/image.cpython-312.pyc | Bin 0 -> 4187 bytes .../__pycache__/link.cpython-312.pyc | Bin 0 -> 4059 bytes .../__pycache__/linkify.cpython-312.pyc | Bin 0 -> 2729 bytes .../__pycache__/newline.cpython-312.pyc | Bin 0 -> 1773 bytes .../__pycache__/state_inline.cpython-312.pyc | Bin 0 -> 5969 bytes .../__pycache__/strikethrough.cpython-312.pyc | Bin 0 -> 4208 bytes .../__pycache__/text.cpython-312.pyc | Bin 0 -> 1010 bytes .../markdown_it/rules_inline/autolink.py | 77 + .../markdown_it/rules_inline/backticks.py | 72 + .../markdown_it/rules_inline/balance_pairs.py | 137 + .../markdown_it/rules_inline/emphasis.py | 102 + .../markdown_it/rules_inline/entity.py | 53 + .../markdown_it/rules_inline/escape.py | 92 + .../rules_inline/fragments_join.py | 43 + .../markdown_it/rules_inline/html_inline.py | 43 + .../markdown_it/rules_inline/image.py | 148 + .../markdown_it/rules_inline/link.py | 151 + .../markdown_it/rules_inline/linkify.py | 61 + .../markdown_it/rules_inline/newline.py | 43 + .../markdown_it/rules_inline/state_inline.py | 166 + .../markdown_it/rules_inline/strikethrough.py | 127 + .../markdown_it/rules_inline/text.py | 53 + .../site-packages/markdown_it/token.py | 180 + .../site-packages/markdown_it/tree.py | 345 + .../site-packages/markdown_it/utils.py | 176 + .../markdown_it_py-3.0.0.dist-info/INSTALLER | 1 + .../markdown_it_py-3.0.0.dist-info/LICENSE | 21 + .../LICENSE.markdown-it | 22 + .../markdown_it_py-3.0.0.dist-info/METADATA | 205 + .../markdown_it_py-3.0.0.dist-info/RECORD | 142 + .../markdown_it_py-3.0.0.dist-info/WHEEL | 4 + .../entry_points.txt | 3 + .../INSTALLER | 1 + .../matplotlib_inline-0.1.7.dist-info/LICENSE | 29 + .../METADATA | 97 + .../matplotlib_inline-0.1.7.dist-info/RECORD | 13 + .../matplotlib_inline-0.1.7.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../matplotlib_inline/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 281 bytes .../backend_inline.cpython-312.pyc | Bin 0 -> 12379 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 4567 bytes .../matplotlib_inline/backend_inline.py | 311 + .../site-packages/matplotlib_inline/config.py | 100 + .../mdurl-0.1.2.dist-info/INSTALLER | 1 + .../mdurl-0.1.2.dist-info/LICENSE | 46 + .../mdurl-0.1.2.dist-info/METADATA | 32 + .../mdurl-0.1.2.dist-info/RECORD | 18 + .../site-packages/mdurl-0.1.2.dist-info/WHEEL | 4 + .../site-packages/mdurl/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 643 bytes .../mdurl/__pycache__/_decode.cpython-312.pyc | Bin 0 -> 3830 bytes .../mdurl/__pycache__/_encode.cpython-312.pyc | Bin 0 -> 2880 bytes .../mdurl/__pycache__/_format.cpython-312.pyc | Bin 0 -> 1211 bytes .../mdurl/__pycache__/_parse.cpython-312.pyc | Bin 0 -> 7258 bytes .../mdurl/__pycache__/_url.cpython-312.pyc | Bin 0 -> 666 bytes .../python3.12/site-packages/mdurl/_decode.py | 104 + .../python3.12/site-packages/mdurl/_encode.py | 85 + .../python3.12/site-packages/mdurl/_format.py | 27 + .../python3.12/site-packages/mdurl/_parse.py | 304 + .../python3.12/site-packages/mdurl/_url.py | 14 + .../python3.12/site-packages/mdurl/py.typed | 1 + .../parso-0.8.4.dist-info/AUTHORS.txt | 58 + .../parso-0.8.4.dist-info/INSTALLER | 1 + .../parso-0.8.4.dist-info/LICENSE.txt | 86 + .../parso-0.8.4.dist-info/METADATA | 287 + .../parso-0.8.4.dist-info/RECORD | 58 + .../site-packages/parso-0.8.4.dist-info/WHEEL | 6 + .../parso-0.8.4.dist-info/top_level.txt | 1 + .../site-packages/parso/__init__.py | 58 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2003 bytes .../_compatibility.cpython-312.pyc | Bin 0 -> 309 bytes .../parso/__pycache__/cache.cpython-312.pyc | Bin 0 -> 9934 bytes .../parso/__pycache__/file_io.cpython-312.pyc | Bin 0 -> 2300 bytes .../parso/__pycache__/grammar.cpython-312.pyc | Bin 0 -> 12685 bytes .../__pycache__/normalizer.cpython-312.pyc | Bin 0 -> 10493 bytes .../parso/__pycache__/parser.cpython-312.pyc | Bin 0 -> 10067 bytes .../parso/__pycache__/tree.cpython-312.pyc | Bin 0 -> 21369 bytes .../parso/__pycache__/utils.cpython-312.pyc | Bin 0 -> 7622 bytes .../site-packages/parso/_compatibility.py | 3 + .../python3.12/site-packages/parso/cache.py | 275 + .../python3.12/site-packages/parso/file_io.py | 38 + .../python3.12/site-packages/parso/grammar.py | 264 + .../site-packages/parso/normalizer.py | 198 + .../python3.12/site-packages/parso/parser.py | 210 + .../site-packages/parso/pgen2/__init__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 254 bytes .../__pycache__/generator.cpython-312.pyc | Bin 0 -> 15379 bytes .../grammar_parser.cpython-312.pyc | Bin 0 -> 8292 bytes .../site-packages/parso/pgen2/generator.py | 382 + .../parso/pgen2/grammar_parser.py | 160 + .../python3.12/site-packages/parso/py.typed | 0 .../site-packages/parso/python/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 188 bytes .../python/__pycache__/diff.cpython-312.pyc | Bin 0 -> 35664 bytes .../python/__pycache__/errors.cpython-312.pyc | Bin 0 -> 62064 bytes .../python/__pycache__/parser.cpython-312.pyc | Bin 0 -> 9445 bytes .../python/__pycache__/pep8.cpython-312.pyc | Bin 0 -> 34588 bytes .../python/__pycache__/prefix.cpython-312.pyc | Bin 0 -> 4332 bytes .../python/__pycache__/token.cpython-312.pyc | Bin 0 -> 1700 bytes .../__pycache__/tokenize.cpython-312.pyc | Bin 0 -> 24155 bytes .../python/__pycache__/tree.cpython-312.pyc | Bin 0 -> 54258 bytes .../site-packages/parso/python/diff.py | 886 ++ .../site-packages/parso/python/errors.py | 1326 +++ .../site-packages/parso/python/grammar310.txt | 169 + .../site-packages/parso/python/grammar311.txt | 169 + .../site-packages/parso/python/grammar312.txt | 169 + .../site-packages/parso/python/grammar313.txt | 169 + .../site-packages/parso/python/grammar36.txt | 158 + .../site-packages/parso/python/grammar37.txt | 156 + .../site-packages/parso/python/grammar38.txt | 171 + .../site-packages/parso/python/grammar39.txt | 169 + .../site-packages/parso/python/parser.py | 206 + .../site-packages/parso/python/pep8.py | 767 ++ .../site-packages/parso/python/prefix.py | 106 + .../site-packages/parso/python/token.py | 31 + .../site-packages/parso/python/tokenize.py | 687 ++ .../site-packages/parso/python/tree.py | 1245 +++ .../python3.12/site-packages/parso/tree.py | 488 + .../python3.12/site-packages/parso/utils.py | 194 + .../pexpect-4.9.0.dist-info/INSTALLER | 1 + .../pexpect-4.9.0.dist-info/LICENSE | 20 + .../pexpect-4.9.0.dist-info/METADATA | 52 + .../pexpect-4.9.0.dist-info/RECORD | 43 + .../pexpect-4.9.0.dist-info/WHEEL | 6 + .../pexpect-4.9.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pexpect/ANSI.py | 351 + .../python3.12/site-packages/pexpect/FSM.py | 334 + .../site-packages/pexpect/__init__.py | 91 + .../pexpect/__pycache__/ANSI.cpython-312.pyc | Bin 0 -> 18968 bytes .../pexpect/__pycache__/FSM.cpython-312.pyc | Bin 0 -> 15639 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4281 bytes .../__pycache__/_async.cpython-312.pyc | Bin 0 -> 945 bytes .../_async_pre_await.cpython-312.pyc | Bin 0 -> 6518 bytes .../_async_w_await.cpython-312.pyc | Bin 0 -> 6616 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2211 bytes .../__pycache__/expect.cpython-312.pyc | Bin 0 -> 16131 bytes .../__pycache__/fdpexpect.cpython-312.pyc | Bin 0 -> 7455 bytes .../__pycache__/popen_spawn.cpython-312.pyc | Bin 0 -> 8441 bytes .../__pycache__/pty_spawn.cpython-312.pyc | Bin 0 -> 42367 bytes .../pexpect/__pycache__/pxssh.cpython-312.pyc | Bin 0 -> 21608 bytes .../__pycache__/replwrap.cpython-312.pyc | Bin 0 -> 7028 bytes .../pexpect/__pycache__/run.cpython-312.pyc | Bin 0 -> 7165 bytes .../__pycache__/screen.cpython-312.pyc | Bin 0 -> 19965 bytes .../socket_pexpect.cpython-312.pyc | Bin 0 -> 6819 bytes .../__pycache__/spawnbase.cpython-312.pyc | Bin 0 -> 23623 bytes .../pexpect/__pycache__/utils.cpython-312.pyc | Bin 0 -> 6003 bytes .../site-packages/pexpect/_async.py | 28 + .../site-packages/pexpect/_async_pre_await.py | 111 + .../site-packages/pexpect/_async_w_await.py | 118 + .../site-packages/pexpect/bashrc.sh | 18 + .../site-packages/pexpect/exceptions.py | 35 + .../site-packages/pexpect/expect.py | 371 + .../site-packages/pexpect/fdpexpect.py | 152 + .../site-packages/pexpect/popen_spawn.py | 188 + .../site-packages/pexpect/pty_spawn.py | 860 ++ .../python3.12/site-packages/pexpect/pxssh.py | 540 ++ .../site-packages/pexpect/replwrap.py | 136 + .../python3.12/site-packages/pexpect/run.py | 157 + .../site-packages/pexpect/screen.py | 431 + .../site-packages/pexpect/socket_pexpect.py | 145 + .../site-packages/pexpect/spawnbase.py | 536 + .../python3.12/site-packages/pexpect/utils.py | 187 + .../pip-23.2.1.dist-info/AUTHORS.txt | 738 ++ .../pip-23.2.1.dist-info/INSTALLER | 1 + .../pip-23.2.1.dist-info/LICENSE.txt | 20 + .../pip-23.2.1.dist-info/METADATA | 90 + .../site-packages/pip-23.2.1.dist-info/RECORD | 1003 ++ .../pip-23.2.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.2.1.dist-info/WHEEL | 5 + .../pip-23.2.1.dist-info/entry_points.txt | 4 + .../pip-23.2.1.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 690 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 844 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2202 bytes .../site-packages/pip/_internal/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 850 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14294 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12690 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17402 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33403 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 673 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 4972 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10099 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13696 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 292 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 281 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8455 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10441 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30344 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1778 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2301 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4908 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15076 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 2620 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 18841 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7837 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 378 bytes .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 236 + .../pip/_internal/cli/cmdoptions.py | 1074 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 508 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4005 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9382 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2093 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 4890 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13257 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10068 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7589 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4359 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2986 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1676 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6775 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3978 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 28969 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15378 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7621 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 9731 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4729 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8953 bytes .../pip/_internal/commands/cache.py | 222 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 121 + .../pip/_internal/commands/configuration.py | 282 + .../pip/_internal/commands/debug.py | 199 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 108 + .../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 | 778 ++ .../pip/_internal/commands/list.py | 368 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 381 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 944 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2183 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1443 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8030 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1991 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 | 733 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 235 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21858 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40771 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 9866 bytes .../pip/_internal/index/collector.py | 505 + .../pip/_internal/index/package_finder.py | 1029 ++ .../pip/_internal/index/sources.py | 223 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16779 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6875 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8014 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3784 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-312.pyc | Bin 0 -> 5803 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2878 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35120 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15138 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 688 ++ .../_internal/metadata/importlib/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 333 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3336 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 13163 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11166 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-312.pyc | Bin 0 -> 269 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1926 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 11225 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4252 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1697 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2185 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26035 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1172 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5091 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1854 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4443 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5783 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 237 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 53 + .../pip/_internal/models/link.py | 581 ++ .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 132 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 257 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 21991 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 4157 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8579 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11663 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18772 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2256 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2903 bytes .../pip/_internal/network/auth.py | 561 ++ .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 519 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7582 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10117 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25821 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7122 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1883 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1917 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3068 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1684 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2025 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3932 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 | 187 + .../pip/_internal/operations/freeze.py | 255 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 269 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1820 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 34016 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 740 ++ .../pip/_internal/operations/prepare.py | 743 ++ .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3744 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 18852 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21239 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 35934 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 7215 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 33103 bytes .../pip/_internal/req/constructors.py | 506 + .../pip/_internal/req/req_file.py | 552 ++ .../pip/_internal/req/req_install.py | 874 ++ .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 650 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1188 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22533 bytes .../_internal/resolution/legacy/resolver.py | 600 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 211 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8614 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 27994 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 28516 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6211 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10381 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 4938 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 10437 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 11426 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 555 ++ .../resolution/resolvelib/factory.py | 730 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 165 + .../resolution/resolvelib/resolver.py | 299 + .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 195 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4536 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1866 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2410 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2213 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5561 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 684 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4186 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3553 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 2928 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2155 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 3993 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7455 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1164 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2342 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7554 bytes .../inject_securetransport.cpython-312.pyc | Bin 0 -> 1208 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13649 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 32754 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 0 -> 2712 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2583 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4547 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8706 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 10311 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 11106 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2400 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4480 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5987 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 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 | 151 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 735 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 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-312.pyc | Bin 0 -> 534 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5026 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19127 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7602 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12481 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29099 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 | 355 + .../site-packages/pip/_vendor/__init__.py | 120 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4660 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 0 -> 41273 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 122041 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 779 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2431 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 5057 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3243 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 925 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 14642 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 3952 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6081 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 7272 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 856 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-312.pyc | Bin 0 -> 376 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7299 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2221 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-312.pyc | Bin 0 -> 322 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 649 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 2853 bytes .../pip/_vendor/certifi/cacert.pem | 4589 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 108 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4572 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 0 -> 27203 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 0 -> 1391 bytes .../chardistribution.cpython-312.pyc | Bin 0 -> 9642 bytes .../charsetgroupprober.cpython-312.pyc | Bin 0 -> 4126 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 0 -> 5022 bytes .../codingstatemachine.cpython-312.pyc | Bin 0 -> 3882 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 0 -> 793 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 0 -> 1400 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 0 -> 3000 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 0 -> 4570 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 0 -> 15314 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 0 -> 4378 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 0 -> 12086 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 0 -> 1394 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 0 -> 27208 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 0 -> 1394 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 0 -> 19130 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 0 -> 1407 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 0 -> 5814 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 0 -> 22159 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 0 -> 83007 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 0 -> 1398 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 0 -> 39553 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 0 -> 83126 bytes .../langgreekmodel.cpython-312.pyc | Bin 0 -> 76992 bytes .../langhebrewmodel.cpython-312.pyc | Bin 0 -> 77503 bytes .../langhungarianmodel.cpython-312.pyc | Bin 0 -> 83080 bytes .../langrussianmodel.cpython-312.pyc | Bin 0 -> 105255 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 0 -> 77681 bytes .../langturkishmodel.cpython-312.pyc | Bin 0 -> 77520 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 0 -> 7006 bytes .../macromanprober.cpython-312.pyc | Bin 0 -> 7186 bytes .../mbcharsetprober.cpython-312.pyc | Bin 0 -> 3898 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 0 -> 1592 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 0 -> 38649 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 0 -> 636 bytes .../sbcharsetprober.cpython-312.pyc | Bin 0 -> 6391 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 0 -> 2361 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 0 -> 4490 bytes .../universaldetector.cpython-312.pyc | Bin 0 -> 12270 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 0 -> 9983 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 0 -> 3179 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 492 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 199 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 0 -> 4016 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 +++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 204 bytes .../__pycache__/languages.cpython-312.pyc | Bin 0 -> 9759 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 496 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 3954 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16425 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3554 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8130 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9092 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5471 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18107 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11752 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4908 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2492 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6616 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-312.pyc | Bin 0 -> 1263 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45546 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 65977 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24391 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 60213 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15137 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7464 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41611 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17329 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19594 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 87581 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30159 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 52549 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/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 1932 ++++ .../pip/_vendor/distlib/version.py | 739 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1082 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 964 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 296 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53756 bytes .../pip/_vendor/distro/distro.py | 1399 +++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 885 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4637 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 891 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16286 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 38386 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2642 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 220 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158874 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 +++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1835 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2029 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8672 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 43566 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-312.pyc | Bin 0 -> 634 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 470 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 12077 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 6911 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3245 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 14053 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 6950 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 31251 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 18960 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5872 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19943 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3361 +++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 146478 bytes .../pip/_vendor/platformdirs/__init__.py | 566 ++ .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18033 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1950 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 9448 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 9676 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 5641 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 12445 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 315 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13003 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../pip/_vendor/platformdirs/unix.py | 223 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 255 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3493 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 739 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26610 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2631 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3237 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4574 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38305 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1573 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3401 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4086 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4761 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 11051 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6677 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8147 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 32993 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 13986 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37941 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6931 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4220 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4199 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7269 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 40577 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 27048 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6070 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 19959 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6889 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2935 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 6131 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9071 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5834 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15162 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 ++ .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 943 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14657 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 64409 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42644 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 ++ .../pip/_vendor/pygments/lexers/python.py | 1198 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 217 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4453 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7916 bytes .../__pycache__/actions.cpython-312.pyc | Bin 0 -> 8400 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 13419 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 267713 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 12999 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 48506 bytes .../__pycache__/results.cpython-312.pyc | Bin 0 -> 34115 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 17193 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 0 -> 13189 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 14909 bytes .../pip/_vendor/pyparsing/actions.py | 217 + .../pip/_vendor/pyparsing/common.py | 432 + .../pip/_vendor/pyparsing/core.py | 6115 ++++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26818 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 +++ .../pip/_vendor/pyparsing/results.py | 796 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 361 + .../pip/_vendor/pyparsing/util.py | 284 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 618 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 379 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14730 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1085 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14402 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5451 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 589 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2026 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 21285 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7209 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13928 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 927 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1512 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25251 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7052 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4317 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1057 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35453 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 777 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27762 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 5964 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5622 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36274 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 538 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1094 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 639 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6856 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2659 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25902 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10511 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 205 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 425 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 ++ .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7020 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10309 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7826 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205981 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1734 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2326 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 542 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 860 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12082 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4152 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1890 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3625 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5165 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 729 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6582 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13184 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 970 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 870 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28972 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2495 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3578 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 2365 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1613 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12327 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9111 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4277 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11863 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5623 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26530 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1706 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8592 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113789 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2263 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9231 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10934 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10378 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1492 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4214 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1850 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3582 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3087 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9903 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6040 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5214 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20225 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19145 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4899 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13553 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9303 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6381 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7139 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1825 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5319 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12102 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40047 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75080 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10394 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14783 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1797 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 572 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6631 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6573 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3835 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2489 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28166 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6069 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6073 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33519 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2144 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39615 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43589 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3353 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 58954 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6345 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 319 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31549 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11444 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 622 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 994 ++ .../pip/_vendor/rich/progress.py | 1702 ++++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 948 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1307 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 756 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 608 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27091 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 4811 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 2320 bytes .../__pycache__/after.cpython-312.pyc | Bin 0 -> 1629 bytes .../__pycache__/before.cpython-312.pyc | Bin 0 -> 1469 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 0 -> 2307 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 0 -> 1417 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 14286 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 0 -> 5573 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 0 -> 2591 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 0 -> 12418 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 51 + .../pip/_vendor/tenacity/before.py | 46 + .../pip/_vendor/tenacity/before_sleep.py | 71 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 272 + .../pip/_vendor/tenacity/stop.py | 103 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 228 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 389 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26932 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3913 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 371 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 | 3072 ++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3410 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 15936 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 223 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20412 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36284 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13498 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10418 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4023 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20307 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 6360 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33971 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 ++ .../pip/_vendor/urllib3/connectionpool.py | 1132 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 203 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1853 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11569 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5724 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24455 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35549 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7516 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 220 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17432 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14806 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 204 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41324 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 214 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1825 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7333 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 +++ .../pip/_vendor/urllib3/poolmanager.py | 537 + .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1151 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4761 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1557 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1357 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4188 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2994 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21690 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15108 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5076 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10772 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11144 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15800 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4408 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 | 271 + .../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-312.pyc | Bin 0 -> 12000 bytes .../__pycache__/labels.cpython-312.pyc | Bin 0 -> 7137 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 0 -> 2701 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 9044 bytes .../x_user_defined.cpython-312.pyc | Bin 0 -> 3300 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../AUTHORS.rst | 11 + .../prompt_toolkit-3.0.50.dist-info/INSTALLER | 1 + .../prompt_toolkit-3.0.50.dist-info/LICENSE | 27 + .../prompt_toolkit-3.0.50.dist-info/METADATA | 178 + .../prompt_toolkit-3.0.50.dist-info/RECORD | 296 + .../prompt_toolkit-3.0.50.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/prompt_toolkit/__init__.py | 52 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1638 bytes .../__pycache__/auto_suggest.cpython-312.pyc | Bin 0 -> 8354 bytes .../__pycache__/buffer.cpython-312.pyc | Bin 0 -> 77336 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 5229 bytes .../__pycache__/cursor_shapes.cpython-312.pyc | Bin 0 -> 4669 bytes .../data_structures.cpython-312.pyc | Bin 0 -> 740 bytes .../__pycache__/document.cpython-312.pyc | Bin 0 -> 47826 bytes .../__pycache__/enums.cpython-312.pyc | Bin 0 -> 580 bytes .../__pycache__/history.cpython-312.pyc | Bin 0 -> 13151 bytes .../__pycache__/keys.cpython-312.pyc | Bin 0 -> 5322 bytes .../__pycache__/log.cpython-312.pyc | Bin 0 -> 420 bytes .../__pycache__/mouse_events.cpython-312.pyc | Bin 0 -> 2902 bytes .../__pycache__/patch_stdout.cpython-312.pyc | Bin 0 -> 11764 bytes .../__pycache__/renderer.cpython-312.pyc | Bin 0 -> 29542 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7730 bytes .../__pycache__/selection.cpython-312.pyc | Bin 0 -> 2098 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 334 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 11342 bytes .../__pycache__/validation.cpython-312.pyc | Bin 0 -> 8926 bytes .../__pycache__/win32_types.cpython-312.pyc | Bin 0 -> 7178 bytes .../prompt_toolkit/application/__init__.py | 32 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 705 bytes .../__pycache__/application.cpython-312.pyc | Bin 0 -> 67748 bytes .../__pycache__/current.cpython-312.pyc | Bin 0 -> 7159 bytes .../__pycache__/dummy.cpython-312.pyc | Bin 0 -> 2780 bytes .../run_in_terminal.cpython-312.pyc | Bin 0 -> 5184 bytes .../prompt_toolkit/application/application.py | 1626 ++++ .../prompt_toolkit/application/current.py | 195 + .../prompt_toolkit/application/dummy.py | 55 + .../application/run_in_terminal.py | 117 + .../prompt_toolkit/auto_suggest.py | 177 + .../site-packages/prompt_toolkit/buffer.py | 2029 ++++ .../site-packages/prompt_toolkit/cache.py | 127 + .../prompt_toolkit/clipboard/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 475 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 4812 bytes .../__pycache__/in_memory.cpython-312.pyc | Bin 0 -> 2182 bytes .../__pycache__/pyperclip.cpython-312.pyc | Bin 0 -> 1746 bytes .../prompt_toolkit/clipboard/base.py | 109 + .../prompt_toolkit/clipboard/in_memory.py | 44 + .../prompt_toolkit/clipboard/pyperclip.py | 42 + .../prompt_toolkit/completion/__init__.py | 43 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 954 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 18710 bytes .../__pycache__/deduplicate.cpython-312.pyc | Bin 0 -> 1964 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 5437 bytes .../fuzzy_completer.cpython-312.pyc | Bin 0 -> 9610 bytes .../__pycache__/nested.cpython-312.pyc | Bin 0 -> 4840 bytes .../word_completer.cpython-312.pyc | Bin 0 -> 4264 bytes .../prompt_toolkit/completion/base.py | 438 + .../prompt_toolkit/completion/deduplicate.py | 45 + .../prompt_toolkit/completion/filesystem.py | 118 + .../completion/fuzzy_completer.py | 213 + .../prompt_toolkit/completion/nested.py | 109 + .../completion/word_completer.py | 94 + .../prompt_toolkit/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../contrib/completers/__init__.py | 5 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 338 bytes .../__pycache__/system.cpython-312.pyc | Bin 0 -> 2685 bytes .../contrib/completers/system.py | 64 + .../contrib/regular_languages/__init__.py | 80 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3546 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 0 -> 25537 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 4502 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 4391 bytes .../__pycache__/regex_parser.cpython-312.pyc | Bin 0 -> 11228 bytes .../__pycache__/validation.cpython-312.pyc | Bin 0 -> 2589 bytes .../contrib/regular_languages/compiler.py | 579 ++ .../contrib/regular_languages/completion.py | 100 + .../contrib/regular_languages/lexer.py | 94 + .../contrib/regular_languages/regex_parser.py | 279 + .../contrib/regular_languages/validation.py | 60 + .../prompt_toolkit/contrib/ssh/__init__.py | 8 + .../ssh/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 386 bytes .../ssh/__pycache__/server.cpython-312.pyc | Bin 0 -> 9176 bytes .../prompt_toolkit/contrib/ssh/server.py | 178 + .../prompt_toolkit/contrib/telnet/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 335 bytes .../telnet/__pycache__/log.cpython-312.pyc | Bin 0 -> 447 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 0 -> 7666 bytes .../telnet/__pycache__/server.cpython-312.pyc | Bin 0 -> 20360 bytes .../prompt_toolkit/contrib/telnet/log.py | 13 + .../prompt_toolkit/contrib/telnet/protocol.py | 209 + .../prompt_toolkit/contrib/telnet/server.py | 428 + .../prompt_toolkit/cursor_shapes.py | 117 + .../prompt_toolkit/data_structures.py | 18 + .../site-packages/prompt_toolkit/document.py | 1182 +++ .../site-packages/prompt_toolkit/enums.py | 19 + .../prompt_toolkit/eventloop/__init__.py | 31 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 736 bytes .../async_generator.cpython-312.pyc | Bin 0 -> 4271 bytes .../__pycache__/inputhook.cpython-312.pyc | Bin 0 -> 7587 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 3614 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 2714 bytes .../eventloop/async_generator.py | 125 + .../prompt_toolkit/eventloop/inputhook.py | 191 + .../prompt_toolkit/eventloop/utils.py | 101 + .../prompt_toolkit/eventloop/win32.py | 72 + .../prompt_toolkit/filters/__init__.py | 71 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2049 bytes .../filters/__pycache__/app.cpython-312.pyc | Bin 0 -> 15860 bytes .../filters/__pycache__/base.cpython-312.pyc | Bin 0 -> 10801 bytes .../filters/__pycache__/cli.cpython-312.pyc | Bin 0 -> 3728 bytes .../filters/__pycache__/utils.cpython-312.pyc | Bin 0 -> 1330 bytes .../prompt_toolkit/filters/app.py | 419 + .../prompt_toolkit/filters/base.py | 260 + .../prompt_toolkit/filters/cli.py | 65 + .../prompt_toolkit/filters/utils.py | 41 + .../prompt_toolkit/formatted_text/__init__.py | 59 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1528 bytes .../__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9550 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 6449 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 5908 bytes .../__pycache__/pygments.cpython-312.pyc | Bin 0 -> 1418 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 4029 bytes .../prompt_toolkit/formatted_text/ansi.py | 297 + .../prompt_toolkit/formatted_text/base.py | 179 + .../prompt_toolkit/formatted_text/html.py | 145 + .../prompt_toolkit/formatted_text/pygments.py | 32 + .../prompt_toolkit/formatted_text/utils.py | 103 + .../site-packages/prompt_toolkit/history.py | 306 + .../prompt_toolkit/input/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 454 bytes .../ansi_escape_sequences.cpython-312.pyc | Bin 0 -> 17762 bytes .../input/__pycache__/base.cpython-312.pyc | Bin 0 -> 5908 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 0 -> 2667 bytes .../__pycache__/posix_pipe.cpython-312.pyc | Bin 0 -> 5676 bytes .../__pycache__/posix_utils.cpython-312.pyc | Bin 0 -> 3080 bytes .../__pycache__/typeahead.cpython-312.pyc | Bin 0 -> 3124 bytes .../input/__pycache__/vt100.cpython-312.pyc | Bin 0 -> 12165 bytes .../__pycache__/vt100_parser.cpython-312.pyc | Bin 0 -> 8801 bytes .../input/__pycache__/win32.cpython-312.pyc | Bin 0 -> 34682 bytes .../__pycache__/win32_pipe.cpython-312.pyc | Bin 0 -> 6793 bytes .../input/ansi_escape_sequences.py | 344 + .../prompt_toolkit/input/base.py | 153 + .../prompt_toolkit/input/defaults.py | 79 + .../prompt_toolkit/input/posix_pipe.py | 118 + .../prompt_toolkit/input/posix_utils.py | 97 + .../prompt_toolkit/input/typeahead.py | 78 + .../prompt_toolkit/input/vt100.py | 309 + .../prompt_toolkit/input/vt100_parser.py | 250 + .../prompt_toolkit/input/win32.py | 886 ++ .../prompt_toolkit/input/win32_pipe.py | 156 + .../prompt_toolkit/key_binding/__init__.py | 22 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 563 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 0 -> 1765 bytes .../__pycache__/digraphs.cpython-312.pyc | Bin 0 -> 56641 bytes .../__pycache__/emacs_state.cpython-312.pyc | Bin 0 -> 1573 bytes .../__pycache__/key_bindings.cpython-312.pyc | Bin 0 -> 24897 bytes .../__pycache__/key_processor.cpython-312.pyc | Bin 0 -> 21087 bytes .../__pycache__/vi_state.cpython-312.pyc | Bin 0 -> 3255 bytes .../key_binding/bindings/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 211 bytes .../__pycache__/auto_suggest.cpython-312.pyc | Bin 0 -> 3190 bytes .../__pycache__/basic.cpython-312.pyc | Bin 0 -> 11599 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 9451 bytes .../bindings/__pycache__/cpr.cpython-312.pyc | Bin 0 -> 1457 bytes .../__pycache__/emacs.cpython-312.pyc | Bin 0 -> 27200 bytes .../__pycache__/focus.cpython-312.pyc | Bin 0 -> 1019 bytes .../__pycache__/mouse.cpython-312.pyc | Bin 0 -> 12127 bytes .../named_commands.cpython-312.pyc | Bin 0 -> 28413 bytes .../open_in_editor.cpython-312.pyc | Bin 0 -> 1819 bytes .../page_navigation.cpython-312.pyc | Bin 0 -> 2746 bytes .../__pycache__/scroll.cpython-312.pyc | Bin 0 -> 7183 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 4054 bytes .../bindings/__pycache__/vi.cpython-312.pyc | Bin 0 -> 103252 bytes .../key_binding/bindings/auto_suggest.py | 66 + .../key_binding/bindings/basic.py | 257 + .../key_binding/bindings/completion.py | 206 + .../key_binding/bindings/cpr.py | 30 + .../key_binding/bindings/emacs.py | 563 ++ .../key_binding/bindings/focus.py | 26 + .../key_binding/bindings/mouse.py | 348 + .../key_binding/bindings/named_commands.py | 691 ++ .../key_binding/bindings/open_in_editor.py | 52 + .../key_binding/bindings/page_navigation.py | 85 + .../key_binding/bindings/scroll.py | 190 + .../key_binding/bindings/search.py | 96 + .../prompt_toolkit/key_binding/bindings/vi.py | 2233 +++++ .../prompt_toolkit/key_binding/defaults.py | 63 + .../prompt_toolkit/key_binding/digraphs.py | 1378 +++ .../prompt_toolkit/key_binding/emacs_state.py | 36 + .../key_binding/key_bindings.py | 670 ++ .../key_binding/key_processor.py | 526 + .../prompt_toolkit/key_binding/vi_state.py | 107 + .../site-packages/prompt_toolkit/keys.py | 222 + .../prompt_toolkit/layout/__init__.py | 147 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3387 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 100613 bytes .../__pycache__/controls.cpython-312.pyc | Bin 0 -> 36717 bytes .../__pycache__/dimension.cpython-312.pyc | Bin 0 -> 8476 bytes .../layout/__pycache__/dummy.cpython-312.pyc | Bin 0 -> 1742 bytes .../layout/__pycache__/layout.cpython-312.pyc | Bin 0 -> 16104 bytes .../__pycache__/margins.cpython-312.pyc | Bin 0 -> 11662 bytes .../layout/__pycache__/menus.cpython-312.pyc | Bin 0 -> 30484 bytes .../mouse_handlers.cpython-312.pyc | Bin 0 -> 2322 bytes .../__pycache__/processors.cpython-312.pyc | Bin 0 -> 39024 bytes .../layout/__pycache__/screen.cpython-312.pyc | Bin 0 -> 11676 bytes .../scrollable_pane.cpython-312.pyc | Bin 0 -> 19522 bytes .../layout/__pycache__/utils.cpython-312.pyc | Bin 0 -> 3562 bytes .../prompt_toolkit/layout/containers.py | 2738 ++++++ .../prompt_toolkit/layout/controls.py | 956 ++ .../prompt_toolkit/layout/dimension.py | 220 + .../prompt_toolkit/layout/dummy.py | 40 + .../prompt_toolkit/layout/layout.py | 412 + .../prompt_toolkit/layout/margins.py | 304 + .../prompt_toolkit/layout/menus.py | 748 ++ .../prompt_toolkit/layout/mouse_handlers.py | 56 + .../prompt_toolkit/layout/processors.py | 1016 ++ .../prompt_toolkit/layout/screen.py | 323 + .../prompt_toolkit/layout/scrollable_pane.py | 494 + .../prompt_toolkit/layout/utils.py | 80 + .../prompt_toolkit/lexers/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 600 bytes .../lexers/__pycache__/base.cpython-312.pyc | Bin 0 -> 3874 bytes .../__pycache__/pygments.cpython-312.pyc | Bin 0 -> 11716 bytes .../prompt_toolkit/lexers/base.py | 85 + .../prompt_toolkit/lexers/pygments.py | 328 + .../site-packages/prompt_toolkit/log.py | 13 + .../prompt_toolkit/mouse_events.py | 85 + .../prompt_toolkit/output/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 449 bytes .../output/__pycache__/base.cpython-312.pyc | Bin 0 -> 14455 bytes .../__pycache__/color_depth.cpython-312.pyc | Bin 0 -> 2077 bytes .../output/__pycache__/conemu.cpython-312.pyc | Bin 0 -> 2708 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 0 -> 3052 bytes .../__pycache__/flush_stdout.cpython-312.pyc | Bin 0 -> 2335 bytes .../__pycache__/plain_text.cpython-312.pyc | Bin 0 -> 7507 bytes .../output/__pycache__/vt100.cpython-312.pyc | Bin 0 -> 27599 bytes .../output/__pycache__/win32.cpython-312.pyc | Bin 0 -> 29541 bytes .../__pycache__/windows10.cpython-312.pyc | Bin 0 -> 5057 bytes .../prompt_toolkit/output/base.py | 332 + .../prompt_toolkit/output/color_depth.py | 64 + .../prompt_toolkit/output/conemu.py | 65 + .../prompt_toolkit/output/defaults.py | 106 + .../prompt_toolkit/output/flush_stdout.py | 87 + .../prompt_toolkit/output/plain_text.py | 143 + .../prompt_toolkit/output/vt100.py | 757 ++ .../prompt_toolkit/output/win32.py | 683 ++ .../prompt_toolkit/output/windows10.py | 133 + .../prompt_toolkit/patch_stdout.py | 297 + .../site-packages/prompt_toolkit/py.typed | 0 .../site-packages/prompt_toolkit/renderer.py | 820 ++ .../site-packages/prompt_toolkit/search.py | 226 + .../site-packages/prompt_toolkit/selection.py | 58 + .../prompt_toolkit/shortcuts/__init__.py | 46 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 945 bytes .../__pycache__/dialogs.cpython-312.pyc | Bin 0 -> 12152 bytes .../__pycache__/prompt.cpython-312.pyc | Bin 0 -> 58188 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 8247 bytes .../prompt_toolkit/shortcuts/dialogs.py | 330 + .../shortcuts/progress_bar/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 688 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 19079 bytes .../__pycache__/formatters.cpython-312.pyc | Bin 0 -> 17174 bytes .../shortcuts/progress_bar/base.py | 449 + .../shortcuts/progress_bar/formatters.py | 431 + .../prompt_toolkit/shortcuts/prompt.py | 1513 +++ .../prompt_toolkit/shortcuts/utils.py | 239 + .../prompt_toolkit/styles/__init__.py | 67 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1402 bytes .../styles/__pycache__/base.cpython-312.pyc | Bin 0 -> 5620 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 0 -> 6730 bytes .../__pycache__/named_colors.cpython-312.pyc | Bin 0 -> 6323 bytes .../__pycache__/pygments.cpython-312.pyc | Bin 0 -> 2502 bytes .../styles/__pycache__/style.cpython-312.pyc | Bin 0 -> 15295 bytes .../style_transformation.cpython-312.pyc | Bin 0 -> 16348 bytes .../prompt_toolkit/styles/base.py | 184 + .../prompt_toolkit/styles/defaults.py | 236 + .../prompt_toolkit/styles/named_colors.py | 162 + .../prompt_toolkit/styles/pygments.py | 70 + .../prompt_toolkit/styles/style.py | 401 + .../styles/style_transformation.py | 374 + .../site-packages/prompt_toolkit/token.py | 9 + .../site-packages/prompt_toolkit/utils.py | 327 + .../prompt_toolkit/validation.py | 192 + .../prompt_toolkit/widgets/__init__.py | 63 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1267 bytes .../widgets/__pycache__/base.cpython-312.pyc | Bin 0 -> 40384 bytes .../__pycache__/dialogs.cpython-312.pyc | Bin 0 -> 4074 bytes .../widgets/__pycache__/menus.cpython-312.pyc | Bin 0 -> 17846 bytes .../__pycache__/toolbars.cpython-312.pyc | Bin 0 -> 16472 bytes .../prompt_toolkit/widgets/base.py | 995 ++ .../prompt_toolkit/widgets/dialogs.py | 108 + .../prompt_toolkit/widgets/menus.py | 374 + .../prompt_toolkit/widgets/toolbars.py | 370 + .../prompt_toolkit/win32_types.py | 229 + .../ptyprocess-0.7.0.dist-info/INSTALLER | 1 + .../ptyprocess-0.7.0.dist-info/LICENSE | 16 + .../ptyprocess-0.7.0.dist-info/METADATA | 37 + .../ptyprocess-0.7.0.dist-info/RECORD | 13 + .../ptyprocess-0.7.0.dist-info/WHEEL | 5 + .../site-packages/ptyprocess/__init__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 375 bytes .../__pycache__/_fork_pty.cpython-312.pyc | Bin 0 -> 3352 bytes .../__pycache__/ptyprocess.cpython-312.pyc | Bin 0 -> 34319 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 3235 bytes .../site-packages/ptyprocess/_fork_pty.py | 78 + .../site-packages/ptyprocess/ptyprocess.py | 842 ++ .../site-packages/ptyprocess/util.py | 71 + .../pure_eval-0.2.3.dist-info/INSTALLER | 1 + .../pure_eval-0.2.3.dist-info/LICENSE.txt | 21 + .../pure_eval-0.2.3.dist-info/METADATA | 227 + .../pure_eval-0.2.3.dist-info/RECORD | 17 + .../pure_eval-0.2.3.dist-info/WHEEL | 5 + .../pure_eval-0.2.3.dist-info/top_level.txt | 1 + .../site-packages/pure_eval/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 556 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 21506 bytes .../my_getattr_static.cpython-312.pyc | Bin 0 -> 5451 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 7820 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 210 bytes .../site-packages/pure_eval/core.py | 449 + .../pure_eval/my_getattr_static.py | 140 + .../site-packages/pure_eval/py.typed | 1 + .../site-packages/pure_eval/utils.py | 206 + .../site-packages/pure_eval/version.py | 1 + .../pydantic-2.10.6.dist-info/INSTALLER | 1 + .../pydantic-2.10.6.dist-info/METADATA | 359 + .../pydantic-2.10.6.dist-info/RECORD | 214 + .../pydantic-2.10.6.dist-info/REQUESTED | 0 .../pydantic-2.10.6.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/pydantic/__init__.py | 431 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 13797 bytes .../__pycache__/_migration.cpython-312.pyc | Bin 0 -> 10880 bytes .../alias_generators.cpython-312.pyc | Bin 0 -> 3289 bytes .../__pycache__/aliases.cpython-312.pyc | Bin 0 -> 6450 bytes .../annotated_handlers.cpython-312.pyc | Bin 0 -> 5495 bytes .../class_validators.cpython-312.pyc | Bin 0 -> 369 bytes .../__pycache__/color.cpython-312.pyc | Bin 0 -> 30181 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 5610 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 0 -> 14744 bytes .../datetime_parse.cpython-312.pyc | Bin 0 -> 369 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 0 -> 359 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 0 -> 365 bytes .../error_wrappers.cpython-312.pyc | Bin 0 -> 369 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 6326 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 63243 bytes .../functional_serializers.cpython-312.pyc | Bin 0 -> 18054 bytes .../functional_validators.cpython-312.pyc | Bin 0 -> 32038 bytes .../__pycache__/generics.cpython-312.pyc | Bin 0 -> 357 bytes .../pydantic/__pycache__/json.cpython-312.pyc | Bin 0 -> 349 bytes .../__pycache__/json_schema.cpython-312.pyc | Bin 0 -> 111816 bytes .../pydantic/__pycache__/main.cpython-312.pyc | Bin 0 -> 70463 bytes .../pydantic/__pycache__/mypy.cpython-312.pyc | Bin 0 -> 60497 bytes .../__pycache__/networks.cpython-312.pyc | Bin 0 -> 49051 bytes .../__pycache__/parse.cpython-312.pyc | Bin 0 -> 351 bytes .../__pycache__/root_model.cpython-312.pyc | Bin 0 -> 7793 bytes .../__pycache__/schema.cpython-312.pyc | Bin 0 -> 353 bytes .../__pycache__/tools.cpython-312.pyc | Bin 0 -> 351 bytes .../__pycache__/type_adapter.cpython-312.pyc | Bin 0 -> 30120 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 96409 bytes .../__pycache__/typing.cpython-312.pyc | Bin 0 -> 349 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 351 bytes .../validate_call_decorator.cpython-312.pyc | Bin 0 -> 5415 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 361 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 3841 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 0 -> 5255 bytes .../pydantic/_internal/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 194 bytes .../__pycache__/_config.cpython-312.pyc | Bin 0 -> 14393 bytes .../_core_metadata.cpython-312.pyc | Bin 0 -> 4086 bytes .../__pycache__/_core_utils.cpython-312.pyc | Bin 0 -> 28958 bytes .../__pycache__/_dataclasses.cpython-312.pyc | Bin 0 -> 10055 bytes .../__pycache__/_decorators.cpython-312.pyc | Bin 0 -> 35184 bytes .../_decorators_v1.cpython-312.pyc | Bin 0 -> 8613 bytes .../_discriminated_union.cpython-312.pyc | Bin 0 -> 21459 bytes .../_docs_extraction.cpython-312.pyc | Bin 0 -> 5209 bytes .../__pycache__/_fields.cpython-312.pyc | Bin 0 -> 15231 bytes .../__pycache__/_forward_ref.cpython-312.pyc | Bin 0 -> 1303 bytes .../_generate_schema.cpython-312.pyc | Bin 0 -> 118165 bytes .../__pycache__/_generics.cpython-312.pyc | Bin 0 -> 23475 bytes .../__pycache__/_git.cpython-312.pyc | Bin 0 -> 1564 bytes .../__pycache__/_import_utils.cpython-312.pyc | Bin 0 -> 884 bytes .../_internal_dataclass.cpython-312.pyc | Bin 0 -> 343 bytes .../_known_annotated_metadata.cpython-312.pyc | Bin 0 -> 13944 bytes .../__pycache__/_mock_val_ser.cpython-312.pyc | Bin 0 -> 11249 bytes .../_model_construction.cpython-312.pyc | Bin 0 -> 33540 bytes .../_namespace_utils.cpython-312.pyc | Bin 0 -> 12126 bytes .../__pycache__/_repr.cpython-312.pyc | Bin 0 -> 7551 bytes .../_schema_generation_shared.cpython-312.pyc | Bin 0 -> 6350 bytes .../__pycache__/_serializers.cpython-312.pyc | Bin 0 -> 1923 bytes .../__pycache__/_signature.cpython-312.pyc | Bin 0 -> 6763 bytes .../_std_types_schema.cpython-312.pyc | Bin 0 -> 19070 bytes .../__pycache__/_typing_extra.cpython-312.pyc | Bin 0 -> 34491 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 17052 bytes .../_validate_call.cpython-312.pyc | Bin 0 -> 5751 bytes .../__pycache__/_validators.cpython-312.pyc | Bin 0 -> 16992 bytes .../pydantic/_internal/_config.py | 345 + .../pydantic/_internal/_core_metadata.py | 91 + .../pydantic/_internal/_core_utils.py | 610 ++ .../pydantic/_internal/_dataclasses.py | 246 + .../pydantic/_internal/_decorators.py | 823 ++ .../pydantic/_internal/_decorators_v1.py | 174 + .../_internal/_discriminated_union.py | 503 + .../pydantic/_internal/_docs_extraction.py | 108 + .../pydantic/_internal/_fields.py | 392 + .../pydantic/_internal/_forward_ref.py | 23 + .../pydantic/_internal/_generate_schema.py | 2522 +++++ .../pydantic/_internal/_generics.py | 536 + .../site-packages/pydantic/_internal/_git.py | 27 + .../pydantic/_internal/_import_utils.py | 20 + .../pydantic/_internal/_internal_dataclass.py | 7 + .../_internal/_known_annotated_metadata.py | 392 + .../pydantic/_internal/_mock_val_ser.py | 235 + .../pydantic/_internal/_model_construction.py | 792 ++ .../pydantic/_internal/_namespace_utils.py | 284 + .../site-packages/pydantic/_internal/_repr.py | 123 + .../_internal/_schema_generation_shared.py | 126 + .../pydantic/_internal/_serializers.py | 51 + .../pydantic/_internal/_signature.py | 188 + .../pydantic/_internal/_std_types_schema.py | 404 + .../pydantic/_internal/_typing_extra.py | 893 ++ .../pydantic/_internal/_utils.py | 389 + .../pydantic/_internal/_validate_call.py | 115 + .../pydantic/_internal/_validators.py | 424 + .../site-packages/pydantic/_migration.py | 308 + .../pydantic/alias_generators.py | 62 + .../site-packages/pydantic/aliases.py | 132 + .../pydantic/annotated_handlers.py | 122 + .../pydantic/class_validators.py | 5 + .../site-packages/pydantic/color.py | 604 ++ .../site-packages/pydantic/config.py | 1049 ++ .../site-packages/pydantic/dataclasses.py | 366 + .../site-packages/pydantic/datetime_parse.py | 5 + .../site-packages/pydantic/decorator.py | 5 + .../pydantic/deprecated/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 195 bytes .../class_validators.cpython-312.pyc | Bin 0 -> 11716 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 4069 bytes .../copy_internals.cpython-312.pyc | Bin 0 -> 8685 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 0 -> 14049 bytes .../__pycache__/json.cpython-312.pyc | Bin 0 -> 6209 bytes .../__pycache__/parse.cpython-312.pyc | Bin 0 -> 3401 bytes .../__pycache__/tools.cpython-312.pyc | Bin 0 -> 3546 bytes .../pydantic/deprecated/class_validators.py | 256 + .../pydantic/deprecated/config.py | 72 + .../pydantic/deprecated/copy_internals.py | 224 + .../pydantic/deprecated/decorator.py | 283 + .../site-packages/pydantic/deprecated/json.py | 141 + .../pydantic/deprecated/parse.py | 80 + .../pydantic/deprecated/tools.py | 103 + .../site-packages/pydantic/env_settings.py | 5 + .../site-packages/pydantic/error_wrappers.py | 5 + .../site-packages/pydantic/errors.py | 162 + .../pydantic/experimental/__init__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 565 bytes .../__pycache__/pipeline.cpython-312.pyc | Bin 0 -> 34692 bytes .../pydantic/experimental/pipeline.py | 669 ++ .../site-packages/pydantic/fields.py | 1504 +++ .../pydantic/functional_serializers.py | 449 + .../pydantic/functional_validators.py | 825 ++ .../site-packages/pydantic/generics.py | 5 + .../python3.12/site-packages/pydantic/json.py | 5 + .../site-packages/pydantic/json_schema.py | 2649 +++++ .../python3.12/site-packages/pydantic/main.py | 1688 ++++ .../python3.12/site-packages/pydantic/mypy.py | 1320 +++ .../site-packages/pydantic/networks.py | 1291 +++ .../site-packages/pydantic/parse.py | 5 + .../site-packages/pydantic/plugin/__init__.py | 171 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7671 bytes .../__pycache__/_loader.cpython-312.pyc | Bin 0 -> 2384 bytes .../_schema_validator.cpython-312.pyc | Bin 0 -> 6907 bytes .../site-packages/pydantic/plugin/_loader.py | 56 + .../pydantic/plugin/_schema_validator.py | 139 + .../site-packages/pydantic/py.typed | 0 .../site-packages/pydantic/root_model.py | 156 + .../site-packages/pydantic/schema.py | 5 + .../site-packages/pydantic/tools.py | 5 + .../site-packages/pydantic/type_adapter.py | 676 ++ .../site-packages/pydantic/types.py | 3255 +++++++ .../site-packages/pydantic/typing.py | 5 + .../site-packages/pydantic/utils.py | 5 + .../site-packages/pydantic/v1/__init__.py | 131 + .../v1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2218 bytes .../_hypothesis_plugin.cpython-312.pyc | Bin 0 -> 20508 bytes .../annotated_types.cpython-312.pyc | Bin 0 -> 3871 bytes .../class_validators.cpython-312.pyc | Bin 0 -> 19667 bytes .../v1/__pycache__/color.cpython-312.pyc | Bin 0 -> 25825 bytes .../v1/__pycache__/config.cpython-312.pyc | Bin 0 -> 8398 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 0 -> 22768 bytes .../datetime_parse.cpython-312.pyc | Bin 0 -> 10344 bytes .../v1/__pycache__/decorator.cpython-312.pyc | Bin 0 -> 13924 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 0 -> 17734 bytes .../error_wrappers.cpython-312.pyc | Bin 0 -> 8927 bytes .../v1/__pycache__/errors.cpython-312.pyc | Bin 0 -> 29596 bytes .../v1/__pycache__/fields.cpython-312.pyc | Bin 0 -> 57401 bytes .../v1/__pycache__/generics.cpython-312.pyc | Bin 0 -> 16982 bytes .../v1/__pycache__/json.cpython-312.pyc | Bin 0 -> 5228 bytes .../v1/__pycache__/main.cpython-312.pyc | Bin 0 -> 48168 bytes .../v1/__pycache__/mypy.cpython-312.pyc | Bin 0 -> 46479 bytes .../v1/__pycache__/networks.cpython-312.pyc | Bin 0 -> 29550 bytes .../v1/__pycache__/parse.cpython-312.pyc | Bin 0 -> 2745 bytes .../v1/__pycache__/schema.cpython-312.pyc | Bin 0 -> 48491 bytes .../v1/__pycache__/tools.cpython-312.pyc | Bin 0 -> 3878 bytes .../v1/__pycache__/types.cpython-312.pyc | Bin 0 -> 48500 bytes .../v1/__pycache__/typing.cpython-312.pyc | Bin 0 -> 22256 bytes .../v1/__pycache__/utils.cpython-312.pyc | Bin 0 -> 35241 bytes .../v1/__pycache__/validators.cpython-312.pyc | Bin 0 -> 30896 bytes .../v1/__pycache__/version.cpython-312.pyc | Bin 0 -> 1957 bytes .../pydantic/v1/_hypothesis_plugin.py | 391 + .../pydantic/v1/annotated_types.py | 72 + .../pydantic/v1/class_validators.py | 361 + .../site-packages/pydantic/v1/color.py | 494 + .../site-packages/pydantic/v1/config.py | 191 + .../site-packages/pydantic/v1/dataclasses.py | 500 + .../pydantic/v1/datetime_parse.py | 248 + .../site-packages/pydantic/v1/decorator.py | 264 + .../site-packages/pydantic/v1/env_settings.py | 350 + .../pydantic/v1/error_wrappers.py | 161 + .../site-packages/pydantic/v1/errors.py | 646 ++ .../site-packages/pydantic/v1/fields.py | 1253 +++ .../site-packages/pydantic/v1/generics.py | 400 + .../site-packages/pydantic/v1/json.py | 112 + .../site-packages/pydantic/v1/main.py | 1107 +++ .../site-packages/pydantic/v1/mypy.py | 949 ++ .../site-packages/pydantic/v1/networks.py | 747 ++ .../site-packages/pydantic/v1/parse.py | 66 + .../site-packages/pydantic/v1/py.typed | 0 .../site-packages/pydantic/v1/schema.py | 1163 +++ .../site-packages/pydantic/v1/tools.py | 92 + .../site-packages/pydantic/v1/types.py | 1205 +++ .../site-packages/pydantic/v1/typing.py | 608 ++ .../site-packages/pydantic/v1/utils.py | 804 ++ .../site-packages/pydantic/v1/validators.py | 768 ++ .../site-packages/pydantic/v1/version.py | 38 + .../pydantic/validate_call_decorator.py | 115 + .../site-packages/pydantic/validators.py | 5 + .../site-packages/pydantic/version.py | 78 + .../site-packages/pydantic/warnings.py | 86 + .../pydantic_core-2.27.2.dist-info/INSTALLER | 1 + .../pydantic_core-2.27.2.dist-info/METADATA | 161 + .../pydantic_core-2.27.2.dist-info/RECORD | 12 + .../pydantic_core-2.27.2.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/pydantic_core/__init__.py | 139 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3065 bytes .../__pycache__/core_schema.cpython-312.pyc | Bin 0 -> 146433 bytes .../_pydantic_core.cpython-312-darwin.so | Bin 0 -> 4366208 bytes .../pydantic_core/_pydantic_core.pyi | 1013 ++ .../pydantic_core/core_schema.py | 4211 ++++++++ .../site-packages/pydantic_core/py.typed | 0 .../pygments-2.19.1.dist-info/INSTALLER | 1 + .../pygments-2.19.1.dist-info/METADATA | 58 + .../pygments-2.19.1.dist-info/RECORD | 682 ++ .../pygments-2.19.1.dist-info/WHEEL | 4 + .../entry_points.txt | 2 + .../licenses/AUTHORS | 291 + .../licenses/LICENSE | 25 + .../site-packages/pygments/__init__.py | 82 + .../site-packages/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3457 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 776 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26541 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2626 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3219 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4689 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38724 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1562 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 2621 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4074 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4749 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 12104 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6696 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8187 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 33004 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 14076 bytes .../site-packages/pygments/cmdline.py | 668 ++ .../site-packages/pygments/console.py | 70 + .../site-packages/pygments/filter.py | 70 + .../pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37924 bytes .../site-packages/pygments/formatter.py | 129 + .../pygments/formatters/__init__.py | 157 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6910 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4208 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4201 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7301 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 41370 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 28682 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6022 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 20116 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6844 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2949 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 13781 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9108 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5774 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15114 bytes .../pygments/formatters/_mapping.py | 23 + .../pygments/formatters/bbcode.py | 108 + .../pygments/formatters/groff.py | 170 + .../site-packages/pygments/formatters/html.py | 995 ++ .../site-packages/pygments/formatters/img.py | 686 ++ .../site-packages/pygments/formatters/irc.py | 154 + .../pygments/formatters/latex.py | 518 + .../pygments/formatters/other.py | 160 + .../pygments/formatters/pangomarkup.py | 83 + .../site-packages/pygments/formatters/rtf.py | 349 + .../site-packages/pygments/formatters/svg.py | 185 + .../pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../site-packages/pygments/lexer.py | 961 ++ .../site-packages/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14680 bytes .../__pycache__/_ada_builtins.cpython-312.pyc | Bin 0 -> 1238 bytes .../__pycache__/_asy_builtins.cpython-312.pyc | Bin 0 -> 17631 bytes .../__pycache__/_cl_builtins.cpython-312.pyc | Bin 0 -> 11667 bytes .../_cocoa_builtins.cpython-312.pyc | Bin 0 -> 97571 bytes .../_csound_builtins.cpython-312.pyc | Bin 0 -> 16379 bytes .../__pycache__/_css_builtins.cpython-312.pyc | Bin 0 -> 9388 bytes .../_googlesql_builtins.cpython-312.pyc | Bin 0 -> 10826 bytes .../_julia_builtins.cpython-312.pyc | Bin 0 -> 8253 bytes .../_lasso_builtins.cpython-312.pyc | Bin 0 -> 76731 bytes .../_lilypond_builtins.cpython-312.pyc | Bin 0 -> 88409 bytes .../__pycache__/_lua_builtins.cpython-312.pyc | Bin 0 -> 8390 bytes .../_luau_builtins.cpython-312.pyc | Bin 0 -> 1052 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 66954 bytes .../__pycache__/_mql_builtins.cpython-312.pyc | Bin 0 -> 18012 bytes .../_mysql_builtins.cpython-312.pyc | Bin 0 -> 19558 bytes .../_openedge_builtins.cpython-312.pyc | Bin 0 -> 34094 bytes .../__pycache__/_php_builtins.cpython-312.pyc | Bin 0 -> 65527 bytes .../_postgres_builtins.cpython-312.pyc | Bin 0 -> 11299 bytes .../_qlik_builtins.cpython-312.pyc | Bin 0 -> 6379 bytes .../_scheme_builtins.cpython-312.pyc | Bin 0 -> 23176 bytes .../_scilab_builtins.cpython-312.pyc | Bin 0 -> 35223 bytes .../_sourcemod_builtins.cpython-312.pyc | Bin 0 -> 21841 bytes .../_stan_builtins.cpython-312.pyc | Bin 0 -> 9955 bytes .../_stata_builtins.cpython-312.pyc | Bin 0 -> 21239 bytes .../_tsql_builtins.cpython-312.pyc | Bin 0 -> 8871 bytes .../__pycache__/_usd_builtins.cpython-312.pyc | Bin 0 -> 1401 bytes .../_vbscript_builtins.cpython-312.pyc | Bin 0 -> 2930 bytes .../__pycache__/_vim_builtins.cpython-312.pyc | Bin 0 -> 30733 bytes .../__pycache__/actionscript.cpython-312.pyc | Bin 0 -> 11118 bytes .../lexers/__pycache__/ada.cpython-312.pyc | Bin 0 -> 5514 bytes .../lexers/__pycache__/agile.cpython-312.pyc | Bin 0 -> 1309 bytes .../__pycache__/algebra.cpython-312.pyc | Bin 0 -> 10998 bytes .../__pycache__/ambient.cpython-312.pyc | Bin 0 -> 3126 bytes .../lexers/__pycache__/amdgpu.cpython-312.pyc | Bin 0 -> 2249 bytes .../lexers/__pycache__/ampl.cpython-312.pyc | Bin 0 -> 4097 bytes .../__pycache__/apdlexer.cpython-312.pyc | Bin 0 -> 19038 bytes .../lexers/__pycache__/apl.cpython-312.pyc | Bin 0 -> 2518 bytes .../__pycache__/archetype.cpython-312.pyc | Bin 0 -> 9190 bytes .../lexers/__pycache__/arrow.cpython-312.pyc | Bin 0 -> 3568 bytes .../lexers/__pycache__/arturo.cpython-312.pyc | Bin 0 -> 9745 bytes .../lexers/__pycache__/asc.cpython-312.pyc | Bin 0 -> 2048 bytes .../lexers/__pycache__/asm.cpython-312.pyc | Bin 0 -> 36012 bytes .../lexers/__pycache__/asn1.cpython-312.pyc | Bin 0 -> 4489 bytes .../__pycache__/automation.cpython-312.pyc | Bin 0 -> 18416 bytes .../lexers/__pycache__/bare.cpython-312.pyc | Bin 0 -> 2875 bytes .../lexers/__pycache__/basic.cpython-312.pyc | Bin 0 -> 26972 bytes .../lexers/__pycache__/bdd.cpython-312.pyc | Bin 0 -> 2084 bytes .../lexers/__pycache__/berry.cpython-312.pyc | Bin 0 -> 3558 bytes .../lexers/__pycache__/bibtex.cpython-312.pyc | Bin 0 -> 5224 bytes .../__pycache__/blueprint.cpython-312.pyc | Bin 0 -> 5312 bytes .../lexers/__pycache__/boa.cpython-312.pyc | Bin 0 -> 3534 bytes .../lexers/__pycache__/bqn.cpython-312.pyc | Bin 0 -> 2548 bytes .../__pycache__/business.cpython-312.pyc | Bin 0 -> 22065 bytes .../lexers/__pycache__/c_cpp.cpython-312.pyc | Bin 0 -> 16096 bytes .../lexers/__pycache__/c_like.cpython-312.pyc | Bin 0 -> 27568 bytes .../__pycache__/capnproto.cpython-312.pyc | Bin 0 -> 2407 bytes .../lexers/__pycache__/carbon.cpython-312.pyc | Bin 0 -> 3545 bytes .../lexers/__pycache__/cddl.cpython-312.pyc | Bin 0 -> 4237 bytes .../lexers/__pycache__/chapel.cpython-312.pyc | Bin 0 -> 4271 bytes .../lexers/__pycache__/clean.cpython-312.pyc | Bin 0 -> 6080 bytes .../lexers/__pycache__/codeql.cpython-312.pyc | Bin 0 -> 2753 bytes .../lexers/__pycache__/comal.cpython-312.pyc | Bin 0 -> 3227 bytes .../__pycache__/compiled.cpython-312.pyc | Bin 0 -> 2000 bytes .../__pycache__/configs.cpython-312.pyc | Bin 0 -> 44518 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 4250 bytes .../lexers/__pycache__/cplint.cpython-312.pyc | Bin 0 -> 1762 bytes .../__pycache__/crystal.cpython-312.pyc | Bin 0 -> 15184 bytes .../lexers/__pycache__/csound.cpython-312.pyc | Bin 0 -> 14121 bytes .../lexers/__pycache__/css.cpython-312.pyc | Bin 0 -> 22107 bytes .../lexers/__pycache__/d.cpython-312.pyc | Bin 0 -> 8336 bytes .../lexers/__pycache__/dalvik.cpython-312.pyc | Bin 0 -> 4546 bytes .../lexers/__pycache__/data.cpython-312.pyc | Bin 0 -> 21170 bytes .../lexers/__pycache__/dax.cpython-312.pyc | Bin 0 -> 6247 bytes .../__pycache__/devicetree.cpython-312.pyc | Bin 0 -> 4047 bytes .../lexers/__pycache__/diff.cpython-312.pyc | Bin 0 -> 5682 bytes .../lexers/__pycache__/dns.cpython-312.pyc | Bin 0 -> 3781 bytes .../lexers/__pycache__/dotnet.cpython-312.pyc | Bin 0 -> 35229 bytes .../lexers/__pycache__/dsls.cpython-312.pyc | Bin 0 -> 33792 bytes .../lexers/__pycache__/dylan.cpython-312.pyc | Bin 0 -> 9736 bytes .../lexers/__pycache__/ecl.cpython-312.pyc | Bin 0 -> 5590 bytes .../lexers/__pycache__/eiffel.cpython-312.pyc | Bin 0 -> 2997 bytes .../lexers/__pycache__/elm.cpython-312.pyc | Bin 0 -> 3241 bytes .../lexers/__pycache__/elpi.cpython-312.pyc | Bin 0 -> 7239 bytes .../lexers/__pycache__/email.cpython-312.pyc | Bin 0 -> 5987 bytes .../lexers/__pycache__/erlang.cpython-312.pyc | Bin 0 -> 20552 bytes .../__pycache__/esoteric.cpython-312.pyc | Bin 0 -> 9769 bytes .../lexers/__pycache__/ezhil.cpython-312.pyc | Bin 0 -> 3863 bytes .../lexers/__pycache__/factor.cpython-312.pyc | Bin 0 -> 16930 bytes .../lexers/__pycache__/fantom.cpython-312.pyc | Bin 0 -> 7999 bytes .../lexers/__pycache__/felix.cpython-312.pyc | Bin 0 -> 8254 bytes .../lexers/__pycache__/fift.cpython-312.pyc | Bin 0 -> 1966 bytes .../__pycache__/floscript.cpython-312.pyc | Bin 0 -> 2984 bytes .../lexers/__pycache__/forth.cpython-312.pyc | Bin 0 -> 5360 bytes .../__pycache__/fortran.cpython-312.pyc | Bin 0 -> 8721 bytes .../lexers/__pycache__/foxpro.cpython-312.pyc | Bin 0 -> 20814 bytes .../__pycache__/freefem.cpython-312.pyc | Bin 0 -> 12789 bytes .../lexers/__pycache__/func.cpython-312.pyc | Bin 0 -> 3340 bytes .../__pycache__/functional.cpython-312.pyc | Bin 0 -> 1050 bytes .../__pycache__/futhark.cpython-312.pyc | Bin 0 -> 4082 bytes .../__pycache__/gcodelexer.cpython-312.pyc | Bin 0 -> 1322 bytes .../__pycache__/gdscript.cpython-312.pyc | Bin 0 -> 7216 bytes .../lexers/__pycache__/gleam.cpython-312.pyc | Bin 0 -> 2714 bytes .../lexers/__pycache__/go.cpython-312.pyc | Bin 0 -> 3389 bytes .../grammar_notation.cpython-312.pyc | Bin 0 -> 7719 bytes .../lexers/__pycache__/graph.cpython-312.pyc | Bin 0 -> 3816 bytes .../__pycache__/graphics.cpython-312.pyc | Bin 0 -> 29705 bytes .../__pycache__/graphql.cpython-312.pyc | Bin 0 -> 4449 bytes .../__pycache__/graphviz.cpython-312.pyc | Bin 0 -> 2223 bytes .../lexers/__pycache__/gsql.cpython-312.pyc | Bin 0 -> 3783 bytes .../lexers/__pycache__/hare.cpython-312.pyc | Bin 0 -> 2956 bytes .../__pycache__/haskell.cpython-312.pyc | Bin 0 -> 30502 bytes .../lexers/__pycache__/haxe.cpython-312.pyc | Bin 0 -> 22286 bytes .../lexers/__pycache__/hdl.cpython-312.pyc | Bin 0 -> 17481 bytes .../__pycache__/hexdump.cpython-312.pyc | Bin 0 -> 3657 bytes .../lexers/__pycache__/html.cpython-312.pyc | Bin 0 -> 20735 bytes .../lexers/__pycache__/idl.cpython-312.pyc | Bin 0 -> 12475 bytes .../lexers/__pycache__/igor.cpython-312.pyc | Bin 0 -> 25700 bytes .../__pycache__/inferno.cpython-312.pyc | Bin 0 -> 3253 bytes .../__pycache__/installers.cpython-312.pyc | Bin 0 -> 13782 bytes .../__pycache__/int_fiction.cpython-312.pyc | Bin 0 -> 48105 bytes .../lexers/__pycache__/iolang.cpython-312.pyc | Bin 0 -> 2217 bytes .../lexers/__pycache__/j.cpython-312.pyc | Bin 0 -> 4309 bytes .../__pycache__/javascript.cpython-312.pyc | Bin 0 -> 57001 bytes .../__pycache__/jmespath.cpython-312.pyc | Bin 0 -> 2407 bytes .../lexers/__pycache__/jslt.cpython-312.pyc | Bin 0 -> 3765 bytes .../lexers/__pycache__/json5.cpython-312.pyc | Bin 0 -> 2887 bytes .../__pycache__/jsonnet.cpython-312.pyc | Bin 0 -> 4863 bytes .../lexers/__pycache__/jsx.cpython-312.pyc | Bin 0 -> 2919 bytes .../lexers/__pycache__/julia.cpython-312.pyc | Bin 0 -> 10941 bytes .../lexers/__pycache__/jvm.cpython-312.pyc | Bin 0 -> 63878 bytes .../lexers/__pycache__/kuin.cpython-312.pyc | Bin 0 -> 9887 bytes .../lexers/__pycache__/kusto.cpython-312.pyc | Bin 0 -> 2849 bytes .../lexers/__pycache__/ldap.cpython-312.pyc | Bin 0 -> 6433 bytes .../lexers/__pycache__/lean.cpython-312.pyc | Bin 0 -> 7998 bytes .../__pycache__/lilypond.cpython-312.pyc | Bin 0 -> 8379 bytes .../lexers/__pycache__/lisp.cpython-312.pyc | Bin 0 -> 121647 bytes .../__pycache__/macaulay2.cpython-312.pyc | Bin 0 -> 23162 bytes .../lexers/__pycache__/make.cpython-312.pyc | Bin 0 -> 6676 bytes .../lexers/__pycache__/maple.cpython-312.pyc | Bin 0 -> 4985 bytes .../lexers/__pycache__/markup.cpython-312.pyc | Bin 0 -> 60423 bytes .../lexers/__pycache__/math.cpython-312.pyc | Bin 0 -> 1046 bytes .../lexers/__pycache__/matlab.cpython-312.pyc | Bin 0 -> 55745 bytes .../lexers/__pycache__/maxima.cpython-312.pyc | Bin 0 -> 3194 bytes .../lexers/__pycache__/meson.cpython-312.pyc | Bin 0 -> 3527 bytes .../lexers/__pycache__/mime.cpython-312.pyc | Bin 0 -> 10140 bytes .../__pycache__/minecraft.cpython-312.pyc | Bin 0 -> 10702 bytes .../lexers/__pycache__/mips.cpython-312.pyc | Bin 0 -> 3441 bytes .../lexers/__pycache__/ml.cpython-312.pyc | Bin 0 -> 26172 bytes .../__pycache__/modeling.cpython-312.pyc | Bin 0 -> 12076 bytes .../__pycache__/modula2.cpython-312.pyc | Bin 0 -> 26506 bytes .../lexers/__pycache__/mojo.cpython-312.pyc | Bin 0 -> 14367 bytes .../lexers/__pycache__/monte.cpython-312.pyc | Bin 0 -> 5119 bytes .../lexers/__pycache__/mosel.cpython-312.pyc | Bin 0 -> 6968 bytes .../lexers/__pycache__/ncl.cpython-312.pyc | Bin 0 -> 45920 bytes .../lexers/__pycache__/nimrod.cpython-312.pyc | Bin 0 -> 6466 bytes .../lexers/__pycache__/nit.cpython-312.pyc | Bin 0 -> 2762 bytes .../lexers/__pycache__/nix.cpython-312.pyc | Bin 0 -> 5471 bytes .../__pycache__/numbair.cpython-312.pyc | Bin 0 -> 2137 bytes .../lexers/__pycache__/oberon.cpython-312.pyc | Bin 0 -> 3751 bytes .../__pycache__/objective.cpython-312.pyc | Bin 0 -> 19475 bytes .../lexers/__pycache__/ooc.cpython-312.pyc | Bin 0 -> 3122 bytes .../__pycache__/openscad.cpython-312.pyc | Bin 0 -> 3734 bytes .../lexers/__pycache__/other.cpython-312.pyc | Bin 0 -> 2456 bytes .../__pycache__/parasail.cpython-312.pyc | Bin 0 -> 2891 bytes .../__pycache__/parsers.cpython-312.pyc | Bin 0 -> 24406 bytes .../lexers/__pycache__/pascal.cpython-312.pyc | Bin 0 -> 23946 bytes .../lexers/__pycache__/pawn.cpython-312.pyc | Bin 0 -> 7869 bytes .../lexers/__pycache__/pddl.cpython-312.pyc | Bin 0 -> 2817 bytes .../lexers/__pycache__/perl.cpython-312.pyc | Bin 0 -> 39022 bytes .../lexers/__pycache__/phix.cpython-312.pyc | Bin 0 -> 18428 bytes .../lexers/__pycache__/php.cpython-312.pyc | Bin 0 -> 14327 bytes .../__pycache__/pointless.cpython-312.pyc | Bin 0 -> 2301 bytes .../lexers/__pycache__/pony.cpython-312.pyc | Bin 0 -> 3430 bytes .../lexers/__pycache__/praat.cpython-312.pyc | Bin 0 -> 10292 bytes .../__pycache__/procfile.cpython-312.pyc | Bin 0 -> 1635 bytes .../lexers/__pycache__/prolog.cpython-312.pyc | Bin 0 -> 10537 bytes .../lexers/__pycache__/promql.cpython-312.pyc | Bin 0 -> 3340 bytes .../lexers/__pycache__/prql.cpython-312.pyc | Bin 0 -> 8388 bytes .../lexers/__pycache__/ptx.cpython-312.pyc | Bin 0 -> 3776 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42919 bytes .../lexers/__pycache__/q.cpython-312.pyc | Bin 0 -> 5850 bytes .../lexers/__pycache__/qlik.cpython-312.pyc | Bin 0 -> 3516 bytes .../lexers/__pycache__/qvt.cpython-312.pyc | Bin 0 -> 5384 bytes .../lexers/__pycache__/r.cpython-312.pyc | Bin 0 -> 6094 bytes .../lexers/__pycache__/rdf.cpython-312.pyc | Bin 0 -> 12264 bytes .../lexers/__pycache__/rebol.cpython-312.pyc | Bin 0 -> 19255 bytes .../lexers/__pycache__/rego.cpython-312.pyc | Bin 0 -> 1880 bytes .../__pycache__/resource.cpython-312.pyc | Bin 0 -> 3592 bytes .../lexers/__pycache__/ride.cpython-312.pyc | Bin 0 -> 4494 bytes .../lexers/__pycache__/rita.cpython-312.pyc | Bin 0 -> 1475 bytes .../lexers/__pycache__/rnc.cpython-312.pyc | Bin 0 -> 2017 bytes .../__pycache__/roboconf.cpython-312.pyc | Bin 0 -> 2368 bytes .../robotframework.cpython-312.pyc | Bin 0 -> 29611 bytes .../lexers/__pycache__/ruby.cpython-312.pyc | Bin 0 -> 22595 bytes .../lexers/__pycache__/rust.cpython-312.pyc | Bin 0 -> 7310 bytes .../lexers/__pycache__/sas.cpython-312.pyc | Bin 0 -> 7045 bytes .../lexers/__pycache__/savi.cpython-312.pyc | Bin 0 -> 3986 bytes .../lexers/__pycache__/scdoc.cpython-312.pyc | Bin 0 -> 2824 bytes .../__pycache__/scripting.cpython-312.pyc | Bin 0 -> 71799 bytes .../lexers/__pycache__/sgf.cpython-312.pyc | Bin 0 -> 2085 bytes .../lexers/__pycache__/shell.cpython-312.pyc | Bin 0 -> 37106 bytes .../lexers/__pycache__/sieve.cpython-312.pyc | Bin 0 -> 2755 bytes .../lexers/__pycache__/slash.cpython-312.pyc | Bin 0 -> 8398 bytes .../__pycache__/smalltalk.cpython-312.pyc | Bin 0 -> 6707 bytes .../lexers/__pycache__/smithy.cpython-312.pyc | Bin 0 -> 3132 bytes .../lexers/__pycache__/smv.cpython-312.pyc | Bin 0 -> 2814 bytes .../lexers/__pycache__/snobol.cpython-312.pyc | Bin 0 -> 2510 bytes .../__pycache__/solidity.cpython-312.pyc | Bin 0 -> 3413 bytes .../lexers/__pycache__/soong.cpython-312.pyc | Bin 0 -> 2278 bytes .../lexers/__pycache__/sophia.cpython-312.pyc | Bin 0 -> 3858 bytes .../__pycache__/special.cpython-312.pyc | Bin 0 -> 5435 bytes .../lexers/__pycache__/spice.cpython-312.pyc | Bin 0 -> 3183 bytes .../lexers/__pycache__/sql.cpython-312.pyc | Bin 0 -> 45587 bytes .../__pycache__/srcinfo.cpython-312.pyc | Bin 0 -> 2013 bytes .../lexers/__pycache__/stata.cpython-312.pyc | Bin 0 -> 5165 bytes .../__pycache__/supercollider.cpython-312.pyc | Bin 0 -> 3915 bytes .../__pycache__/tablegen.cpython-312.pyc | Bin 0 -> 3357 bytes .../lexers/__pycache__/tact.cpython-312.pyc | Bin 0 -> 9042 bytes .../lexers/__pycache__/tal.cpython-312.pyc | Bin 0 -> 2979 bytes .../lexers/__pycache__/tcl.cpython-312.pyc | Bin 0 -> 5153 bytes .../lexers/__pycache__/teal.cpython-312.pyc | Bin 0 -> 3562 bytes .../__pycache__/templates.cpython-312.pyc | Bin 0 -> 83659 bytes .../__pycache__/teraterm.cpython-312.pyc | Bin 0 -> 5570 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 10078 bytes .../lexers/__pycache__/text.cpython-312.pyc | Bin 0 -> 1560 bytes .../__pycache__/textedit.cpython-312.pyc | Bin 0 -> 8522 bytes .../__pycache__/textfmts.cpython-312.pyc | Bin 0 -> 15605 bytes .../__pycache__/theorem.cpython-312.pyc | Bin 0 -> 14913 bytes .../__pycache__/thingsdb.cpython-312.pyc | Bin 0 -> 5624 bytes .../lexers/__pycache__/tlb.cpython-312.pyc | Bin 0 -> 1877 bytes .../lexers/__pycache__/tls.cpython-312.pyc | Bin 0 -> 1935 bytes .../lexers/__pycache__/tnt.cpython-312.pyc | Bin 0 -> 13598 bytes .../__pycache__/trafficscript.cpython-312.pyc | Bin 0 -> 1854 bytes .../__pycache__/typoscript.cpython-312.pyc | Bin 0 -> 7370 bytes .../lexers/__pycache__/typst.cpython-312.pyc | Bin 0 -> 6915 bytes .../lexers/__pycache__/ul4.cpython-312.pyc | Bin 0 -> 8151 bytes .../lexers/__pycache__/unicon.cpython-312.pyc | Bin 0 -> 12518 bytes .../lexers/__pycache__/urbi.cpython-312.pyc | Bin 0 -> 5920 bytes .../lexers/__pycache__/usd.cpython-312.pyc | Bin 0 -> 4032 bytes .../__pycache__/varnish.cpython-312.pyc | Bin 0 -> 6955 bytes .../__pycache__/verification.cpython-312.pyc | Bin 0 -> 4039 bytes .../__pycache__/verifpal.cpython-312.pyc | Bin 0 -> 2981 bytes .../lexers/__pycache__/vip.cpython-312.pyc | Bin 0 -> 5704 bytes .../lexers/__pycache__/vyper.cpython-312.pyc | Bin 0 -> 4934 bytes .../lexers/__pycache__/web.cpython-312.pyc | Bin 0 -> 1324 bytes .../__pycache__/webassembly.cpython-312.pyc | Bin 0 -> 5830 bytes .../lexers/__pycache__/webidl.cpython-312.pyc | Bin 0 -> 8114 bytes .../__pycache__/webmisc.cpython-312.pyc | Bin 0 -> 43551 bytes .../lexers/__pycache__/wgsl.cpython-312.pyc | Bin 0 -> 10860 bytes .../lexers/__pycache__/whiley.cpython-312.pyc | Bin 0 -> 3645 bytes .../lexers/__pycache__/wowtoc.cpython-312.pyc | Bin 0 -> 3250 bytes .../lexers/__pycache__/wren.cpython-312.pyc | Bin 0 -> 3115 bytes .../lexers/__pycache__/x10.cpython-312.pyc | Bin 0 -> 2406 bytes .../lexers/__pycache__/xorg.cpython-312.pyc | Bin 0 -> 1395 bytes .../lexers/__pycache__/yang.cpython-312.pyc | Bin 0 -> 4159 bytes .../lexers/__pycache__/yara.cpython-312.pyc | Bin 0 -> 2741 bytes .../lexers/__pycache__/zig.cpython-312.pyc | Bin 0 -> 3904 bytes .../pygments/lexers/_ada_builtins.py | 103 + .../pygments/lexers/_asy_builtins.py | 1644 ++++ .../pygments/lexers/_cl_builtins.py | 231 + .../pygments/lexers/_cocoa_builtins.py | 75 + .../pygments/lexers/_csound_builtins.py | 1780 ++++ .../pygments/lexers/_css_builtins.py | 558 ++ .../pygments/lexers/_googlesql_builtins.py | 918 ++ .../pygments/lexers/_julia_builtins.py | 411 + .../pygments/lexers/_lasso_builtins.py | 5326 ++++++++++ .../pygments/lexers/_lilypond_builtins.py | 4932 ++++++++++ .../pygments/lexers/_lua_builtins.py | 285 + .../pygments/lexers/_luau_builtins.py | 62 + .../site-packages/pygments/lexers/_mapping.py | 602 ++ .../pygments/lexers/_mql_builtins.py | 1171 +++ .../pygments/lexers/_mysql_builtins.py | 1335 +++ .../pygments/lexers/_openedge_builtins.py | 2600 +++++ .../pygments/lexers/_php_builtins.py | 3325 +++++++ .../pygments/lexers/_postgres_builtins.py | 739 ++ .../pygments/lexers/_qlik_builtins.py | 666 ++ .../pygments/lexers/_scheme_builtins.py | 1609 +++ .../pygments/lexers/_scilab_builtins.py | 3093 ++++++ .../pygments/lexers/_sourcemod_builtins.py | 1151 +++ .../pygments/lexers/_stan_builtins.py | 648 ++ .../pygments/lexers/_stata_builtins.py | 457 + .../pygments/lexers/_tsql_builtins.py | 1003 ++ .../pygments/lexers/_usd_builtins.py | 112 + .../pygments/lexers/_vbscript_builtins.py | 279 + .../pygments/lexers/_vim_builtins.py | 1938 ++++ .../pygments/lexers/actionscript.py | 243 + .../site-packages/pygments/lexers/ada.py | 144 + .../site-packages/pygments/lexers/agile.py | 25 + .../site-packages/pygments/lexers/algebra.py | 299 + .../site-packages/pygments/lexers/ambient.py | 75 + .../site-packages/pygments/lexers/amdgpu.py | 54 + .../site-packages/pygments/lexers/ampl.py | 87 + .../site-packages/pygments/lexers/apdlexer.py | 593 ++ .../site-packages/pygments/lexers/apl.py | 103 + .../pygments/lexers/archetype.py | 315 + .../site-packages/pygments/lexers/arrow.py | 116 + .../site-packages/pygments/lexers/arturo.py | 249 + .../site-packages/pygments/lexers/asc.py | 55 + .../site-packages/pygments/lexers/asm.py | 1051 ++ .../site-packages/pygments/lexers/asn1.py | 178 + .../pygments/lexers/automation.py | 379 + .../site-packages/pygments/lexers/bare.py | 101 + .../site-packages/pygments/lexers/basic.py | 656 ++ .../site-packages/pygments/lexers/bdd.py | 57 + .../site-packages/pygments/lexers/berry.py | 99 + .../site-packages/pygments/lexers/bibtex.py | 159 + .../pygments/lexers/blueprint.py | 173 + .../site-packages/pygments/lexers/boa.py | 97 + .../site-packages/pygments/lexers/bqn.py | 112 + .../site-packages/pygments/lexers/business.py | 625 ++ .../site-packages/pygments/lexers/c_cpp.py | 414 + .../site-packages/pygments/lexers/c_like.py | 738 ++ .../pygments/lexers/capnproto.py | 74 + .../site-packages/pygments/lexers/carbon.py | 95 + .../site-packages/pygments/lexers/cddl.py | 172 + .../site-packages/pygments/lexers/chapel.py | 139 + .../site-packages/pygments/lexers/clean.py | 180 + .../site-packages/pygments/lexers/codeql.py | 80 + .../site-packages/pygments/lexers/comal.py | 81 + .../site-packages/pygments/lexers/compiled.py | 35 + .../site-packages/pygments/lexers/configs.py | 1433 +++ .../site-packages/pygments/lexers/console.py | 114 + .../site-packages/pygments/lexers/cplint.py | 43 + .../site-packages/pygments/lexers/crystal.py | 364 + .../site-packages/pygments/lexers/csound.py | 466 + .../site-packages/pygments/lexers/css.py | 602 ++ .../site-packages/pygments/lexers/d.py | 259 + .../site-packages/pygments/lexers/dalvik.py | 126 + .../site-packages/pygments/lexers/data.py | 763 ++ .../site-packages/pygments/lexers/dax.py | 135 + .../pygments/lexers/devicetree.py | 108 + .../site-packages/pygments/lexers/diff.py | 169 + .../site-packages/pygments/lexers/dns.py | 109 + .../site-packages/pygments/lexers/dotnet.py | 873 ++ .../site-packages/pygments/lexers/dsls.py | 970 ++ .../site-packages/pygments/lexers/dylan.py | 279 + .../site-packages/pygments/lexers/ecl.py | 144 + .../site-packages/pygments/lexers/eiffel.py | 68 + .../site-packages/pygments/lexers/elm.py | 123 + .../site-packages/pygments/lexers/elpi.py | 175 + .../site-packages/pygments/lexers/email.py | 132 + .../site-packages/pygments/lexers/erlang.py | 526 + .../site-packages/pygments/lexers/esoteric.py | 300 + .../site-packages/pygments/lexers/ezhil.py | 76 + .../site-packages/pygments/lexers/factor.py | 363 + .../site-packages/pygments/lexers/fantom.py | 251 + .../site-packages/pygments/lexers/felix.py | 275 + .../site-packages/pygments/lexers/fift.py | 68 + .../pygments/lexers/floscript.py | 81 + .../site-packages/pygments/lexers/forth.py | 178 + .../site-packages/pygments/lexers/fortran.py | 212 + .../site-packages/pygments/lexers/foxpro.py | 427 + .../site-packages/pygments/lexers/freefem.py | 893 ++ .../site-packages/pygments/lexers/func.py | 110 + .../pygments/lexers/functional.py | 21 + .../site-packages/pygments/lexers/futhark.py | 105 + .../pygments/lexers/gcodelexer.py | 35 + .../site-packages/pygments/lexers/gdscript.py | 189 + .../site-packages/pygments/lexers/gleam.py | 74 + .../site-packages/pygments/lexers/go.py | 97 + .../pygments/lexers/grammar_notation.py | 262 + .../site-packages/pygments/lexers/graph.py | 108 + .../site-packages/pygments/lexers/graphics.py | 794 ++ .../site-packages/pygments/lexers/graphql.py | 176 + .../site-packages/pygments/lexers/graphviz.py | 58 + .../site-packages/pygments/lexers/gsql.py | 103 + .../site-packages/pygments/lexers/hare.py | 73 + .../site-packages/pygments/lexers/haskell.py | 866 ++ .../site-packages/pygments/lexers/haxe.py | 935 ++ .../site-packages/pygments/lexers/hdl.py | 466 + .../site-packages/pygments/lexers/hexdump.py | 102 + .../site-packages/pygments/lexers/html.py | 670 ++ .../site-packages/pygments/lexers/idl.py | 284 + .../site-packages/pygments/lexers/igor.py | 435 + .../site-packages/pygments/lexers/inferno.py | 95 + .../pygments/lexers/installers.py | 352 + .../pygments/lexers/int_fiction.py | 1370 +++ .../site-packages/pygments/lexers/iolang.py | 61 + .../site-packages/pygments/lexers/j.py | 151 + .../pygments/lexers/javascript.py | 1591 +++ .../site-packages/pygments/lexers/jmespath.py | 69 + .../site-packages/pygments/lexers/jslt.py | 94 + .../site-packages/pygments/lexers/json5.py | 83 + .../site-packages/pygments/lexers/jsonnet.py | 169 + .../site-packages/pygments/lexers/jsx.py | 100 + .../site-packages/pygments/lexers/julia.py | 294 + .../site-packages/pygments/lexers/jvm.py | 1802 ++++ .../site-packages/pygments/lexers/kuin.py | 332 + .../site-packages/pygments/lexers/kusto.py | 93 + .../site-packages/pygments/lexers/ldap.py | 155 + .../site-packages/pygments/lexers/lean.py | 241 + .../site-packages/pygments/lexers/lilypond.py | 225 + .../site-packages/pygments/lexers/lisp.py | 3146 ++++++ .../pygments/lexers/macaulay2.py | 1814 ++++ .../site-packages/pygments/lexers/make.py | 212 + .../site-packages/pygments/lexers/maple.py | 291 + .../site-packages/pygments/lexers/markup.py | 1654 ++++ .../site-packages/pygments/lexers/math.py | 21 + .../site-packages/pygments/lexers/matlab.py | 3307 +++++++ .../site-packages/pygments/lexers/maxima.py | 84 + .../site-packages/pygments/lexers/meson.py | 139 + .../site-packages/pygments/lexers/mime.py | 210 + .../pygments/lexers/minecraft.py | 391 + .../site-packages/pygments/lexers/mips.py | 130 + .../site-packages/pygments/lexers/ml.py | 958 ++ .../site-packages/pygments/lexers/modeling.py | 366 + .../site-packages/pygments/lexers/modula2.py | 1579 +++ .../site-packages/pygments/lexers/mojo.py | 707 ++ .../site-packages/pygments/lexers/monte.py | 203 + .../site-packages/pygments/lexers/mosel.py | 447 + .../site-packages/pygments/lexers/ncl.py | 894 ++ .../site-packages/pygments/lexers/nimrod.py | 199 + .../site-packages/pygments/lexers/nit.py | 63 + .../site-packages/pygments/lexers/nix.py | 144 + .../site-packages/pygments/lexers/numbair.py | 63 + .../site-packages/pygments/lexers/oberon.py | 120 + .../pygments/lexers/objective.py | 513 + .../site-packages/pygments/lexers/ooc.py | 84 + .../site-packages/pygments/lexers/openscad.py | 96 + .../site-packages/pygments/lexers/other.py | 41 + .../site-packages/pygments/lexers/parasail.py | 78 + .../site-packages/pygments/lexers/parsers.py | 798 ++ .../site-packages/pygments/lexers/pascal.py | 644 ++ .../site-packages/pygments/lexers/pawn.py | 202 + .../site-packages/pygments/lexers/pddl.py | 82 + .../site-packages/pygments/lexers/perl.py | 733 ++ .../site-packages/pygments/lexers/phix.py | 363 + .../site-packages/pygments/lexers/php.py | 334 + .../pygments/lexers/pointless.py | 70 + .../site-packages/pygments/lexers/pony.py | 93 + .../site-packages/pygments/lexers/praat.py | 303 + .../site-packages/pygments/lexers/procfile.py | 41 + .../site-packages/pygments/lexers/prolog.py | 318 + .../site-packages/pygments/lexers/promql.py | 176 + .../site-packages/pygments/lexers/prql.py | 251 + .../site-packages/pygments/lexers/ptx.py | 119 + .../site-packages/pygments/lexers/python.py | 1201 +++ .../site-packages/pygments/lexers/q.py | 187 + .../site-packages/pygments/lexers/qlik.py | 117 + .../site-packages/pygments/lexers/qvt.py | 153 + .../site-packages/pygments/lexers/r.py | 196 + .../site-packages/pygments/lexers/rdf.py | 468 + .../site-packages/pygments/lexers/rebol.py | 419 + .../site-packages/pygments/lexers/rego.py | 57 + .../site-packages/pygments/lexers/resource.py | 83 + .../site-packages/pygments/lexers/ride.py | 138 + .../site-packages/pygments/lexers/rita.py | 42 + .../site-packages/pygments/lexers/rnc.py | 66 + .../site-packages/pygments/lexers/roboconf.py | 81 + .../pygments/lexers/robotframework.py | 551 ++ .../site-packages/pygments/lexers/ruby.py | 518 + .../site-packages/pygments/lexers/rust.py | 222 + .../site-packages/pygments/lexers/sas.py | 227 + .../site-packages/pygments/lexers/savi.py | 171 + .../site-packages/pygments/lexers/scdoc.py | 85 + .../pygments/lexers/scripting.py | 1614 ++++ .../site-packages/pygments/lexers/sgf.py | 59 + .../site-packages/pygments/lexers/shell.py | 902 ++ .../site-packages/pygments/lexers/sieve.py | 78 + .../site-packages/pygments/lexers/slash.py | 183 + .../pygments/lexers/smalltalk.py | 194 + .../site-packages/pygments/lexers/smithy.py | 77 + .../site-packages/pygments/lexers/smv.py | 78 + .../site-packages/pygments/lexers/snobol.py | 82 + .../site-packages/pygments/lexers/solidity.py | 87 + .../site-packages/pygments/lexers/soong.py | 78 + .../site-packages/pygments/lexers/sophia.py | 102 + .../site-packages/pygments/lexers/special.py | 122 + .../site-packages/pygments/lexers/spice.py | 70 + .../site-packages/pygments/lexers/sql.py | 1203 +++ .../site-packages/pygments/lexers/srcinfo.py | 62 + .../site-packages/pygments/lexers/stata.py | 170 + .../pygments/lexers/supercollider.py | 94 + .../site-packages/pygments/lexers/tablegen.py | 177 + .../site-packages/pygments/lexers/tact.py | 303 + .../site-packages/pygments/lexers/tal.py | 77 + .../site-packages/pygments/lexers/tcl.py | 148 + .../site-packages/pygments/lexers/teal.py | 88 + .../pygments/lexers/templates.py | 2355 +++++ .../site-packages/pygments/lexers/teraterm.py | 325 + .../site-packages/pygments/lexers/testing.py | 209 + .../site-packages/pygments/lexers/text.py | 27 + .../site-packages/pygments/lexers/textedit.py | 205 + .../site-packages/pygments/lexers/textfmts.py | 436 + .../site-packages/pygments/lexers/theorem.py | 410 + .../site-packages/pygments/lexers/thingsdb.py | 140 + .../site-packages/pygments/lexers/tlb.py | 59 + .../site-packages/pygments/lexers/tls.py | 54 + .../site-packages/pygments/lexers/tnt.py | 270 + .../pygments/lexers/trafficscript.py | 51 + .../pygments/lexers/typoscript.py | 216 + .../site-packages/pygments/lexers/typst.py | 160 + .../site-packages/pygments/lexers/ul4.py | 309 + .../site-packages/pygments/lexers/unicon.py | 413 + .../site-packages/pygments/lexers/urbi.py | 145 + .../site-packages/pygments/lexers/usd.py | 85 + .../site-packages/pygments/lexers/varnish.py | 189 + .../pygments/lexers/verification.py | 113 + .../site-packages/pygments/lexers/verifpal.py | 65 + .../site-packages/pygments/lexers/vip.py | 150 + .../site-packages/pygments/lexers/vyper.py | 140 + .../site-packages/pygments/lexers/web.py | 24 + .../pygments/lexers/webassembly.py | 119 + .../site-packages/pygments/lexers/webidl.py | 298 + .../site-packages/pygments/lexers/webmisc.py | 1006 ++ .../site-packages/pygments/lexers/wgsl.py | 406 + .../site-packages/pygments/lexers/whiley.py | 115 + .../site-packages/pygments/lexers/wowtoc.py | 120 + .../site-packages/pygments/lexers/wren.py | 98 + .../site-packages/pygments/lexers/x10.py | 66 + .../site-packages/pygments/lexers/xorg.py | 38 + .../site-packages/pygments/lexers/yang.py | 103 + .../site-packages/pygments/lexers/yara.py | 69 + .../site-packages/pygments/lexers/zig.py | 125 + .../site-packages/pygments/modeline.py | 43 + .../site-packages/pygments/plugin.py | 72 + .../site-packages/pygments/regexopt.py | 91 + .../site-packages/pygments/scanner.py | 104 + .../site-packages/pygments/sphinxext.py | 247 + .../site-packages/pygments/style.py | 203 + .../site-packages/pygments/styles/__init__.py | 61 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2628 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 3641 bytes .../styles/__pycache__/abap.cpython-312.pyc | Bin 0 -> 1076 bytes .../styles/__pycache__/algol.cpython-312.pyc | Bin 0 -> 2596 bytes .../__pycache__/algol_nu.cpython-312.pyc | Bin 0 -> 2611 bytes .../__pycache__/arduino.cpython-312.pyc | Bin 0 -> 4270 bytes .../styles/__pycache__/autumn.cpython-312.pyc | Bin 0 -> 2852 bytes .../__pycache__/borland.cpython-312.pyc | Bin 0 -> 2221 bytes .../styles/__pycache__/bw.cpython-312.pyc | Bin 0 -> 1898 bytes .../styles/__pycache__/coffee.cpython-312.pyc | Bin 0 -> 3442 bytes .../__pycache__/colorful.cpython-312.pyc | Bin 0 -> 3710 bytes .../__pycache__/default.cpython-312.pyc | Bin 0 -> 3212 bytes .../__pycache__/dracula.cpython-312.pyc | Bin 0 -> 3025 bytes .../styles/__pycache__/emacs.cpython-312.pyc | Bin 0 -> 3252 bytes .../__pycache__/friendly.cpython-312.pyc | Bin 0 -> 3348 bytes .../friendly_grayscale.cpython-312.pyc | Bin 0 -> 3558 bytes .../styles/__pycache__/fruity.cpython-312.pyc | Bin 0 -> 1927 bytes .../__pycache__/gh_dark.cpython-312.pyc | Bin 0 -> 4016 bytes .../__pycache__/gruvbox.cpython-312.pyc | Bin 0 -> 4364 bytes .../styles/__pycache__/igor.cpython-312.pyc | Bin 0 -> 1121 bytes .../styles/__pycache__/inkpot.cpython-312.pyc | Bin 0 -> 2983 bytes .../__pycache__/lightbulb.cpython-312.pyc | Bin 0 -> 4354 bytes .../__pycache__/lilypond.cpython-312.pyc | Bin 0 -> 3495 bytes .../__pycache__/lovelace.cpython-312.pyc | Bin 0 -> 4248 bytes .../styles/__pycache__/manni.cpython-312.pyc | Bin 0 -> 3483 bytes .../__pycache__/material.cpython-312.pyc | Bin 0 -> 4796 bytes .../__pycache__/monokai.cpython-312.pyc | Bin 0 -> 4777 bytes .../styles/__pycache__/murphy.cpython-312.pyc | Bin 0 -> 3668 bytes .../styles/__pycache__/native.cpython-312.pyc | Bin 0 -> 2945 bytes .../styles/__pycache__/nord.cpython-312.pyc | Bin 0 -> 5574 bytes .../__pycache__/onedark.cpython-312.pyc | Bin 0 -> 2251 bytes .../__pycache__/paraiso_dark.cpython-312.pyc | Bin 0 -> 5117 bytes .../__pycache__/paraiso_light.cpython-312.pyc | Bin 0 -> 5123 bytes .../styles/__pycache__/pastie.cpython-312.pyc | Bin 0 -> 3457 bytes .../__pycache__/perldoc.cpython-312.pyc | Bin 0 -> 3043 bytes .../__pycache__/rainbow_dash.cpython-312.pyc | Bin 0 -> 3689 bytes .../styles/__pycache__/rrt.cpython-312.pyc | Bin 0 -> 1451 bytes .../styles/__pycache__/sas.cpython-312.pyc | Bin 0 -> 1796 bytes .../__pycache__/solarized.cpython-312.pyc | Bin 0 -> 5748 bytes .../__pycache__/staroffice.cpython-312.pyc | Bin 0 -> 1099 bytes .../__pycache__/stata_dark.cpython-312.pyc | Bin 0 -> 1666 bytes .../__pycache__/stata_light.cpython-312.pyc | Bin 0 -> 1667 bytes .../styles/__pycache__/tango.cpython-312.pyc | Bin 0 -> 6120 bytes .../styles/__pycache__/trac.cpython-312.pyc | Bin 0 -> 2592 bytes .../styles/__pycache__/vim.cpython-312.pyc | Bin 0 -> 2475 bytes .../styles/__pycache__/vs.cpython-312.pyc | Bin 0 -> 1480 bytes .../styles/__pycache__/xcode.cpython-312.pyc | Bin 0 -> 1818 bytes .../__pycache__/zenburn.cpython-312.pyc | Bin 0 -> 3327 bytes .../site-packages/pygments/styles/_mapping.py | 54 + .../site-packages/pygments/styles/abap.py | 32 + .../site-packages/pygments/styles/algol.py | 65 + .../site-packages/pygments/styles/algol_nu.py | 65 + .../site-packages/pygments/styles/arduino.py | 100 + .../site-packages/pygments/styles/autumn.py | 67 + .../site-packages/pygments/styles/borland.py | 53 + .../site-packages/pygments/styles/bw.py | 52 + .../site-packages/pygments/styles/coffee.py | 80 + .../site-packages/pygments/styles/colorful.py | 83 + .../site-packages/pygments/styles/default.py | 76 + .../site-packages/pygments/styles/dracula.py | 90 + .../site-packages/pygments/styles/emacs.py | 75 + .../site-packages/pygments/styles/friendly.py | 76 + .../pygments/styles/friendly_grayscale.py | 80 + .../site-packages/pygments/styles/fruity.py | 47 + .../site-packages/pygments/styles/gh_dark.py | 113 + .../site-packages/pygments/styles/gruvbox.py | 118 + .../site-packages/pygments/styles/igor.py | 32 + .../site-packages/pygments/styles/inkpot.py | 72 + .../pygments/styles/lightbulb.py | 110 + .../site-packages/pygments/styles/lilypond.py | 62 + .../site-packages/pygments/styles/lovelace.py | 100 + .../site-packages/pygments/styles/manni.py | 79 + .../site-packages/pygments/styles/material.py | 124 + .../site-packages/pygments/styles/monokai.py | 112 + .../site-packages/pygments/styles/murphy.py | 82 + .../site-packages/pygments/styles/native.py | 70 + .../site-packages/pygments/styles/nord.py | 156 + .../site-packages/pygments/styles/onedark.py | 63 + .../pygments/styles/paraiso_dark.py | 124 + .../pygments/styles/paraiso_light.py | 124 + .../site-packages/pygments/styles/pastie.py | 78 + .../site-packages/pygments/styles/perldoc.py | 73 + .../pygments/styles/rainbow_dash.py | 95 + .../site-packages/pygments/styles/rrt.py | 40 + .../site-packages/pygments/styles/sas.py | 46 + .../pygments/styles/solarized.py | 144 + .../pygments/styles/staroffice.py | 31 + .../pygments/styles/stata_dark.py | 42 + .../pygments/styles/stata_light.py | 42 + .../site-packages/pygments/styles/tango.py | 143 + .../site-packages/pygments/styles/trac.py | 66 + .../site-packages/pygments/styles/vim.py | 67 + .../site-packages/pygments/styles/vs.py | 41 + .../site-packages/pygments/styles/xcode.py | 53 + .../site-packages/pygments/styles/zenburn.py | 83 + .../site-packages/pygments/token.py | 214 + .../site-packages/pygments/unistring.py | 153 + .../python3.12/site-packages/pygments/util.py | 324 + .../rich-13.9.4.dist-info/INSTALLER | 1 + .../rich-13.9.4.dist-info/LICENSE | 19 + .../rich-13.9.4.dist-info/METADATA | 473 + .../rich-13.9.4.dist-info/RECORD | 163 + .../rich-13.9.4.dist-info/REQUESTED | 0 .../site-packages/rich-13.9.4.dist-info/WHEEL | 4 + .../python3.12/site-packages/rich/__init__.py | 177 + .../python3.12/site-packages/rich/__main__.py | 273 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6984 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10153 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7865 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205969 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1722 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2342 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 506 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 848 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12019 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4128 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1878 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3622 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5153 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 717 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6556 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13172 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 958 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 858 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28759 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2459 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3542 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 3329 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1589 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12371 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9114 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4265 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11803 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5571 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26501 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1694 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8580 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 114715 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2251 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9224 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10898 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10402 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1432 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4166 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1838 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3570 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3050 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9893 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6016 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5190 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20165 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19132 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4875 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 14039 bytes .../rich/__pycache__/markdown.cpython-312.pyc | Bin 0 -> 36030 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9559 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6369 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 6924 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1813 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5235 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12768 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40588 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75896 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10382 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 15975 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1773 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 560 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6605 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6549 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3811 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2465 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28538 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6083 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6061 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33483 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2108 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 40096 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43885 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3341 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 61224 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6325 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 307 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 32869 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11729 bytes .../site-packages/rich/_cell_widths.py | 454 + .../site-packages/rich/_emoji_codes.py | 3610 +++++++ .../site-packages/rich/_emoji_replace.py | 32 + .../site-packages/rich/_export_format.py | 76 + .../site-packages/rich/_extension.py | 10 + .../python3.12/site-packages/rich/_fileno.py | 24 + .../python3.12/site-packages/rich/_inspect.py | 268 + .../site-packages/rich/_log_render.py | 94 + .../python3.12/site-packages/rich/_loop.py | 43 + .../site-packages/rich/_null_file.py | 69 + .../site-packages/rich/_palettes.py | 309 + .../python3.12/site-packages/rich/_pick.py | 17 + .../python3.12/site-packages/rich/_ratio.py | 159 + .../site-packages/rich/_spinners.py | 482 + .../python3.12/site-packages/rich/_stack.py | 16 + .../python3.12/site-packages/rich/_timer.py | 19 + .../site-packages/rich/_win32_console.py | 661 ++ .../python3.12/site-packages/rich/_windows.py | 71 + .../site-packages/rich/_windows_renderer.py | 56 + .../python3.12/site-packages/rich/_wrap.py | 93 + .../lib/python3.12/site-packages/rich/abc.py | 33 + .../python3.12/site-packages/rich/align.py | 312 + .../lib/python3.12/site-packages/rich/ansi.py | 241 + .../lib/python3.12/site-packages/rich/bar.py | 93 + .../lib/python3.12/site-packages/rich/box.py | 480 + .../python3.12/site-packages/rich/cells.py | 174 + .../python3.12/site-packages/rich/color.py | 621 ++ .../site-packages/rich/color_triplet.py | 38 + .../python3.12/site-packages/rich/columns.py | 187 + .../python3.12/site-packages/rich/console.py | 2661 +++++ .../site-packages/rich/constrain.py | 37 + .../site-packages/rich/containers.py | 167 + .../python3.12/site-packages/rich/control.py | 225 + .../site-packages/rich/default_styles.py | 191 + .../python3.12/site-packages/rich/diagnose.py | 37 + .../python3.12/site-packages/rich/emoji.py | 96 + .../python3.12/site-packages/rich/errors.py | 34 + .../site-packages/rich/file_proxy.py | 57 + .../python3.12/site-packages/rich/filesize.py | 88 + .../site-packages/rich/highlighter.py | 232 + .../lib/python3.12/site-packages/rich/json.py | 139 + .../python3.12/site-packages/rich/jupyter.py | 101 + .../python3.12/site-packages/rich/layout.py | 442 + .../lib/python3.12/site-packages/rich/live.py | 375 + .../site-packages/rich/live_render.py | 112 + .../python3.12/site-packages/rich/logging.py | 297 + .../python3.12/site-packages/rich/markdown.py | 784 ++ .../python3.12/site-packages/rich/markup.py | 251 + .../python3.12/site-packages/rich/measure.py | 151 + .../python3.12/site-packages/rich/padding.py | 141 + .../python3.12/site-packages/rich/pager.py | 34 + .../python3.12/site-packages/rich/palette.py | 100 + .../python3.12/site-packages/rich/panel.py | 318 + .../python3.12/site-packages/rich/pretty.py | 1016 ++ .../python3.12/site-packages/rich/progress.py | 1715 ++++ .../site-packages/rich/progress_bar.py | 223 + .../python3.12/site-packages/rich/prompt.py | 400 + .../python3.12/site-packages/rich/protocol.py | 42 + .../python3.12/site-packages/rich/py.typed | 0 .../python3.12/site-packages/rich/region.py | 10 + .../lib/python3.12/site-packages/rich/repr.py | 149 + .../lib/python3.12/site-packages/rich/rule.py | 130 + .../python3.12/site-packages/rich/scope.py | 86 + .../python3.12/site-packages/rich/screen.py | 54 + .../python3.12/site-packages/rich/segment.py | 752 ++ .../python3.12/site-packages/rich/spinner.py | 138 + .../python3.12/site-packages/rich/status.py | 131 + .../python3.12/site-packages/rich/style.py | 796 ++ .../python3.12/site-packages/rich/styled.py | 42 + .../python3.12/site-packages/rich/syntax.py | 966 ++ .../python3.12/site-packages/rich/table.py | 1007 ++ .../site-packages/rich/terminal_theme.py | 153 + .../lib/python3.12/site-packages/rich/text.py | 1361 +++ .../python3.12/site-packages/rich/theme.py | 115 + .../python3.12/site-packages/rich/themes.py | 5 + .../site-packages/rich/traceback.py | 797 ++ .../lib/python3.12/site-packages/rich/tree.py | 257 + .../stack_data-0.6.3.dist-info/INSTALLER | 1 + .../stack_data-0.6.3.dist-info/LICENSE.txt | 21 + .../stack_data-0.6.3.dist-info/METADATA | 443 + .../stack_data-0.6.3.dist-info/RECORD | 19 + .../stack_data-0.6.3.dist-info/WHEEL | 5 + .../stack_data-0.6.3.dist-info/top_level.txt | 1 + .../site-packages/stack_data/__init__.py | 10 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 737 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 44907 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 0 -> 11486 bytes .../__pycache__/serializing.cpython-312.pyc | Bin 0 -> 9235 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 10315 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 211 bytes .../site-packages/stack_data/core.py | 926 ++ .../site-packages/stack_data/formatting.py | 234 + .../site-packages/stack_data/py.typed | 1 + .../site-packages/stack_data/serializing.py | 201 + .../site-packages/stack_data/utils.py | 185 + .../site-packages/stack_data/version.py | 1 + .../traitlets-5.14.3.dist-info/INSTALLER | 1 + .../traitlets-5.14.3.dist-info/METADATA | 282 + .../traitlets-5.14.3.dist-info/RECORD | 54 + .../traitlets-5.14.3.dist-info/WHEEL | 4 + .../licenses/LICENSE | 30 + .../site-packages/traitlets/__init__.py | 35 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1439 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 869 bytes .../traitlets/__pycache__/log.cpython-312.pyc | Bin 0 -> 1206 bytes .../__pycache__/traitlets.cpython-312.pyc | Bin 0 -> 181532 bytes .../site-packages/traitlets/_version.py | 19 + .../traitlets/config/__init__.py | 20 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 527 bytes .../__pycache__/application.cpython-312.pyc | Bin 0 -> 49726 bytes .../argcomplete_config.cpython-312.pyc | Bin 0 -> 10281 bytes .../__pycache__/configurable.cpython-312.pyc | Bin 0 -> 25471 bytes .../config/__pycache__/loader.cpython-312.pyc | Bin 0 -> 51070 bytes .../__pycache__/manager.cpython-312.pyc | Bin 0 -> 3961 bytes .../__pycache__/sphinxdoc.cpython-312.pyc | Bin 0 -> 7253 bytes .../traitlets/config/application.py | 1129 +++ .../traitlets/config/argcomplete_config.py | 220 + .../traitlets/config/configurable.py | 600 ++ .../site-packages/traitlets/config/loader.py | 1179 +++ .../site-packages/traitlets/config/manager.py | 84 + .../traitlets/config/sphinxdoc.py | 164 + .../python3.12/site-packages/traitlets/log.py | 31 + .../site-packages/traitlets/py.typed | 0 .../site-packages/traitlets/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 191 bytes .../test_traitlets.cpython-312.pyc | Bin 0 -> 3546 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2159 bytes .../traitlets/tests/test_traitlets.py | 59 + .../site-packages/traitlets/tests/utils.py | 42 + .../site-packages/traitlets/traitlets.py | 4312 +++++++++ .../site-packages/traitlets/utils/__init__.py | 91 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3817 bytes .../utils/__pycache__/bunch.cpython-312.pyc | Bin 0 -> 1449 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 3274 bytes .../__pycache__/descriptions.cpython-312.pyc | Bin 0 -> 6498 bytes .../__pycache__/getargspec.cpython-312.pyc | Bin 0 -> 2450 bytes .../__pycache__/importstring.cpython-312.pyc | Bin 0 -> 1606 bytes .../__pycache__/nested_update.cpython-312.pyc | Bin 0 -> 1413 bytes .../__pycache__/sentinel.cpython-312.pyc | Bin 0 -> 1340 bytes .../utils/__pycache__/text.cpython-312.pyc | Bin 0 -> 1717 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 0 -> 2796 bytes .../site-packages/traitlets/utils/bunch.py | 29 + .../traitlets/utils/decorators.py | 86 + .../traitlets/utils/descriptions.py | 182 + .../traitlets/utils/getargspec.py | 51 + .../traitlets/utils/importstring.py | 41 + .../traitlets/utils/nested_update.py | 41 + .../site-packages/traitlets/utils/sentinel.py | 24 + .../site-packages/traitlets/utils/text.py | 40 + .../site-packages/traitlets/utils/warnings.py | 64 + .../INSTALLER | 1 + .../LICENSE | 279 + .../METADATA | 67 + .../typing_extensions-4.12.2.dist-info/RECORD | 7 + .../typing_extensions-4.12.2.dist-info/WHEEL | 4 + .../site-packages/typing_extensions.py | 3641 +++++++ .../uWSGI-2.0.28.dist-info/INSTALLER | 1 + .../uWSGI-2.0.28.dist-info/LICENSE | 355 + .../uWSGI-2.0.28.dist-info/METADATA | 26 + .../uWSGI-2.0.28.dist-info/RECORD | 10 + .../uWSGI-2.0.28.dist-info/REQUESTED | 0 .../uWSGI-2.0.28.dist-info/WHEEL | 5 + .../uWSGI-2.0.28.dist-info/top_level.txt | 1 + .../site-packages/uwsgidecorators.py | 419 + .../wcwidth-0.2.13.dist-info/INSTALLER | 1 + .../wcwidth-0.2.13.dist-info/LICENSE | 27 + .../wcwidth-0.2.13.dist-info/METADATA | 410 + .../wcwidth-0.2.13.dist-info/RECORD | 19 + .../wcwidth-0.2.13.dist-info/WHEEL | 6 + .../wcwidth-0.2.13.dist-info/top_level.txt | 1 + .../wcwidth-0.2.13.dist-info/zip-safe | 1 + .../site-packages/wcwidth/__init__.py | 29 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 577 bytes .../__pycache__/table_vs16.cpython-312.pyc | Bin 0 -> 1775 bytes .../__pycache__/table_wide.cpython-312.pyc | Bin 0 -> 8301 bytes .../__pycache__/table_zero.cpython-312.pyc | Bin 0 -> 23356 bytes .../unicode_versions.cpython-312.pyc | Bin 0 -> 925 bytes .../__pycache__/wcwidth.cpython-312.pyc | Bin 0 -> 12051 bytes .../site-packages/wcwidth/table_vs16.py | 125 + .../site-packages/wcwidth/table_wide.py | 1493 +++ .../site-packages/wcwidth/table_zero.py | 4843 ++++++++++ .../site-packages/wcwidth/unicode_versions.py | 38 + .../site-packages/wcwidth/wcwidth.py | 345 + .venv/pyvenv.cfg | 5 + .venv/share/man/man1/ipython.1 | 60 + __pycache__/read_stats.cpython-312.pyc | Bin 4832 -> 6334 bytes __pycache__/stats.cpython-312.pyc | Bin 9031 -> 9527 bytes read_stats.py | 66 +- stats.py | 11 +- 5389 files changed, 686710 insertions(+), 28 deletions(-) create mode 100644 .venv/bin/Activate.ps1 create mode 100644 .venv/bin/activate create mode 100644 .venv/bin/activate.csh create mode 100644 .venv/bin/activate.fish create mode 100755 .venv/bin/ipython create mode 100755 .venv/bin/ipython3 create mode 100755 .venv/bin/markdown-it create mode 100755 .venv/bin/pip create mode 100755 .venv/bin/pip3 create mode 100755 .venv/bin/pip3.12 create mode 100755 .venv/bin/pygmentize create mode 120000 .venv/bin/python create mode 120000 .venv/bin/python3 create mode 120000 .venv/bin/python3.12 create mode 100755 .venv/bin/uwsgi create mode 100644 .venv/lib/python3.12/site-packages/IPython/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/conftest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/consoleapp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/display.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/paths.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/conftest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/consoleapp.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/alias.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/application.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/async_helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/autocall.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/builtin_trap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/compilerop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/completer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/completerlib.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/crashhandler.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/debugger.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/display.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_functions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_trap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/displayhook.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/displaypub.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/error.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/events.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/excolors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/extensions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/formatters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/getipython.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/guarded_eval.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/history.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/historyapp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/hooks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputsplitter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer2.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/interactiveshell.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/latex_symbols.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/logger.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/macro.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/magic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/magic_arguments.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/oinspect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/page.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/payload.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/payloadpage.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/prefilter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/profileapp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/profiledir.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/prompts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/pylabtools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/release.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/shellapp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/splitinput.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/ultratb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/usage.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/alias.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/application.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/async_helpers.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/autocall.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/compilerop.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/completer.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/completerlib.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/crashhandler.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/debugger.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/display.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/display_functions.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/display_trap.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/displayhook.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/displaypub.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/error.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/events.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/excolors.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/extensions.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/formatters.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/getipython.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/guarded_eval.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/history.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/historyapp.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/hooks.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/inputsplitter.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/inputtransformer.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/inputtransformer2.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/latex_symbols.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/logger.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/macro.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magic.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magic_arguments.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/ast_mod.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/auto.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/basic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/code.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/config.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/display.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/execution.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/extension.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/history.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/namespace.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/osm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/packaging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/pylab.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/script.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/ast_mod.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/auto.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/basic.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/code.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/config.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/display.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/execution.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/extension.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/history.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/logging.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/namespace.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/osm.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/packaging.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/pylab.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/script.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/oinspect.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/page.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/payload.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/payloadpage.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/prefilter.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/profile/README_STARTUP create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/profileapp.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/profiledir.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/prompts.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/pylabtools.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/release.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/shellapp.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/splitinput.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/2x2.jpg create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/2x2.png create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/bad_all.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/nonascii.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/nonascii2.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/print_argv.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/refbug.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/simpleerr.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/tclass.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_alias.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_application.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_async_helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_autocall.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_compilerop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_completer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_completerlib.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_debugger.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_display.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_displayhook.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_events.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_exceptiongroup_tb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_extension.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_formatters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_guarded_eval.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_handlers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_history.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_hooks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_imports.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputsplitter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputtransformer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputtransformer2.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputtransformer2_line.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_interactiveshell.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_iplib.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_logger.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_magic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_magic_arguments.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_magic_terminal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_oinspect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_page.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_paths.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_prefilter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_profile.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_prompts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_pylabtools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_run.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_shellapp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_splitinput.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_ultratb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/bad_all.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/daft_extension/__pycache__/daft_extension.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/daft_extension/daft_extension.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/nonascii.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/nonascii2.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/print_argv.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/refbug.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/simpleerr.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/tclass.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_alias.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_application.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_async_helpers.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_autocall.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_compilerop.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_completer.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_completerlib.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_debugger.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_display.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/ultratb.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/core/usage.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/display.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/autoreload.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/storemagic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/autoreload.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_autoreload.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_storemagic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/test_autoreload.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/test_storemagic.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_for_kernel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_loaders.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/test_qt_loaders.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/backgroundjobs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/clipboard.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/deepreload.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/demo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/display.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/editorhooks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/guisupport.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/latextools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/lexers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/pretty.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/clipboard.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/deepreload.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/demo.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/display.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/guisupport.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/latextools.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/lexers.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/pretty.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_backgroundjobs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_clipboard.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_deepreload.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_display.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_editorhooks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_imports.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_latextools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_lexers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_pretty.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_pygments.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test.wav create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_editorhooks.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_imports.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_latextools.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_lexers.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_pretty.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_pygments.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/paths.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/py.typed create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/custom_doctests.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/ipython_console_highlighting.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/ipython_directive.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/custom_doctests.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/ipython_console_highlighting.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/ipython_directive.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/debugger.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/embed.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/interactiveshell.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/ipapp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/magics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/prompts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/ptutils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/console.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/debugger.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/embed.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/interactiveshell.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/ipapp.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/magics.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/prompts.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/asyncio.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/glut.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/gtk.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/gtk3.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/gtk4.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/osx.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/pyglet.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/qt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/tk.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/wx.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/asyncio.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/glut.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/gtk.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/gtk3.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/gtk4.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/osx.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/pyglet.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/qt.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/tk.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/wx.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/ptutils.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/auto_match.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/auto_suggest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/filters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/auto_match.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/auto_suggest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/filters.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_debug_magic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_embed.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_help.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_interactivshell.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_pt_inputhooks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_shortcuts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_debug_magic.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_embed.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_help.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_interactivshell.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_pt_inputhooks.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_shortcuts.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/decorators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/globalipapp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/ipunittest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/skipdoctest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/tools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/decorators.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/globalipapp.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/ipunittest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/README.txt create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/dtexample.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/ipdoctest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/pytest_ipdoctest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/setup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/simple.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/simplevars.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/test_ipdoctest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/test_refs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/dtexample.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/ipdoctest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/pytest_ipdoctest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/setup.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/simple.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/simplevars.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_combo.txt create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_example.txt create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_exampleip.txt create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_ipdoctest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_refs.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/skipdoctest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/test_decorators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/test_ipunittest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/test_tools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/test_decorators.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/test_ipunittest.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/test_tools.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tools.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/PyColorize.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/PyColorize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_cli.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_common.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_emscripten.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_posix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_win32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_win32_controller.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_sysinfo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/capture.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/colorable.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/coloransi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/contexts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/daemonize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/data.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/decorators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/dir2.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/docs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/eventful.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/frame.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/generics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/importstring.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/io.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/ipstruct.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/jsonutil.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/localinterfaces.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/log.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/module_paths.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/openpy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/path.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/process.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/py3compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/sentinel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/shimmodule.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/signatures.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/strdispatch.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/sysinfo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/syspathcontext.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/tempdir.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/terminal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/timing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/tokenutil.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/traitlets.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/tz.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/ulinecache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/wildcard.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_cli.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_common.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_emscripten.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_posix.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_win32.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_win32_controller.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_sysinfo.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/capture.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/colorable.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/coloransi.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/contexts.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/daemonize.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/data.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/decorators.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/dir2.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/docs.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/encoding.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/eventful.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/frame.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/generics.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/importstring.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/io.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/ipstruct.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/jsonutil.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/localinterfaces.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/log.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/module_paths.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/openpy.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/path.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/process.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/py3compat.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/sentinel.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/shimmodule.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/signatures.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/strdispatch.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/sysinfo.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/syspathcontext.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tempdir.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/terminal.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_capture.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_decorators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_deprecated.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_dir2.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_imports.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_importstring.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_io.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_module_paths.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_openpy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_path.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_process.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_pycolorize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_shimmodule.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_sysinfo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_tempdir.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_tokenutil.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_wildcard.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_capture.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_decorators.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_deprecated.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_dir2.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_imports.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_importstring.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_io.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_module_paths.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_openpy.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_path.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_process.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_pycolorize.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_shimmodule.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_sysinfo.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_tempdir.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_text.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_tokenutil.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_wildcard.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/text.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/timing.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tokenutil.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/traitlets.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tz.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/ulinecache.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/version.py create mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/wildcard.py create mode 100644 .venv/lib/python3.12/site-packages/__pycache__/decorator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/__pycache__/uwsgidecorators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/annotated_types/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/annotated_types/__pycache__/test_cases.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/annotated_types/py.typed create mode 100644 .venv/lib/python3.12/site-packages/annotated_types/test_cases.py create mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/astroid_compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/asttokens.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/line_numbers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/mark_tokens.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/asttokens/astroid_compat.py create mode 100644 .venv/lib/python3.12/site-packages/asttokens/asttokens.py create mode 100644 .venv/lib/python3.12/site-packages/asttokens/line_numbers.py create mode 100644 .venv/lib/python3.12/site-packages/asttokens/mark_tokens.py create mode 100644 .venv/lib/python3.12/site-packages/asttokens/py.typed create mode 100644 .venv/lib/python3.12/site-packages/asttokens/util.py create mode 100644 .venv/lib/python3.12/site-packages/asttokens/version.py create mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/pbr.json create mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/decorator.py create mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/executing/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/_exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/_position_node_finder.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/_pytest_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/executing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/executing/_exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/executing/_position_node_finder.py create mode 100644 .venv/lib/python3.12/site-packages/executing/_pytest_utils.py create mode 100644 .venv/lib/python3.12/site-packages/executing/executing.py create mode 100644 .venv/lib/python3.12/site-packages/executing/py.typed create mode 100644 .venv/lib/python3.12/site-packages/executing/version.py create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/AUTHORS.txt create mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/jedi/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/_compatibility.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/common.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/debug.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/file_io.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/parser_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/settings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/_compatibility.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/classes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/completion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/completion_cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/environment.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/errors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/file_name.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/interpreter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/keywords.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/project.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/replstartup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/strings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/classes.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/completion.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/completion_cache.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/environment.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/errors.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/file_name.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/helpers.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/interpreter.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/keywords.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/project.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/__pycache__/extract.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/extract.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/replstartup.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/api/strings.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/cache.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/common.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/debug.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/file_io.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/analysis.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/arguments.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/base_value.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/context.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/docstring_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/docstrings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/dynamic_params.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/filters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/finder.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/flow_analysis.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/imports.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/lazy_value.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/names.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/param.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/parser_cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/recursion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/references.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/signature.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/star_args.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/syntax_tree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/sys_path.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/analysis.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/arguments.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/base_value.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/cache.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/access.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/getattr_static.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/mixed.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/value.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/access.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/getattr_static.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/mixed.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__pycache__/functions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/functions.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/value.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/context.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/docstring_utils.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/docstrings.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/dynamic_params.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/filters.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/finder.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/flow_analysis.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/annotation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/conversion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/generics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/stub_value.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/type_var.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/typeshed.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/typing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/annotation.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/base.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/conversion.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/generics.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/stub_value.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/type_var.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/typeshed.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/typing.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/utils.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/helpers.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/imports.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/lazy_value.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/names.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/param.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/parser_cache.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/recursion.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/references.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/signature.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/star_args.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/syntax_tree.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/sys_path.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/utils.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/decorator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/dynamic_arrays.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/function.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/instance.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/iterable.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/klass.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/module.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/namespace.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/decorator.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/dynamic_arrays.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/function.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/instance.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/iterable.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/klass.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/module.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/namespace.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/parser_utils.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/django.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/flask.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/pytest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/registry.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/stdlib.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/django.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/flask.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/pytest.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/registry.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/stdlib.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/settings.py create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/apps/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/apps/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/apps/registry.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/global_settings.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/locale/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/urls/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/urls/i18n.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/urls/static.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/actions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/apps.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/checks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/decorators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/filters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/forms.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/helpers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/options.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/sites.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_list.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_modify.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_static.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_urls.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/log.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/tests.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/autocomplete.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/decorators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/main.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/widgets.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/middleware.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/urls.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/admin.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/apps.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/backends.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/base_user.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/checks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/context_processors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/decorators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/forms.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/handlers/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/handlers/modwsgi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/hashers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/commands/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/commands/changepassword.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/commands/createsuperuser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/middleware.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/mixins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/password_validation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/tokens.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/urls.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/validators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/admin.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/apps.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/checks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/fields.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/forms.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/management/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/management/commands/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/management/commands/remove_stale_contenttypes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/forms.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/middleware.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/sitemaps.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/templatetags/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/templatetags/flatpages.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/urls.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/db/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/db/models/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/db/models/fields.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/humanize/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/humanize/templatetags/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/humanize/templatetags/humanize.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/api.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/context_processors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/middleware.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/cookie.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/fallback.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/session.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/general.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/mixins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/statistics.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/constraints.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/array.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/citext.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/hstore.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/jsonb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/mixins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/ranges.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/functions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/indexes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/lookups.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/operations.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/search.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/validators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/redirects/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/redirects/middleware.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/redirects/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/cache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/cached_db.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/db.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/file.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/signed_cookies.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/base_session.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/management/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/management/commands/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/management/commands/clearsessions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/middleware.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/serializers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/management/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/management/commands/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/management/commands/ping_google.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/apps.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/management.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/managers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/middleware.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/requests.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/shortcuts.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/apps.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/checks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/finders.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/handlers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/collectstatic.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/findstatic.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/runserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/storage.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/templatetags/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/templatetags/staticfiles.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/testing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/urls.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/syndication/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/syndication/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/db.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/dummy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/filebased.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/locmem.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/memcached.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/caches.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/database.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/messages.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/model_checks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/registry.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/csrf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/sessions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/templates.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/translation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/urls.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/images.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/locks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/move.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/storage.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/temp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/uploadedfile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/uploadhandler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/exception.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/wsgi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/console.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/dummy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/filebased.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/locmem.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/smtp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/color.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/dumpdata.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/loaddata.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/makemessages.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/runserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/testserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/sql.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/templates.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/paginator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/json.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/python.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/servers/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/servers/basehttp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/signing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/validators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/wsgi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/creation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/features.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/introspection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/operations.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/schema.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/validation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/ddl_references.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/dummy/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/dummy/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/mysql/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/mysql/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/creation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/operations.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/creation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/features.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/introspection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/operations.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/schema.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/autodetector.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/executor.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/graph.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/loader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/migration.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/fields.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/special.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/optimizer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/questioner.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/recorder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/serializer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/state.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/topological_sort.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/writer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/aggregates.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/constraints.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/deletion.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/enums.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/expressions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/files.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/mixins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/proxy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/related.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/related_descriptors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/related_lookups.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/reverse_related.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/comparison.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/datetime.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/math.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/mixins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/window.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/indexes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/lookups.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/manager.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/options.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/query.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/query_utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/compiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/datastructures.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/query.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/subqueries.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/where.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/transaction.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/dispatch/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/dispatch/dispatcher.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/boundfield.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/fields.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/forms.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/formsets.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/renderers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/widgets.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/cookie.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/multipartparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/cache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/clickjacking.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/common.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/csrf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/gzip.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/http.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/locale.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/security.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/shortcuts.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/django.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/dummy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/jinja2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/context.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/context_processors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/defaultfilters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/defaulttags.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/engine.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/library.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loader_tags.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/app_directories.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/cached.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/filesystem.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/locmem.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/smartif.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/cache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/i18n.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/l10n.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/static.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/tz.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/html.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/runner.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/selenium.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/testcases.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/conf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/converters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/resolvers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/_os.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/archive.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/autoreload.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/baseconv.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/cache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/crypto.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/datastructures.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/dateformat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/dateparse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/dates.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/datetime_safe.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/deconstruct.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/decorators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/deprecation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/duration.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/encoding.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/feedgenerator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/formats.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/functional.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/hashable.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/html.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/http.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/inspect.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/ipv6.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/itercompat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/jslex.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/log.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/lorem_ipsum.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/module_loading.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/numberformat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/regex_helper.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/safestring.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/six.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/termcolors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/timesince.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/timezone.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/topological_sort.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/reloader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/template.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/trans_null.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/trans_real.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/tree.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/version.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/xmlutils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/csrf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/debug.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/cache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/clickjacking.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/csrf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/debug.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/gzip.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/http.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/vary.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/defaults.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/dates.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/detail.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/edit.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/list.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/i18n.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/static.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/BaseHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/CGIHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/ConfigParser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/Cookie.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/HTMLParser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/Queue.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/SimpleHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/SocketServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/StringIO.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/UserDict.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/UserList.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/UserString.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/__builtin__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_ast.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_collections.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_functools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_hotshot.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_io.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_json.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_md5.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sha.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sha256.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sha512.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_socket.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sre.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_struct.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_symtable.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_threading_local.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_winreg.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/ast.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/atexit.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/builtins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/cPickle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/cStringIO.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/collections.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/commands.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/compileall.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/cookielib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/copy_reg.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/dircache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/archive_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/bcppcompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/ccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/cmd.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_dumb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_msi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_packager.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_rpm.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_wininst.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_clib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_ext.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_py.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_scripts.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/check.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/clean.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_data.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_egg_info.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_headers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_lib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_scripts.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/register.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/sdist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/upload.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/core.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/cygwinccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/debug.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/dep_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/dir_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/dist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/emxccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/errors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/extension.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/fancy_getopt.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/file_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/filelist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/log.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/msvccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/spawn.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/sysconfig.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/text_file.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/unixccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/version.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/dummy_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/MIMEText.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/_parseaddr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/base64mime.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/charset.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/encoders.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/feedparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/generator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/header.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/iterators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/application.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/audio.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/image.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/multipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/nonmultipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/quoprimime.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/encodings/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/encodings/utf_8.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/fcntl.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/fnmatch.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/functools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/future_builtins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/gc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/getopt.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/getpass.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/gettext.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/glob.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/gzip.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/hashlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/heapq.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/htmlentitydefs.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/httplib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/imp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/importlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/inspect.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/io.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/itertools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/json.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/markupbase.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/md5.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/mimetools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/dummy/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/dummy/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/pool.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/process.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/mutex.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/ntpath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/nturl2path.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/os/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/os/path.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/os2emxpath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/pipes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/platform.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/popen2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/posix.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/posixpath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/random.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/re.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/repr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/resource.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/rfc822.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/robotparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/runpy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sets.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sha.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/shelve.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/shlex.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/signal.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/smtplib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/spwd.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sre_constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sre_parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/stat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/string.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/stringold.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/strop.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/subprocess.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/symbol.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sys.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/tempfile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/textwrap.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/toaiff.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/tokenize.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/types.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/typing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/unittest.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/urllib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/urllib2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/urlparse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/user.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/whichdb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/xmlrpclib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/__future__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_bisect.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_codecs.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_csv.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_curses.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_dummy_threading.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_heapq.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_msi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_random.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_typeshed/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_typeshed/wsgi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_typeshed/xml.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_warnings.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_weakref.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_weakrefset.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/aifc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/antigravity.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/argparse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/array.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/asynchat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/asyncore.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/audioop.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/base64.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/bdb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/binascii.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/binhex.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/bisect.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/bz2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cProfile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/calendar.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cgi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cgitb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/chunk.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cmath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cmd.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/code.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/codecs.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/codeop.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/colorsys.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/contextlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/copy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/crypt.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/csv.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ctypes/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ctypes/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ctypes/wintypes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/ascii.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/panel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/textpad.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/datetime.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/decimal.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/difflib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/dis.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/doctest.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/dummy_threading.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ensurepip/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/errno.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/filecmp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/fileinput.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/formatter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/fractions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ftplib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/genericpath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/grp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/hmac.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/imaplib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/imghdr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/keyword.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/driver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/grammar.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/literals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/pgen.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/token.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/tokenize.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pygram.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pytree.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/linecache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/locale.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/logging/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/logging/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/logging/handlers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/macpath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mailbox.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mailcap.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/marshal.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/math.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mimetypes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mmap.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/modulefinder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/schema.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/sequence.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msvcrt.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/netrc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/nis.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/numbers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/opcode.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/operator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/optparse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pdb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pickle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pickletools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pkgutil.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/plistlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/poplib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pprint.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/profile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pstats.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pty.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pwd.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/py_compile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyclbr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pydoc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pydoc_data/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pydoc_data/topics.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyexpat/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyexpat/errors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyexpat/model.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/quopri.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/readline.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/rlcompleter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sched.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/select.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/shutil.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/site.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/smtpd.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sndhdr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/socket.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sqlite3/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sqlite3/dbapi2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sre_compile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ssl.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/stringprep.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/struct.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sunau.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/symtable.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sysconfig.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/syslog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/tabnanny.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/tarfile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/telnetlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/termios.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/this.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/threading.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/time.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/timeit.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/token.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/trace.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/traceback.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/tty.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/turtle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/unicodedata.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/uu.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/uuid.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/warnings.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wave.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/weakref.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/webbrowser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/winsound.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/handlers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/headers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/simple_server.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/types.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/validate.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xdrlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/NodeFilter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/domreg.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/expatbuilder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/minicompat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/minidom.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/pulldom.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/xmlbuilder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/ElementInclude.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/ElementPath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/ElementTree.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/cElementTree.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/expat/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/expat/errors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/expat/model.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/handler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/saxutils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/zipfile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/zipimport.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/zlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.7/_py_abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.7/contextvars.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.7/dataclasses.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.9/graphlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.9/zoneinfo/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_ast.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_bootlocale.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_compat_pickle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_compression.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_decimal.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_dummy_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_imp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_importlib_modulespec.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_json.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_markupbase.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_operator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_osx_support.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_posixsubprocess.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_pydecimal.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_sitebuiltins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_stat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_threading_local.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_tkinter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_tracemalloc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_winapi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/ast.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_futures.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_subprocess.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_tasks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/coroutines.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/events.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/format_helpers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/futures.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/locks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/log.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/proactor_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/protocols.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/queues.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/runners.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/selector_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/sslproto.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/staggered.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/streams.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/subprocess.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/tasks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/threads.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/transports.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/trsock.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/unix_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/windows_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/windows_utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/atexit.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/builtins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/collections/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/collections/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/compileall.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/_base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/process.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/configparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/copyreg.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/dumb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/gnu.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/ndbm.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/archive_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/bcppcompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/ccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/cmd.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_dumb.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_msi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_packager.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_rpm.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_wininst.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_clib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_ext.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_py.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_scripts.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/check.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/clean.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_data.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_egg_info.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_headers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_lib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_scripts.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/register.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/sdist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/upload.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/core.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/cygwinccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/debug.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/dep_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/dir_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/dist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/errors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/extension.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/fancy_getopt.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/file_util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/filelist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/log.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/msvccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/spawn.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/sysconfig.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/text_file.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/unixccompiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/version.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/charset.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/contentmanager.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/encoders.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/errors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/feedparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/generator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/header.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/headerregistry.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/iterators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/application.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/audio.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/image.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/multipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/nonmultipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/policy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/encodings/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/encodings/utf_8.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/enum.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/faulthandler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/fcntl.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/fnmatch.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/functools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/gc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/getopt.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/getpass.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/gettext.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/glob.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/gzip.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/hashlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/heapq.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/html/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/html/entities.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/html/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/cookiejar.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/cookies.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/server.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/imp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/machinery.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/metadata.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/resources.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/inspect.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/io.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/ipaddress.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/itertools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/decoder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/encoder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/tool.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/lzma.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/macurl2path.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/context.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/dummy/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/dummy/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/managers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/pool.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/process.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/queues.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/shared_memory.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/sharedctypes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/spawn.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/synchronize.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/nntplib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/ntpath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/nturl2path.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/os/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/os/path.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/pathlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/pipes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/platform.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/posix.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/posixpath.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/queue.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/random.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/re.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/reprlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/resource.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/runpy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/secrets.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/selectors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/shelve.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/shlex.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/signal.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/smtplib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/socketserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/spwd.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/sre_constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/sre_parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/stat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/statistics.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/string.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/subprocess.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/symbol.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/sys.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tempfile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/textwrap.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/commondialog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/dialog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/filedialog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/font.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/messagebox.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/ttk.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tokenize.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tracemalloc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/types.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/typing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/async_case.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/case.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/loader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/main.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/mock.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/result.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/runner.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/suite.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/error.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/robotparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/venv/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/winreg.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xmlrpc/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xmlrpc/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xmlrpc/server.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xxlimited.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/zipapp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/OpenSSL/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/OpenSSL/crypto.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/_base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/process.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/enum.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/fb303/FacebookService.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/fb303/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/ipaddress.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/recipe/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/recipe/watchers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/pathlib2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/pymssql.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/routes/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/routes/mapper.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/routes/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/scribe/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/scribe/scribe.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/scribe/ttypes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/BaseHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/CGIHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/SimpleHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/_dummy_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/cPickle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/collections_abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/configparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_multipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_nonmultipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/html_entities.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/html_parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/http_client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/http_cookiejar.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/http_cookies.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/queue.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/reprlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/socketserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/error.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/robotparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_error.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_robotparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/xmlrpc_client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/concurrent.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/gen.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/httpclient.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/httpserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/httputil.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/ioloop.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/locks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/netutil.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/process.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/tcpserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/testing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/web.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/atomicwrites/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/_version_info.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/converters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/filters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/validators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/backports/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/backports_abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/callbacks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/linkifier.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/sanitizer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/auth.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/auth_handler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/ec2/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/elb/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/exception.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/kms/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/kms/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/kms/layer1.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/plugin.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/regioninfo.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/acl.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/bucket.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/cors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/deletemarker.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/key.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/keyfile.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/lifecycle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/multidelete.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/multipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/prefix.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/tagging.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/user.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/website.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/cache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/decorators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/func.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/lfu.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/lru.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/rr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/ttl.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/certifi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/characteristic/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/enums.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langbulgarianmodel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langcyrillicmodel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langgreekmodel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langhebrewmodel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langhungarianmodel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langthaimodel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langturkishmodel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/universaldetector.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/version.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/_termui_impl.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/core.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/decorators.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/formatting.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/globals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/termui.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/testing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/types.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/croniter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/fernet.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/backends/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/backends/interfaces.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/bindings/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/bindings/openssl/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/bindings/openssl/binding.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/dh.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/dsa.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/ec.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/ed25519.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/ed448.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/padding.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/rsa.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/x25519.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/x448.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/aead.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/algorithms.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/modes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/cmac.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/constant_time.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/hashes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/hmac.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/concatkdf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/hkdf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/kbkdf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/pbkdf2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/scrypt.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/x963kdf.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/keywrap.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/padding.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/poly1305.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/serialization/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/serialization/pkcs12.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/twofactor/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/twofactor/hotp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/twofactor/totp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/x509/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/x509/extensions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/x509/oid.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/datetimerange/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/_common.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/easter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/relativedelta.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/rrule.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/tz/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/tz/_common.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/tz/tz.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/decorator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/deprecated/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/deprecated/classic.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/deprecated/sphinx.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/emoji/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/emoji/core.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/emoji/unicode_codes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/first.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/app.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/blueprints.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/ctx.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/debughelpers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/globals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/helpers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/logging.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/testing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/views.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/wrappers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/database.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/errors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/mixins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/records.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/gflags.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/any_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/api_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/compiler/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/compiler/plugin_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/descriptor.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/descriptor_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/descriptor_pool.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/duration_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/empty_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/field_mask_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/containers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/decoder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/encoder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/enum_type_wrapper.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/extension_dict.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/message_listener.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/python_message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/well_known_types.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/wire_format.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/json_format.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/message_factory.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/reflection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/service.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/source_context_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/struct_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/symbol_database.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/timestamp_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/type_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/util/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/wrappers_pb2.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/itsdangerous.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/_compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/_stringdefs.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/bccache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/compiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/debug.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/defaults.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/environment.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/ext.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/filters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/lexer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/loaders.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/meta.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/nodes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/optimizer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/runtime.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/sandbox.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/tests.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/visitor.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/__meta__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/blockparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/blockprocessors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/core.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/abbr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/admonition.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/attr_list.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/codehilite.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/def_list.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/extra.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/fenced_code.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/footnotes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/legacy_attrs.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/legacy_em.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/md_in_html.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/meta.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/nl2br.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/sane_lists.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/smarty.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/tables.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/toc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/wikilinks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/inlinepatterns.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/pep562.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/postprocessors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/preprocessors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/serializers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/treeprocessors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_native.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_speedups.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/const.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/decoder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/errors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/extension.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/reader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/mock.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/mypy_extensions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/nmap/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/nmap/nmap.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/_version.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/_winapi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/agent.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/auth_handler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ber.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/buffered_pipe.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/channel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/common.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/compress.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/config.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/dsskey.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ecdsakey.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ed25519key.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/file.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/hostkeys.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_curve25519.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_ecdh_nist.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_gex.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_group1.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_group14.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_group16.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_gss.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/message.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/packet.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/pipe.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/pkey.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/primes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/proxy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/py3compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/rsakey.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/server.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_attr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_file.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_handle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_server.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_si.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ssh_exception.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ssh_gss.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/transport.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/win_pageant.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/polib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/event.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/fault.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/option.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/view.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vmodl/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vmodl/fault.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vmodl/query.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pycurl.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/charset.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/connections.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/CLIENT.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/COMMAND.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/ER.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/FIELD_TYPE.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/FLAG.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/SERVER_STATUS.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/converters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/cursors.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/err.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/times.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/attributes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/table.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/util.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/indexes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/settings.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/throttle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/types.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyre_extensions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pytz/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/adapters.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/api.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/auth.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/cookies.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/hooks.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/models.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/_collections.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/connectionpool.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/contrib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/fields.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/filepost.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/packages/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/poolmanager.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/connection.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/retry.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/ssl_.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/timeout.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/url.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/sessions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/status_codes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/structures.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/retry/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/retry/api.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/decoder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/encoder.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/scanner.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/singledispatch.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/slugify/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/slugify/slugify.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/slugify/special.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/tabulate.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/termcolor.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/toml.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/typing_extensions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/tzlocal/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/ujson.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/_compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/_internal.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/_reloader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/atom.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/cache.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/fixers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/iterio.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/jsrouting.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/limiter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/lint.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/profiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/securecookie.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/sessions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/testtools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/wrappers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/datastructures.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/console.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/repr.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/tbtools.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/filesystem.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/formparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/http.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/local.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/dispatcher.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/http_proxy.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/lint.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/profiler.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/proxy_fix.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/shared_data.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/posixemulation.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/routing.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/script.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/security.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/serving.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/test.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/testapp.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/urls.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/useragents.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/wrappers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/wsgi.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/composer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/constructor.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/cyaml.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/dumper.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/emitter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/error.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/events.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/loader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/nodes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/reader.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/representer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/resolver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/scanner.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/serializer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/tokens.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/os.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/threadpool/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/threadpool/binary.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/threadpool/text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/contextvars.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/dataclasses.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/examples.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/nodes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/roles.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/states.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/filelock/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/freezegun/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/freezegun/api.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/frozendict.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/algorithms.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/algorithms/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/algorithms/py_ecdsa.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/algorithms/pycrypto.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/orjson.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pkg_resources/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pkg_resources/py31compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/generator.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/utils.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/BaseHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/CGIHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/SimpleHTTPServer.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/_dummy_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/builtins.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/cPickle.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/collections_abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/configparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_base.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_multipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_nonmultipart.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_text.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/html_entities.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/html_parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/http_client.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/http_cookiejar.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/http_cookies.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/queue.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/reprlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/socketserver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_commondialog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_dialog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_filedialog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_tkfiledialog.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_ttk.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/error.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/robotparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_error.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_request.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_response.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_robotparser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/ast27.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/ast3.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/conversions.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/adjustments.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/buffers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/channel.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/compat.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/parser.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/proxy_headers.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/receiver.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/rfc7230.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/runner.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/server.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/task.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/trigger.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/utilities.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/wasyncore.pyi create mode 100644 .venv/lib/python3.12/site-packages/jedi/utils.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/_compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/_punycode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/parser_block.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/parser_core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/parser_inline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/renderer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/ruler.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/token.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/tree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/_compat.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/_punycode.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/__pycache__/parse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/parse.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/entities.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/html_blocks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/html_re.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/normalize_url.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/entities.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/html_blocks.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/html_re.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/normalize_url.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/utils.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/parse_link_destination.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/parse_link_label.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/parse_link_title.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_destination.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_label.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_title.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/main.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/parser_block.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/parser_core.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/parser_inline.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/port.yaml create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/commonmark.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/default.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/zero.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/commonmark.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/default.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/zero.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/py.typed create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/renderer.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/ruler.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/blockquote.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/code.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/fence.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/heading.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/hr.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/html_block.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/lheading.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/list.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/paragraph.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/reference.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/state_block.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/table.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/blockquote.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/code.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/fence.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/heading.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/hr.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/html_block.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/lheading.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/list.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/paragraph.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/reference.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/state_block.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/table.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/block.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/inline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/linkify.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/normalize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/replacements.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/smartquotes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/state_core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/text_join.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/block.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/inline.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/linkify.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/normalize.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/replacements.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/smartquotes.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/state_core.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/text_join.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/autolink.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/backticks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/balance_pairs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/emphasis.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/entity.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/escape.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/fragments_join.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/html_inline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/image.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/link.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/linkify.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/newline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/state_inline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/strikethrough.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/autolink.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/backticks.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/balance_pairs.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/emphasis.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/entity.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/escape.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/fragments_join.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/html_inline.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/image.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/link.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/linkify.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/newline.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/state_inline.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/strikethrough.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/text.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/token.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/tree.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it/utils.py create mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE.markdown-it create mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__pycache__/backend_inline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__pycache__/config.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/backend_inline.py create mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/config.py create mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/mdurl/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_decode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_encode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_format.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_parse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_url.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mdurl/_decode.py create mode 100644 .venv/lib/python3.12/site-packages/mdurl/_encode.py create mode 100644 .venv/lib/python3.12/site-packages/mdurl/_format.py create mode 100644 .venv/lib/python3.12/site-packages/mdurl/_parse.py create mode 100644 .venv/lib/python3.12/site-packages/mdurl/_url.py create mode 100644 .venv/lib/python3.12/site-packages/mdurl/py.typed create mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/AUTHORS.txt create mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/_compatibility.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/file_io.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/grammar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/normalizer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/tree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/_compatibility.py create mode 100644 .venv/lib/python3.12/site-packages/parso/cache.py create mode 100644 .venv/lib/python3.12/site-packages/parso/file_io.py create mode 100644 .venv/lib/python3.12/site-packages/parso/grammar.py create mode 100644 .venv/lib/python3.12/site-packages/parso/normalizer.py create mode 100644 .venv/lib/python3.12/site-packages/parso/parser.py create mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__pycache__/generator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__pycache__/grammar_parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/generator.py create mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/grammar_parser.py create mode 100644 .venv/lib/python3.12/site-packages/parso/py.typed create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/diff.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/errors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/pep8.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/prefix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/token.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/tokenize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/tree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/parso/python/diff.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/errors.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar310.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar311.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar312.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar313.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar36.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar37.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar38.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar39.txt create mode 100644 .venv/lib/python3.12/site-packages/parso/python/parser.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/pep8.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/prefix.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/token.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/tokenize.py create mode 100644 .venv/lib/python3.12/site-packages/parso/python/tree.py create mode 100644 .venv/lib/python3.12/site-packages/parso/tree.py create mode 100644 .venv/lib/python3.12/site-packages/parso/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/pexpect/ANSI.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/FSM.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/ANSI.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/FSM.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/_async.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/_async_pre_await.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/_async_w_await.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/expect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/fdpexpect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/popen_spawn.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/pty_spawn.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/pxssh.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/replwrap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/run.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/screen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/socket_pexpect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/spawnbase.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pexpect/_async.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/_async_pre_await.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/_async_w_await.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/bashrc.sh create mode 100644 .venv/lib/python3.12/site-packages/pexpect/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/expect.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/fdpexpect.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/popen_spawn.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/pty_spawn.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/pxssh.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/replwrap.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/run.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/screen.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/socket_pexpect.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/spawnbase.py create mode 100644 .venv/lib/python3.12/site-packages/pexpect/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/AUTHORS.txt create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/pip-23.2.1.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 .venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/AUTHORS.rst create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/auto_suggest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/buffer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/cursor_shapes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/data_structures.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/document.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/enums.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/history.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/keys.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/log.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/mouse_events.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/patch_stdout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/renderer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/search.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/selection.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/token.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/validation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/win32_types.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/application.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/current.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/dummy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/run_in_terminal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/application.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/current.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/dummy.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/run_in_terminal.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/auto_suggest.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/buffer.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/cache.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/in_memory.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/pyperclip.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/in_memory.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/pyperclip.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/deduplicate.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/filesystem.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/fuzzy_completer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/nested.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/word_completer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/deduplicate.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/filesystem.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/fuzzy_completer.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/nested.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/word_completer.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/__pycache__/system.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/system.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/compiler.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/completion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/lexer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/regex_parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/validation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/compiler.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/completion.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/lexer.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/regex_parser.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/validation.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/__pycache__/server.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/server.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/log.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/protocol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/server.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/log.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/protocol.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/server.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/cursor_shapes.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/data_structures.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/document.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/enums.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/async_generator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/inputhook.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/win32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/async_generator.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/inputhook.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/utils.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/win32.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/app.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/cli.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/app.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/cli.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/utils.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/ansi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/html.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/pygments.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/ansi.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/html.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/pygments.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/utils.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/history.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/ansi_escape_sequences.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/defaults.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/posix_pipe.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/posix_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/typeahead.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/vt100.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/vt100_parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/win32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/win32_pipe.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/ansi_escape_sequences.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/defaults.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/posix_pipe.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/posix_utils.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/typeahead.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/vt100.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/vt100_parser.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/win32.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/win32_pipe.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/defaults.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/digraphs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/emacs_state.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/key_bindings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/key_processor.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/vi_state.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/auto_suggest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/basic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/completion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/cpr.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/emacs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/focus.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/mouse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/named_commands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/open_in_editor.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/page_navigation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/scroll.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/search.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/vi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/auto_suggest.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/basic.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/completion.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/cpr.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/emacs.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/focus.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/mouse.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/named_commands.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/open_in_editor.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/page_navigation.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/scroll.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/search.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/vi.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/defaults.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/digraphs.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/emacs_state.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/key_bindings.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/key_processor.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/vi_state.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/keys.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/containers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/controls.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/dimension.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/dummy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/layout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/margins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/menus.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/mouse_handlers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/processors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/screen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/scrollable_pane.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/containers.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/controls.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/dimension.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/dummy.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/layout.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/margins.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/menus.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/mouse_handlers.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/processors.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/screen.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/scrollable_pane.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/utils.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__pycache__/pygments.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/pygments.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/log.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/mouse_events.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/color_depth.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/conemu.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/defaults.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/flush_stdout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/plain_text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/vt100.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/win32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/windows10.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/color_depth.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/conemu.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/defaults.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/flush_stdout.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/plain_text.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/vt100.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/win32.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/windows10.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/patch_stdout.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/py.typed create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/renderer.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/search.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/selection.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/dialogs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/prompt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/dialogs.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/formatters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/formatters.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/prompt.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/utils.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/defaults.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/named_colors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/pygments.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/style.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/style_transformation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/defaults.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/named_colors.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/pygments.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/style.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/style_transformation.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/token.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/utils.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/validation.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/dialogs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/menus.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/toolbars.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/base.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/dialogs.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/menus.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/toolbars.py create mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/win32_types.py create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/_fork_pty.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/ptyprocess.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/_fork_pty.py create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/ptyprocess.py create mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/util.py create mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/my_getattr_static.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/core.py create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/my_getattr_static.py create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/py.typed create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pure_eval/version.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/alias_generators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/class_validators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/dataclasses.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/datetime_parse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/decorator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/env_settings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/error_wrappers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_serializers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/generics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/mypy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/parse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/root_model.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/schema.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/tools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/typing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/validate_call_decorator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/validators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_git.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_config.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_core_metadata.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_core_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_dataclasses.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_decorators_v1.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_discriminated_union.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_docs_extraction.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_fields.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_forward_ref.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_generics.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_git.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_import_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_internal_dataclass.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_known_annotated_metadata.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_mock_val_ser.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_namespace_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_repr.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_serializers.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_signature.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_std_types_schema.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_typing_extra.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_validate_call.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_validators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/_migration.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/alias_generators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/aliases.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/annotated_handlers.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/class_validators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/color.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/config.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/dataclasses.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/datetime_parse.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/decorator.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/config.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/decorator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/parse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/tools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/class_validators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/config.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/copy_internals.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/decorator.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/json.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/parse.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/tools.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/env_settings.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/error_wrappers.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/errors.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/pipeline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/pipeline.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/fields.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/functional_serializers.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/functional_validators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/generics.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/json.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/json_schema.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/main.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/mypy.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/networks.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/parse.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/_loader.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/_schema_validator.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/py.typed create mode 100644 .venv/lib/python3.12/site-packages/pydantic/root_model.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/schema.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/tools.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/type_adapter.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/types.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/typing.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/annotated_types.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/class_validators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/color.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/config.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/dataclasses.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/decorator.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/env_settings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/errors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/fields.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/generics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/mypy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/networks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/parse.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/schema.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/tools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/types.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/typing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/validators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/_hypothesis_plugin.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/annotated_types.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/class_validators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/color.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/config.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/dataclasses.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/datetime_parse.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/decorator.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/env_settings.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/error_wrappers.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/errors.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/fields.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/generics.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/json.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/main.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/mypy.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/networks.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/parse.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/py.typed create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/schema.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/tools.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/types.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/typing.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/validators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/version.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/validate_call_decorator.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/validators.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/version.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic/warnings.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc create mode 100755 .venv/lib/python3.12/site-packages/pydantic_core/_pydantic_core.cpython-312-darwin.so create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/_pydantic_core.pyi create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/core_schema.py create mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/py.typed create mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/licenses/AUTHORS create mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/pygments/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/style.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/token.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/cmdline.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/console.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/filter.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/filters/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatter.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/_mapping.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/bbcode.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/groff.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/html.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/img.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/irc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/latex.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/other.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/pangomarkup.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/rtf.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/svg.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/terminal.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/terminal256.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexer.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mysql_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_qlik_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ada.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/algebra.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ambient.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/amdgpu.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ampl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/apdlexer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/apl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/archetype.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/arrow.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/arturo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/asc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/asm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/asn1.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/automation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bare.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/basic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bdd.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/berry.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bibtex.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/blueprint.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/boa.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bqn.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/business.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/c_like.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/capnproto.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/carbon.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/cddl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/chapel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/clean.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/codeql.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/comal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/compiled.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/configs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/cplint.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/crystal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/csound.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dalvik.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dax.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/devicetree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/diff.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dns.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dotnet.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dsls.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dylan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ecl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/eiffel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/elm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/elpi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/email.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/erlang.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/esoteric.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ezhil.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/fantom.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/felix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/fift.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/floscript.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/forth.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/fortran.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/foxpro.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/freefem.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/func.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/functional.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/futhark.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gcodelexer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gdscript.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gleam.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/go.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graph.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graphics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graphql.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graphviz.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gsql.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/hare.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/haskell.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/haxe.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/hdl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/hexdump.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/idl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/igor.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/inferno.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/installers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/j.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jmespath.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jslt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/json5.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jsonnet.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jsx.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/julia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/kuin.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/kusto.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ldap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lean.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lilypond.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/macaulay2.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/make.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/maple.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/markup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/math.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/matlab.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/maxima.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/meson.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mime.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/minecraft.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mips.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ml.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/modeling.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/modula2.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mojo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/monte.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mosel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ncl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/nimrod.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/nit.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/nix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/numbair.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/oberon.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/objective.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ooc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/openscad.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/other.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/parasail.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/parsers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pascal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pawn.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pddl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/phix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pointless.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pony.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/praat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/procfile.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/prolog.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/promql.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/prql.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ptx.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/q.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/qlik.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/qvt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/r.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rdf.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rebol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rego.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/resource.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ride.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rita.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rnc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/roboconf.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/robotframework.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rust.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sas.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/savi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/scdoc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sgf.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/shell.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sieve.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/slash.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/smithy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/smv.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/snobol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/solidity.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/soong.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sophia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/special.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/spice.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sql.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/srcinfo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/stata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/supercollider.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tablegen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tact.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/teal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/templates.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/teraterm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/testing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/textedit.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/textfmts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/theorem.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/thingsdb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tlb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tls.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tnt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/typoscript.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/typst.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ul4.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/unicon.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/urbi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/usd.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/varnish.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/verification.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/verifpal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/vip.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/vyper.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webassembly.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webidl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/wgsl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/whiley.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/wowtoc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/wren.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/x10.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/xorg.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/yang.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/yara.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/zig.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_ada_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_asy_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_cl_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_cocoa_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_csound_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_css_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_googlesql_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_julia_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_lasso_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_lilypond_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_luau_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_mapping.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_mql_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_openedge_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_qlik_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_scheme_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_sourcemod_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_stan_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_stata_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_tsql_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_usd_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_vbscript_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_vim_builtins.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/actionscript.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ada.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/agile.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/algebra.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ambient.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/amdgpu.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ampl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/apdlexer.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/apl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/archetype.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/arrow.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/arturo.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/asc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/asm.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/asn1.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/automation.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bare.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/basic.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bdd.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/berry.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bibtex.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/blueprint.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/boa.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bqn.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/business.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/c_cpp.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/c_like.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/capnproto.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/carbon.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/cddl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/chapel.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/clean.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/codeql.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/comal.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/compiled.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/configs.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/console.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/cplint.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/crystal.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/csound.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/css.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/d.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dalvik.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/data.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dax.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/devicetree.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/diff.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dns.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dotnet.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dsls.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dylan.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ecl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/eiffel.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/elm.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/elpi.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/email.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/erlang.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/esoteric.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ezhil.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/factor.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/fantom.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/felix.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/fift.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/floscript.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/forth.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/fortran.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/foxpro.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/freefem.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/func.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/functional.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/futhark.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gcodelexer.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gdscript.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gleam.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/go.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/grammar_notation.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graph.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graphics.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graphql.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graphviz.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gsql.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/hare.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/haskell.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/haxe.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/hdl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/hexdump.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/html.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/idl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/igor.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/inferno.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/installers.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/int_fiction.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/iolang.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/j.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/javascript.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jmespath.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jslt.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/json5.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jsonnet.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jsx.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/julia.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jvm.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/kuin.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/kusto.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ldap.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/lean.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/lilypond.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/lisp.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/macaulay2.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/make.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/maple.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/markup.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/math.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/matlab.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/maxima.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/meson.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mime.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/minecraft.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mips.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ml.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/modeling.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/modula2.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mojo.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/monte.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mosel.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ncl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/nimrod.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/nit.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/nix.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/numbair.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/oberon.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/objective.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ooc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/openscad.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/other.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/parasail.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/parsers.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pascal.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pawn.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pddl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/perl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/phix.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/php.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pointless.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pony.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/praat.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/procfile.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/prolog.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/promql.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/prql.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ptx.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/python.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/q.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/qlik.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/qvt.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/r.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rdf.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rebol.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rego.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/resource.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ride.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rita.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rnc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/roboconf.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/robotframework.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ruby.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rust.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sas.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/savi.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/scdoc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/scripting.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sgf.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/shell.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sieve.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/slash.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/smalltalk.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/smithy.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/smv.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/snobol.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/solidity.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/soong.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sophia.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/special.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/spice.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sql.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/srcinfo.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/stata.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/supercollider.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tablegen.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tact.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tal.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tcl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/teal.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/templates.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/teraterm.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/testing.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/text.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/textedit.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/textfmts.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/theorem.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/thingsdb.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tlb.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tls.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tnt.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/trafficscript.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/typoscript.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/typst.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ul4.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/unicon.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/urbi.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/usd.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/varnish.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/verification.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/verifpal.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/vip.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/vyper.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/web.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/webassembly.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/webidl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/webmisc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/wgsl.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/whiley.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/wowtoc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/wren.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/x10.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/xorg.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/yang.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/yara.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/zig.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/modeline.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/plugin.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/regexopt.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/scanner.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/sphinxext.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/style.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/abap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/algol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/algol_nu.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/arduino.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/autumn.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/borland.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/bw.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/coffee.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/colorful.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/dracula.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/emacs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/friendly.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/friendly_grayscale.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/fruity.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/gh_dark.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/gruvbox.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/igor.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/inkpot.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/lightbulb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/lilypond.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/lovelace.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/manni.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/material.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/monokai.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/murphy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/native.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/nord.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/onedark.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/pastie.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/perldoc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/rrt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/sas.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/solarized.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/staroffice.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/stata_dark.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/stata_light.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/tango.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/trac.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/vim.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/vs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/xcode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/zenburn.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/_mapping.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/abap.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/algol.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/algol_nu.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/arduino.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/autumn.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/borland.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/bw.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/coffee.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/colorful.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/default.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/dracula.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/emacs.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/friendly.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/friendly_grayscale.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/fruity.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/gh_dark.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/gruvbox.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/igor.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/inkpot.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/lightbulb.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/lilypond.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/lovelace.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/manni.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/material.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/monokai.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/murphy.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/native.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/nord.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/onedark.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/paraiso_dark.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/paraiso_light.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/pastie.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/perldoc.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/rainbow_dash.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/rrt.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/sas.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/solarized.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/staroffice.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/stata_dark.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/stata_light.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/tango.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/trac.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/vim.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/vs.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/xcode.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/zenburn.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/token.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/unistring.py create mode 100644 .venv/lib/python3.12/site-packages/pygments/util.py create mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/rich/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/rich/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/abc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/align.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/bar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/box.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/cells.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/color.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/columns.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/containers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/control.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/errors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/layout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/live.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/markdown.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/markup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/measure.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/padding.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/pager.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/palette.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/panel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/progress.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/region.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/repr.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/rule.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/scope.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/screen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/segment.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/status.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/style.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/styled.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/table.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/theme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/themes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/tree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/rich/_cell_widths.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_emoji_codes.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_emoji_replace.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_export_format.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_extension.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_fileno.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_inspect.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_log_render.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_loop.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_null_file.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_palettes.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_pick.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_ratio.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_spinners.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_stack.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_timer.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_win32_console.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_windows.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_windows_renderer.py create mode 100644 .venv/lib/python3.12/site-packages/rich/_wrap.py create mode 100644 .venv/lib/python3.12/site-packages/rich/abc.py create mode 100644 .venv/lib/python3.12/site-packages/rich/align.py create mode 100644 .venv/lib/python3.12/site-packages/rich/ansi.py create mode 100644 .venv/lib/python3.12/site-packages/rich/bar.py create mode 100644 .venv/lib/python3.12/site-packages/rich/box.py create mode 100644 .venv/lib/python3.12/site-packages/rich/cells.py create mode 100644 .venv/lib/python3.12/site-packages/rich/color.py create mode 100644 .venv/lib/python3.12/site-packages/rich/color_triplet.py create mode 100644 .venv/lib/python3.12/site-packages/rich/columns.py create mode 100644 .venv/lib/python3.12/site-packages/rich/console.py create mode 100644 .venv/lib/python3.12/site-packages/rich/constrain.py create mode 100644 .venv/lib/python3.12/site-packages/rich/containers.py create mode 100644 .venv/lib/python3.12/site-packages/rich/control.py create mode 100644 .venv/lib/python3.12/site-packages/rich/default_styles.py create mode 100644 .venv/lib/python3.12/site-packages/rich/diagnose.py create mode 100644 .venv/lib/python3.12/site-packages/rich/emoji.py create mode 100644 .venv/lib/python3.12/site-packages/rich/errors.py create mode 100644 .venv/lib/python3.12/site-packages/rich/file_proxy.py create mode 100644 .venv/lib/python3.12/site-packages/rich/filesize.py create mode 100644 .venv/lib/python3.12/site-packages/rich/highlighter.py create mode 100644 .venv/lib/python3.12/site-packages/rich/json.py create mode 100644 .venv/lib/python3.12/site-packages/rich/jupyter.py create mode 100644 .venv/lib/python3.12/site-packages/rich/layout.py create mode 100644 .venv/lib/python3.12/site-packages/rich/live.py create mode 100644 .venv/lib/python3.12/site-packages/rich/live_render.py create mode 100644 .venv/lib/python3.12/site-packages/rich/logging.py create mode 100644 .venv/lib/python3.12/site-packages/rich/markdown.py create mode 100644 .venv/lib/python3.12/site-packages/rich/markup.py create mode 100644 .venv/lib/python3.12/site-packages/rich/measure.py create mode 100644 .venv/lib/python3.12/site-packages/rich/padding.py create mode 100644 .venv/lib/python3.12/site-packages/rich/pager.py create mode 100644 .venv/lib/python3.12/site-packages/rich/palette.py create mode 100644 .venv/lib/python3.12/site-packages/rich/panel.py create mode 100644 .venv/lib/python3.12/site-packages/rich/pretty.py create mode 100644 .venv/lib/python3.12/site-packages/rich/progress.py create mode 100644 .venv/lib/python3.12/site-packages/rich/progress_bar.py create mode 100644 .venv/lib/python3.12/site-packages/rich/prompt.py create mode 100644 .venv/lib/python3.12/site-packages/rich/protocol.py create mode 100644 .venv/lib/python3.12/site-packages/rich/py.typed create mode 100644 .venv/lib/python3.12/site-packages/rich/region.py create mode 100644 .venv/lib/python3.12/site-packages/rich/repr.py create mode 100644 .venv/lib/python3.12/site-packages/rich/rule.py create mode 100644 .venv/lib/python3.12/site-packages/rich/scope.py create mode 100644 .venv/lib/python3.12/site-packages/rich/screen.py create mode 100644 .venv/lib/python3.12/site-packages/rich/segment.py create mode 100644 .venv/lib/python3.12/site-packages/rich/spinner.py create mode 100644 .venv/lib/python3.12/site-packages/rich/status.py create mode 100644 .venv/lib/python3.12/site-packages/rich/style.py create mode 100644 .venv/lib/python3.12/site-packages/rich/styled.py create mode 100644 .venv/lib/python3.12/site-packages/rich/syntax.py create mode 100644 .venv/lib/python3.12/site-packages/rich/table.py create mode 100644 .venv/lib/python3.12/site-packages/rich/terminal_theme.py create mode 100644 .venv/lib/python3.12/site-packages/rich/text.py create mode 100644 .venv/lib/python3.12/site-packages/rich/theme.py create mode 100644 .venv/lib/python3.12/site-packages/rich/themes.py create mode 100644 .venv/lib/python3.12/site-packages/rich/traceback.py create mode 100644 .venv/lib/python3.12/site-packages/rich/tree.py create mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/stack_data/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/formatting.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/serializing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stack_data/core.py create mode 100644 .venv/lib/python3.12/site-packages/stack_data/formatting.py create mode 100644 .venv/lib/python3.12/site-packages/stack_data/py.typed create mode 100644 .venv/lib/python3.12/site-packages/stack_data/serializing.py create mode 100644 .venv/lib/python3.12/site-packages/stack_data/utils.py create mode 100644 .venv/lib/python3.12/site-packages/stack_data/version.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/traitlets/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/_version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/log.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/traitlets.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/_version.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/application.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/argcomplete_config.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/configurable.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/loader.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/manager.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/sphinxdoc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/application.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/argcomplete_config.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/configurable.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/loader.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/manager.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/sphinxdoc.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/log.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/py.typed create mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__pycache__/test_traitlets.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/test_traitlets.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/utils.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/traitlets.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/bunch.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/decorators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/descriptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/getargspec.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/importstring.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/nested_update.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/sentinel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/warnings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/bunch.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/decorators.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/descriptions.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/getargspec.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/importstring.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/nested_update.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/sentinel.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/text.py create mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/warnings.py create mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/typing_extensions.py create mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/uwsgidecorators.py create mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/zip-safe create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/table_vs16.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/table_wide.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/table_zero.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/unicode_versions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/wcwidth.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/table_vs16.py create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/table_wide.py create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/table_zero.py create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/unicode_versions.py create mode 100644 .venv/lib/python3.12/site-packages/wcwidth/wcwidth.py create mode 100644 .venv/pyvenv.cfg create mode 100644 .venv/share/man/man1/ipython.1 diff --git a/.venv/bin/Activate.ps1 b/.venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/.venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/.venv/bin/activate b/.venv/bin/activate new file mode 100644 index 0000000..eda7da8 --- /dev/null +++ b/.venv/bin/activate @@ -0,0 +1,70 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # Call hash to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + hash -r 2> /dev/null + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath "/Users/user/dev/testpks/testpks/.venv") +else + # use the path as-is + export VIRTUAL_ENV="/Users/user/dev/testpks/testpks/.venv" +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(.venv) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(.venv) " + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/.venv/bin/activate.csh b/.venv/bin/activate.csh new file mode 100644 index 0000000..d5c1feb --- /dev/null +++ b/.venv/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/user/dev/testpks/testpks/.venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(.venv) $prompt" + setenv VIRTUAL_ENV_PROMPT "(.venv) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/.venv/bin/activate.fish b/.venv/bin/activate.fish new file mode 100644 index 0000000..012c890 --- /dev/null +++ b/.venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/user/dev/testpks/testpks/.venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(.venv) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(.venv) " +end diff --git a/.venv/bin/ipython b/.venv/bin/ipython new file mode 100755 index 0000000..624ee60 --- /dev/null +++ b/.venv/bin/ipython @@ -0,0 +1,8 @@ +#!/Users/user/dev/testpks/testpks/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from IPython import start_ipython +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(start_ipython()) diff --git a/.venv/bin/ipython3 b/.venv/bin/ipython3 new file mode 100755 index 0000000..624ee60 --- /dev/null +++ b/.venv/bin/ipython3 @@ -0,0 +1,8 @@ +#!/Users/user/dev/testpks/testpks/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from IPython import start_ipython +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(start_ipython()) diff --git a/.venv/bin/markdown-it b/.venv/bin/markdown-it new file mode 100755 index 0000000..01b35e8 --- /dev/null +++ b/.venv/bin/markdown-it @@ -0,0 +1,8 @@ +#!/Users/user/dev/testpks/testpks/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from markdown_it.cli.parse import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip b/.venv/bin/pip new file mode 100755 index 0000000..9870d0e --- /dev/null +++ b/.venv/bin/pip @@ -0,0 +1,8 @@ +#!/Users/user/dev/testpks/testpks/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip3 b/.venv/bin/pip3 new file mode 100755 index 0000000..9870d0e --- /dev/null +++ b/.venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/Users/user/dev/testpks/testpks/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip3.12 b/.venv/bin/pip3.12 new file mode 100755 index 0000000..9870d0e --- /dev/null +++ b/.venv/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/Users/user/dev/testpks/testpks/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pygmentize b/.venv/bin/pygmentize new file mode 100755 index 0000000..957ae84 --- /dev/null +++ b/.venv/bin/pygmentize @@ -0,0 +1,8 @@ +#!/Users/user/dev/testpks/testpks/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from pygments.cmdline import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/python b/.venv/bin/python new file mode 120000 index 0000000..11b9d88 --- /dev/null +++ b/.venv/bin/python @@ -0,0 +1 @@ +python3.12 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 new file mode 120000 index 0000000..11b9d88 --- /dev/null +++ b/.venv/bin/python3 @@ -0,0 +1 @@ +python3.12 \ No newline at end of file diff --git a/.venv/bin/python3.12 b/.venv/bin/python3.12 new file mode 120000 index 0000000..a7a5fcc --- /dev/null +++ b/.venv/bin/python3.12 @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12 \ No newline at end of file diff --git a/.venv/bin/uwsgi b/.venv/bin/uwsgi new file mode 100755 index 0000000000000000000000000000000000000000..4a0be7dc682b49176f464cb85886c5ae12e5bc48 GIT binary patch literal 1200232 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

p$N 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

;y*g`OsKsnBIY8-zB2!f4x$ADoXYU3<_p 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ʯPeh z=Pq`VMqkiGHqU#|Qu6j&!Lh)859ij3c4~pZzoo=T<290x<@u=#`jo#x*n>w&bL>KE z(T(Xwe8Y}cpxJo1;D9xz<8~W_9ke{5R_s85*2!gXHkH~n5LIEZau-|zDF_A{=5HMe z?pWSPv8Cz^8HH6YSWmV-2TORYpc-_bHmWnge_ENlA(|o8eql$Q64(?xBuF|cND(W5{%n_fr9!PPLq5Z;T@ z8tpA&quEedpzA_5$rVxq&h_f(ZtoioXd;-hA(q%A*pd7hx!f+xjY^M5li35 zM(ucg-GuF=1FBx3OrmWw5htDjY4I*05r{e0PnquI18TEUiT~#aHXj1_O6PG*C<0{+ zgsbQ*COKGXiT+ttowMgiK&rLMZ`y#efQTvWdYvw>!f|jgy;4S?g}d%(smu)^M-d|H z)3$cRcd`Q1LE?aUO52sNhWMac{o3xYYZ$EPKv7yPkeJ@jny_@)e1=>Y3ldJ|#Qc0; zlA$(nkSHYh34P78v94;9$Q%bsvIdxKO=;srJw0%jN6DlRTAOt?f;BQq&rwh%hkW4> z+d=HtmQ{Bl6u8ykv)D-;A0#}hreuElCIgXNNjX|yyIDy(;IIK*xP1Sah0I(9?LGnCw!&Csb?k54)e6UmnW+^@O_7r(=tVqb zVUQzOLrN34WYK%do~>eJ=WtC)Ou8)k<&9d`)CC%pr=1{RC3kqISTj!N?d$%)Uy_6! zV|U=yHi5nES&&Ml=QL?R0*CiEba)Wl>!)!fMtRWyrc2Pa)DG=Vp``i&%4$I05dad} z>vH4Pn`s%(!WKgPi&n>q7#dCkfvfzkXuFUjXA@>n-(AQYT)lxfy>Bj2)<6N}Oa1V? zJG25I)P{+th1fc#!pkB#qdEv3-j-*`z3O{~)KUL}dq7WS{OBRDApAif(#wsXXdkF5 zgsIIVS{7ud`fCYnKrfLD*H<)_AEJ?GuqjZT6R3R^jP6O592B9@ku?)>NCJhd3AN7( z#B-WUwtu1c66y|tX_TTkmIe(SciI(hWc90gq_liS&BP)RC$c}~tt?DU*WXr(ta;Uo z*y#_+ZuAqg0X`MnHUvaxQ&-elb}bN3Ty5Q}od5~B#itH!wq`rn3TqlOA z)qVwqu;VpUOY5>Ph9-^IfvT5YJveDghp^acJ~Oo41d$;=u{%BsNT^kD#3}u@BAu2JQL9~(tLOXNpqh35Fa#lUhf z>;4U~V|C0czn?lq1=8Ma-c96@3T56T;0&4dHS)d~mpEhzGYF+cTuBLHs}As_r8fcB z>0;=+s-vr*xE2LpfQ8HB)LKLc;9YFT((F4{{37{#(*{avbjb#2Qn&9+v1+I%4H(e= zQ5FwTg1|*^d#gJqHgJ2sx$+At=#Qq>@@A&*$EB!IV@*M;FWB_L|j%90+k zv%H69-OA*1bTvZgKFkHNH;Yi+)5@fKJK;0?4BlWME5tGt+Kz^nz8%V-zN~ktMf@zbwyQG z?!f|idLLejJeHBgT>T#bQ9s&2K?$i+8_mjl0zrC3q=H!eK(c`hkJTgUJ6T*Fxm)6{ zDfz4)vOSO9W>O?sLwP&sEOG*Oh%+L`&8g7bJPeQl4yIFCkVrGH(;#VsvdwF_BK=qI z)yZTxECOPb1p)*S9XRGBZrvp0W9_7Ucz{~YwC}=5xI6?xMXI)VvYiUj{1#mst`bZU zU&H3LLZL8)3{{^b+xdLzMbx^4MJ5w@vyKiY3aLsHfZY0%+K38!9PUfG_T!!if}%J% zgCKGXUN%z#38Cv=P1)ycZhX%3PBjBJxC}atRiU_Im{4S5i6zuYil($IBvlWwA}E&v z=7ecy(la*wPSfMIo4ZObgT>vN{v*Pc+)hzKXUQunKD~dVrxYQDz#~}V+8R-FLK`Y< z-)JCzONTJ+R1~v|q*3V>=(2+1O_NA1UWqwsnPtL|HovC>Q%I*5WV(NC@vBfCZP0f zcI;{KUO&)qCS}8ZvX?aQ4)Ad7fo0AJNnOK5Ef%&f704voa>4peA_z;2;M}>`Y#SUa z%iMC|yG+v~i&&M!ay|#VOiYke6FQ@S&>a{!^*8h!n$a4_*PvEU4NL`%De|3EDe_=I z-f2UADII{*mszSg+TScpEXF7zC%Y+T)Ql=lfnjwRB#0^zreWT!09Ya~!D6OjS~A=@ zDj4diW~m0iZC(i2j|S^SIf<>()WA17I4x@c_ngK0Fln)if_|3NfCX|ha zOaL6!&dcyy4YPO3774{&>q>n;F0A8l4jEZ%S~klv?RZW=2l-QMX;|ut$wuI~)}cOo ziTqiNBA8f@j8RvosyavmW(x{Y3aE7qFUN~v)_}KVEY-;D0OVSsj9Z(#%!{vWuw_^R zeu-Ab5>X<8WQvJ*UcErYy{B|j+l~YRSs@E}4+`1lM`;aJ_YJw&yiHX4o`+)%dgYdc zXP7$V^cNeoED86-@7rZ}_BBN#j|sg|cs(VnlokVWM@FpDFvZI{lLESN@=Q79mT@@7IZRcX<1Z(ElO3ZWht7$U`k z${n{nWYlp25+AEY1LOjD!K#cWrPuhtzF@`9lCB%^Q( zRRDekd|R>hqr2!R8(bdyXZaROvqfZ+abi3VVkzV#K;_jHEzjkKsgVXt!z(q>vQc>q z7Y=FsGVKjX;<(a-C|as2?Bb~bSHwP7AtvpqSiq&Pm5`3L*l8zy=Y%orb6|r^WTQ)e zk^XQ+qNr7GJLzy5DiGB$G1^NLtCOna*>u*oH|#WqVtcfG2nv>^$ZOYtbH6n6llq}D z&~DUk=!%r1Mq!953kTi8Zaopcvll4oN^-}wV?yk6Jl8U5?UaxgH*$s4ee#3$tpu?D z%bqxe30v^0G-7~Anh2K!$%oZ(i6%i%fAS#1Tb9FmRA50Uyoj4oc(5Z5avicmQ1pWM zq$k|mAin012P4M7Ij}Iy0J$~NW38!dA9WlhfW5n6M;I8KhXAn-o=P+xvd}${Tt$t1 z=o-9ej}h9Cgk|QGptQZRpmII9hy=q<)pCX6JT#aTd_z=y`HCv5Mp+Zi2m<15nRGh@ zBn%%4><}tsNK-+J6JWo@p033Mof<+}9*do|oePWRK3q%|(*Wd8R6gn&j%0;EU zW(>GYHeO!T4K7I8s{t^M|1Af4aNbWqyLnW18N}n zzLGA24zQAt>|M3DE8tG>B5w`dx4(;n5HyQ_rwM-wDz{4Y=H>k;TCj6e#kvqndzjxi>3@ z2O(l$Bl8Qz!5r>QZ@=t?|>9r!t2*jy;r-P-pAJTX^1oKL*1v(^XTOQ6W_#U zoCrb?%b&)fcpthY>DYVY#B}zzHK2W||}-C#myI1t`rv(d7VI&~Vc z3uker(x22Caau*iZuDGXRPQT`R*O{1Pzf~%&{mwlQzjOL)TZ+$niK%V>~E9RHWeI1 zsKE3^;-WDf3P%?O!828D&r+MXzR)J}B@5gkcEm5BRDDF&GakKn=pTI&-lU5X66i0i zi%w+`llA~ZW8@kSTu)81S$38<8>FT4jVe@d@IGbK5K=;<(pb|7rq^ zp{zO;Y}BkhfAv5yv59ogbR+6Xs~5bGrH7-v&hUOO#=$FUi=4 z31wCQygq>0Q84tpVh(28Kr~CyQ3jowNV&;D3NX&nBTjDhL3q!soG?zE;MVM~&c#BH2 z!2>pMnI-Fn$Xgmx__vIn0)(Y;pT+DXV{Me|C^cq>hnsO?&EXj|ikSl9bwuMFdQlcF z$TlF~`4oA*z%zV@N;*ja{exy2{DiFLX({G{6%qy^39hrf3Cq-Yg;ec8-huoXUI+}b zAay5uq#1Wxj>(C-bdVsYLBUaEh{C$Q&eu2PfT*ev{lUU*?uK8~*eqMg8!gxfO@Qpy zZ4#efj4l^tGqH-=m&9kD4O9NFH$+263|(Pe~O;6iZjtavP!^fCMc(m zsqU9pv;1TNxK+$Tf}ZVEXxDC}nJWkC50>a=Iv^AvSE-t9ca5S6KLjDmCM4uQ8R3`<;#$W7V~_h7A&QjSo8 zSx4y3M)TkZQ4n^NlzL6LmAHV~k)3v?F6S=PD7Cv?%Lc-qO^J)9O zg`%Hv4b%?X9U^t+2eCeo46UW!Q2vl@y)tM6M0+K=E*%_L?)TBjoq-@Gpcu|vSb~#kzAsR^Vl|8UP@g_h{cD@3jBy{c#Ar$ z2G-{&xShjmF3$VWeCSk;faUPf8>uWD7DbhCRr3&NlZbN5;H{VKVR@_olJo^kQhKOJ zE-d1%>LNa)O{DU6q;?KCEk{l5d<7v+ixcU)mK$^ktWqdiK6dA1RQYayl6Pk z>3>sOLeX_c@IYK!HcW}s&RPmYQd)&&s&t@wglO3zrIIR2FDggKvO)0u$_|L`iS@Nc z6pO-f?t_iF?qv)lfzU8`SZ1WqXb1iRy?q zVx^3w&PA~2MTc}p{fb9TKneZuE;`oP%i!n3*A`xhIhBYwR?%<+-8Laqm&Q7sn!xDA zI!aeH`3n#e)Hub(PxL5U!ICRv4D#C%)|rN^3(`O(7>e-OdblUuLnr}}f}S0xVlBuv zdQg_Q=cCH0k3e7fcjMH7N^Aj0#5?_SSl5|O`ZoYAenK)pQv2dKH$aYN1p>w%i2*RK zm2#+!!xYx0%N2U^!m4sqOAo?6YZ^y|CZLw0)lak0mU$_?ZB2G0kv#(1AlQzKOcBzw z6f<$rjz@x0i5A!xZ2yyzk%N|F{&d8gC+Si4noZ46e0q+v99Ljv-Ptg$954SyqU_$R}` zp$;m8ree9E!N`}STt{-nIDy}g4P=U*P+KFiNd|Q~QWIQ<0{aKI1`shyH2y|d zyjx|Zd|z(`hq3+Zz)H2rb?;CZTt^R)7DZB4@jVynp&&9y1z=3!vd0>$fi(JNT)wl3 zseFHOY?z;DS!fM6X(*m&1iA>=Fv#4E^{&x^Bd8WoL;=ESpu-N6@Cf*JK6gk*=hM;5(4Daft$+(wVod|IvR8u+a z{ML$RqF19@s1(el0%&pBWAr1*F~5P_plCOqz;UM5wCa=(D5K*Uf-W6=L0U}Ab?fRa zy;|a!4ph(@(g5YGi9TA(P~;FJy*)$D$tWPbpa4l0t4i84tf7l)DNGv61x!=k3PqxK zZqkA&-=MmbX@b8wz(4{~C0&@%hiWq?IEI4QL=1n5;`JMaTVZE!#ph!z_B3Xzu0jh% zxo|Fc#qa^n;Peh;pZ85mXolI#1gm35YmUu zUpAt79|nR2p9y0+Q5~zFcxB1j1$S*-U9$O1mD1=k#N+;8tA^ug`OvH`kx7YfQIViK zpDe~g%mm@QFd}vCWf5u3APh^D6i{IJ+mTCcj?D_kbsJrPH`>A8^j7lg~3}O_9dP5jN zY9tsv5{-%6)fq)#sN|f9LS#eNBo3jF>k;V|@=%CGa15dI-utd!&kKAczC)|X1Q<%Zr*~R^2|5g{W?E?6Sg0ESt-*M@ zu{zQhm7;{+iO{E?Ew7ojlD6t^!nsx$+*2Gi0L{IDlmP{HBP3-HH(ZC8Lb@a{5dw~s zI;Ywybut9xNS2jmEu2bI)|fS1x6EQ=;GwvxIA}h*8N+gu^}zbOci23IN9SF51R13p ztRQjIAG%DN(ity8vkD@#2+yR?Yb*@kCMd)QF#zfw(oMKkS32XHPR4*z( zO@cvveeSZ;XHnK)IFHXT z4UJ~cd1DMlms|S6CO}Q7&g7H6U(BOMYhWoTTSHKg@kt&uavYf{rD+Pl%$jZH5p@V8 zMno7&k#u5hZarwOHBHD${?p@`58Mn0yz??-BPcxN9w?>y1v=&L8}za6kTKuNp-(h( z9G@kB5|cC?Qy`s22t0J&y~-r}9Gx*yrL*c^-jfu0-%Bd>gmT!lo{sebXEk!C0U*+1 zF`~RUkh}F4)Juy%s*0h~LBFgisIG{Q<*5(ZWKg%#U?W>L5I{ODf6hE19alNl6d=ji zuo`Pt7{FBKWCC3|f8CCicu;##b#TOAA>6Rp5kwq=3PC9n^T|_DO;un9Nh4$Mc$Q}F zIaowHP|CqfsYYI*hR|0DAaBle*GP#@V4lt^3K*Ns67Y_wxHJjxx-&frQ8CdP$8ZWB zL<@hA*X;UqDDM#}Mt?W~j7b?K!iO?rJ)q{vHcijl33X}ehZApDvrw2}D}^1kcK4ln z$Bj{=oIPlRYRh1&aeKI`%#`g2$ZFo4cvVdYv9KuW)CJAmM)C%Owa1lEy*1PzsiczXCxNf zi`B+-Cx3}08nH;+BEUchFd(bX#e-{21p0f@EhK*Gg=$GdHiYPEJ+T6Ybd!uEb7%ZS z1wvc0MhOgHH`>cw&WsRE_1lmZI}zA|gKQl=1*U8w6d9uff0IF;08hGj)?Wdu}zKrz(` z22y{xJNkZ3u9Z*Vq4Ow@35K4c1*u$VyR=jrYYMyfllY;kSo;Ko&TkfR0`D6{37Da` zeOI9c77O+9xRHL8M8o*$JWO2|_Q@QLbAS)zYTaHu%g0kQWQvjyNXWw3VMxM^JEC=f zrDec7@e%-Up0p4R!5TY;aO`>e7$Z~;ZRsilE@jT5X%~0Og)@PL6Kf`(BAA2G*%=M9 z`{%|^ODJWZ;fe4cFyy6|@h&CWqDN+#?I47%1pQ%Oec{kDYH>RU)93*`%FgU#3uuK@ zU#s69GF)W!*(=3)i|m&p(%-TY7Z}yZm4!~#V!cS@$S^B^6HU}#J!WYWW~b_|9sUJwRS_tB{fj85C_sZ7UaKmp~|48MyIm^!Pw3s z>ugAbp)(!33AR;m)N%p#M3wP8WFanqBGF3}N#zH%gLFGEA3XO5Wi5j5L<&wW%m?7d ziG`p5Ewxd{?{sBVg-6=!(oE=Qbu#DzC+}cOt6ha)3F60iB^JOW-~`&+j->2c(kkV& zt+MA`JFgE)=`cY`xPMpV-TGFkv0^Wsej*Rs+z*t-&#^wt=SqF*ld!NLHrWD*6f?6Z z`VJAVuoRdFTE+|qhO&gw9@;~kR>g#5F(SsO$)*dOYnzutt(E1vL^MH zw_{XIzk`;1Ca)OfM4Z}>x*}2wQyH;QHA`mxjq~`0WZsQ3Qd}lO51G@drMlD_vzEU|k3O+L)=FtUo6rO0I zBj;Siz@KNWTY8;14kplo93+?Np$S=mDh>=+WEc4)@HT>pN2$&lK73Oew!+qTV33M& z5ihGl;2Luyj?}Pv58ig$LO8<0*|Jc9tRPl9$CCfxgR*}BL4#HO4U405xQI{ZlT({!QzhsI*k_Sc0*uCHEoTw;Nq#DR;mKwVic^fl3igx zDbq1T>xO*8=2bZ?FvX{{AJNfF4a-dkG~5<+7p8dYhrLX>Y-8`KNS`{h8l5=AE^2OA=^G&6L88%>-B!2%#^ zLC4g1EeM=K+59!|hBEHivT*&l;fW57(l0_a><&dO=z|;i7oZT#A}Qc%aylHNYhBPe z`Db(&!w#ab9U4O7$Vt-%3d2w|)eB%#z3Ab-tw5e^Lj1oHp930hRLF7^5>6)=dpKooOTpeJc7ZF^0*uFcKoq@}dI9DscGe^Qpn~oo7jKZ<$dWE$4t5BLmBDA& z*&cwUrgr)8Q1URA29i{ zI8}F22mLf1nS#F@R=ya;KdH(xw;dEK8dGB%#<7+@kiFMurmXr2j z6NYhUtwdEik+)6e2CfR0TjvA(RHjqfIf_=oxb!qmcP3b!3 zbhsiUz}scGX!ZyTQP26g+7Rji+CZe_*NB*bY283DT8=>QQ!j?PAjsydeO%{(^BWrJ zo!3ED$rlH0Vkc^Z?QOsE)ldze!akit=(`Ic4RR2`TqlW^3x&Zank7j{&5jN$B2t~| zJD6sLnal&jnb7fOdOjt%R0PycVJm{sF*2Zfl`v7!{%d55n1ZCym1uOJhV2PrMU5IspEY@hH%;-R$o z`Mv~|xJ*YQG(l&!v}}^~P17bR>(jaQOfo*D2Wn!%V=6XT@1zcUSB1bSEAEX;1Tu4f zv`l+VkAn`KJeATT;NgX%16*ip%O7I=G+H2}X?9s`o3C&-Y!k2Tz1~=Og_5EwIPyTVW$Bw@6Liu5Kx~>vB(rm}i799^(n&dGS28pE z8r7JT;;qN3(|JTeKB|#Izz-^~4edD#R?%mDr_rjFg0>$! zjFP>P+00~Vf!m4@B2KAs)58!0e87@~uT@BoiRfa5Ajs%ULz-L-C8y;>7h?2jaLyPY zqcA>EOU(%x@!;&W{01|7oq3~~yF2&cB{W;8MHFkJyQ-8*gRr3r3)?kxjfJqI0I(>Z zjGfov&6F5H1Q{SIVGL5yE7EKYZKnMSLtb8(2Kh*e&!nI>N#4VxO9(0{y3 zhyq}^G{wQO6VI} zr;vXFzDJyfjjo`6arAWc zL66y!@2m!Eu*=nc2veLAIF+=4Z`y@Po<54cLF&*^R2Obn0Kn?vONE{}H#QU8pqD9v z{CQLXbe;e$k%0#LfFf`lPq|qYBet94$BGa^@v|N;WzOEw^)2B}`GqJWkKT)=M}X-| zy9*XkeM)0^u|ylKK`Y5|?PPBjIQOrhfM}{VYyatt{y%}R!!MKxH$|PL88Anhz_-ZY z35AtAlF~|5l`e+4%EJ>B$kNnJzB?t5Zbmk@hDd~d(ulxFii5c6+h`(cL1_-^FPES#I4XF4fnzlG}2kbB@)jtnF z*_laJXgh2zQ9uQR8(CpIF{OgaTogir9dK8!5Nqm2lQ8fLwJG9}tcxNNuhd=DpGK$z z;rmu|eN~ayIRI+F1nT4zcr7}Ig6k4E9*vdasjOpol>R~t@e33^8mjhcx7*Sd7G%a) zA(|;zieG_bPz{7rHt58%^ZFwM%+!ICqu+i#lg4A_cV_4UHpW|_C#arGtN&|3nwijq z-N0}G?d{PTH*?!@2)Y}%<5g=-fS$^s`|GR#TL)!k&I)x|-ZnQR?d520N?dj+`O8v_ zatIOD{(Me{6Ody7Bt8jlqX2Pz5yzBl7sxshixF;RTxi_Cw6d=LOMgK$?R7<3(?PL4%ydO7jnwbxA4JiD zq@BpLKy1{z+!!63F2=JY6q6fb#~u+wR$odbwp?0SN|G1ksl`B$Dz5~==Ol0;NshD~ z@*PD(?eG-b1^%S1_(j?#FTqJs1Vlm4=6E_QJT5#rY3D`Td$Z7r3eg1ml;y9j7lNRVz(iv z(25#TQz|zLE}F0>{Fx!=k9%m1qI=u+u2ePBPvI)#DN##^YVyX4VFNU)$Nq6Kwp!6( zl)bz$V28dw3djLVO_h}&Bc@P*bb*MQU0nEQhS*I5ZEG*UFP$p6a%`IWjzg2-1y}~@&vz@47 zCCY<{3YW6ev1qCC8iqnByAOmRW~}Xm4SUh<_qyE{_nOvEmVhpDyvj3&VW3q8wdFv2 zM7+rJl$4-;!2-_}fS@+S)?|o5O3%j6rm;ifLidV2$_wEWq+~#>1?9*N_Die~5-)8P zOQ+{bnDUO50zQB@gern~c9v;qw|6}k8u=3tFvYhWR&g{Uw1f@DDz%_iB#8H{crtZyZB z0IlE?$l3g;URTaCx|iE#lS8eBVzi9ZDV-8%P#;;9+E!;@Qw`jOJ&gimv3->ZrL6OF z^k#)jPXfp|EmjK9Lglbjyepj+5&<>+PxDG*cmB4f(mJr6;9W93Kn_%SsSc+i%@%$p zK6(lC?KH@aA17sn9pPS0fS%~>(&jy}_Pi88#Vqwx>JP9%gkYAgh_0z2fHWB_QRpTY z)Diy-^H^YslVCMjGiR?TwX#YZTIC7zWcr zf$qpmZcNi`@kr|fgl!DdOcHb<{+$!!jrnU#e;SdQFUKbEh?RBqXy33SRRlxsobgTt zNV&(bk!H(*W~SkCfV4+IfMnz#)K-yA;BVVaD#T8TMy9>H20#Sl``W-xxUdQ6K~1kW zoP?qV89))>Rg}*=@1csK; z3c(;HqeH0Fc1p7j(ZLn)9592b=-DbE3fU>pVI>|Hd&z%OvfV|hgs49liLQt+(uHLo zM3$rh9i#(&`wd{Wlq_joxRu@!;V%sErwxNMFDb%)K2CAMpP`E`aQ09atDenZ~uP(j9D=!~l0I4NdD0^(laQv$lQ ze}xK=VnbMU*+e9gJiiiUOdM`)sUE%4a}i**@3XAX#oT9s9GPAsCAF&n3kvB(a5eCN6rEa&j*_H! z_!@_|M`yR^y-C)Fb8tklZCCKhs<9jakBX{V(P1m4z9NB51++9&9d3=(TInUBO>?t= zEj+`5gAT;9i6sn0|HXFJ-4eFd^>9sxbl@tCIC@P#C)|d3k$rPwwOGs_DMAE+TkXmN zAkDBinw^EM^aM{8w@K>=s@8^quYy{035!q|Ch2sej`~5Pz0Z||9V2Jwwx~5>d`vh| zLGFYO$pH-ne22=_h=2!t37Dd6xtHm zGJzEtU?X?7Y~KZ$hsG~2)Li@vMI*FyAk_EmeZkxIF*<-oCh#jYKwQr?YO)^Z_d6v*c$?G)?gTch02sK{%AJShE{o>p z{8}PJA2&#A#9MYSivlVA24R+LZ-z)6rgF6MJuRFc`Xc~k&k#^*kw}j~0>>uyY8B)! zHrHWK*nFNLkXAIt-%^{Q72McQs+@#gv@$CjF}AM3^Ck%TUTPnX0xE4p-p=U&ynNd` zsE6)*eEx-sAW%ll^rmza!PF)(;9Si@Gk~oEZ#*~8XCq9iOJ&xpGki@tuKPjwSWh!H z-iH?3kV;>wi0Mjp<*q8J#JC11P_(iNz)Fio`QZ@fFj6)2O5O{&gX*&P1zLeWw1cyb z^>Je9pIaO^eGw495BPnsHJiDi>m1mJ+lH=2W4!7R_{s^e#=KSt(?WpwNlUPoP< zc>{nd8fuP`X?oW`Y0S8hM6fRJ|I%et6U6})vqha)q=ki9F%b?RNeKS!>&bmmxX7>< zIAWKj$y26tqx63~({k^4cwClYr=03j3KIRbIb=yHpa-K>_Znkn@BkcY37(&kqKBh? z)_7Wgszw+B#l!?U=u-q3PDedeLMsN0Qo%f^rja>l@M6$MG=tP@)l;JMPP(?{VABx6 z#HmzRtH`bgkvvBdeR*H#AplQMB?i+%VVvS-ag2g_kXDQp2C%C=9zsTwVca*uO%fMF z-H0fCGT_qaa@>e%2!@`gUvk??Xo^ zCx=P=gml|$~zmL%+;}qTo7y0jg+=Eor?QH)WEl_9GSo%oe9=i>( zgHi#0(#!N3J}hMeic0@*N`!d|I%H~miDo)x)33htG%%wCz!hp2>PO21VaSO;(t`e~ii!?Isx(f9u z?MV{c4t$`QaYvibjyeW}6V#y^gpcCWj3=wrMz%`5xvWFPpN2v{H!#qlxHgp$EcJ*+ z=Os%&Kx`sSssnnZ@agd}JRGGX6;8;KNRcY}XTeHK7LIane0{ znkh;EHn-jvZbK6_Yj0YYCFbVVX^0>{^3HhaTMK%7{vA5uyasFw$>tNAXg1$e3In{v z#i-%BhgAxR;c4zy1M>}m_L(YM+_uaD?nUebSn1%vi08`iu=;H{fida{I_7#iQD9#f zQeX>`<;tWn!StLDI}{A}Cw=QhSxDs)b#eL1cPq``K?FNt3Rj`?th?F`McE00h73~w zvT4iB5V2Lj0>ehB{h_sO3PPL~F`M~JE|3&KB-|hf)+q>vAZ^5;C(T6u5o2|-CSl8o zlU`{%U93nCv}Fjj)C0XHfx`@&d?&Jjj*^~ic;UaE9h?rcD6+&HGQYV&CC6j(j8qGn zF#%e=s7dDNt9N+}Ru8$#Z<7Dz(+EJr$#yr)i{MF1kahbeJ3YCniH;!h_EjA2Lq4k{ zV2dB71t8PJNFNateb$;~Uzg-gXu`UDtk4Xcti+2bxHfSP2!`=ByGHTtkOY)WFP|j` zZ96Q-BggOzQNyAH2QeR|4}2tV_yAf4Y(-_W+H{iHivUdtwu~YbyrRY&JGDlZp_bMl z2C|Hy`=zS0i3!61x(CSQ6}SdjO2)0_;r}~Hj>9U1U_pWuePKw$$tZ@|Y$V%ipjYW% z+zyN0nw7cp&}fs}Q$UNw1j*X?ey>ry}BNMeY*Q_V=savF zkSCzXF`M|I%u0>Xy3?t(6g$mvfC#*dUck4c61x>tN^Ne+kB;t1c~nwXNQH(`EMu5L zg+@YchQ^wA&QsS62b=yjbWa}ydtFXnYo3lfK4V*hOZ&nGD1i(a*tLedHa*Hc zH2=hvk-+FbitGVHdN>2Ulo7t2kZb4mrO?(CfaEsPS0$R{9VpV!8(yZ}qT_y>9pjym zi%4J2Hph*XqP}3KtfhrohjuL7qLYzXrhvasJ5j&2H!sU~YFG*iUljrRGep4dwRE&g z+hGv|pr{jsi00~s_200PM{kEhcusXt?O}DJ&JNPy!tJEPtT{|Eoa(h!c5Dl4x`VDV zkwQxyv;`Mghin$_$3u#PDn^D^2_FPZ{}Np%$LiyLQL#>&g_5DuD)b%nr4)C*ke&=R z2VZ*K*1H_1wuK7uXFMInxyiK%Af$=cOCalW#ZWvg8kt*!AXLqcSJ16>3Uo%hrbOU! zMn=#K<1`j8Am@HnXG%0Rj2TPb5|bcek}1T7v}o-LKGE_m4#IiSkiJRHs1nhTg6aiW zPzW+tPrtG9^iR$d5xB1}Rpm6}X2q!o-UpS4kYM?N>GBW~4jqML-I7>cBwnZ+XZG0_ z8jRX%IFuUD&?+b#$FKtNcr~8#D&5cT4u9K1VjI5e0S3Y-Q7^G;ejqJDZ&#qi7dYIi z39M#66#B!q>{H00quhOagp1csa`zc(-dbmxDVgrm?}ZTi00|ek5GK&Q5`4u*#;m{69yGFwaPqlu9I#E*v)S zRPC!o0TqR@R^rQZ;7spgsjN+%_4PS$7!HjDfE{55GC#0_8B0u;N0o_#LBWbhmCR(6 zK`xF$(?JrY|B` z)+;-v&SZr#CwQBN9g2H+9RPhRxznX!3+^tE=I9e3TCP)tZOGmRB~~lSYOzkJdy|28 ztc>+yg$Y=|ZpFp^W9|Nscu;2Hi94vd1CW{r!S_!=Au{`Q_m!$6L8PCWwgSyq4 znfA0>vefOK@z5!iR3)jVOI781Ro$&&V9Br`D~4d%U}ptP(pljThz(W7T0rL5tbMJlcl}fFiF=Mytz5C9+_uO;#+55Y{d+&4UV_F?p zafK)qDp0Z-IKv5~y_i1Nqd2M6Y_bdbae_GRJa#IAB>2#2MXFD$O4M#BR^aAhnayeS!r zfJ;pV$CTh@&qd1I10W1=A{e9uV92o?30??ah}TEk(hsTJNH#%YXJKfg4)G>z1PMnt z@@k};QdnR{Tn3DDT;aT{#Pjn`;DBrs2~-7na75!PNfxuH4RyT#1b7@F2Ntd_iK(Zw zAFsr}rdI{?^L{QV>DkW{1Qb+D3a_zG4rTa85Sj-obWBMhj)NrQzw%(?l#-dU#kAE6 zR;7AB+bOYJkh@Xfr6ph)|J7(>FQT-wnFXgm2r7FpG71v4ga*KSW&>qut#AW^VHja- zy*sf@_=A`T^hn^AIg#!N;+rWHLdu1#0X{u;PBtBkuBSXf%$&ty0)YtH4(CWu$P#wL z$ds|A6*)N6hxwFG#*IZskuHK}D5VXC1h;7Urs5qOD)^THL28InB^z2kPij9n<_>Z= zOd*ABq*XZPRfV)Y*zST!>xyjh)$}S1A>7In3*#C(lK|4($(qXR3GfJjTKJMe;j(+4 z0!EOf#8(Xm1=?mGF_Ueej5X0^`*GKtS^N`erTVCsq{>4$mL+&&QL)F|dJ2$Pm6@xY zj&wp19u~<$`yoOT{^0%yek6DnuE$yv)3Ct!(nJSg{YNg|Akkm zBbhhOpsBzINRDv9Z#eQ{xl^uc?~iFr1Pcx9u&Ua$}n9*`m+ zqkx#uEN&qyKPDLnW!hk1KU*r8U@#pUB$6mINVQ}_$_OH98!p3%S6>}Dpx*f_hDA{T ztzwpF0T1eQR3UE%^_!|^JO>ij(2Jd5yNI;#qM0Ora6j!q$;!ycPL$YhIzK;H)O0G( zRy#B@ju;)n_glMNB8u#N@>epB`i znHvv6Vi@!irYAd0HBqF&K`Gud6$LLceYVk*TtaU+g+nh{BK*6=h`7Hgvw^ogjGDO6 z*nA2(nz#`*7G5P%0zs-g%!wH%oS75QJMj%hnb%Jrr@l%GDBp@UPD-Gt2-lfDXG<|_ zFe5+S1PW5nD^P*(Ax)AXER7^b7>jD`Xya@=siZ>L3oQpeyQCy}T3U)D??zXECVoMP zC>n!)23t%+k

kIPf;0McIm7frqZok+dULk{Ypfc56tsg=xZmQuk0sO5dO!FcM4a z0%H7I~Cdnu|f(OC|30YDzWE#vPzU%>nf&>q}kIhG>QMc56_GLlW0^=znC(@C4 zq%AR#xMm)ND@tLo2vvDk5KxvJd`Wy3ylDpi85ZoNLB_s@(T6Fx(Mdpu?7?*Dv$#e> zN6FA4Y%-anW@Oit6m5}(WPPR-UUpW>`V%yi!Xl&5aF)s^Jq&eV`nY5i62g$Dk1|8O zfeqv`u0KAHq{&wm<+IjNOB(Zy;cULQ8O5+^K-W@|ad89SS#oJFsz%XAY`lyjo;zn2 zDVxAarYJcAA`_@eEeIG8&uSE+DTUcsqNp=#nVZRT56=!F=omf_{Rh#Te<}weK}*9; zQlqmcQ0nCvWXTNRP6C?fIOB}nr&wi&W!E(63ambsJYHv3I)Ot_L+loR5?#?~0YORn z%d1z7Ni!pf3ql!-BAAvJ ztEG@9K6t7rtpHRjJHqqMLZ{z=)Vz{jZie0NN*x$b7eUH~aL_m9ow^?@fWaWPDT0Di zU@B^m15lnd=GD3nHc!VjQ2Zg9q*opOp>Pl2!N%pp&+q}g}CFDnWWJwTjp*mzQ)S69Z=p#HMx0rZR_n0^n3&UFLTvzmo z^R0eK7b&H-Tm{%A~bgqqa^Vy(G7|!ueIiC>T21bKf7vXcL9+gV?fOS!}7B{535LS$g1DD zon(>G74-@E4%lN&$dTP7XflMq2@d6mA48#8bqp>|M=`}MFNH4RquCxnHoUArS9XIxZB0?Ac~uFP0fHsysForQH zd*KJ-jR1foHn~T1959eQDIrUkn?4V`O#OL?k@%pB3V>5F)@!qcJVxiHB=;^>r&#DG>+&aerqgRlV~rOWWT z(0tIP5?a`Ux)ucii%18ehbkBD5E?d#t@PLNEx2gpb%|27fJTa z+gi*P;ugO`WC)}kB)GRpaD~P7*^tvJv^4#P98%U7_70_pVlVw7aA>aJRi-^}M71xH zRU%_pmr@vRnKOEY}J*mmBK**qEaTJ)#$*yz)*7zh|+uAQLTv? z;NZv;NL)gm0c7rZx!*}QGk^dz181Zod>~uubV;Qr!2|PglZH*@XQx$M3JZu*Fw&40 z|0GkBNGQ5XSYGu*G#MS3Y4yin`{-cT|QoxT?Y2F8J(D@HMFL)u_;&75ssCi$r@P|7~I)xtu06k;) z9jcJIN&2Y7>m>EFL59r@MWkew@tdr;?1+xWOtd1k6?{(lcC@{e7Y`-d#}$LhJPu$A zPh?v;iychJZgRA-amJ&ORrSlbT_DH0P5K3xl`NPL)UsdEIMVW{_3+dD+-#_j^ezD% zQd5ehv%?t&9M_c{ZPdBQGhp6P!b#CD12W3oy!3 zBHM&iy?}Tz)yola9uZ9zjm(-b1_(@el@?3;l+`iyd<---pd)wJT4P-W=fX7x0jGc~ zr8#&M5hcHbVYMj}(lOfHb`Hs2mv_OFgwiPu1mS4iYDCGqJQ_`xx9Cq~$)a`cj$#RjHuR!#%MYwTT>?-*T3 zrl19lh3Eih;5%N9E{M{EzMv~jkL;_k$OMJyvS<%VH&P2K}?+hA{iJ=h79r# z=>*Q^%_(7D1Kg0<3_tsvgd_Nk9c8furL0dy6^xqA3nag=Xcity4WJ{7&@v9ws;0YX zZ?Z(oGL86Ed;wn~6{AUaG_v?I1tWQLVEPfRo_XLUCuK0z)Nuj0-68&k8It@efDTT@ z{`1_DY!Zx@f(&{zS!e7+d_`oaC6(+_rWe5l(MvX`=y}o5hnOLd%m8o*Ft;c~E@#ZN zVIfmVp~9F-@zR>kQBlFPLUY+gR8k%Vt&W<0r2++13+Dhr1}*6rCyTzwQ1Du)bXFrf zhf*47a`YTS4-SOKjH>|Y$ubeLK{ydVj;zEJq(icYEMpMFMzD;No`UnjnAxW+Z zSBQWo>yJ7@o4`^@@aJ=LCU|s28`V&9Q$0)=KcX>kl0@W#&5@SpPl3^*pL2;aPXo3=>QB@i2| zO^H>?+f$#O$c@~ni~_>gf*`_#7roB~AU%{`rXAjiN8l2+;g;NzOiv&p6~9>S2UTAI8i zLn5@Kz%ezEB#LJSXiA>ShK($|T>+9gVqJ5?SCS&2J5oeH5JqRFQYsV|8_zl>LlYOrszBJ*RQy>GgNO$MbHJr0P~xIAsU?yd zn@nBk+j_^yXD35kkv$6u9;1-WyU^jJT#_P_o429_QeqO4kwfc)J2bYMJp6xle<0Mw z($JIvGH4TzozfVkxvUmNgUDp$6qrP+;cPKTBo6nNH?J&AEjz0rr^g&%B2+;tSTbOg zF@BmTit@#xG9C;8t|&S;X+F{Fa-P6BdPHqdSX^{2X`lr~-2ggz!(51ez+1R^b}iDB zJX($Yzc7(-4*el$13!WM946A1*J5S|c-~S(j&)WCWTlC7qD7f#+#zK|!akg=`x`T`* zBgOmyPLu)c!Dq$Xf)2@I<B#nxcn@hPTHUg9L35cWcXnh$lcrc5*#Fyd~h;Ehw1kO=NOBAYwTi%?9bj|kB zjCA(5Ph`kYnm<4qsO4+XCW#pUawIEn#AGrx&g)DK6#>TahFY}HMJ>c#S>9A<7cwaI zKp}{NlC0Tq7&x2Mn98_k$|7=Eur#%JIg%@C2sti2KM%>ZgNPA^vSZm>sxlgfkjDpQ z7HGnh#2F5-1IKNyyRcdAgL( zKp4sTNv)z-5GI{ZQ1;md?;DWL)*(EAPsR`5a z6=7b!7E$J@Q9M!#v#e`9j2hw>{7!zKY+Ni1W0*HX#tGp7a1lrli-empcY+U! zG(i6^bwuGV9lRl11fwuT_Ce2dMn*)(A;&RE8)0KF|lonDpohaiNJr5ZxVOG%<@kyMFSf#uvGQGx9JD;klQdty-@&)NhTX#kd=d?y0L ziw4i=bZ8bl0K88oZTp}L29Pd88oPfIA$ik~BF0Q-%1c-X1>QdM3K(!N zJvZPPl#(ny@nHJIWp*O+^l?G$&HZ^2A=z>+BblPlMu& zWILfApe{i*=p(t-;y{8jJSkCR8JV=^rlbDqFImvLrl3k@TAl0oM(z=gDDyx{C0A^U_P{;m<>$>3%0eaIDJJ3{g;C>|a|E~({02)Yp()st z(9^cQ@Q$QWz<3}>(O7wtqOhRHfquiC%eO%e)6&We=}fPMGOlI;>rEj8=SlIj+*$5a zzb65_5KIAi_!TIH$^%>N&<(QdWj6S*?GJm-8Q`Mu8{;*klulZGAY$1Aga<-Mq<@28 zJj$R=Ih&xSC20zi?ypP!g^8>@cjJ*zCFFxADKILX$&{Es9v7WtR&X+i7IAg4DPqkm zB;AWLl}aV_#WjN*6P7^Y(}xMy%;o8}m#uVYbQE*YfJQ?IC6-#$0y1`h; zRr55-3+E_t7f~2-a#9O|HXzmYsI+L{gy^y}AXZk~$RwobpRKio zBt9c3z!8sOamDik2GEa|2!EYh#N)(Wc{#a)BXlQP0vwUtV@cCD7$wq(V2gGL3*eEU z571iQkbFkC#69xHSBMJ{L}dYHL_9SVFcO3*S^>C(8VcPXH7oR_&Z66}CVB+QPQK1-hY%F7f-EVw)&FD%Qb}Yjv01sc^mptr znkd`s^aIjPlm3JHjfB!n_7S8)b>xy2^Kx-4vJjD~%AHV;Kvl!;O_}5xnKU8)bZW<`T~- zD_18xG4OsGW@sbgVSfC#pQe+J%$RWTc+*SwgB1RYawiC97f6KyV5_#`Hn zq5*uR?S!Eb{UZX1S&N<7MYU79f;SQ=K@KW9xQz%?4n_*d6vW_T;Op~Zu2lI68Nq|x zh7{5#=$e>kDq1Zwp(v`X@jYN1B;S=g@Zi;N;;Dn`Xy;?21j%hv00Ql zCV)E#W=I=-T^2613nEbgcDY0qyx;p~l*t^$uq%neb_H;~ep zK(&qnR+ZC0JkB_9O#+Cxbzm0o3!%Xl z=ud_N`pjk#h9aSSs?8*{eSmA?sT< zP(cI|N-3RwAr6!%$)I7$BX>Jv=u9vl?&GQ?*$T}?Q3@ZhHj2Ioj!-g$pSn~SDSky< zPACN2CTPM+)|NrR2_|~QgrGT-1epM6in79~6d{%dOZjp3l444K^7yS+`3Dq7qDV;t zkUL9rAq(&zXdOZPu+NEZu}`9kWL0*8ofhPWXEYfJ#ynfQD$j*;I4f}{5;zRgqhEN= z#FM$#yeArpSdn`nKc#m93}QCY{7^~BLZrlLIhhZvC;cA=7-JYLm0Cj@0vClW$)3ZE z6{5@{2082|B2k2^ZaAnF&b3nIK64r1m{JH9GBp(hfE-B%O1c9ZjWFQR!DE~uP*Yed`N4EdGL}-sZAh^e z9+=VdSg5ZAV5~K8-q=Z0q)KoQqg_$9A{60p8SoC$mi=JknkD5wR$#Q_2PsW0j<S+p*q znTvrB^N3KH_%<;U?;(ew)|ptw$L}Uda#~XT#3IQJ6G;zd=N&^#hf%7mt!Alb$2|)9 zGoTV91p@&`D-Aj-tSc!a%dms}9MBWl9hb0VI|ewAuP&MgeDW@2hyX*W_A`pS_PDc3 zWih`BvEW8Po$b((s3f*Qjt@NvxH0wcQ+6-SMkl#B_!IT(0Ez`x4gr#=38<8WedaW| zOP~|GB&z`2U_cAwg2_icaXDDhY`g6FAT_H(wv+HJ&)l`lj@2t`0ICDDS!_fkkA+{E zdRQbDzaW}D+d{-*NI^};EZ;3viZlrV!1X2DSzuU*yj(KcT7*#OTXu&OFwz3Iqs2^; zkvF)R6zc;JNyN->dvxS?0=b@wAWNEn?ma)Vmu(je8l4O(gp4|hWB{d1DO(69S}iKcVF#-c>9hR;aGk^}olE=xCzskP$cqugTu6w)$P0&2 zRd}eZs_cnNm_c$&@LD*5o;J6H zlmmo{N&ULnBbtJ$qz)X1K;#HvT}4w8$jIw`RQ3v^!vO+J_(*r=j2H<&Bqf57Ii2o| zxrz@aN)6*D7>hTt=rY47HO_T7EM%mBYJ$<+bg?6ggJLaeTxOo^U!Gm+`NS8Z?_~5R zeaqa+z>7=EEzuFyG~1Q|{Ky(4R)WN~-4!j%ir`{nuA|f}s?eSZmOze5AJwv?NLbDt za??~uP&iUBd(E|#=30-sPH zE-L%6BTkSSK$0o}pb^qhwZJ0h{R~zx5&&|gc|=h;DQFFg%t(q~yE?LnD-m~1u0U2c zVmWtasZy7Xv`K^(S0pJ<#tL%Fyn~JyBT-!Pm9U2VY7(Ujpxob)i&S1BpuTjKALroyd>DSpQG)&$ZauP6`|B8JIJ zQK1j}{J3TcpHic4ilvAWTosuZd$WR7cEFqog{E=}92d%C@uWsXonp#ZDE&Y} zB-QC^62Vd^$bJb9=s#bcX!G{iO(vT5&2~h9UGRx?C)ACuB*B>0l;v$KDO<%-c(tII zm|1dQ?*!(HwX}^3O2l7oU$O)w8KDMJ{Xhz=dgu``C%VE|gq=>lQPM)CTT62Xdh`Zt zvst;^Y*b?AP?R%~Yk-JQLWPhcawEVE2tz}{$}x+?UFAaDOnTX{d1gaFi)8nKq}hoA zu(c&mJ<17jXPO~3YQWAkG4mWzl1pung*=ncJ{Q#F=jB20OVU6ke_=uV4-@1$%?93) zbB8ny)s#(nlaQP2XTBCWLy$Ao95V@?s7+QO`<}^xE^a>W=Kd1d!Ae&E(x4K`B_oSB!DeHfDsWc71d45C%mnUF76s)h+AOIbK}iq zVhK`Rn0_y!E>#MYhzOMmPB!nfxN(wYPD1(2Dc(d%v@yk=FtbT(MKqvij59cq+G=TL zf(O>J$YPSpsb^og+DwNevd~|gAuEP^W7P|c@@fTjvWN=iu8 z>Qs1J2uP+8?<*EX4@yE}7gO&{-hpOzG%j!6c%S=lYyeF#2g6KhCO68xIRQ!Cl~Bh5 z3d;~3fjh;w5KbmP*|>>qOJ_;hsedIbX4hVE)3|uh4R9LGo){&##7M`p1GJ>ZC&b=Y zex;mTs#8LKP=g!<8AF)5tSq@jVaURT#t%yV2YxfbStt#EK&^2EAQq}2JHfjxjnNjsiFUJQ>kZw94!6BA9IwToD4GD>WO zp=45fu8Sw+hOwSNt&#(sk>qX$97c@i1z1cq(E($qC{IXJW=C1nrXVgx7VjMMNQ{!y zpqPT+!HxkqDo*q@8O`?dGC>ZB0b%u-OUjGgWWs=JS+OgsBEcoDF(M2p*w(ZyjZ*)pCqh6m02BJl(kGY3a#L2b1lDz6vTRdIsy zW_@t`%7I}S_>dmGE1 zQQ<|PETq1goUp!OVt6&C8?HfRCl8Jf$Rbj{v@AD|n?dBPEC3V&OOk;RMN8n`xGX8} zf(D@*V{i3~+H(2e6eOI7!Iq|{0$#mG{XBnO}+ipwL5uaZ}1AiB{y=0T_qACV33wE~hj9oc#b zTmflSH*qFK2XPMJ8Th$ELza!iZA-YMddsoGCc}=B8;yndo8E=*rT|6xff~b%RV^z( z_%D_zoG_11y*Y;#WG1}Su&%Q#EL193Qj1!2k{kxSGc#{tf)`>+{C)I;pk!RR=)1Uw z78GAermIQ9&5{F-1s96Br<3azIv5dp%w`{$M3xKi0$xg;C1WKafrA!;o+;wE;L*6G z*tnv#!GJ7W^&i1KseOmZEX06HFaWp!AY?ehxBQV%;z=DL)_^Gvg-(-Z4~8b+%o@~5 z$tcum+!Jgg)jMDisS?i?u;n3t$DV*S6 z6W1hX;B1V9P`vu+_+(~;tC~z1hFJ7XWm(c?aO!p}67(}Cl3|^dI#S#hAVzKC*OZJ2 zlSt*lhqDh>1=i3qCSA5%rKVK&KppbPs6e<1H81ncGDa)NI5Gvu6&79g30{?3hdL1m z45&7TrK%{2bzvn%4LKH8Vd{Gl`-2Ri%DiyE%Q=mKdt`qJK@-+mz9)o4D<*wi6%qze z6q2mFiA+xygIsAOkuo$#R+Jg!b!Xcd@QW6cHxbyuhR1y*Eg??Kjnys_9%D^0gU=!m zvf{Ln+se6xG_nT(ZZI3qSyOlvyW0WB0VVuZEE(Ge_Ob^lfwdyDiJ>h)fjH|CwzASa zoFqmiu%)y#o|Xs$#>+Iy%;9gBOb&=rhK0m_KCY~VWHhFR1$Ij20eq%j*<>@C44r&n zVMrs)KmlVZ6C-F84|59?A&hyS>YY7l*lkdj;Yt-3_R@f)F2W;N(y`-`(V;zB2!iGi zK(tUIWfsed_@JI)adTnvZPl29T6+cn4M06k1@uaGY6w%yit~+IN#=Sbr_};J((2_8DK*eQXV5GLoc8OOe@oz*BQl^f-mF^vw}gWczr!Y zsFQj^TsCC_%keJ40;~^vK$d~a>_vjcjw$9R%NNS)#gil>9YUUutU;zad4gJ5He9-r zr0qvz&5mOooC7;1j>SA7l2U;SSf&(8>XJDSVzfArLuOq8HAu*{m$QWf;29AK9RT_~ zxlIqVJF6AR%N5{4lzO>C7*8Br+0B4)A*$Iy*fQjIu@u%DHD`E};~f^(l_cA%zfFWm z%riSTP$0rR38A0|uv9vh)ESSPhfMknf|%UPw85*IPo@MZK!pan2rR(bGUDv%#kUftb?#Y&*orIi?X=ROR`}(4*`e zw!Hu=m0RQOL0Sl1-}p|+3jt(dnRp8%S)5ewAtD%@?}1GTgP=APgU3l$#1(nXqw?>B zm^lEbA#W%|;F&JtAZUiBidAQ&nG*!D_yNfQr>rF*>tIGve#-*a>cXM<&`&fAsFf%x z6(M%Q%s_D#tm?b4K6%w=VSvnnF)bX7sgmK&r-l22XA~Du`gv(@(jS7xxUP~aJqi(u z*N6N?yx>CUH%=I4#)vUr%yH1O$e2~2^b+5otN{fGkb~Gt!zFFfhCnZE0m1u&HcmJy znQ6!|kqp@{ZVy2Qz#)g|7GPB5Cq5Eeu9T-^PL$-cOmqH{k^e`ce zPBoE!X>rJMmR>g)isS&@Q!bg%p~S#8gsY~0w{-rZ}iZ~HlCpa1L&pE~#a zr_O!z*%PmB?C$NaZmw^=+RT5<_nn*Ngq@qqJGa(yq4I zS>3zdaM~wp8@uaQ_O^F#PL6HwPOfckUw&k=x7}W;w5lfGjp!^|kKX;a8b#Z0XMCWc%u5@A~@0I9^$wPS>YRdvbr1{(E=5 z{=mX5ceb}T*LS-%_rGUuHm!}D_OFp^A7gf)yU^^&{M~kLuI^rYwYjmnMQ%24P9hM~ zo73av==RRu#*K|HR55Euu02*pce1(u>iTB0Bl5FVmxTe&7fT?^sIHH)jQXFmrjDv!r+ew@-m2zX*IIF#S^yESq76LumwMvlSUIyk(bVeMex%u5&#~q0 z>2g-=)$QFY>yvsc!nHj;?(oJg4YRs8fvK?6TE7atJW%dFtQxE+Aj*Lz1@xVt-UY%L>gjieL1>y^6KjD#_HCd z=S(O1`(D}I*wN?v-FW9_vvboK{$1YFX9)euE9t~y_3fRE#UtrTuG?O=UT)z|bBFpy z^9`0au5CHJsej6lPpzDds~hWUot|IY-;KDPhdPYb}X1Y$n=qF zt4!YV<@M{UuWoGb?-oN*6o%p1TfcU5Lb{^0wy#*pTh~q~g6hAN?sNih&&6D8Z*_NX zWp|xM*_y5|Z!ve9t2fw9}Ulk1$W_1)=Ybvl`DM`ouJ%6+<#g?;S&+4B<} z+bn9N?eNs_Ut#Q66?5SMukJ@9rRkOJ8#@fg7E`$~r5Z9W^NMI%dkNUD@9ZsK-WNgK zZR)qlne$b?>(S-erM54B-Wo0)EDzf~P-dHvV@C8^Ptq?VbonM*e8_#;W3^-J1tKiJ zwo4=FLVIu$t#dqJVWs_LB2jm5p8&Li@~V-FHrZW|ZSMrMJK8qdU45-rH}#ov$ug7l z_v*EbiZ-2Am_|&iiDAT6n=AgI5LPF%W0R}9+c#!QF^{;qySsXGQpct@P`rrPJ6~u5WCv%}n6Lx-B~MN_~X7$X0hI=PuGt*S1zSODD_KiWOhZ#g?yc zZ@)4v5Xq(Vm|O)HOv>@eYuDGeCi~OZg1@wm?wsuJtmWAv;YGE%a{b`^Km;P|XG*k{ zhHl(na{;z?+eq(jKyBTJN&R8++Q#1X1FN%rl4(&}8H@GT*RSmF6)@MI9uqn{PV;T< zmvM7^zI}P-mFdpLUQ<85wi`8mzRqqt{ih~Jr$_ERcKp$4`C)l^dD5Qnt>0`(o8`4= ztQH2*Ct4h7-uvG7cFjHoIZigF#Z;`$uw3pl(dr`BqW!Z{j~>6$Tns`jKb6~>t31t#%Nt$O=FvwV?RvI%J-w$e z_IJuU(8+cQtsS3yc6)yk)z^Z9jlDWM%Zz0Pf4Mu^_4?tu!DcTA!u+_fqDOa*&|BdB z+Ww6jH&^N8sCLkV$=X_x`lMyIHOtTdlH_i{san%KVS=IYcq?QF7zbn)8u z{+@>QgQh+Z=6b{jM>^Q<0nD&xsNK)u<42l}Ez-GRg)KmIAQ0er{Rm`8ldW~r-?y4P ze02J7uH`A?__XLdM~^gDw)bg)f<$^TEUTy@^>*~?Df6wbk(Jt{z1+&m8k4ZHa-?b3 zf?>Y8-CR6>?%Z=L7tX$L;j``MbDwTMJp0M#&s{j%Yyp69cyoPq+D_`UVK6++wT&w) zb+PVmUAFG3Sy(BGtr)iTwH1nZ(Z)3fVRIvA7+0#EB-h zFMlHf<@@&L&E^VYxYv(#!JrG~xhjZuJ>85tY<6z4a_ddeux|G4RSw&s>qNa zxZj$M^tT?1>6*T>QrytX+iN%3$knwnHY+Px-UR&EBh3xY_R5XvwK_~e)mg;^>bbb@ zyUnrb`yR0-s$4mxM~Th)>-lV;E;swt?I6_!o412)-F1+xXvdjeZ?Q84&5+s z))5_ebS?hNlxkzWtF5wBxA(X9cD5P7$4BDVXr>|`6SoHTO?OcC-m%iSf zvgO6gm>Z6n)-20-YyGuJJ2=JKRwGL+7ROHy)6rwIetqoyN2l+9BnY;$A7$RJ>h{_M z9Bo})N^5)fkt6({97lTu-R4?#@{S+Z|BMW1TTnap#7c=zw7Jd;gV=r1+}H#U_}DL9 z)})Bs>h8^~mD+CBJ-2c`-&K;pLdy(tn5}8|G@b(si4Jpq_0<${V*$6&Z%Q}9k zbzDz3?nC}vM*Y439Q z(!NOcr1gV4wSVmB=Gr3>xZ+f8Z0&$Q@q59bchj^eQ7r`P9k0)Wd_DbGopbxw;uHi1B{yb^;_ zd?8SNhe@GGqI;?Wscymn!;rqMFgR-%$tmk_?u#3zs!8jOUNLj+^aU#D#_AsJd3m3J zy+6Oczc<-9(e?FL@Yw)PWNT}?`QqlOa)o>5`d!ZRVa?iW7Lbq|W{u3GrML}|mV)ss z{!0ta#o5jFkQ>e^hZ(4yFxLz}Hmo>=Cq-l(Q%p~+!dbD=?Thx;3L#&)4e*X6^WZO)jA zMbw9kE0U$vkvMZpuLdg$w@nqdV^U1#@v1$_92ULZ@izA^%E)MO@$da9i@y9+uG4Wg zz^ySqB-$>%5i%W?FQ!y?dnjTtTHTPhQ-r3IS#-3|jSZ$pU6^ zdpD+Ma_s0102gY$8{&NI`k&(*xhU?^q#LEQnT=AuEsRospdY0inH!~Ul@`3w2?8TM zUEg)<>Or)hO9ahx?^$>&^w2e7s_yIF%^iMq9r*5&1#xtjoE&QxX{^*EZg8Jgt*E_2 zi}*A7c_z`I^bWSJm*Y-e?{ky6o3~RuL%5SHPeyd!Zp?nY#|Nltz4PSh`lng2Q;5)& z-ODSnNxO61Oc1a?{PeUmD=Vm_*bg+#PvCoD-{*cRCU$q{N^e}7>A5dH%^qB%oXnV? z=2~}$CktmheX0_P+^u>RGG}^fV`cRQ*LQtob9*=6^T%S^-DY^Er|O4k^YrxG>}K^c zhuyFJ<>@avvyhf^jZoiWD2!_Pp|$Z@kCs8x{xz9ln%BYQu2nOgzVFoP=IZW^#s_Yy zj$RWV@y&M&xciHJkvC$cS{L-{sa4F)m6hq{`ua{D z)umor-3+vP`S3|#VRd)<82Mo;fglbMw_ywY;SrY0 zXkOEwTv~)=7e3fsePv^Jqj`bmXr1;jb=7aZ^2&+*EpdidBGd4P;ArEaJWURot!G;T zsj}TLKZ_s=>d!jV{XBb+ zzE7vtjgdmswUv-ebLSLa0}pk1JEUTr{V2=AoseE+$<-oq9xES0n2Zq6)?4xZU+x(D2}w#vEBU7mm1GEN_U(9_md;Q$ic!1SeJg~O$Y7TVwS$`cYWmeyJs!%s8JNwh?&1U~K-Pmk@GCpB8YCG||bg;ip zew_Qtiq0OF?;PBSoS}8vG@LRJv+#&9-#m3=J=qemN%LRJBh7v-4>bE)9%uHo3|n`h z(x-*r1Xo_4zjol>jg76QK2wR8U1n*vZtSe&Co#WFG(B+n)At;uTISncTipjkyCa@q zcmDKx_Q9j=t>zEss`oaYyH{!4-fXU6J#z8+Z$94_if8#Dr-uto1*PXxl+%}Z`Lfpsuw|QE2Uu_fMxU#n` z{9h9O>XPKF?sZ32t`?ea>x$f(cHLRJ1hD;rVxRv!`=MW*H$vL(rrqB59+I}D4W~`} zVZ|>sdX!HEb@|H`;X487ZL89!)<4Om+m9mi-AXSeZ-(ewLl%l@eQTxioSl0n(we*v zajyK~n~1@-pSvb7XMdzXzO^Kb)(~RnMCL$sN*6rTeBtFKk!H?^)h8)HfB0=5&M@Z3rOzad^wU?>W_9`di3wdMZc~0G4$Ep7r(A-U7kBq+@@KB zBEzjqG&?$TxfXn%`7gO@jO)z|KxQq@FI%!8Gc#|fdN#%Hixou@w3a*L8x$Wdww0`> zD{FBWWl@hk&12?d^s+L$jYE?nKGW%`T@Ze$%`l**M(jELWO53y2O?|p@Djk_Aycyh)@D<(&0xIPt9`us=G)H%G}fa z#C`4=WnoY#unsl&vD$y0V&&$4BTD$em7SX_(wN}>WE+-mA-89ztw3kVCCv)wXO!8@Su_VGgd#-V`IBm}VM4Y#fiUm|HJg#47!@lsu&hI5= zZZ79I%VwQ%Nfe3MT}$xvsf%ZxeYPf>y^zfRr`yc`He;)-u4bjnbi1mk3AfzFLHYzQ zl3W6{CHJi?%|6de5<&7)4#d3Y&J+bncIv{qo%?wLB8Xy5l5r|u$*2^jHET{}JAWh@ zMY%)QlaEcBkG{B-25VKF)V!RJHXMO+ zaj}dTmxPVxE3ZpqsTrjSQQx>v_IF9qywBB>*H^@LIgUV5KsL8uqaR926=b>LpWXA~F~ArT}JnxqkcT*2hK4 ztAd#|?6O1Jt37`F^+_8%Pgd;eYx0w;``o7HG&S7EhOS)Sznrw!R`{BY?Pg=6IoF)q zY_4r@1IZ<2a;~SJ+P{3Cbx<=T+b*P885aGw{7xM^;w~j!iAT;8NRs)L>nm1ElL8Y( zENUX^bYh|M}US?PvNWUdtZB+*=`kqbmwwYOicw@;y|)lve=3;jCY z_e<_gvXgJfk4ZB%E?dE8NrmdJg=yTp`K!314SX^<(ys_sNzLo798HwkmgP)Oz7#Fh zj*4UNSLh%`{5t*#XQFPv7-W(V1$%cT936YV8t~u*;_>?pU4$vH65RO>8T6PyTHqmy-K8e z(uVY$S`=@Jk+$)eF3YA^nA^2E*ZSDN04;ag%a!XI?|qW=EAct zJPU1~G9F!JK}(?|qiVa=%e5Y+>vz5RiTZ~julGOfQYC_0#%L!1V{h(?_x2!zWO@kq zymjePL+))~qd5TqnS_Jw+JWrGt@iQUr%&-8a+`>LPL-{^ySt`FbQ7Ik%Qf2XC0|Ts z9V(h4>xwqo9}7c$?2!{yYp=h)<9el{1bpa*scm|q{cE6}KgGRC*tf(5jBce8Cfyw? z1yRi`BYWKOrcGG)aixu?r4r<^QYAu`B)R+P_;fpufuKtvTKU+r6aiTmEA8Haw;U3+tb!|&KO|2`S4!1vSk)&S*pSjrb_oqJj)QkFIAD~kwPrca8jz4qu z!n5Bx`(ZYzZ8cywlw~^GnXN@UeraclwA9umhc#*L-C1P<0->+0?q0^aey;v~d2&H` z;${TCt!t`jS7j!X9Txr4w>{IZX{%#-u>YVuAGSsjAe zY*j%~e=93)PW{!xC+Z){ua~w?&mIu4wKYN-5uVPAFglpFZiVpZ^i<@wDBa`D7uI*T z1@yRr_guQB!N&cmH(B10X1#2bPZhm6C;DwCs?M&cC2064MAmDw`n9#;k8zD&XF53V z5Y*9)$I9oMK!!@~oX5U18O3^t(rjEQb%Bejbm7U{6}|u~+6J>=Mu#z&af9Kw%8*WX zPCh`36fH5Qk<0gDyk^gF=*b^C*`F;y6-?9K+_(0s_CRQ*sp-nDudQ!|PDmX$jh^II znN6(^S9M*gjH9`h4VPU4D6MjF-!^XS-w=#WHd-+U?NEBMD*}HxH22&!gLU?-kN3ST z*IX{cUb|gm<>^xSshyF-2J9PV7ugOUK6~i4?~`4}D+KFD`Ta%g-rt|vsnX@O?S!s# z4XY-aGn*So*H4{lDJ4w~da(j&nMvqQ^;kKQtkh)mwawQimm^MPQf z-hQpkDekZ3j_u5KD!W@zT@6xK@Y`RsyUB(XcYX^>< zE0^uGlfPRM+{$4)0{EKP+03$cp-oBRLiejPSv;lYO_PLOLQ- zVHRjcc;~Wq)itL-*S0lj%Tz9$Khq6%U!(GDi(C);?NcwjaDL^fGiT18f1!Ew#G~_d zRVfu;%(#r?hBG66wF;jGJqj#m_JiMJ6bLo!k}*@Vi^$=Ytgp=X z2EvOUGH;st_9sew;|5okg-WT!>05(6!+Sgv{Q`79#XM1Kp3gkv@66{9mDf2?Vl$8f=B8Eo}~o;HRsl*0H)M z;htvmQ|RpyFRc~xg(#X|Q!Nf(ZJqJjv{lcs$F6=X(dK1)ZVs;e?y|&7ioQ=-hM?=IrEDuQ*>*gs2sRe4?KsRY1@hH-Pg9$6&%!@G_ zv$e6(j!qNRxuSD2xy#2+|2Dg?H|n2dEo^LFLG%~y!>X{6$W^D*RnoFza|e2%jlQft z^W@6rMyOFkR7+3V?}*Uj&<24)q8BrS#*e1GAAFi z9-NqcBp>q^DTCKOo>To4zkMYI9`$Q~yMjOu`yrQzT5B~y{aCMb<<*ty!`G6M?gsr~ z24H%hgD29D`~B9T;rS<-weNl{ti;MEo)Ts__u>m@FRXm}>}Sg!PLZqGh-57+BFIu@ zGi#8Y=i05&QvHs3KhS=*yk{rPHj|kXjUMUE+AT-@HLH6fu64(j*-tTDtCKnPIDe%W z^s=&=n3erPQq`44fp@TF`Qz=fFS}vXfYRc_AG{>mk)q!!7tQWq@>cc1 zizU^py;45P?W|q+5-)X?D$E8VE?+-nU>0YrDE&E%TY&As?xgH#x!RM`t9+*&>uy!Q znnA1PyCE5XQ7jIgMnV2Py)0{?HTLtJ+q0>};<<;oHSNijFgVr~7j)1DGb`(5Za1wm zXJK_omr6hDB!6Jqs6yeYNaCP@I(N zHqGCm(Cihv=d63-oLjbZf2}N@&Yvyz06VrD!@=&^UaBQ!4s^BCPz$FQ%W~LaU$8p! zH=MTy%XQftcK&>`&Zyp_K%&(d?)zUpi9#U{Rkw@QlmaDRBbA$R(-YXK8$@N~!d%H& z*i=y|w>day{=zLPY2qWz=C^Zc=UaxAYd0CoVr^qmbLXVNq%SPK|EbFsGCzFbe)TkX zJNo|+@$CuDI5gWk)z5h0o6kS<>;>VLR~KZn81q91e-6sbcdwk#P1@{%mKUd>qg@Vp z^8Tl}llS@PYrEoMvtyL{#;cz1+F?(a_OqtT*S^Hl(|+!B@>4PY<@H`U%*);(Lp=X; zE1LJY;xgZ4t;s+4Dydd>>vm_wJNbw5>}Ai89-A--mdtvOG~2{pPG2Ecv+^N%~5K86!o1Wq;p7X|#dJ4!P&X_2T(=4$*aeong2%n4!0vSVPz4 z#Ez;fU&3FMxel)XSfxel-U1b$v^*ZASVy^r>AHvQm-T!f%dqtuWENQSKwDo;{pCmM zg%9G%@;FsO@+^yhvOGq&0P6YT{MjvQ_wh1~ZO3q^}6o} zSdHKE$Lj#L8}NnzX`J38Cl}5z3~1D@*@uIWmbl>E@x^@j^~lFbpgYb;ife zTxGP+M15@SEk9TGHE8efih6MS{Jpx~lxsbH{Bet|J=E{F2vTeF8tS=8x+Z1tzOf?*lZwB#d^Q`PfnfaZcV!Q!$;$w#V>(N5TM-J0Xj z%Xf2Hw@m89sVG*3l7TK%QaiCv3#F-W94gge#*y1M<$0_leoyA)sa{P z&hw4SFXlHGX0C0Anai!9uNozfS*KJ!5ZwjV)czj(}AM1fe;Y{cjzd9D6*; zosiXy4dV6nlP6C+{viPv`Ja;(XO=Co=BK>hqN*3xu4(OE56kDf^&nhcdfOxNcY9_| zC}+-t@p51u{gwlDWJ|0^hFrlhwgZ;bM7h`v{o>gRQZ81Wf9jjhW>rO%tbFR+#TVKE z=WI(2TL@CVqehOltU9BevUUK!v@5hrbbi6r{%vos z!9|6=;|gsrxVtyq=`MHSg^TCOW2M3CZL7Eio4sD%_D~>4*Z%y4bD#NaU|9ts-4bqU zmx^&X!8kOzt`8?`-qcEE{+eozPEEXEvY^zBEnAqSJ4qPNY~nP{k3dF@a3@0UC3pA?MBGjMcOUkQiM^c#yn2rJxC?g@c1di zeg2ado_gl&tmLk_c=pW7OJ|?Hc<#)n)uIyri_e~W{=m^NvM*eC>iLVGusY5@f9BjX zNeJ(3_5KdMNXtKa=IqLg7oKZspl#NU`Qwbssl3MyRt~;5i}yB=l2^AkF{@`<+|ilK zQ^oxHp&OMvEYnCowV8Ide@6`cI_!4A2?@XFGB)z zgi@`xzkelfJCVtJvi^Cz{&}MQ$?H-4_GJC@!TRSz_0Knm#o5j2`dYIqDM86IcQ9e| z83)x-%xyYsNqmbItIfM)-?`i#@9TW>kx84(D*RbiWIcO2`8aFw#FIAAU0=n;UiieB ziMMz^IXU*eCy&dM>H09WOYff4in2wO2hG>XW$%#b4#8=ewvL=HYDe(16L0Pp=75QeF`LiT=~AI&h+}>?p&Qvf$T%o46ARwDJKK5|)(n~Kbry*rnh`Z*uUi{Qkzb%<`*Ru0L zLeNp)C8C!DC6mABdU{hEfjxM%Tx7XirMp~$!!-rO*uD7tv!7`#QjQ<1fqkidhqiv< z4CqxRcd>CNRsBiTNcfO93OA2_;5|pa_8Z=FWM`k# zIlb=72j6p~Og)49=o7v_`JN-07oU!PVgEfxjy^i=e)-UQjwC>GWpDAf$VK!)^XSnv zO}{q(My7q1dU8$mNPe94{5!+f9;V%{Z)jCPfsC-GY zwY}19iQ!{wyt@4`bA&b8_D}a@rI)=Hnonb?D~%qWl9(FEPuD0fYXh!k^bAjLiB{6HxlgK#T31mJ7}k{EO))eY?YxTPUUjmtxir zO+NXOF4R%$2dAP^?vMnRn|12Ul*J8#I&Kk6_gxLW)zT|_;c#K<7M683w zv%o}~6DcjMCe)M=$u@D^t;rs9cdb<9>;{W`WPg0Jm{-vs@50B0^6%J21<)mYXvFJ)0d zIeCnSbL8QA1!j>uy`a`--=}j5`o8M6)A9XjC;CtEt>-S$>0ZY)>1@P&i&kGd)V1wo zwZGugP(7li>n1TLi)#bC(7Ik@l{D3a+kH4cX?^_)fw4N=1 z1G>CFYaw#cAMN#Zf21nlLzdWrzCO^r)7Nu{S;u}@dac~*>;9LSzU~h#OA{};`r`A? zW?58}+oJsWi_WX$PH*;CX>=#n^DBG6T3QyWw~vw)@+&M2NK26yzRbxi8QND z;bcm-lG?8_Brl9Qk_xn5&$iYkC3qz%tDIYuxg92p_e_Hp@21=MQSid1TN_)i0L{Ht zuA4qeRKj>DA*sisn7z%>ZjBsD%!=2pFe%rQ?jeAmF4fe4_RTN#+{sfHpE}>xNia$H z9@&hwrZjbMJ>Dr|4a#&sPOfiUyPk5YE0`I{^fxy49-FLQE{SH>6=_!$+}76_86!~M zE1@H0QzA83U6I!ZQ_pwLy=`dMVXb@aom#R3x4!JjH={QF}Kh{+bCRw3?JpqhzgP7#*f$|p6Jn*9}S?NSr%xLtd)RuGO@%Ulm zVGdU}alP%|lG`DIn*BdA-E9h0R!@+|!hZdbjZybYK|A$TfOF5$P8ITWZnnzP);$Lb zh1%ZAb;5nPSiR3|5}!C^C_Vb+?3dW8fc9&+jv0|#BGbK4t!`e!2<~0K(R{8u_Og85 z)WsB<Ryiof6gzog@@`&BFkPb87_G=LJ)PCXTr=vyaQHNmseQ|-jI2`vwT%M_nkO?SZ`*0anG)I&FCW~ zE8aarbJvR#<0H)natq5`3dGz~y^HH?V}1`@>wZ10n=xlQg|0J=SlGdPcE!V8&)4L2j&;$N>MOVJ?VI(glyA7{D;RPb?0#cV%5+j6 zoelXfChXB`JFMw+?P?Z5Dn=A* zr?@*i(9{931y`3?S?W~;z~k~a{h#u>`TolF@F9#sck4qMJQiqJFmF`WjK=TChS^3? zhj!&ey(Apk|J-&Gi0yp;{-^p7C9m_qu`X5Rz~L@BF%$8KQl_l^#hZ!R%+qr1lKzh{ zpZ(mvQM}aM_HDbUN8iH^W%n&=PurWEX#a-lu5lVW;1eDs&<7jkkslfTkB`Pq*`-@e^4>Aq2fcWiiQU%Umk-LxTH zSgo<10QY8ca?*`Z2_`mk|IS9G9IPWyK7JXaQO;ZF#==N+@;_C!oVVg8=#<)*cI)=I2%0-E(xBAWG6LYnQde%ExvFjGLSs`TPJFTA(Che@FiNsn0Cs=fS}Lzqc6Bk@$FyN4Bq^8uJ`Mk(Hp+LPQR}i-g;j%ntW}u zbn^X8b8Fc-%gwMk-VB-(jn&@_FP(J$$!74D&y&Y}e!Lmn^;d$)VCM;a@b{q)G|l-Z zwRy4`zxBapbo)b1^X5mi`-tnGYDRZXHRF@t*eu=o#%9!f)IC1xo*!$*cR$uNZ$H&6 zy>X@)KlDs9IRA`$ep53z`AyC6jc@Y#)2{uTYd-HezNJ~3Txf=GUC@V%?)ReSeX&_O z{jIL^t_W_;(fp5xn`|84H^ax0Bz(=0voeUAU( zW_FoDra!9vAM@Nl*bLtO!DhVk$Mx}! z`N1gX)oAH}}*0cVY{{2|f+C!(mPCwraZv8?tdg~XO@yUPWKL3|% z|6Gk^b?=lIvn(rG_k`nLwd$*&nK-TKPG z=&i5x{i_B`&2JhEZ@qUgzWd%m^VY+I(L?VW4Bz;=!T9u}gXY%P50>tJy(RI)V0ik8 z!P1>42F>Xw2ZPB62jpk4v~y}OxO>WVUL1^Xy)+oz{>)(b_Gg^;*}>q_w+%*<&kdS~ zULK6@ygX>$SRV}TtPh&I*9L?08-r%@orCck-|7Cp*EN6NV6^jHgW;X;8Z>uq4+cBm z?fT!NFTZ~WX zU-a8A>i;jf=0DbtU-tKx2jjPYc`!QpPu$~IJnOFvmhSlb)~~qFzjV)krOja2oE{Iy zZ;pq}-LDxA-uw;2=FWSEqx0_@4lccKIJ$duIC$vme1HG2dE?k{`1Y}3bMn#QaOcrs z^XAtNhs|Td=GKYf@XZs$=Ap-j!}E_1o41}AjwT-%F5UUSuzC9%hU4=ecFsqJOU{`1Usro1KpiM|VCt9G?8xaPY>*hD+x^?)txZI6isW^`06oO`dW6PY;*gd~VoG zo*ynfbk6bf+JDP%@Yc5sM<*{12h9u4d1*L!=rhCSq2DrGy8Bz)=RX`;zr*33mEqv- zihEtsZq>2N!{McM_qjS8?0kMWeCzY>@yc*;`W1cL9F9+KdEPC@zI`}+Xm>a|JsmdZ zU)T2a;ppVe;o$sD-+$|HaQnCG_pM~2{vX5U{Lj1J&pYpz zhJ)L`G+es$%R_SF_`evAPyS1NXhuuTU^F^E7&WJdqv7r0sJS&7jd#YQ!L9LV{PuX% z++G?jUHS@tzj`#d`_-fITMvx}&95DePyV~3X6M(BMsIx0XzBcK7&UkQgVEshZyYrz zzjicw^XO=N>+42KZyy^C-gsm*e(2HB=oPTCC zy7SCv`1UiS@#(XUe_}K^|B2D~?k7h}Z+&Vsy!%bAxiT8QwK8hnyfhk~ULB3!TpbN3 zS4N{-S4K^9O`orgMw8FG$DZff_xI*#xbuZkGx?(SUmOkI`l4s~ZLaa#MuW+3cimf~ z=B?lD8vl{D|M6(}#&;UC-#c1r{uB5AeWP*nU8BLt?=n8OUE_O4OSivoGrcDSe>WOk z`tP0dXFSiJ8I3Rfu;>2K(eU<<>f4WwM(6+RXz9%#)9!z8?vLx^k307#{q~cir8|FV zG(7p2M}td$+28+lG`js)jN@M!EuDO8G&ud1=lI`7!_z-A8r=FB{rRh-!JWT4YHt6Z zqv4x>+iyRs?avywzc(7){rl$Y=SJhx|Ij`Dm23YieK;~6y?JCjKK)hW(VedvH<$kH z@woYS{QZsN;oH9vhWSn7=B>$ic>3Y-((U(+$9KP0yQAag^!vw4lSlk^Vm!Qca=di@ z@$vA|2galGPmTx82mSrvc>MMU$4jR_JRUss5$(>5N4GyQ9^C%qxOwwajy*db-}xrj zeSSQ+^!#{uH-FC&)brz|yXVJ)^WWmww~PmOE{w--y`cSz<7V=bdw$0E&y1IDe|9{& z^||r*DR&ySaySN!(vBm2e*FLcy#x7 zjhi>V)3NW=pWEZn&TajEKRh1n{K$Ct z=8qVMAJg{FjhmA{K3=->$MMqX|7pzLjF)cxr0;)eJUacC{rz9Y zOK<#@adYdZ#-q1?O8dVt9^d&J(T&UkS8XUF5ye^7eLl>5s=3AEr5B>k_y?}`n!~)$=f3Xi{(0^*GkZ4PdkdI#nbg=@ zGs(rb;`Q4z=*yYpa64>!COO}pNsOHXdrl_ZdTyp{_FUw%K2z4ZK9lNS53Tc%*Lj)D z?0K28hVwJY{_``b)^}!-xsFVt;et$A?**C6*oB$0+`BTF;df_}WA8>D7a_lk;By|@ z7iY@mFV3VJF3FVjUy@1JTngPwk^iNc%w$(4)&Aa0V*Y)ZRQ59X+?`1^bZ3&S-QX?< zb2)sv0$NwVzxQVntydxctDt{1xT`aX#j7)!#okOhe@&)r@fy6o4!(Z?`FtRQ@gagf9=k zj%5<<4`njFn{mw-p!vm2a`sD^MDJJN+ryc%ny*6VkxW_sQM~sk>S_}2J%)Hp;k|D_ z<8kOeo++DuJd?>ikx2|sDlf~gDo-W$D$mUBU7l{=r#vyc57?^mME?Qh$>9UaQw;}}XR-%@ zJE%N4c2Ie`rlvg6dvJL=aY%Vt&7tMV{GoVVTV6JNSb3)PaOC&W@>ESdbn45K*(1On zS)Lp|vb<~&HhUDfqso($u&oWawgGt`4eg`Lle0(Tnnp0MEYHlpsywlHQh8a!$?)ss z^2Gcp<(c7A%aik`;%}#wC-P^Mmt|j9o@r<;PfWI!Cv#_&C&u1TUY0l;`Msq)+5Z;k zt}9RH*U4SsN?M7)N(5FSuo8il2&_b4B?2oESc$;S2;hzz`~2@s&SOcAlx)X8xb4Y| z?S?&BJPyb{H<9Vx9ecKWBvSKxVDEL$L^_wn9_{n72m8WAdh&&dR0H<^hgT)aYW7N` zdiP2s$6&L2W6yVQ><90Ieg6FtW!dUPy5@jH+2jGxIs(@og}vjWp^g3g#g`?@^2a1n zcyN*FeL41yUzJELzABN#9)7AHd-$?<-+CObc@3_4O(KyyF_D=(F_EY_Igy?`Igx5T z1$)cbzt6WMlKm}-#Nz3R)bJVb1N->1XC>18YZICNH$da;M6wk1xTu zal9T+B(h(@-@k%#P9#!`*q@*MY6ACPiRA1f3G5xi*RR39C*bRJA~ignNG?t%GV|ZW zb>D{O3}QB$NMR4ZZ1G3%|0&p?CeqoTB~q$gGkH_-eI>h#Zu#UkqY zFYx^@@Dq0InMA7Qui*cdNae6+pZ_=f{x4#V{d(C#&1aHj^X1rQu7IsfrhBv4|E@}= zXRDH_+`ia{-Y=Q#-w*rd`zO=+>SSuNI+-3j0DH{`V1NHW?BgGVJ?Ddynbt#+sj)+o z$;m^LnZ;V@9*Oslf_-%o8$ijju^hN2?3JICOf8;-z4nu_7v7Rg=3A19;j@yd*|V@8 z4!gKEiT#^oqW^8lAAlb{PBa!^uqUu4LKp z-O0q*J=ie+bTYH}Y3SdZOfTLG4ea|bjwVyBpG7$~B{SLklc|2}{ntE%_a91@0~nZ&18D=ThRD+5_@k++$$p=?9;bnkA8Ru{`PO=v3n|&txP2ndti@u&s2Ii zn<|^nrc(LmW52f==hdmi{DIixJ}8yR9gKZm?8CR#r?799O4c-BZ+LYIeKD0BemVH# zQmOvqQf2wqU=O(oe``vWd$*JW0$=LHfHI>Yt3fqGBTX4-8sbuRJDcq+* z5Bu)9*QZj6GgIjt_T2MlrPA58sbmB8-WS_a$?Th;yAFHCZ-spa_P5`GJ!b5&PoAGj zHM}#GXulwpoV@_~UzkcRUYJS@zZ-eJ8@^tYLjQzb9=>0U^GlEi_T1+$OJ!!U@7|C7 z_Id2J*Yu)%*QQd7*TR?U;NuOr=7v7l_ma! za{dX|V_!ajgvYX8N?vhhBH5iyW-E8A=*K&?_^UiSZd`okzmhP_YdU_9?DeS=pXcu$ z2-k$8h8%`qO(7hH&w}2YEO)|nGTnIj4#4KAx2NYN{^0AKd|l?|^ettQ?*xvvzo>uf z@Y+j0=jd(28~x-?CsxpNxJu+TPOi-6d*XHJo8h74yBhBeKco5Lak(ZxU!DrL4%{HQ zDgHey-woh$e^tHiB3wQGzDe}RRqjd9&-e7}cH3C~Aul%aj^vNWe2MPVU%mRffp{T* zCyr?}mw9rBS&rwDKZbzB0=W#dy;LNB;qkaEFHl7ZLM=FV$J(au7>N)Y*0dA1o(Ux=kt4(7KQ%vu* z+AkzNE#T_1n(v;__L3i;)2=JuSZJMSOL(&fe8mfu?^SwdKR?b}CrJoevJKcs)H0Y6x!{Hur;+AGg%Vb_BjBlj}PIdR?y zZaRkEW^nT{xUJxp$sJ?!b^J@CEob-Da_k$yVe2|kQG$~=u9dz)Zoe3D+yH)&JU)h_ z$*)%@KAR-}{nXF@v7FPcw}7i57Z@LSoz%+?aCPL4w|Y*#wYwz}t>mJ{r511Aj?r8N0*=BdPGRR!8Bxg7sqXxC0$)_|KP zhg&60Mo-$qdT@#Twcc(eR?rLSw*%nwx}F9_d@+T?WGf32e}tn&S|Fu z;PT`yvmE0p<(U9CO|HjsuibUN@#-IZ)xqj#U>(SLOt@88?B>Wt^^-N=+Q_}Z=FfA{ zTMw?E+<_6?MsR)PunnQfkGB(_&EO`80D*e9^&y*&HpgFelYP6e_MnE3vg9t{-)(;pe}}-ek?XRY zsXx)30Y6Iq2FvqYxFvA;Bh}BlY`IR_*?y|Ar&n>ba(7rglfU@e0=}F4mu>x;cnRMl z`p2mLAFTcv!T!4m{51Jy%RA%D7I2H?0`ro??EqJ|TJt~4>N)+b7WZ21rJVL9`JRq(ELxcx;z)%5pb>K0`(BmZ?=G+B!7?9b^6T?aLvbR{!#I) z#hz}ST$9yv;?x3eklfcS=j7W3F4w5}M)i{+aCPMHaa>J)JRQ9$(R-!p1^jdBdpo!e za+TIUo=dz}Js2QYVz9$PlekCZj2n30GdL$$`_*jl8b5|tHJe>YqjMv zgRWC{!YDb1lQc8+=ng4bJ5!jZjxL>1h*C3G&y_>T$5jJr+uWc3D|qG z=6gsHJ*l61aDC)%P8+?Dez6Yx!l|lTXLX%+yaC)IIZREOd_Q?A<=zBtj$8--UYIwX z_PGUI&1stNIhJ$cy#rhaxj?-*dbN9DzHTX^M}0_n$?l^{++-g$$Ls&A*v@?p(_Vyc z!I3>(^ZR-UUg9Ea-!bxm@xm$Z2)MyBRQEvJ9+;2l&EV*NopOPCbGRkE9wZl-7s+|$ zM_%*f&b8|evyPDbTfo8gTvOei6Z~2iNu{)q604lYP`ha>o_nq+Vnn zwc^dH*Nl5ZFZpo}X_wo;*S$mecM~u4KQlgy{wmC!9po>yys3BLo4}8g$Jb~yMflSN zeqp`(GaQ2-0pE7M@-IYLyi`QLSbvuGDgC*jLv;f8olZMx0@p_lj}kTc`8DhQvy{6N z$K(a7S7Eu3xDJ6IzEF95dRCLK8?w(j1ERN6`Hvz7Uh?^ndfowG@gn7=PNH~;M?HMb zUaEXx9m#k|IoE<~BzJ}NJ7oTl=OTUYRo#=-i=E@96K8oYGDdDUy!Mh`K4*V=3*H-i zpX%*v^ACxG>@oLsD=#rIy1VRWOB_~%Z@XOisC^50E;2^$wK3u={du-Wb-znD3jNNB zgY@U_E0ycEoHO6bbCKB+oYYquzSUi&dauMaUh?B=;^mbed}FWj2NN&&$#db>fyUA@?adK~q;N-c;BDuhQr=yp~^Mk4n zsh^ib=+%SElRMUOJeP8;1=mL|DxN*yhRMCh>V?E-6Zm=Z>n-o}4}47^QFpVJ=XlHU zT>RVtu9e)oEa&Le;^uXbT;RUSX?HE)X362Pzov-x(F4By!|Laqs4Fk|e8{{h&qd~M zRsI>PZ~CdUzpdcM29^H;UhkqG(q1cfLw~(PdHGn&F1+za;~ zxH)q9BAocU5nRoks&}L1LfXRw_+Ik6Tb}2V|2A+P5HbrN%ljH)=37m1F z6WlVnbcynK>%M&v0%I71-A6Nbxw*02Oihd9HwrS<@a{;^Rhw$?G zi1BYK|8e4lIE3)B4ygN<^5uldYey`Ul^1l%OK!y~vEaMLlkC2+Ik0{e?jzSS~+$MCNS+&sA> zBK+$Fw?OWs2yOsec0uD3Sa&)8$vU8!Twou>;ba}qPA)2bl~~(%kPD25j^1i;z2pM( zqch&G12;|XXko${oyH#8iB zs|PnqE~>q*1veJMzaDVoG4w{jO_F;}L^)=_&BfrBz%7z%iqMnKM^yb@>m!Pj&qw6Q zy(mIYJ|EFcE~?(-^AW8v^yKpqZ87w=fomrhRd1D8On1cKR)fovi|X&|z;%-wu=9h{ zPd0#C{G-M>aK9WfugT{l+W(~dM{K-9_-){4$;aB)ti<^9XVt$MYa}oE{l@fL=~qqQ z^M6sk+m<;`Kba!1}B+egdz(jafv>7n9#j3UJWr*3avz-_ zho8yPzViYZn=+cevxu7$nXuH3n^bM@@}kG{tjEd5MJ8f z=uyg-S4Hbfy=(yA_gdwn_UAW&nG^T!t-&}Kh*M0dtMK2`84GMp96OK?M86f7Ug7Y^pamMA@w~0exAIH>AUbe6+gFu zYdl?b{r+y-g>aQ=+^?75B(AH$)sZ{hmfQI0=Vzb4OMWuGG@PM+1@0@H_%(rRBPV^w zOMYCO^++e)7<--SeUMn8oThz9{zEvjt;#=cd1pMB!h7T7@N-z2{QN`ahb0glYgPAn z;srmPa#f=&{p7x4IcJ^U1g`E4s`p}Ben(IC=^D;fF7O=B`TXesxV|>!#%=#M<&pZH z0$=qu<`N?|RC%D8Fnm@iWtI3aRNSubiFTP*-z&->o_u4TwDC9f zRg3HJb7+Z*8XWzT%nsP}T z$CSUu@{S*}Pq%oRa$77H_Bm$o!yi{(>d{MnJa{U9m+vu+l6xorUZ@9WJl-MslMAeC zcwNc)@e}G#VBgj4AJCd6_g?D{&n3>CIBGtrdS}{rn0k?N%KX?mqRc zR(|l4F?3}eFz)M?@V8hy7XM^DJG)8C@mcGiDYx(~I9l&lKG1JM`eP6Hh6j`n%$Lsi zKLW0g+%tIXCBHrMRO)>ONBiegZxjDsXip9&?RbIQn^Cu3GI~-TX~#7Ws@^*-7gl~S z?VnfvRLh5zA58B<$_K_dr$3K?nYh}>58=~jFUwz5K5(CC z{1$$-@Q*0}7por;Sagp+c~{c@h%_e=B};pKk0=G*FLHU{4*%#+Ih*ZN`NT&!P8xusu@QzvS^ZjwB{ ztNE>$*OL6WJM(%c{@hG1Fb+H10JwQ__)3o^Uyr9=z2NmUIl0D5KIiCd!yCC-_3u7n zVg6O3jZKrw+4kn>t;T!v-%~w5eg!@1i+}6D&5$Ta-VV z`4#ea)^S_G)scHGUVF)pk7);@TZ#7D{KL|^(l6V|#nF|1+54l?x*Nd_lItkpuf$FI z<=j)M`>2*~XS*}y6JG8!JLZ&+6X$C5qrM-P_FL{Vhsnj!mHW)epOn^>`^-6Vf$u|y zjAt|8>$a-y2{s;VzY>QfaINHSu$);B2=Dz~2KieNLofO5$oL`r+BC+ir`3;ZZ9STC zTiV?Q@V)cOpQq|O>(QB?spi@{BRYb19RuP=;KJePQE!{O@%)_SKykDp!JRX4=%88CedMf5}X9pFcQr~Jov zGy0|{ zf1Z1B!Rs+{w__~!Qju~>{@ZcX{7ZEM>oC3Adp;%oqJ!Kt|6a)7#83Q?eo?VQbq_D$ zhwxp(|5y3%S^bdqCHE8K zaMR?@kI>r;E?c4H2z>s|(c3Eik?W4oOQSuFk-H{>s|Q#09L@KQ5!_mEt>gmzg6*ML zyOVYz_nCQK-(vGI_a3X~+&{=VrXj0(f$y1w#8t-Y>|V-8tt(}`t{@li)0t;wydEa! zf9$AGZu;%jKe$11;)9p`_=os80={D(^)v7sl9x-|XTW8vlq)vR3%3MrJO(HCneF?k z-q)FrEsyBQeP+de%3WZ~!}$2^vDp1dKDBh{w4J`g`=0;3(^81`JBn$?`Qc#RJYfI9p2Ql-_It=m-^nU zlu!EESgqbC;z1w zyzJ-XU#$AACH#?itOwKoQsrgr_LA>EPlekEu8&+3|6Zs^XFS;qZj4-<@@)g(ULQXm zvM$OVp?siUhs00%*%cNeY3*09;RR{s7N`WwLK zbILzIMtyAt-+sLEQSsOcu8rKGbldi)TKqkYXCJ=aS1sp!o~a((GW9lDE~H(p1K)ju z`gxD#o%PWMaETL@3yePwC*SiOB=>5o$8#xqPwu6v%*#f@eB#qlGHa~N}B>Fu#I>vic$IuM^B%3wikFC4U@r+SLHKn$wj#%yK-J_)UPT zBX<@0mX~}zGY(5T+z!6`Ox4{RuXo|O-WJ_e7$YXnQf?As(=MFRE!KV{Kd=3?sm|*u zQ|Rv;PbI%59C>m-uv|zSWxZDOrqa4Y;M&N=(VYQb@n+Qx+%G!w{Svqwxp$(EdC8A^ zh`(}QGaft{vdp&QslATAsS4+DFCtdi@^udY=33W0Cm;)<0%FBjuI$(NEpL{NeO7X&-g( z)cgbAn{l`)aCvfp&o?;Sc5vezs&_YDd&zGXQs9#*3AI!h;>&_#wQsk2&&3#29a+eayYDh~G{; zYSD&UFH`QHCHyGXp2R;HZz{S~=e4%{X1#BYcKin;;G-B8ps{UzZc@l zb1$BF?dwUbyyWYJw9^>?(^qT$Un5@7<^61_^0xKr^?~1;2&q3Q@94G4-=1cMzJG?7 za`)h?pA1xOWhYeEp52@}MmUsH!CUAA+eqlMITdZCs?$VBDsS|iU;KaQN zT;t8^S36#N$*)g`>%<#*a+Smi^}}wG4jVs>?Qep$T-#lX0l)PA6I%OAJVRRz_))``M~~v2ru>8`Vr;VTm6vo zZUx^@K8x30^8F9duf+J5|ETH*?l(g8*MLt9DE|e@7vf`hsn<^M{p9N`&vUQ-!41aX zbZafCJ3EU#Nw?~v$_BrZ4 zrsas@c7SUq_l^iX`P|BA46X&-BDui61@)zVyTC1z3p`(Q>P@~M(QuoVW44HY(yyn$ z&5?VVT@Qq`L)qt87*gFoSY2lyU%nqPcDr&fvz#-IH-Vcbx5;v5eh`1<`w`8bQr(Zk z7cUj*m$i6v1pN42%AZQS(9d`-y7K*qd2)X*p)33j@RRqd?pCX7;#O*&Xd6|Xz~^wB z`-&#yk^PKvf%U(`b%Glt_Z90G+lTls^F+gas`n=JaWDCCG~cf%<$v=g)yY!E##ib= z{BIz)cLXQ?*Tvw({~B^p{YB#DBp4Y_vSCF zUmvp^_3H6=X@8UC7A$A_zrmUG&N+<(?Qta^cc5feYj z-@E@Lf3($g;?xP<1#&f(~AH= z$+?&O_RCZGyR5T(y{P*`d7hM|-od;+Y#fv4Nmb+yi{RvWQVqF-BDk%N-pLVM8htcJ zy%Qt2dT<@&PK)5yg6k(YVmYTh_JFH;MC&7}J<9W>c5=5`Ju{w2yO4F(Ecw9iT!irQ zJSq36`th9-`cm(!!OxQq_~Sf(SO>0cQgw%|ZbN?}4 zd_K5>+*y`$=Ib=p8#!`;=ei+&t_D9(KI-|~I&jP6K5z4Po}0__r2faWJg=}^%=yv3 zK2RS{Ih&we@paATdo~|4?@3&{aEz1R4}Hl?{y5;wH!?qteM5EcwfjmYe$qZ?a5T&) z|Irfr!@|q_IQ#?U--j{GOTHf=`t@KIwzq%i*&UKV2j9bopA#v>| zw`e)zpC8xOpQx_H*h_wSs4JYrb(Gu{O6^=1IPGUj-ur23z3sr-$ZfTHPQEh#Ww)wc zo8{OKrC!#6YbN*g81>@Ke?L>*&spBoi&uUy9ZxI&8tVtog_{D`OD^#LhB))D%zur) zP`&?HJ!kzP^I!It%AIE0v++~n&;-6=LHXV^h5h<8y!hJ%zIVIw#n$zrI|QzS+@Gwj z+2;}68Sr&~QQaQ8QE0DDe_fLN$=ze?!L-*>{bS)7&9Ayhe&SaXj(Kv$o?{5tiDR0a zANGR(cu$gW131RWt&=}W^5d;%9yfv4zJF2qZUZ+?xF7>+(+$gylEN9l4!fym$v84GQfI9S&U+xfI)`!b~Q~rsx;Z3^~ed!;A z|5W}6y!Mi>Z+NMPYWOhtFXf~5eWia)lKYnRJ49FdNBe(N_p@}PP#?~?EB#}E+}0BQ zO8KOJ3?}~9`}}#S`y%0Yh(7tOC02Z39>F zBIORWoKx?WX}n49Jj*%tDfhX}9 zu8jZFhqW z`?cT(V{kp-dSh@S;5uS(vMz5WS7FP`b7`+j;2O!DV&fOmUTZNQv^8pcqI6rp<;Y!& z*Ix4L#q>LAXR>cQ{6DJu9^!@ian>ucZ@WNljpcYQ<(iQ^*QnlSEEkgh4)DF?1M3@J zFMi7N@xc;Yv2jHFl5xbp{wY6zeq7A>CHb}BXg*2H5%~R|<9Gi5fijM?o~&G8U(}RW z{20M8PyTqc0WbM}m~meG*do9ws$ZRE8Nqwm(^c;pRokiOtXF2hb(8yRi8y)X2jASPx_`rK zFZq6&`W0Trk*YJ5zkPSZn|KMo4t(ERl@HvXh1By#@Y8Qo{_Yt5%euJv9Qsdp3UN02 z(k`}xuR2%xZ(E+{;`b`_uSs&HelJsaSr?D3SKY5$UE_!FUEo{KQ(pd$3@;UlyZ9~R z$k@A;?<8I*r_=6a99brJx#gVpv?TezNA=FJoU^{GPNTh(dy#D)A?1?K*$iH!x{p}h z5WWX|T|OQ!ao7ZYocxEazS9r3fNQu|bp!KkNIR8vam^+1d3pYmy;S+j5KAxl^%tVQ z9(?=zl>eLcJA@wq-*B1olQ!-l{1o`fZsqrh(QlT(k6oesH)H6_?~u0kDF3n;`tm!Z z?N=!u_&kki2U4%{eWH2tfqgm78(#f`YrI-@_qB24xp4A*qJ|ipe4nU}T(Nng)cm+i zzdvH*7*fs__}0;@{=diaoENR%%C%U|e11sEJAz~OTIGxN3*lyPG+(FO7xCIl ze!F$Y2fQ&)?jd4!yb(XE;am3x)%&3J)0AI$Da+gklz+dWYH5hBWWIU02>?0r8r!su8`1)~~q|R%L_$QpiWr5tR z<(%h)5|{qFwH#5L#HDdWxn8U1+($}W`eSh0z%9h!D$%ZU_ms|eHMl`?*G2fZ4qW2X zrS&#|Ym33jI6g-1`8HpkOMPqsH%jgr%Q^Ae0WN#5`j@qwqgRVQu}rd5bAleU{~UE}ZQDx03s~<(xRmeaFwU3G~>-87d>v=BiU)o12xxoK7?QorVJ^B^Z3-l)^elo7llRJsm z7yNcOZ@zn2^$xKd&&9uOII`qgBRCn?8_69Q!O6JZ5QCF(y)FhP<9ZFbz&<(skouQ# z-PijCUVF)JS7v=K{8lgv6B?hueWB?G!dIftHhxw4!2Xjycn{$;!;R}SC35P{ zY+*>3MNxpx)?9 zeu_Vm&m6h4l?s$cxK13|Y4tlWt~vYFGOjg~3*<|EsUI2F^5njOI`@+A-?Oae% z+}@Vsxo}H3TFDiQcd7c%^Ll^#xZsbIPZM7I{zR?AI>Gtni{hmI>zHrgd9l+@r2gm0 zU4++O^5g1o+wex+tj53CeqOOSNPSo1sNnT)vHdz^|3%tIx;jlB9mRaOBCo zTmC4?_uttcAHtu<$=#LqsGXc?=b|g^qwzYxRZ7RLj0Hcz2le4|0IU~M(|a?Qa-Sc7@|J`evbTN4E^ok2e+yI z|Hk0u`BcZRl^@=R7x?|u^b@Hsc|J9_L-`x6zFAL7zmn%ujsI5u9{A=ZU*Bn8Bj6?z zfA>CD{5)cXe#LXqn*ldU?&T5OlA{;J$@jqLs27-*oP3+WEs~4+o^B_&ilmlfZG?aF zd@4sSuwPbUoh0=j<8~{r-^0e$j2r$qS?u>ttJ3Q4(GmVO;k^cOt0TBhyw^`TfirFQ~kicZHRsv<6tZKIR38&KTrM|>raUOdhodl^(T)00Qgz* zar~EkyPD^y{*^KOk$t;7`8fBzwdg~W&q9AK`0R7z`y=;v?azYW41SD!9RIh0PwXDw zpH&ziTb~8r1b&$OVbb;_`TfO=H??@HOZZCl=R+Rs@b3B#T*dR0yU^-}w0jxCBJ4gNpXhU9#D5rcsweJP0-%h*`7nZZw`0J13qrCo_68Q<= zf}>(D&2OvC&(wqPJvhe6?+0JK6j7c{07myy{hZP}>)DyFx8S`=a_cM?bN-s=^*^`u z9#Re|cYn3|C1Zh?{Bne}6DfDYLCQZ)yihM8?L^8wOa5yyc!_j+xSxpR`wNV z$rt+`U9ol|*H_~h=Jip}RhqyJlJoTn<;HuGM6VM^Ke-RcA0_$mbn1Bke_kecjt2#~ zdi-euNA6&aN1S!=cJPbjKY`a?^7A+G6a8w$ul*3!AIIw`Udq=3X7Nzv$B2iOPv+_F zTIGtZJN-D?^^@lpw3~VT7i~TvhiUhv@?AVk{eJoXQO9pr3x})Dk=B1_ zpF!HyBDt4Yj^}>6s(6v=z0dYj)2`ZItlYa~?vmu!zn&#ZmA}7UuirtwaD9=uw;!SW zzBXQlmvZ#rXgyN-w^@B>{u;r1eZ@F4&Xg+8Fm-OV`57H)chZisN2!0EXfsa{ZQb@|AV?G`Wne zN477CPbc0Rd%5O&ndL&B^U6L<;#lRcu)Nc5r|@1|qjIeger^ZXOD^#H=8oPf^pWmY zs@^F@^rSp%zzvg&^E;ff53~3`s(Zcdhi04+{UI=|$0`3hTmF##A^R}-*C>CB^_%BX zud)uGBjxLI=d zL~v8!+D=ftb0av}hZ&B+$vS+2+&8SA^SomXxc(D0-vcejbBVWnf3A;Qv2}*Tdn33! zxhoH%K*abl0e9)an|(7Gkmw zGyWdsPo#XIK6x&j?8D5H>$M!m6N!WD!!%x`dPn#Jv|ldM?uD1n2{&G+{HeBlh8I8N zbHZ)cD<2pq`FSU={iActlKXQE-4^iuA5`6_e$|CHyU8t;&=o&Mz&GElx)m|{p?prb z?iS_WjqAPS$It0s@;Tvr3{L*vfpKzww0h1wAph?`Z@=cdIfCl~SM_1#qSh@#;2OxC zZ1tRSOo3}7_tpq*JGlNB+$ubLnkIL+)pN?b2HY&UsCC+UaC7ATCqhrYGqD&W-_78b z$@$yEVf}5ZqgQMlE&U<=oSpu)SpRq~ocDjLe?;poidzf4I&z0tJtuxW;2Ovk^UrJl z;Ht@Qa>}`YX+1L?DIPLFM(?$7ubh)>ZckHO=g|kPGxDr+*HB>n1nD>kIii+=S?TQuF0+hFxfzZbs#`M7@~|Em(b_`42#`*3ML zHh}9O7e{w9__{lzbtV6;;2OvkYtO=^U$9f}Tee)z=jiIe%~CJ${D;?x-dfSSOZ~gs z>N)MW2izFB!2XX@pCjNF$bH4?Ir+|j>%Cj^t&HH7z;%!-HXiu5U3Py}$|w8YZM^=- zBKb&rX~NM??lZQ1hqSLQ@be?;|G3o+S?7&_$={=VV4cqE#orkm-Q*(U0Ij4WgzStPKhb?EyBk_`b@7$-gJpZtK$ao;nr?dAeADB;^b~Xd9gWSbd z*O@1mz)g}1{Qr(7fAP0Ah4s&8H2)XkS}*zIoGG8w!&>mY_bDIcM-R9;a>rTSkbTrm z;1@otx>4)DE#T(Kt);uRex+RU`J}2%swZ{rrHFFX;~u`^e&zQkUeM*aSAK8_avv?i zmFjoxy#CH2*GoQ4I2OnS{vTYYU37wL_?-G(%pcJkz%feh(>5N|E9H09gPPA4d%g4f z8RGZs=asuGjT1?J+>4ACHD6NxdnI@&#|Vzuhn4@hXiM_-^~`$?H-p!06Us%!c?sM+ zxxd?TIdPUYH2#R{J;{6u`8wmgj2G>XDi;{%9ZvSqm&pa5vpDOi0dTXEs&~1~m**0f z32=2^Q|=9D`(EF_t6quF~8(`X%EZ1 z{t_Ekr#&};Yu&2;d<3t(Mf|+&hdcx7W3P0$Jw9j^?~m@ zgv@`^j&tOt++H&Ni>}18ncOFo+Ub|k6@CQAIQge-{7kN=JV*HzgqZTsQ!D17sflIFL788zT%h4pJRDveXD^WXH%n9rrWojAJ5y-BW-Gt=Mcr2pfSYH&Ia^+*{mS&dVdux3}#ibH$u{j2}8eD4(ZXLL`7~BSM?c@Uc2u}TO0@o2kZwt6QxxnXI96kB` zXH`54?*a0@ZG^lq4sVsQ1~mdOSBn=`Jh1((}L`&(3d?g7^vgBt9saBbwG;=Ik#yUE7I zskcfz2cD+hNtScQ-PPb0V{q%hRqdxYna@c{V#YUO`Qys(Z5@qY?@ z?tu8bJojFF7JTjQ7_SeEufG<2>p{wYKZgGsz$a>y|FVrw$a;7)`2K^H5A1`O`@C96 zZv$UbtNaPpAE#YcR$@FNcbw&%d2=%jGq`<5-2X(!^RJom0UT>boj z)pgdd^4zIQu8eERtzWjT^PlsCvu94gYmUHTJ1GrvtXWMoX63@-x$BxwUTv|j|{M-tz z;wa_TTFxnV8qbGwF}Qkg-Q?aHp|=*?7`do8_JA8Dcd*stxs+qX(Yw)d&ipk4uBt)H zd!UV@Q{E+T*`t-~v3lgBombC z=}m#FIY#xOxb5KjVsNYQym&DNw+39>>eBhH2RBLX!iczR1XuC$(t7gTJ0F9S=iYPV zPP6$sbxqhqXd=70bxQ0gcFG{ZmTphV6y%BKz zPM_!XM_Ip}dA$kmb(1?gg6qV4W8}`YoDc3byz3~bcF04_VM^i?}tc!~2NV}=VG5i|U3G5$GR`Qd0jgylxwYIpx^1;J1UHB_9}nL*i16 zSY%t&?>lj=m;AV!a*97K;QLQk{x`&n#YK48_iQ~wd1?Dz^7TzSDAi7SL{Ai{OZI}@jCVE0^1%!$~^?W`Sr?w4X?fAm&5Sl#|(}I@`2|GPJ37a*M6qz z27c$o#7F#={rT3jl)nMzUW)KzE%-6=f$u@`a?$MpS8=xLmiqr(h2I3e?~TfTi8{sF zfy84g_^LMLPq4fbk2LBcM{Yb#ut@pDkJaF3*QxGis~b`;>%q6bRryNG^IZJh2(Fpj zOD*TjBb&jsk_+^EhuaFSgItHzbM6n)m=ngxU5_=rm;CaZab5ge4L;kc<#|2vLOt+Y z;f$USYjkoe7j@9R?C4jaFac*y?z z^m~=x)7Fm}w`-BV{655JxAG@gf1LI1T5z-Ees4MBx9DyF-+#I42Idc^oo)g*M=mg~ z8(oRtR`4BHsP2O${3tdLh>omR=BabFjjNeIr93S-8hSL}tMS@Pe!F+u0p92%mnT+e zzfM1vd0>{@ddpF-nE&FB_@B5^{Rw=2(OFkF0c#_-R<4oc`|bGCi9h#~3#@m&i!f)v z4&WFh7x-R@qbGGaOD^zvUuV6$4P4z-T8^l7e+<|W@xhm(1%?^@N{!*Wi$s|T0A zPC2QgFg+=cJZD}Y*M--+aAth)$`7XTde!|>3|{83=|1IGTi(P=^tXYT`=IhCF7(;gke8X+Z zH(8$NlK&F8HgedC(B!uZo(d=PSSz_p`S(H`oc7ZMZj{_jmUG7UPH@>l^)K-I0wHmg zd93~8%Krkdz2y68>bVwg$~;!{DdjIGUhvl$HMB{Y<`J-A(Qx%Q@eFo&cA`QuPXIYt01e_r`O ze{lNm47mP>luKAYLi+Cx@a>zG58SsnaLFOw@42Z?tJxOsA~#krUKayfck;3~eL z`F^knCvhDDmnTxZew-ft^+zn6J1f6sm6y9#Y4NA4y3dm%nC`+ozkk6PC>LA#DzV4QKvC+%j8T-0;L0dNcCiuE_CSMPp> zT%f;))a!O!GyJ5+EwFFp__+%4ZTxODC;6`dH%spPH2xsTuZNKQJHcnSsP353J9(#m z2fz)I`>*Ak{yG6J|3lS_nm4zBTOb#RyE7kFqP^7oNc9?QzC4$9CHDw*F}QW$8pxe# z^_+Y+fa@Ul2Fp2d*#vHw+>b2h+&^yt*Y=c_V`Buj1KcDzX&YYh>(6NqwV0#&=2WlR zay*x~w1Dd+SB{u_$=7rIllzs9AFE!m=Y^st_bct>iuJ!@{@ioWmPsdu-OTIs5 zo-L)*{B!lU)Vf3RZNbs~wDKP+(JzGW!7=wMk&Jp3gGhs=uht!&qDIqGRes$}9Pf{$2U*|6@H$dy@7rze9Cu z@Y+kh|2!403CA3{z`l~xZ#%*HdVVnqoWy?!M>n~LY;c!9QN7LxZUkH}xf?9!jBhjG7RcRc zIcNTovgXS*-xDq8jQiCXrw7Sxw477kCUA+}R8Q)_OMcuPt`poSxz}5c=Mv`uaP#Ee zYdJ@60$gK-=KCGXIpvjovw3n)MsSsA<9*Ljz292S`TspvgKK@Rau-^T^;?g>%k!T> za&JP+z2wIwr2lLLKfSx^7MpiOcQd$2a&JP}cF_&F-`WO#@p-CyHt|BgblPKO8sqyO z%Kg}K&b%z&&zL6{wV$*OT-Bbc*J|~geC7KYIdUgjj_0+oo4|FD`?uwsejwk^$YqO^ z!{Oxl&oa5kBJ||@8N<(4y++INT>NVRH%>0_eOxDB`F_Ua3si5`>N%WzKcnM?r8)V2 zMs}5QQxSTyZ#GWuXAzw2o8|XXy<05jj1ThtjJX(`d_N<%x9ZJVJ*QpC_cNBsMXg&m zgKOAF^-i&RJePhV-_K|xx7~84p9o(m`%P7eYm4DRo9H&HgJ-D&`lv{5( zGY$wp0Df_Q<>P$*dJ260K;^Hr<#fi&?ck=#1@4EPb|=3}*m{uaecI|d+!}CmKe`u8-VsM7~Sl5{Ic?pnp5%t;QxmM+~kB+$_2N zh(ce$8(yOM_h2seQp7r70DSKe%FB4L3(r$&XA|K1$i0PsFU;%CI4$4L zm?U?e^|$#t&m+;3?`KpTrTGT-`JH&m_cLtQ!JdUvC5d&%d_I4ZjGyMznJYI&|DUWgCRg_GYUY;7#f)q@)+m$!OOxz~bA zyi)awJy(!?d%!JIFNzxhw@9v7d_->s+yc2y>z`A9OW+#l-x|yDT=c53$J|WrbrGEW zE@7TrE`pQaCF~=2p5>hWCBI8JOYQ-?z7478De$dpG~Vlr=t_CEgBv6l7%!Z0Z`GcF zU#)s~Sv`ka1FnzU)(B31moRsn>IFW>w-2PUN=U)2Vl_=b~|UuDPJ5PkVw!kUwnPsNxY3qAujgh;}=Ih)K4S}nB zo$CEPf|~-DXjLvsZ#%edat}x7t-_{Y_VuOp)`06H7xi3VJ-FPNsuwj*ZUnbXE=q4R zxUsW}#Koz%t>WKW<)Zcr(tBaNdP8Zh9$e$urSn}2F8jvPdOhG4$c;qQ#|XH5o9cB~ z&RKWNfEy=Q?EgoRadHXV@S9XGa{k{NdgLyN$hQex_RXsINy|Cwj!tlWKNc_+X%lUuZ$qqj}`Tc>*H@|yhdil-8n%6%{&k&9|CtHI5a`xdV+j2n)B z>qPIUe|h`dhg#0bcLTU=2@Xx!OZM|3GJeZkSMyda-vxHQG0#VYZ^6<2Hsyba*Ix4D zVfa${E>q{NR>$nOOME5Yy0>e-f$!luaq9xt-maY7x_Qa>kEc?OAso%*UTn)9GSAKk ze~#)tQDUAI{T(}^Qh>r12gzee^$*r_@dCCVZBw&0k3kMi%4y$DHuIn4dD zl)DEtb*-;2L6ZOW+zyaK+*xeoMb>yG+Y@Bx3C)-*0E0 zZ^9ex-O5Ru2;)lS(|fsIFEQBVdbSIRyW~@Gg>r%a-_o=<;k$5*_bA_P{W83iSMpxC zQu#r=_EJcBCI0PKDHj+woN++nKS(a{IasH?SHri(5}a3laLre1zW*pu9FTw>Z3v zGt(bY{$Gf>mx|O&$^JN?ItNguP+vS3|D->5lMAeeLgr8Dj}^D7Zp!+{b#F1h{P@lB z`ewU-X2#t@{63}mP1El}In4Z8EMIAFQg4&g`RB9r+rPedSp9gB^@HbrJp0JK7H!Q- ze*Ky9iLS(R^e)x?g3>$Z74`$s9m0{jTe(_L$E7z0CvoYH!EFbZkHN{_ zPzSlU(4Rs%oOycUk_&f>+$$f?P~BFsuTD=mYHWI4lOw9rj;MTYcKij z#f-5 zI9kaC?z7CeExKJedcUW-*W$I8{Bk(^DKdU6kPFNQPJ5jK*Z+Oh+r!qkiM!;#gd@L2 z`BuF4lApgb-c_R=4U+q_SdAF*V*fN?$^sQ zxf#oa_%HP`_#^fIe#<-KoYYIrQ_4+5a8fVh`#TneLMKvkClH#M7dU>ZMTtoWf4yD zUjr^rF7SK!A^yteZUEdgxfd4kTjC~T#^m4Bzl$svQjgogC;qPd6P6FDM;W(=mz6IyABaCP zZukCE`TcD>3GqkjB)>!X!0%gz@SDWv|0w@;c`eCrCn5Y+FvI^<{v|QmVI_PXF8`;u z@B4)q`Z7K=R4D(I7`%)Rlh0B9@e+Koc}wD4jiY&Y)j0vrioN8=A*8>w0O;6H`J~O) z85d;UYTaMCebINk-3VZZ`z;qm$Wd4l2>|Xee+!6 zQ4emAT*}sSh~MkLcfUk+AGGT~;P1YgmheBgWIMqm7%0N-}B@~@|#g?8$!i?)I5 zC-+Od_L3iu5M7zKT8~j(>1(_2&Uhs4vU|01CtA*#SLB{}_~pvIhH?czoq1&=xN&kH zupIL()m|%Jq4`{h&vtsrFQHjs&lF>mx-6uo3#7ZS1bQdl)+0y@|Ak)!BLY_ z{ye33wl}ArNW1SKceK?teu%EL`|cA|_i?N1w1*vdujWMMK48md);oT??`=~4`ZR@$ zluvkR_lZ-K|3QrYD(!x&!ya5I2y@)BSxG?z|Wnnx`Fm?>OuUF`fYrp^2PQ?#Sf|926FP5SugqZ6*6wi zxYqx6)s6c6<63aj^9esJ0z z+3Qm$KCisQ{-#_n^VvABFScJ@YFwD+^?~P!McU2u`O)PnmES0@&&O=13m5#q%Ws<3 z{|K@6lHYDZ>P`AZ_q+aY`T6zH#_M0o>>b za)J8+hwB8_8iN}E*GBGko3AsUPvE`T5?rbBHRQE?#p+$+AmwW$H;mU_^5gFKBjp<- zS8V){`jPUDl6x@isqLJ1L&n7^AdT-;KjkA-Uh?zjX|Zxjelp%v@%pF97wXaUC*fOg zOq0L9MEjBW^x&xLR{zHE+DpEFj87^526=tju1`%oeE+(y)cgYfAF3&j?_b|l$``Ab zV*bhX62FcT*Nb0GINHg{9)_3vI6TXKx6rHpmTH%aur8Km$*v2a@Q#r*za=2y-slBzzvt+q~0qr z7YvfS%f`*L$5QPqalOXlIOuxGZ$CWs+gTO4-^ZMX=5A2ki>Xtne`ov}!g~#U${l1m zo|p1J%j>t=>z#Hc^*&9mJEs3tA5^~%iO?1QYsejLbxl1;9A|{TNpsP@4zv< zQTbm#^aIKg8`V4u#A@?f{wB&JjKRrzHW!220qPS-%74%DA^LKkK1RL`zIn-yuhEzBVFLX8M^*o5%X8f> z<=h5tc|f^R>pbCQf4S{r$|tO@@w;UIxlMI)(DjmE9%mgT{ilvxVBF_r;#Vh*26E4p z*h=#COniiw{*(Q<=3i<*Q{p*;Bk@V)qsHYWV9TFSE^2?b8nIiX-sf!`L;P(4(|fz> z27brQ#9hkg-4EWOe4PDM=|44h#^<+!pS(-?Qt=aiDy997C?A+_O?gYTo54@3PB(PD zk=XLW(kenxeFW$Pn^9|1pmpYks$p)c)ci}0J253KX?o+RO9 z+-<&Jxj=h&`b8~#Y$X@9&XIQ0LGF#VTqf?4zqFgd2Q>ev`?wKs{p4zJotON2aQvJB z*GDce&O6*vOucHvx|Ck2_R~#&a&)^ePB{KF;XS{6fqLL|60c4ie!QYSk3RrzF-E*5 zz%7uA8b7vyoBy2F(GQTbBOGeo}&eCxRK zah|V8`J8}2F z9@XoQp&Nzv#&c;$(%xpt9a)5vI7@q*BX?|x{dUond2Znwnt!o*OLV7j%#-`1tq(K) zm5Nv6wB{#cnV0-_X8Kq5o67kglM9QBly{kWQR9)(%kf;| zwhc#~T%i9u<)}p4>LwR84zC8+PwvAu-;jOh_0nd)rSVy3d1v2uBe+I#fzQW2%XYr_ zZO!j!n;*+7?W74u#f);lu$(D}@Lf2j$-gfKKLV!eJE}h?F_7f9AJflEwZpL|Ri{|H zmwJ}+jFKz1-z4Rbb~sEf@VWPpa!bEkBwuFBVeW@Ym1F$7@yanqu2?ywyi$%)a>wGe zm;CrT{Y3iHB)Ja}E7SwIQhsM=7S%n(6U9Fvy5fK0hsp)+vrIpb_Bn%N zmi%pYJz&Of;dkK3{Z#e8kJn!E{Rq*oM;l%wALy6Qa-8Y=S-iMTl8YPH$)CrI>omEz zaUFbGb)O$Iu6^5{U0fS~t^BX-y!$NUI{#bMDK_3oy-RzYBlk)>E}8slhCKzj`B zD`;OyyN32Pv?tJ>MB7Yz8toahucuv0`$pO~)4r9qo%S8H=hI$5+ev#7?IpDDrR}DD zKkZet*U)aDy@B?Fv>&4Fr~N4H$7nxJJ4Aa2?On9@(2ml6mi7VK2WdCceu?%gv|pv2 zr2RVWKwCq5DDC02FQ%=hJ&N{av@fS^r2QY-<7khkZK8cG z?Wwe<)3(x{MSC{wn`qb3zMb}5+Vf~TXx~Nq9@>j(yJ#%Lg!W$A`)Kc{9ix4S_KUP%rk$XDl=d;&Z_rNDew+45+V9bB zp?!+>C$vAKou~a3?Qdv*N4uT&&$Q3b{*88-_FuIBp-qlzJ5AH>M*Cda=h0?qUr4(* z?Y^|tvw6CIlHEoXeMB0;SPoZt0eI4zYv~QqoqkRkQ z+i1_BT~GT?+6!slO`E5^l=gkJm(%vpUQK%~?FVT4Xm6sunfAl91GKl%euDOP+F{ze zX+KT-8QM*>pQHUe?H6drX&8kK27^e+F#Qy z(Efq;PqcrbU84Ov?LTS%O`G_Pw$n1&a@yz6R?_ZC`vTg%Xn!}X*ZcOCFYEa*?E|#_ zI_Qn~(M-8Tcnj^@Y2QKnPTF_TUPS9(e<{x|qkTW^)wI{q-ava3?Jcw)rM->zleBlx zj{RT{&p+S#`L5WN2&_b4B?2oESc$+&1Xd!j5`mQntVCcX0xJ<%iNHz(RwA$xft3iX zL|`QXD-l?Uz)A#GBCryHl?bdvU?l=85m<@9N(5FSuo8il2&_b4B?2oESc$+&1Xd!j z5`mQntVCcX0xJ<%iNHz(RwA$xft3iXL|`QXD-rnrR|F<*)bG1JPCHBc6WVRGf1+Kc zO?^+-b_14dl&5{+Aq>h(te9}3+>No z7igcM-9cM^la?n-yB}>W?UA&H^eNYKmD=lR`)M1=oj}_{dp7OMHtKb2XiuhXrF}E) zdfNBUcGF%y?y@a-h_IlcW+E37q&^|yrPWu?`4DF9-=V^aWyF~jR+KQXCJTIWFrahdt zf%aAZ4|`_<*i@DM|3}Lvq7(r^HjAKwYuOa{vRX#O4xpl=la@BLmA1(wDHKHwida-M zDr!Z=h^Q4&1A(x3oZxft(0A6>=J6DdbE@FXT0liy)Uk)N)c>&~fNGIgQkn81essm(K$i9#RAs1s^z90P^fP4z_Maa#N^^nU@?-9sa$mbz9L2iW%Lw*6d3-TAp z_LpP*f$R-=7-SaYiI8I;CqhnzoCaA6ITO+gc@5+u$R&_9kRQ+2aeM{23gx?@uY zKpq8o9Aq}+Um&MI{vEOy(gisOaz3OFaxvsG$VVV+A)klb1i2M54EY7*F34XX+t1T^ zIRLUZ=J6DdbE@FXT0liy)Uk)N)c>&~fNGIgQkn9?xz6)_&B}FqA8A&u^R}s3xsLy>X65={?%pQKha&#( zo0V%nZPTs&G7RG(qglE3->+G@?w71)<@#R;pD4=*>wY=6S-H;V1%4iJ zmFv9S-mF}=_mO7hx?L|dE7$GX)~sBQlSWxSM90~twaDiXecYbS%Jp#vG%MHshc_$N z`8-3G57l|QP?itZ<(G=`;TWHHG%MHfKh&&T=lO|d|I41R@+W)r@y+qI7yRjh zpA4PjuNM9n3jSW`c@;XI>OT7SwsQRM2tFcszu*tAu*N?eI>&RDh{r4Vh0r-a4+*|b z@E=0w_-jNw-Dg_kIR-lO0l`lfdDyp>sTS!v7S(PZNAd@YRC9A3EprMiI~Vg8v1&F;mAsaHw^D9ec4g{$%`VfG5(#j2)qhC)1%|h7;KGy&Zg-4xi|c;@W<;*$4hj4x&P4qL&E=2 zU83=OsM1jI98XqnYdkryv;Xsi|JH-7{Kc^Idb>#Y&%^JtW`C~;e!Jic1wU|3G=Ak{ zBy^6ySn!v_&d0j}I_Iaoh(DMjA4-w`5!$DskOa*pff*0^w-E3zLFY! z2K0<7Jsvm@e0+O~d`S$id^w>96Zl^u_(!1g{LLGp#}CKz1=|tmH_*Ai>JPT^{Vvn_ z;dUJfo%v1h&-OC}f3Dy|f}bn+TLs@yjJLb{NBe6s9rOk8L9DkN2eG2TY@q^!|KV0}913k1L{`i?L_?ZcKZg-8~1JJ!ESbwiQ zxA!2gHU2)(a}iHQFI|uMp@KhI@Ik@n3H~C%hx%CkuMzz7g7@{d@(sW0^_>5?f_8It zdx8n_`BRE~KltPJ4}{M7@%OdHGd2mIm1*U31%IyapWV;OUy+124zcnJlkn32&ER=F z-6i4)3ja?f;Uj{t6Y*>j{__sC#{XRsJ}CI~E3D(W8+7ik%)_kyrzGKhg1<=c9^pT` zr`7+xN%(-^S0>@5|EC21qKL;oz#7j-Nq9r#^XnwM^xr6W<4WBhP5JL{jptC(#@c*vhgM$BA@M%}; z<7Hl^^TX$TZf_UZS??)$E@$~#%=Mtk@zH`m0EuV*G~xgBB>dk5KP?GgA^7>wz1LgE z1IM#k@av%G-VmSvEQVMA9@tLke7$plxL)W~746@d#P@(6zRKz!X)?yg@TzPQboSpM zu9xS<@Y9I*LHFVQo_C;i{5%M|@?A!MpMcKuu{H0v6+nMB#rRkHn_M5`(s{QXR?}C3GAD44{ zXm75F=O)2dGe5@~5Bpmx_=lOt_0CjrzvvaVQ(LFd-}j(%eriQNJ6{vcC*ejv=*+JZ z{Mmvp5PYbYb^P23JGW;A*GGQB;JxbL^k=i+w?Pjj;P<~aI$u=%zR>yn+aUa(Cion| zHwylI!Cxf!h~TeaJH=8$e{X@#`K%S=p$>LlS6>r+*M8P~?u_w&Ci(wf@HJxo?t7iJ ze|tdZc(R25r|YfznGswc;eQ37yZsVZj%&9rY`qbAAd%{L6&@HC!L<%@O?Tg8vXYug`M?f57$D_>YFp ze3js*3f?LB>jZzd;2(v~^Cc|!ciE2od;y*FQ!My>Zm^EGe$bgO6?{JIJboNpANe$J ze+-8=u1k@>hyB69qtH1XkBDch@ZSKP^Z%9LJNT^q)eAcFm4d%W@RtkTEBLoy=k|XA zo#US;_@Osi<2egD_iwe}?@f_^Qt)pI|9;_reX#)(4;9 zC){j}CmH{D@SJ})bk4t1tS5^FzgqA);{NK#f^QW3r(*nfU!>#bc#`qQfam#jD%VGT zGKBw`f}bz=9)f>M@H+*cDfqFsSo41YbY7na3VxH|KV%;3L$=_%+-miID0Ch_If9=e zcpG${zh2S53kB~N{AzLj-68mYLFe{niFi)A%^H6)K1cAApmY2|G5%)?{z}1@ig>;h z{I7y{3jUmGYy8E~Ii6yX&!=JM@w^E-&o7Vg|GnT_-L8+v{8aIL_6XS7{|LcfAo$ra zd@)tJ40^UR{{DPniu}#sc|P6+J(S@3aYKsyTQTvtDE<$ibAGbLe!lnOXn##2eh_rN zKa(T)q8MJ~^b*163jPJbza{vofBty#CZ=Tlpb^KVI+w!I!aJhi_aCo#U?( z@$ATs#xs)YEam!G|3`@X1G`}7@%a<hpLDA8O5y zP55^RzCrL;3jPM@oc{=TzTSFN@ImN2-WrAfFWDaw@FR52f4$%jUSe(UVCd{WB=~aJ zIlos!Xa8FS|GM!13D-ye8W<1U-sA7K#xo8&pO4xL{z}1L&pgh*8DhM>$#yhg2Xu}< zL)>p1=eNdlHgt|BB*uTa;O7dyUhww_{z<`y1^>0+cMIMS@t-H|XC8TvZV&fwuE@`6 zu=D&nOYl<#Um$n~bRN%6(O)+R-Y@)nh5s-1MAx^!QlD)EAO0%M^8P)KpIyR#o29zF z%yYY#p9DLP=V{P+JWLS#rR!m5KX-C{-tP&1i{Q6I=lo}ZXMdgU)$wvXeV}tZxx)V_ z*tz}`=z1$z^%e0=ifBgRaX^6ISd-n(L zO~Bte)XHap4=3QWVdr=zLg##D;Qkof&q4eg&kXRPE3M}vwqFZ7>x+f|c_N={Q{*=a zz8*TSSK-6;`HSN}s*g24$@o_HS@{g;?7uY$6#Yb5E zKQ8#N7(X8f|DOrILGb%OVD;Y%I>(C#7YIHp)4IQ^5&PSR!3V|j z2wpE&2!1p8%uB8P#e77>)5!5)e==3Xb4-mjKPN-a6#Gx^-x9&kf}Z8F#>4!5uycHm zL2p|BMLZu1{&T?>3;vh~b^PpqICS=3DtJ$d{2akwEBrf!|BWf~?+X4a;ol?t_g`*p zZ!&&3cvMa- zPZa#$1fL=JD#70=_#T4aEckZ?pDFk@E3EN%fzI&{6#U78KSS_AaX-f;__>1568>Kl z{1(BF5PYA9t?>_r&hcjpzDn?S2|h>gdj#L{5sYtMuLOT0>^z>w3O+2x+wFp1A^2S3 z|6RfF5PY8C2R&-d&neJ3KgEK-MDPm*?-YEU;NKE_rQkaRtnu`O&hdB!KTYrs!B+|X zX2IVpc%R@m2>yM+hx=RS`vEJh@h9UC75uT#xxLjQo(ly(L-2mVFB1H{g0B($M#0w$ zJ|Or`tE}zq4V~k!75tfkKVR@c!CxczC4#RL{2PJ~3qBzv+96GnxFZfx4zf$luf?qE9rvx7m{Ck4mA^2Ls@Bg?p{yxw-{-EH` z6#NB(uM_-y!QUqMkl@z~zFzS4g75u=HU49vbNmg0zf|zm(E0j3BKT(opUnSe!6);- zP4LP5?-G16|NGXamY)L!pUnRt!4HSd`L7ynJs)`me|-{uv*6!N!e>5dZSOGX98Zmi z=VHNM51q$@U+_-|{$=66LGW#!vc}T~I{S|Zex%^ffX?wp#QJ=R;1>wKQShq;|AOF+ z{?`85A^1IlZ!h?vYpw0ghR*S42;MDtui$$KewEU;_zJ<#6Z{ClKO^|fg3lKG{!d%;*%vy;pCkBE!OszVuHZKc{yo7@75w05tnrM3 z&hg|4eu>~86@0Pa4|>+>zYp~A)$#9#93R8arkfTgL(fa_^N;7I$TzHuK3}+q{QnL0 zeF^-}jPbuWd~VF|XHfTCW^?@f`wGPUipOL8EB<-te1FC-_|8F$cLmd*UeKBUNxaXQ zCHPYWZ{U4ho*%h_&l7yDxPN%1;BOH8z+u+)XO-Ze75qBk|4qSfgU;)1Q1IWU$nW!< zHJ{1+_e_yL7Ch(o6zF_^yH3P^hTzW=d`R#`usUN zg1<)acR}a&?iy_!&mRi@E9ks_I^mz6zw~)g!~>oAO2L<~9qn;J&w4NZ`gx<^?}X0d zq4y|j{4c`J#gy0 zgU<0(iFl?6zEJRf@NJRrrGj52_!_}~E%-fx4~Tfizif^F9OxW>t>Et#{DXoI3jPbh z|0wu6!Jk-Xjb{vWjwd8|zu;F2J|g(e|Frr~#vhU*e@u$}iQv)Q#$TZGd}&1dY`;eM zzXdw4=h=d<5&j<&{_Di~y4412e%eCM!up&e{2wa#A<%ifDi-f6ju!kR=p28QIKSK~ z_=g2wE%*-w|Bc}Ng3sG%ZLbqLKYz^4wysytvK<|=89Mh@hPc1IL-58XeLUtjiTza; z?A+g@1z#ula|B-`_$`8eNbt`JJ|y@rVdwR^^(#7lo{#l{KLvK?&lP-F@HYy6x!@ZF z|FhsbZMMeK2%gvHfow-YkB83rZ@~G8`CQnW;^+D}AGPQ6g;zVAA^16h&k+3WDf0KH z$Ui3dXE`3cFBIYSBK{xPj{NNVsãjPGxIX}t#j{y(&Ml%2B3cgsx;}QAv_S5ll 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 E05qrBivR!s literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/__init__.py b/.venv/lib/python3.12/site-packages/IPython/__init__.py new file mode 100644 index 0000000..b723548 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/__init__.py @@ -0,0 +1,163 @@ +# PYTHON_ARGCOMPLETE_OK +""" +IPython: tools for interactive and parallel computing in Python. + +https://ipython.org +""" +#----------------------------------------------------------------------------- +# Copyright (c) 2008-2011, IPython Development Team. +# Copyright (c) 2001-2007, Fernando Perez +# Copyright (c) 2001, Janko Hauser +# Copyright (c) 2001, Nathaniel Gray +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +import sys + +#----------------------------------------------------------------------------- +# Setup everything +#----------------------------------------------------------------------------- + +# Don't forget to also update setup.py when this changes! +if sys.version_info < (3, 10): + raise ImportError( + """ +IPython 8.19+ supports Python 3.10 and above, following SPEC0. +IPython 8.13+ supports Python 3.9 and above, following NEP 29. +IPython 8.0-8.12 supports Python 3.8 and above, following NEP 29. +When using Python 2.7, please install IPython 5.x LTS Long Term Support version. +Python 3.3 and 3.4 were supported up to IPython 6.x. +Python 3.5 was supported with IPython 7.0 to 7.9. +Python 3.6 was supported with IPython up to 7.16. +Python 3.7 was still supported with the 7.x branch. + +See IPython `README.rst` file for more information: + + https://github.com/ipython/ipython/blob/main/README.rst + +""" + ) + +#----------------------------------------------------------------------------- +# Setup the top level names +#----------------------------------------------------------------------------- + +from .core.getipython import get_ipython +from .core import release +from .core.application import Application +from .terminal.embed import embed + +from .core.interactiveshell import InteractiveShell +from .utils.sysinfo import sys_info +from .utils.frame import extract_module_locals + +__all__ = ["start_ipython", "embed", "start_kernel", "embed_kernel"] + +# Release data +__author__ = '%s <%s>' % (release.author, release.author_email) +__license__ = release.license +__version__ = release.version +version_info = release.version_info +# list of CVEs that should have been patched in this release. +# this is informational and should not be relied upon. +__patched_cves__ = {"CVE-2022-21699", "CVE-2023-24816"} + + +def embed_kernel(module=None, local_ns=None, **kwargs): + """Embed and start an IPython kernel in a given scope. + + If you don't want the kernel to initialize the namespace + from the scope of the surrounding function, + and/or you want to load full IPython configuration, + you probably want `IPython.start_kernel()` instead. + + Parameters + ---------- + module : types.ModuleType, optional + The module to load into IPython globals (default: caller) + local_ns : dict, optional + The namespace to load into IPython user namespace (default: caller) + **kwargs : various, optional + Further keyword args are relayed to the IPKernelApp constructor, + such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), + allowing configuration of the kernel (see :ref:`kernel_options`). Will only have an effect + on the first embed_kernel call for a given process. + """ + + (caller_module, caller_locals) = extract_module_locals(1) + if module is None: + module = caller_module + if local_ns is None: + local_ns = caller_locals + + # Only import .zmq when we really need it + from ipykernel.embed import embed_kernel as real_embed_kernel + real_embed_kernel(module=module, local_ns=local_ns, **kwargs) + +def start_ipython(argv=None, **kwargs): + """Launch a normal IPython instance (as opposed to embedded) + + `IPython.embed()` puts a shell in a particular calling scope, + such as a function or method for debugging purposes, + which is often not desirable. + + `start_ipython()` does full, regular IPython initialization, + including loading startup files, configuration, etc. + much of which is skipped by `embed()`. + + This is a public API method, and will survive implementation changes. + + Parameters + ---------- + argv : list or None, optional + If unspecified or None, IPython will parse command-line options from sys.argv. + To prevent any command-line parsing, pass an empty list: `argv=[]`. + user_ns : dict, optional + specify this dictionary to initialize the IPython user namespace with particular values. + **kwargs : various, optional + Any other kwargs will be passed to the Application constructor, + such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), + allowing configuration of the instance (see :ref:`terminal_options`). + """ + from IPython.terminal.ipapp import launch_new_instance + return launch_new_instance(argv=argv, **kwargs) + +def start_kernel(argv=None, **kwargs): + """Launch a normal IPython kernel instance (as opposed to embedded) + + `IPython.embed_kernel()` puts a shell in a particular calling scope, + such as a function or method for debugging purposes, + which is often not desirable. + + `start_kernel()` does full, regular IPython initialization, + including loading startup files, configuration, etc. + much of which is skipped by `embed_kernel()`. + + Parameters + ---------- + argv : list or None, optional + If unspecified or None, IPython will parse command-line options from sys.argv. + To prevent any command-line parsing, pass an empty list: `argv=[]`. + user_ns : dict, optional + specify this dictionary to initialize the IPython user namespace with particular values. + **kwargs : various, optional + Any other kwargs will be passed to the Application constructor, + such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), + allowing configuration of the kernel (see :ref:`kernel_options`). + """ + import warnings + + warnings.warn( + "start_kernel is deprecated since IPython 8.0, use from `ipykernel.kernelapp.launch_new_instance`", + DeprecationWarning, + stacklevel=2, + ) + from ipykernel.kernelapp import launch_new_instance + return launch_new_instance(argv=argv, **kwargs) diff --git a/.venv/lib/python3.12/site-packages/IPython/__main__.py b/.venv/lib/python3.12/site-packages/IPython/__main__.py new file mode 100644 index 0000000..3b46056 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/__main__.py @@ -0,0 +1,15 @@ +# PYTHON_ARGCOMPLETE_OK +# encoding: utf-8 +"""Terminal-based IPython entry point. +""" +# ----------------------------------------------------------------------------- +# Copyright (c) 2012, IPython Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +# ----------------------------------------------------------------------------- + +from IPython import start_ipython + +start_ipython() diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59e19e311ebe17938a7841566869f5c61ce19789 GIT binary patch literal 5900 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 SsypWotEWCa`?PvW$p2p*I1~f` literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/__main__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49cebada74cc70ac5fe8eb672e3d69ce295477b4 GIT binary patch literal 308 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/display.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/display.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b603a54d4d010c34cde520125df4e1d4bd9c945 GIT binary patch literal 960 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/conftest.py b/.venv/lib/python3.12/site-packages/IPython/conftest.py new file mode 100644 index 0000000..abf6131 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/conftest.py @@ -0,0 +1,87 @@ +import builtins +import inspect +import os +import pathlib +import shutil +import sys +import types + +import pytest + +# Must register before it gets imported +pytest.register_assert_rewrite("IPython.testing.tools") + +from .testing import tools + + +def pytest_collection_modifyitems(items): + """This function is automatically run by pytest passing all collected test + functions. + + We use it to add asyncio marker to all async tests and assert we don't use + test functions that are async generators which wouldn't make sense. + """ + for item in items: + if inspect.iscoroutinefunction(item.obj): + item.add_marker("asyncio") + assert not inspect.isasyncgenfunction(item.obj) + + +def get_ipython(): + from .terminal.interactiveshell import TerminalInteractiveShell + if TerminalInteractiveShell._instance: + return TerminalInteractiveShell.instance() + + config = tools.default_config() + config.TerminalInteractiveShell.simple_prompt = True + + # Create and initialize our test-friendly IPython instance. + shell = TerminalInteractiveShell.instance(config=config) + return shell + + +@pytest.fixture(scope='session', autouse=True) +def work_path(): + path = pathlib.Path("./tmp-ipython-pytest-profiledir") + os.environ["IPYTHONDIR"] = str(path.absolute()) + if path.exists(): + raise ValueError('IPython dir temporary path already exists ! Did previous test run exit successfully ?') + path.mkdir() + yield + shutil.rmtree(str(path.resolve())) + + +def nopage(strng, start=0, screen_lines=0, pager_cmd=None): + if isinstance(strng, dict): + strng = strng.get("text/plain", "") + print(strng) + + +def xsys(self, cmd): + """Replace the default system call with a capturing one for doctest. + """ + # We use getoutput, but we need to strip it because pexpect captures + # the trailing newline differently from commands.getoutput + print(self.getoutput(cmd, split=False, depth=1).rstrip(), end="", file=sys.stdout) + sys.stdout.flush() + + +# for things to work correctly we would need this as a session fixture; +# unfortunately this will fail on some test that get executed as _collection_ +# time (before the fixture run), in particular parametrized test that contain +# yields. so for now execute at import time. +#@pytest.fixture(autouse=True, scope='session') +def inject(): + + builtins.get_ipython = get_ipython + builtins._ip = get_ipython() + builtins.ip = get_ipython() + builtins.ip.system = types.MethodType(xsys, ip) + builtins.ip.builtin_trap.activate() + from .core import page + + page.pager_page = nopage + # yield + + +inject() diff --git a/.venv/lib/python3.12/site-packages/IPython/consoleapp.py b/.venv/lib/python3.12/site-packages/IPython/consoleapp.py new file mode 100644 index 0000000..c2bbe18 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/consoleapp.py @@ -0,0 +1,12 @@ +""" +Shim to maintain backwards compatibility with old IPython.consoleapp imports. +""" +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +from warnings import warn + +warn("The `IPython.consoleapp` package has been deprecated since IPython 4.0." + "You should import from jupyter_client.consoleapp instead.", stacklevel=2) + +from jupyter_client.consoleapp import * diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__init__.py b/.venv/lib/python3.12/site-packages/IPython/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..125fb6571797c708ac75068915406ebcc06c0c09 GIT binary patch literal 188 zcmX@j%ge<81aX(=rGx0lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxd6|EmyoLW?@UkW7k zQ&P+HOHzwV3bKpgv|d?iUYUMQW|DqEWl2VUp0S>xk$!PzNvdu^Vsdt3dTO!0X8>46 xKRLfBRX;vHGcU6wK3=b&@)w6qZhlH>PO4oIE6^@RAT9~~H6j~^uuBpY2rzdS zA_;@G>``knb|NyF45`T^q7!#Qjopdd$&B6psb`uWY5SvuC=cn4Jfk-0wD~8KO5!Si zdd^+!0;C|PNqdL9d!OgtJ@?%2JQn{_UhW}~UR?U&0JnpXUtz^cQogX($PqG26cQ#1 zr|=0b%&{jQ=GjvS3-A;Y;;HCl@no{H;TSQk^+r?}Pfp(?XhoI|TzTsO;VrCQm~H$Vmd`+3E4Neox< zP|7%aMJ<91%*2g z;z2JA5QYB{H$imK>KbxbrNVQ_T_{^6MX-*ON8&nes zOD1GJB}dbGszXux<4HB>ks%q#3?O@onVa)W6cLOICg&c0`=#M zbeLA=i?I=k*8>I!v8Ya~p=?NrcrpzXaaKahlqWQ~5lbbQ1o4SP#-DFYt!wYk zG;M5`+Y)kC9-!)o{9*^Ac>aqAC18-4fSrHguuvaga@Q-Tf9P1sOtHEehXTK~XaoQv2|axU(fZpPmFl9XYyg}qt3 zIbm(D%%0PMZES}HIvpoUZt_6`?0s4TPRJdJA_|4AZYf%}XuyjdxLXjAq;3dGN(;DP zPmHNfI666$O5!mpP`+2j8lsBX$k;<=-~#nxRsk6fRbv2l+sukU)g;}X?}(*F#%T*y zB!f?BhM0^FtA?PBYldqi5!L%sblC6!m{DCDjq8Iz%m)`Fnoj7EJeV4ugl3gB1Swg* z_ZOjOHI-_iG~^*gy%5q>O&>Y0+0WnwHF+VFh@T6Mi~|rSJA=FTgtWM>c8o-0=K)Z) z(8;G+Pbik6YKW~BguMn}0hYBxLHjXe7s=fk;_|#P`r7F9!#A7_tGuwKY0`JMf_QzG z4^16fF58|f+djYlW?B0xU$(h%>eStOQc-#N?9|!i^445=>-_UK%R@iw{NT|0hn71} zJ*E;^w>6#N)lZX=>B-lR5Xc zRbIqp@A%EmI}*X_?Xt}B2Q@0$`C2n&|J7gRz#OM0z3cL8>u{* zya0?>iuOZ8NWBxY!ixK_irE+zy6jGDTDO>`!q)acPvNZrPbXt~JeAa#K1d`|qcR9F(gIGH zwgVD6jQZ8!V~Qb;q(&4&V!ei>45I#*M$+1#VmQ-D)*Q3dGE5Tk|7({R53-=%B2Y3@ zmWP@p8zd`0&EgqYZ9`6LT;Z9u6*!Ew*U6Hhvcedv^lrWYBW?3w9Pptp<6~@<;kL^! zZF_m*rGV3rn0BOXFbA~PFaSJaK~y)Kk%*Ftfe5;oa71<0kdje4pan!j)YL>jJpyys zMA`!-4R?h+W8#V898bpeNF-Ci77bc;%BCI5 zn?kuwq3goZrY>mluGBWnzA*E`cO#SHw>(T9V>a)A4z7#bUQ>XFvtSGiL1kltR-40x zJ}@Hcb<5HQ&X=B>0WMmG%j=vQSFrh7pf%(wl&#Vbv+u2%`Ba!~TzVzcdJ~+Ewg*dD zPDf~G>D~PPwc;IvZ1&%yV-g;-0 zj0w+^Q7+)g?0*h!yaIQEArZU%yJYk{OjDn=Cey>`RLUTQ4y1?Gq^<=sN6r9pA)3o= znjDKJAJ*k_dF%psI;X~>2t#pQjsted=hgAi6jfxnujkV7gdR@@!K?$bHPiE_&`G8M zFKHh6@;*{9v$H2@f}QO)4X43i#_a&kBFyfR2U2>s+(z&5ZQ4DdtxcmSgiuRlj^PI2 z9q^^WI@LzhSiCtHkNaE#>;W{` znSx=^VpK4w)*|52fu%qVhgml~aV?&AyyyYgkKy`?I?nVc10pbMbZSVkR2s}G5sZ8# zAkgDD&Jlw>fuD8^DjGtDg;o?~iC92o!QGoUY8N2QMRL2$clqGd!8!42#g&R&*+aLg zTJ8|8?G(52#MA$J@}EwACU9-fachLD{u&1z<&cX`_gM~+D?Afkt_|jDgUhvhbG3V~ z_vdOK{ZRRb_}|5IwU198zw073&2#sjI zI*WuW&vJJiq;kt#*VO}84!m>vrazG1N^s?ot`A)AyKpB5aU5`BL&azgZJ6L*m%wXiMYP|LEMz>*bX@fzb{*xHCzzglc^jQL3}Pt3K-;lB*aEug2n{NnvvbAMlLMc6$<*i+C1gtM_AAJHQFaR|O{R);*mgy4AP^RoKXpwKE<5bn;j2GZEuRM0a7E1UF&pmUata+uXcD8+{ zeNLJ0U8)L99$l%fo$S3`=AYj7%>ygGs>@?jV{_7*ug-6~;cHo`YnVMhbAG;Up=PNr zI4%5pll*q;V%5V_M*)Ls>Sw!Wx`EEIrRtrNy|;W-(_L?l&+Wb8lRvGKS2k^#9sln5 zkJ{d=UO4kN4FFHuyAVkCB9898-6X%WccEsXe<8ilxYV+5scGMJ4R7;D;z!SZ^xQ|@ zoBN+!tm>OQdfVl_?3wZ`yBcz?hPjrHUCr#KL!6L44=)^W(?{SzcVmX`4n2z5lbD^r ztQWJdVHU$|gG+_#i|MeJp`f)wc8Pq(3zBQqODd0W7f-H=lGL_ZQ7_f5c5zY&}g6dF&LqHK}43PKi zEBi<1I@w$)KNs9PpzO3@AnaDECP_c1xGuTF9>onVV43QLU@@`w7%sKk3Vz}Rm3c|QlZA%U7*y?nqY;ZCGRBT4W= zW5o&pZx2G<+TTO=J#LohwxZMRaar;$P!tLT@v~eU;OZUj+Z^`*7vr^q06+f^u1CQw z1bP_S+>opjK;Q!C68jir(33EX32?v#Fq0kuOG?EiCg(@6gc_Yb1sMd3z)H>AYhLCE zGOetF_s9Sz4?^ch5oZi{Boa$RH7ydcyvU1YkON6)YKu?Q_9Oopy0m8?`}`ug}wc_;yBQ-xvql!0e2c>#R?v(P)i zq4V;^ikGBJ_Z;Y<6meg$VQxFmQ`5Gq@D zB!)A8moqi%jwRoE3n*!*_TWT9oj-l`+N;Z<-dw16DRlhzg!3PGJ21a{Ub(e3u+aK5 z>E_mbcLY*ZJ>5I|_{`(qDF+ShKL8rqec-=Yk(nSr+|lE4#EMyGUq}k;%n}xpvB4FZ z@@c&gkMrQy+gB9)`uYi>z+3=ep*W_2KEJ|G2(Jj^y!jmE>`g&sYP#xa%%JxQ5yh&iXhj1_1#XMkg^^#ugOTYMSJurA7y1(a=2HvL*owb0RY zS*QkGndWt8aNq6vHyER#sc@0p5e0Xv-g(I+_o2MEgOV%X#-6qsVbRA1_7|_Y8z|<v_IEy9izi`Hv zAcGGpUQ)Gb?#$KjmGFY{p>VVE(4=Fq%8CM}4pW)LV0sCoeai}eu%{P9rM!=D?5o2n~Qx9;-U z?W^$e8h$td2n09CH{)COx8(dS^SuyR@rNd*TlL%L_rBM5v;L9E^rEZ#x&qn#%tS^q zW}+@-%q)pg+H5AMhFp8_}7W>)j>aY7wr@czE)%dbqmGN&y0S{Aw%eW68H=>9jg z#pWzb`r~g3O0OhnWVuJdOeqKt8r8*^{yKbj>$_J4VN1B{j3s&WhBJQyRyM`K^Bj5x zWG3!66x1`oPYU}6HlZ4;A}GBh9}l$Rec=<3m+qiG-s-<-$c zLEpr(87XCGWpI)8a$g=xsL_J2w0Yf|uj}Jr9qnPD2QLn8cy=a>D(0c76JUpJV;X2{ z&bxJ9{Mg$D0ZaEo|7U?ftD1Vj4l2eXSRWJomITcOmP!dkCIr`o##M+>!)>vH;qW_= z(ZP6Z(AMw}%N~Jfw-%&RKnpl^2_9z1I^3(Bz<~Sq{?Iu(av_K(;x1KH<)Nj_9;=W^rzT;u)^ z^~J{hOO3r3pPD|iB=&yN(6sQ_&4$o&Luam`^TV#ihR&siBNv~TZe0?OeB!NHaee6* z;$49+cU(O7TbCrss}*i3c&CmyDn8?R>A;!*r8`(!h2Hkn3YT<@TdfhKFRglb>5)~J zD0Q!TdFi3wxg3&-#cYp(1~a153fnYzs?vwB(4>QrpeIz&B4%_U|1f_uM)Bk+8gVQH zXSnUrl$`_e*>EOO0|Q`%7!G}W1fLvybA^vHBXJ1S`B}Unf=+bA4CqN`FoH+FibV0p z5r+HNSWF$k^D}Km{G@6)%;wqIyrG| zC*eH5B<^1l&wr48pOU8kB(0y4hF_5?_{l>}^Yk7jea)Rq)m@9ke@8sdaa-mpuhw0u zo9BMweA~GoESz3&<>cMDhCOQpd+&ag=Q#It!(9T8yDrG)JZ9PP7{_gePap)Jcc11T P=eX|aL%${XWRUPb(t!y8 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/application.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/application.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05953795052d7009d56f3ec983f58caf136c1227 GIT binary patch literal 22891 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 Ni?9BM!e7E){|{HPsiyz{ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/async_helpers.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/async_helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..954b00ea5cbc4d62d88b60b7612f645f65b7d5ad GIT binary patch literal 6264 zcmb7IU2GfKb-pu0QWQyvvLs8E-N@rVc^ONTH&(N@)@!Wl^)`+jX={1Au!`OBh%=N% z8gke>L(^2`K;0OLoGjK3ipC414ZJ{rB=8m}iahkO28t#?Unpn`ITIIHpnYiHWXV9b z?n}ROheJ}f`p^OA&gIPgIp^H({QgTvM}pz{VEw0azv*J^-|0_yMe3dHkI}i$3^v0I z$&hVnMiNhXMix(HM!{3DBZcTpRAPp#$Bf8rHq$1vKW0YsHZx)m!}`KA z?P5e5M#LK<5=J}bCXEEzl#xW+VWiAXqr*(+BSz=#$V^vN&ZPB65@U%8w_41p^QK)g zxtcE*bDrfCRc~JRRGpiuRlK3wmZ4&lr{7fZ>7A-KkH@L(AF6uMP-jissbmw0tMitt z<{Sf4T)cEW)y(G|?hT7k1-+`y>o-i*H0De-r@N-B799@*@zyHNsk*D0H%n&DGmWfz zv6v|7+_Q3JTj#3fVO{KQ6;)j=mJ72W)X9V7GPhg|a#hb!4b#J9wK8vd^Y~sTBmo-m z+PY!dRct|=63s=^G-whp7r`K2spbu{=&82jlvIZkW#DMqDS%X`=z6@I^IY{6+gda+ ztu$g|xUF92rdQ_0>%%nVdet&*<9bF2&C?gnBDjS7oO}X&*;dZ-KmzvEb6#1u(dWA5 zn&4Py4I{sTPNzmcg=!cB-XQu{~{zzW+Xpa;d;r< z)qx=%1V07$_TQtq&)S)X6A!M1I-J7)^bA2Y&5kfHgf2VExFWG@tQe`Vo60p-k-S(q z>o0nn{e|}MZSxtf$a`CM7V6R*L%ndEt~A%1W*JGJ0m0(jEC={;am*!d=5(M$oija6 z9GgbRmPn|$u9zfhd?wHU2j;L^vAlWJDRWG9Esl8&*^LKtMpWId=v7w@j?=}F2*?i; z3`WE$7y=n$hYO>xQhs7`z$j<3y9AE_)DB`#)I570g0A$b% z^93kHw#FI)|!Or zA}Lf;DA}xf!{jd1S~m>S7#~+pXHSY!a_w*nAYC;G>3lW7LCbC@s2;XBL`wW7M{0M@z!6 zoXWoXwNcmd%#o6wTh!-FceF03QHa7E6;x<}y>hdqYCw2M8*$A$vGHEq?lhVewz)qV z?Rb*z+ejZ@OCMiPXKL}xmrs)YTTF>|JdLsTj?Fgoo9Ddx=|UCT-iJ~5naN=5 z8QFQ*Va1TqMyg6C;&*BjWRNaSLCi&y=UNq#l$P%8F|kHdc|t{5psz1n%hJR8-lRH9 zqjeyv>Nj9kY_jfTVQ5b%lV0{5y`o!QV^l^Kg7dop0*y}I)^bjvWW%s#WIy7XcHWN= z8eO7PRe1*R~qWPu7d+=~+MxBZ_O@oyN5q&QaA>N;%@wC7Sdz{`U zHk`~viTI*kFg49jXj;KB$~N^=n)c@~(ZLr^K;lHc*jr2$oOAekCYrCIBOq~`ZOM`7 z>)R;gGGajtMkSSKh*-R2xG*IRzTg*X55ohKr^dZsQ)1{SRxEo-yik8=Uj)GBO zDR}=jM!S2^;2eAVS0f*_KR$45HS(|V;7oUbh*lPKA4UhU7wBF<@5SpUvLXMC0*z57 zm(piw?~o(D^?5zH-0CUEg85Ic#WreT5$=9>H5&3k~-izG3W+650md=QSL4 z^X;m#%JO8R8jUonN!YDsUfY zKBDtE*N-h$#B&c~yj+=cM1b`n7~pw4uref80CZ&~glJuNmQL)z3LpvxO4BqgdsYMn z?zya1AAALixNo5Oa)tfJ(Gwd--&#BR)^B_FeR8zcn|Uy_)|>go*v5(1*G{~?t;ol^ zYh8z)#n`@s8~tBh>;G!)#M$-!H)>sP2+V-|w)##2n0^~V1qz(~9?NY=APnR=Aqqkw zgXt@aW|fbk$Fpc$I*043`ewjbvW0=Af&Y`YZ_&&PX#RVJ!KdEy?pJ?QeQ;zwJ+vBm zlI-3{4y`4J9(bQ8hrvN-&%Lo9{@F7*(s6EEVVwh;)Z0w4-alBK`l6?Q^-`b(4f}y* ziC&=v!|1d^3)SmZe>TffmtZl%-?BuFtmw z0zmvrVE`uylL3#4uf77U!oT(gtoS&QPoqMU-Jyx0B62i2e*>R%8qA=Kbk7&b zuDfUMoVj;xJ$bMeIr#FK6A;Cj2hk1~V>TG0SP52WclO|SLZcyUw;=r`as4G$-ad@x z5|eO?BS$O78gR=p1s9@@y7iRXx}p zq2Z&Vv0S%|Soidq#!{04MDRboV4&6YC@?QjQJPkld(-0JQ-OweqxnxVH=7C8xBu=^ zEk3Zi^gM`MV`*ts>WJKlropuzp>_D{7@tx6xZqIB7x@HU@Hf%ybkV8SZTWe8C#UKX zSXbEZBI&J2G`fGYlcl=up1yPX-uX}VttSuHB8Oi-buz5t)PIEzC8yBvR!e}lbQz7P zR$?BF7ndO~H2huoj?oIc_`c5?zVBgu{SPH1xbbiv65KwaM!O`YIr$nWxFvl@nyx=9 zQkVv3B1``y4r@XrT?nv6)x>b>wGE_*l;@*yDs|+TH_aT9Ij0y@MHb2^ljz0`y_iFG z53Ds54dn;IA%Vw$SudjkfSL=!wf_f{zJBubaInmIDaevV-X7<;V#8Xg&Kpf1Y#UgN2CNrgHtr%#}I-RbWd1FzhfFTl8eB< zPMrEtWYcA&5CX=&V&2T{Fd#iz$u-M{qfzu4nvqLbw1V3u#|aE~#iNPG@zmY+JMH(5 zew2QeVCe&oQ>Qjk<7=t$f4utZ_aD7qOO3Cmrr|!*iA^TAC%$~v&Qb$g46*p*bobrr zohqWl|JhXV|G6;0AMQEL{-J%MUwI@YC%TnKDT(^sQMAZ&OxyNjL0Y}Tst`s5YX2FX zoh6lJAjFWH7;TnN48@2%tYi1H=tHu1xNfx+QWhF$48Bnd%eM<6mw@4Bkz}`di^wfR z35W73ae0&xiz_dO<(z7)f#Wv)dsy_Xpn`@vgs#rQj4V=-P1MoCa@o$r0adf>4SRUK zo^^PhSttplp@4_#2Z4IWV#8FK5f!~c$wE!5Vjf48ERXs|R)BGe%6Ap2jG=HM@)VUQ zLS4+`qJBm>DJIqx)<6y&{Ts>f5^QhKo$1 z5E-~eL#>+LxQbO@B3zW8NGGV~M@2etN;N|irD!Z5FX$JgLBV90Yq=(BffyxZl~qNZ z6eUt!T`a;b*cS9qC`!Qpl6>}@A0a#8?|-Ly{%vjI^5v=bw5wC^XqPYi>4nSM#CsDL zuL^HRHNU*A&$(}B;(l9QF8n0U*;jO=y{}R)b$&`aKXqm5-K!TTFZl7Cqlqbga=KY| z^poE*3l6V}LJt)6GEGFPkBV8VtMAeRv1+qsPz&PMFz^Ss-4D<}P5WZey$A{)r@HPP z{Ur9YxzBR7Q&Y7+xw<~|?lVR1N~}f@6n6D*q>rqnk32AbUih@ImOk~X%EoJ#*6>ST zs>LsT`6Si<*9U6JW2Cx!f1BBkIZ5b!RHGR-Sha_ zpkQ#06Z7O)TmucLm87R~LW-dNBPD;wI`R8AcHoP?{WaFJ727Wz{QY=b8hFa6>0>>I y*1Hd{q<GHU=UIhSFNqm3u+Nk`Dj%t(jo;R8Hv?+XB+x~ z>{yM!`1;o$Hh-!T@;7dZQO*~WPhs(xaMB_!xk0$|fN)nhPfFQ&%eC4PXg%RhwI!=9 zgSH|{Q>{0w*8P#GUF)ZD$dsZXOITYfnMz@3C)V`lonhLIqed8O(Ws$eH`eA#t#+P% zs3nW&4b7rWp<#br=!iu;rgwxEBT#H~;~q2gmg)}&U{PC-Q(#Ba^Zygm=dsns%k3 zp<>2RrUhkchYewwhbefC!mwfkExRm9L}aKIn@n>h;4^TtTG+4B0fS)MN>I2X6%G1@ z5!oGSY`t(X5Gqb+kA*tEsN}YwJrQ<<@w?o( z^lsD0R9sA0xXm_&Y39f_5!q%DX(Jhq{UDH$OoL#wIFsQL`#!cMky-7zSaVkGK+x99ADaQc7Uf!)ofZ3 z$lE|KEqM+}PXI?bl^r^a`;^DgYD#w)Iz_0#bA~ps8NbD`t}76M_Ce$s)^o5PSKv|b zrqRM|9x~l|v_+#`vOiB2moX3e80<3tLU^*|6@DEz}+wTWE1;JjwSC8RpQr85%w_+X23? z?r3DY!Ru(o3&0i$2o_W5iuqd##s?fd4HM;b6mffBP8Kp4ahh?DhaO4qpPu)a#`*~5-*S1p?(?8Qg%Czvws=<}`OFB-fQ zLBXW^^5Yw0$go5{;;Q?mRRojHWolzJb73-cxjpx(Jl4?QH` zZ~i;~K||+yy?i7Sk0Rj;c-1Jb;vLwekc8E;e{j+*=!eJa;1lUQu4FwT>s*$?*2T-* ze&N5Lb;l3%+wc*l*fc=wmmJ4==FK_Y!Ie|a@}qMH1g3+vinH?Q>H&f2;N%>v)pG)q GCI3I>S2cA2 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/builtin_trap.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/builtin_trap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..617ff42253eb641b361f2da836be095cf7074394 GIT binary patch literal 4031 zcmcgvPizy}8GqxMaVEBtxFkSuAQ>75u#(stps3nzt3rSURvW6aNR`#@?8NhuOqh(b zZ^i*frpke~rls1f)QTLcD#t~v)E;{1u|4;~K#67vjaZKw{)gV#v3M5vLvZ#bAC>i4m&Y4;L$Ta-9y)QQCA8pp$6nB)Lu} z=p?ArS|?SF<&w+i6Q|Wu*>>p-S6$F;eU>tHrp$u6Y0s+e97sns?Ri>qsR0$YtiHZb zHeP>kx?)cWY zFSWu|hcc&70a-BUQo*H;yLioMee+AyUMg7TbYZdT&Xw&G`HABN$8_oVqF%ZN7&wKC zKj0&UQkl_0cu~z|`eJ^u%HpsK7hO=xkQ~gYFYV< zTOC)h)QE<2c`;(piU0v!XhpA&xM(L{wrVvp&);n{5`5w6V367KNRm38{?DS_~Z*&ME%D~hCh%}^zvbSZfkCD8ya`Pg7etB zqZq=qWB3kWv}NBdmB_~lF#CqE>-^XGe87<+n>B5D?{?I}?xQ%N0AhtSlRb^(AuoAo{TmOH-)yGRAH040?K_v7 zN~)n`9x9nN-BX4Dk!L-<^<)4`i>$B!UX#OOLFIo2i?F2cll|B`!L2ULucjQ>w+>)+?_NcCaRG zX;lQ)Ta$M88a3e!Sg9t~gzu87P!;}zUJNyH2FAYS>}kVLbv1nds%{&qqc2ei!c;}i zVA{HspUTDkWT=9X5dDW?me7BQ;AH%C$j?^zWP`9iI|w2t2UZlX(JIS9hc8d#RA0i? z9RvrB7+Nu@8%E?-miM=_zHQ)JFvpnzu|hsc4>ZzQFP*K+&7Qsws<*3ay&Hr1M?HnQ z)J&#-^Olz!YWDPQ42*g`qs`I6s?_-V_`^%jWs)9yu8?D6^|OuC zke3=-7rj)rd0?=9Zgu#Vm%hpYv_I#-yHJ7W65EOzV7EP6kz*d&vZDl6f;la|?5@?a z&}%=W3uUl~ZmR$S^0bxjiW%)=R|G%EoiN&*!^fcV zb>8MCgwWld)Naoya>-}OPr3>DF#vlrc2kUD7zVOO4@@9;(o#VBQ&(Kb9@H>4s*KK1 zMj>Owq?2Q*MObK>ikY4RSsI0BAhMHiW;O)EmmzywaB_i{;{Cpay1q11u}jStH8 zPg48Wq&4GlYWRf+o&N^oKf%iXZ;Zdja+qxHD3RsxC!{@r!pN}v(-!fo5$7HC`kYys zQy0wHIai%SM>S1p>tR&!g+!)v#=wCkxN|}O0$B~(99|N;&P>;ZS&$7nD*Ri3uQQpt z$mo(;t~e@>G*15f6!@-FaA5Ao*tenP%O#8I%Trcly ze_C6y4wE0}DhN&ju>65B@4#5SyV-xR(Ld_-k2d-zy#9$t{U?wFBeyTqCs%u)q%vzK z*2TxE>~kQ&$TJM~1D-O_P!4;_;SFWDIh4gb=pd&@PMFGdF$^%Q69uN9OhSP<9>eU6 zji4As!D-H~gUn@kc1R6_#I6K+wWdMFau|Af#`66j!^6~)=a+prfV022MgE@Zd$9LH zQ_a2-g{~tj=RS|8WcB4iS?+t;Ez5gfb|>Vam;JIlj?L^pyF28-W$=Y^U493InsNyu zjS~7jhx;}E5M%QgcZxu|e-ZQlkt@}zg< mQSZ?QB>f3Fyn23v9DdS0@T>Al@>TqdAdIYzeNOPpxA_-+=X$UJ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/compilerop.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/compilerop.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..956015c8e0cedae94bdede348e34477d6568139e GIT binary patch literal 7046 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 P7_~PR!tKgId942f6_y2P literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/completer.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/completer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab2cf66a0d000ebdbc85d92b2fbaf4efa0acfeeb GIT binary patch literal 125529 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%0Dk^{ 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/completerlib.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/completerlib.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb9c3084c9f62f457715f2771d3c5977094bb6eb GIT binary patch literal 14282 zcmbVzeQ+DcmFEmF_yz%x00!%+~#pjlFwGU0oF*P$oP}SIKq0s&m!V z6-8-tmg?$q@AY5?pbXpD>ms^)db)eMUw6Ovd+#;>OHq-Yg7E$HPe(j$6!qWmK?<5| z=Fv}Sidv#rYJg&CRuP~FXp$-h6eLv+C`rl;FeFtCs327a)DxNk4UKJ>fObMRpd)!z zKtG`$(38A6V3;rt7$L7=wSl4u(|~EhJYXizx`1V(c%T^ade#sqnXnF6NgHFpHenyI zlYCL2biy&f?Pb4+pZB*g4#H?Sp$G@V`FNf@LJLhlH*>*vHT<~(Ytw?x z!;K8`lL3DiyBqO^2mO;|IPl1v^Yh`)ZBQ|Cs`1o!P6Ry@zLT$h|I&9av6nARH=S~0 z;iShq?iqpd)=QTz4-Wc+{_x=m3(Q2ThVXVQmHE&BzU z=dmA`>*-+Y%Rm#p6)Dro`mVHweSCOwoR`y z_D)60)$!yJlHtwW)pVr1rK#~!3y?la;@}XZlQXYQUq0oo6PQU)cvMhxzVH+m+(AY- zGL#a2kD@Te>)Pu&BqK|YH&PU*U=_1e7+#8@5HZK_`_F_M+HYthF|53HQTgC@*qbjM6l=i_%4VOyq>nKizl$@nsp>7RLQ&*L* zP}8(q7x`1Y3&Klele)sAK34#^2QWimmB18&Bcu#j2=59FlLwK#@h;C5k3ZlU3iw?9 zAbBz3hl5DE8x93nAJ;T+VkXH^bo?3iPm`nj8!HgMyl$8e;t%k4MJknw#Ss zkRiuBQYB7g5GUMnA`tR=0{qDqnHPKyDiSvEg~$ggPOVnoetG%uO4~+dbE@Lh6Vm4o zt);+mkv{HXK@s9PCw`wH-&Xl~__V-GdjjKvGT?*J01Nj8S%JZCa>xb*_295S;Nt~m z+&9Auy6&r9-z3T?L6?;#z!_B&p0F2KiDz;WTdPL6(A1=$W-2d~CL7EcPYiqH!H) zJ`K^jRM8QR*Cvcsve z!|Af4XL!x$er`B zPI?uk#t3AUp2ZY_=X=>+Ii(+tQ?R0N%|hIng%;AW12O+E9NnxU$A{&4DnZ6Ed9$c3nw$74lU5oI_tv?)vpEs=S)T_%P@&{QDp>HIE-9|gmE~X+|ek*A7<4+Q(3mK8fhLd;#{dLQJ^%pyQ-w# za_N{XS#o947@+M}jSE=}31nQwd0*D$#xp{B6|caLrutz1xBjOzf44sJcY0(+qBH^t z^Yy|Ap*c#duM$Y4FHsc9!b?Pmh|B=xJ?Q}Y2z$oKheI%(P;g|QYue{R0q&ZbY|*=I9O5)? zA4DK$Krq>cru>1hKbTc+1_>e%G@yBS!eLHOutS0p9ypZZqDa!d;G5~@xDZE#2;$(0 z&=sGc{}WGO%12%Z=KeG1yI*{{f3UCr#g{sIyFqAk{$Ln{c9;!Kg$31cV2U3VOj5Pp zGk?Dslxix~q53n6aX~?6xpy$ILP{dH(5>$K`KtCB1*A6v#gdVu^5JZV* zLH!AvXD7#V7okc3>rR2#o1-3^D82n=<=p9vMmHA$sb{gh)wyBYm$L0ko12r`=Fc>y z7&ku^pIR76Os#9`GZj@SZP|m0s-Jb=?*7@C+h>w{+Sd-GD^4c0Wt%0XZ}A(B)|8_) zU9x}fh0S97k4xvyW{kyi-J2Hcl6FzMP1#g+F=k6qqH|_S8&;T9X>+W1tB%syHnh%^ z)|ohRUt7E7hFTAsC~Z-u{%}k&uZpXZrs|ZohI}D$Jnd*mmo(13kTH}dnbI#F@1-oe zwkeCwxmjAhT$e6wfG!ovA`rHYCDWoQ5xH+^`eM^s39_xo{;|adlC8-8^nux$Xiu5z zGEHqs3$#mF8aB<=n^zM0l)2{TgZIpbe)V!@SH*&A(_&ASetX?=1~OX|?Pz>V(Z%l1 zU`F~y{f5PrvbfeQHF<5nf6si7G&+g$-BI?I?xBjZ9NMacAwK1g0QrAoS9RJHAJ}X? z8r28x;?CpD2ghj4AJ=thG#@ew$bYD&F|X-phlhVu<74xb)3U@K*e4|ou}(li7RQEpcgnnbS(!H1CAD=Atd4{tQM_<85l&fa?^)Ydn3b1S z`c`zS{i(+Gr1@AxQ8`WhhT{rVXwn@r(YEl0 zv+(!BGA516h)|*;j7SNT)Or=8NJ+r8v)V91Z4#o|9Lki|3M?45sP;#STMmYr)y-<7 zx}*NDmp5Dz5UA`k`kWi1hi262t1AtpKPG>G@e1wD#sFn%JG5qTCt zDZwm2a)HSdAP!pCWK=d80v$W-_sAw)wD^h`jo>cs6wD7H8S2b~g9MNXn!!Od)(#dn zNgx(~o0d%yR-ja#!85MNNe`fqB}!+_6ZReE2{+B*c?V8`8U*1K9N3VkET_mfO;m=t znJkMgV43&_Y=qXPtYyO4zudL{+}Yo@{g%D|T;H8TDQEu^9$DfKi!122H5Ihm0`LnA z4uF;LXo_4-0~itIB!N?c5=;d|5^!Fuu?Hh!%Fw_I1bZTi)BAalKVc8RO~8c!{NOcM zZ8?@eMYn-)8g2ku3%ZFxlrvyh77SU7D=vh{AypGdZUA_=1cHtv#9T^y1#@2QK>)8J zk&p}EUJygpR-w<)i9`G6-@uPQ4x8@_V5VBiV481=H!bwtY@O=_sG};`G?pc5iOvsi zi_7m!FTb|Zv^tdD-F|QPskN7qmgncrJSedNC^K3YIu;`9#+rA}{pyvB)+*wzUwBum z-y8ltMOSvx%j{-l(@NV4yLxWDvSV9GRn-7;f){{$bX_#sMr_c>%yLcISU=YdVpZ-Y z?d)IaUU&B2*Y-bOqVg(k_K1C z=-4n;rHoZ~USDZX?|yFGcsNtj{84FF;^N;r*E;?af4{BsN3SJIyXIbmD8pDcnDP`; zo;bVCG;A8o3+AjG*=nU#B^h(^4c-6QHsZLSY*$c@Zkk60h|z{(2~5I&l3h$jth>!l|07aU+cc=L3hNlW1>Ea`}bxU+*Nfj%ME(24$z(m8T_Wdd+c>JhT0w_&Hm!M;Kaw_G)pxRnCK`vPFO^??~V%mtxr z2Wu1zY)GC*r0$t{<@jV?Ep*NCh$(;{WX#T_*7*n?D8V9;5&OfH2lKQB7H<%YuonRK zjX@=D9BZn`$`Nf?&;m0W91VrWVW>*)1WSg<%|JDAoPV0tC(X|cjhlli8(0nH2n^+M z6{Rg%*n5Xx*VJZ8t2as;Ql$;)Qg_Von4wkWz&ccxAD-V}oGHecEN@;J|8-xIao%Un za1rQWhloO2lH<1q>*kKB6#xq`E{afRhyjPO7q0xdc=xlc^$74IltZ zW}Xjvb93vXX7n@qEYMK_&?$=CCFkYq4PQBC;}UfVKlp#qB!%8=Pf%hL;9&7doQ(K$ zz&;d!UCRR}8~1_546HxL$mbfei0bM@poMJ^i-x(-go_kFD!v!rJf&Tq<2rGutO*R( zi)gYPoWvJTwe=qHnY)Hn)Y%8*;v(=eK<>ilpyB?Z9}d|pmN#L9<`yEqxdzC&)#x7y zg5_p9#Id}f4w95Wi+pfE95;f(7vRx4j+{_ZaEnFtN@5lOJGeiGD*p?9{O=(Ga8N=O z70;iIpIzW@z6f@gBFlpP=D=LfmYUL<7K-0|ePJqbaq;T%;d>5u#!?o09ax9>j(#&D zzDw42q#PX?L-E4J8^<@TwP|a8(paA{0dRio#uwKBAzL`zV@n&?XmC3Y>pwA^)j z_kD}|p1CWj?J77-@yqZ*Gk~0%KS*k;wp7%vrn%RjY-=bB2zDgXZ%TJ}IzV@VtQ2tV z@b?I&LYKO49` zkTx_XnMRRO=8s-xlunrIH_wu#f1!|>MxKV7^Amv0rwazVzc7`?Wb6V1%!ZsVfVTtV zBwmd|?2FBLjg>)Qu)su6UnilEe+Tqmqx`;rb~z^NmQpQbdtoFU2|30@{Q1gR^{gi6 zK&5ei`Po<)*JFH$PjR zM;qH8M;o9(DU8bibks-5NN06X9rR<&3NSFH%^LG`b|d(XG!hbq*2P3r8T<0I>YRT4 zrJNB&ktOm%XZC)Ki#U}*U;vl}zcT_{xZQ&17q7fXX>f?hA9Tdjb5p?_mPUTu1HcNb z`JCSyCN6*OO`sch9ioV$p@yj5JKzihZw|t*&;=tX7Q+~Ft7k$E%shL+h#*Y3RAij+ zjQG8SFvLM{2ed(Z;5|eW=OCZYZ^Y{Xdvf)&{0(k2eEFKd5#&OsjElDf^!t}D-a4^i zs7x6u6P^u&E2ZE6ghLP{&`nS2OHb+62-5^)jHsHBiV+P-fA_;ke+5HAgA$OQx+&mAG3nFNOrJ;|fd4HsDsBDb~{ zARPDap>8#j>NZ5cut7U6UGOc9Esm|&*Nv@kc|dE3b>Gy3Ff}dP-*Mh`Zd4yiRUcaI zTd!`y(Y@5V*t%Q~K8?5rl=PV9u@Qy%nfRHx?oFeK+(S4YKMxNL2Ud@y8;+-# zy1Cxir9?Ya)EZzRR_fRF``0!5Kdo9*cfS?|Xd zJGhMe2>&gO50$jj{qf%YtB$oJskYPUy`5OnMgLx@0P&r%*9{5 zdck;{yOQun^bX=f14dsZ5z@eHE&(NGH6UU@bVRko3cS$^qQgW)FO=uzlQZFh)`#Fn z5!HPiZ3>HiX+GSyzK#|!O3;wV80%nsdRCviIx*(_G6f46qNB3I07Ws(X%7*H`o4U# zwCv8yf*-@I5lra-UY-rCAy1D4>dh8~Yo$74HBv5@0*u%J8DK`H?2O>v^{nX|=2M^R zNyIM#1Tiq{qh!`5xKabAJ)op1s)zHU4x^Emgg5DE(U@C$%B4B_!PT1G z3>7Wn|Lp%`)G~!RQ+Th`dsG=UM2!+uAvT78!THU*l4OpWfwJJlAbZ6HGyDqBS@`@) z6a~1rJE{e0ArQ1c9~Ri%7T75}s03ds&VydXdGjgGpAYmSLa*X1^is}hXEm~OLoeq{ zat<6GSwL0{Fw7h|Cc!W;QceZEcqfnmEiVgqHAem3QSkg;jfqTwTpXqGmeu&9BABYF$dQm|yx*mBWvY~ONG|t4Kb&YGeXT|r| zWABco>W;#tiuvjI^!)4b*AvHA7`Q|dV?H*RGgik^`(pc#k0*^)53KgsnFku<_2?VX z1^%AKxoL%aBXL{j%)+vb7_> zKKQHSfQ`V%Vya!~*etd#ITjsDm5Y^$*Vc;>rI{`B{< z2)$tVPqwQlJNjUZl(C2ALF7>%>?%HMRDamyK3l^4qxJY%2lG41b+&@}T{VO8bGEb9 zJJA^IMA48_0~z?AB)X8@HHT^3ibzF=WV^|_Lg4BcUKb+>KC-KM*wxIV+6R}h;GbbQ z5BviRSP$WUPDJC~JbWi#aT3g=dEPPkJE#%GV*+k^I3^Da^&5u0DZ}2hp*hJk6Dy6I z?s4x!|0^5vf;X11fbT+WkyW6Pf_ok!={_|4&jxW~3Rcm)i2uVeL2l9cxEYSY>VQR| zy8J&j;yr7fti%yriLe!LHINHx$ZQ1r6evA>%itsz^5TEqK>Z0Y9HKTRXtMu5l4XZ* z%?{i=9GY4L9bD%S|G|g*Hav6ZNPYYmxHgGBliQEwZ(&6EK4d0|e6 z`h;!H42JihNr|CzOvZ#}W z_OQL3a4jwpk0hN()8_U$OPENLJZL zm~5Bo=<0{Ns_5#4&MgX(Rc5vCecdC>Zl9&?^jUhlrIOwac^&QEuBf5EO+)?=-9tYL L&UVabl|v1D7OB2jUiOLMaGVLNf`i{rSq^I`UK^oqNZR$g+M z-KAyGR4>=2h1|N0jcZ{AC>mdJz&WssCP0B}|LR?lA_e-7SSyvhaR38%L2>FJXjf zjZ4xnJEWQgxu6*AxN53pG#oHBxxijXvlmUdFr}K(Z-}E~seltLV!pg=qbMGi?P+Q% z>9#4`6DTJ37mK=iQg;QVS}$hlpl1dz#tPDkQ4w#;jJDV#F)0 z7MzVsjE%DW3`|d;AaU&$3;7A?($Hc0M&OaTZ6d|9!6YY_ff5A!gP}9UOUj<*ONCMeI{cWwLI8wL(rW zDX`&&$uW7tDB0uEC_4pxkSd^b$Q8TDhP+)KXQ#ECYqqWtPGh^kq?K`YR4bIuk6>ry zUO73!Ue~a}XRQ&KrU7-CBV0Z1X!SgVPL@q($aaxOK~o;=jk8xLN(H;bc0ZYZ?1}Uq zj~v_mSbF!K^y5U$Ba9|?+%!@?U6m#wfy2P}JU%*s639OJ1eNw;Nr#QuX0s+6)(S8k z9o}l3l`L9lQ7h6Q*nlFBuu0R%vllh{aA^XQSga_MLz@H(GJD?0oyBzAS~P6v5gO;M z6E=5F;|7^GOtNcoiAQVV#E zjZf^FCD^u6u=qwY3M!a!_c>@ysW3ZGv9J?eQqQs@ib`Gwi-9`8cU~)Kd0A(3=nFH1 z#BB`lCLvX=o5m(q<}_7TtOkcL^-~5@3swoslXGwy@Mqi`oh2!99|bLFmQ{jh^o)*g zb=mie+|o!}GVJZbL}@BZ&I}@*m*jT>g5d8Zt7H{v+i|}Ins6U}?786C&pdqZRDBvR z?s$|L(zIj9e(~3NNHJ-$&B|(LjN@A+}DAzO5ex!xz@TFjwUGSVk z-KP}cTk(c9=^OsN?w*;cO-*x8;QIW59rnZkx0n)kC@#R>)_s1RhZ>7Zh`LilWI zhmaue7tVv)Xg#{tNn1P|quZ#vaBjsV6PAW>OwM*fg`y}#DeRmkQ&3^td%&m9HwDi$ zg&7RWaua;|lvz@xToWn~TD;2rzenM!pbEe_LMHeskWD6}ikYwy%tX|v8dKwHj4;Mz zkaAU0Li_NH*MF2QC9Ecth~H0%)=TxVN?c7UlA4@MDv5W(nHD9fwyJF$xwNQlN~_vF z13b1qDQ$`fEib^NyU2|fp+escIA9)zAS69vQe;+I%H0HH3Nym%Y z)9yQ0s=lGY!TA`&f+|RYN62$vTUvEv&*`!S7s0naHU%5c!y%2I$!00)XR~J*)eZQ3 z?mk`3a8fV)@d`UfK9x6`4s@MZ!bxbBT^(e=7baVE7erh4c>X?dm z^bjrKK41a(K#$DV>2mA&Mugp-vZ9zky6zUm4tKF$gKm=-z>zX`I^n?~ zi=vMk`&6?*`(aj%NhSze zqk%?Yl#X0pq^-a9cT~NBbn^PN3!6yn@KX#sj?MyH?G3x!Z$oi7;2=cOAWC(!9IZE< znpP3bIHuyBk;@wx-7;Vf1#l&sQ>8qeF625r&k8X$&>2jsPHeJdVl4nzzKtZ>Pde z3>%Ig5X^S$X|sc}PGn9e7n9$gA9RkTqK-&rZEm1$ZIpFW)nwN@GxmT|8^mp9tZFb7Q(TG3KJ1J?Y(#k6D_n zjuwHe=vN$Shb~an?;eznuWZG|@0yEa{B70k?9SR78 zPyNH-KkfR*UDbgD3*vHY>uOi;f_N#m+Q;x{xx4)-YTb6HyYJe;pB?_m;nl&h)$O}i z2S!&@qbsTBs;TE5#KoQifd%o;;`c#RaKb!PIT1HhIU$59Ct|7ybA?>pL!%?zyznUS z7+S9iHVx+KVP3iMwh;l8z`SVJ;|jdFf0yGE!cz$(ULcJ|C$>X2?+1CI7wk|Dc0ak=?CJWyH7n zsO@7pp%V4EM9kuMT{Pg~?`L|~5kplG3ESBO%y^pF=$9JLil`vQ&OFj+@k=)&bqU8F z-os1;g-Q(Z8*$g~8xZC~mDtQypGxED_EVxaV>di|nU8}mYxM9-<|cd4FIVCX8=2Ye zw>F+PGL%&Riy6-0ii)zY5nGu8>6sdVP=;Y*JZhNYuyw7!P{FKLUH4#}x z-0(*Mf=Ls^GNe0s9c}vbeP>>VVx&#D%L) zc-BNfbP{xX>jiE)j%YgWxw3gfal-sIC6zGAlbKs6BbAwqvK^F>i$Gi|+F;a4xTkIo z51ja^170|F;`IYMg)q7ax8QmO9?9Lz+(dK`bKUdd*J7^Q{Fmrt(cXAlc+e|s+`Q8N zXtn>*OQB1xwTRHSZ6Wy}CT!TUsJuV@-t_gB5A9pM`xX+biQc8ez@4tmi)U}{S?(IE zCdcmd^e;Yot7qrML%;6nzxu|NH-4O1IJDZ<^X~k``Aa{<+j?8?Ba8OR)+ej@?R|0~ z@gO1$?!0#P*1+RD$ln*I)ba;4gxU zt+)CPE*!z4lI<&r?f;(Geka*+IrY=QpAG+H_|xQQEh5Id_#&=ZAHKfa^Yp?YP;TwM zCq&|Vf1T`D>KwS)^>-UT*!XGk35;CoOkdu<(m7P^99rp2SLt`}huuH#|EM2@j|V>) z{w0XMjM-Yc-aUHp=wkOuf2!J_x;c1VyOF-t|J~)}_?Io9{GeTkcdx|ytFiv2jo{}MYO9!`cn8Qy$2 z9{Sg0_;63ud>(Ie&F4ole~xEPK+jjnpQB-Yn#b3qsla@w5_%ZQnHLc?MB6)m3WARq z8eSEV>;FJJGxhl2nA;yeA13;hpkEINR9AxF^&!}4rjCvpl;}*pZggmEy@8lq>Xo1( zmO-ErpuEvn3D49~R)aq9frqzF3KTz13zr5xj~^)ypWrBx$^Hq{JDSj8RQ3+z?k-K2 zwQuiEWEl7F-gh$G$JwK}9i(e?cP2?H_coo(`R9{yw!=dE&_VAj3_*Q5wl==M&;oD+ zjGG_a`jk64PH&tM(dG!Ln3J&R3kW`RS!&UV;P`?|O_LO5lAXC;IO5VZ`_STuGlo`3 zMO>#x2I@pXf`*$f@EY7*mX6aep=QzLMw1gWpFzFcx8}^y6W?dcEutL@{(0~ zJg_sA3LiUm?9?G#8p1`>fsR62mO?~Hr*blzeXAtv-kWGPs~9;n_h)ehC*%8Mc6|sk z_hJU~2xSxr%srIRmUG&&S-F4^&p)tP*{n(Obws){5;E`V10({kA!={NH|t&7y5QDiQTK6JKuh3 zRcc+ZE+1YzdFAD$wry2u;FdT5KRfj3Dt>pQ=(m5%y|$6?fxz9CzFL?HQ0j)Qi`JEV zEy}Agp^se)U74@Nc~ug6w=Cwayje@|YEsxbSZm?MRv5#5POJ9)z|-NQfxB&8mtU^7 z4b;L^1Ko}-wJ0yfgx0Q=7FKOxwK#8(1gZ6Yf){^3&=uZ#?PN{B(fpGbA@E57ad5aFRWd=>a2_&{&G_su<+56y=H0{n8^C)#-We%J&S zo)-)7XgGP2`gv-cA|K|_?D|O&o}KO+c)A((=eG$@^7JtLkF%8*V}PimsaScxjL#SJ z6{3O5@KH-~znd}(--H0{T-Zdok1mo*7A(BsT}&bfc-nrX@sZ*rzQ*e1*bdj3uyQb$ z1_%!G`#0_^oT&Ge#!O-Ku~d@BKc|huHV-kvQ#qSGPl?YnrkZa041(|Px^8|SgMqkl zJ)z0ER#p|0{&T_U&FX-2U*Bu{@X{pRnm?c{P1$#mrNT{+j&=ek?0Pi{p4_Xs$jrOk z@cF#uo4}tMhBOpJMMOD zx)^~aclIts?uhYaiLFRORcYv^{);DlFfp2;d5VeQySsG|C-@?n(j5PO_g7v zap^fd{;QI$=~fyzpI`j)P(tR;#p^`iiV#YU#ILeWhBdW zPU@@JKG(lKW9oQId(rwsWVKKr5V$8s0^<8SzHqOYX<_-MihF#-1u@Zu=SomdF_nY5-0>#6K$7Us);SN e5U=g}j#t?G+{)f#)xF2u>fLbsL6|ylwfqlzc7WCZ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/debugger.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0aabed4f347dcaf4dfae9da3de6fef2d419ae198 GIT binary patch literal 44328 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1b41b3fb5a8ad485fade9bb66eb3e0e4d6d85c6 GIT binary patch literal 52332 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

qL{U;@ilTKxj>E6V=&Ig-T+R*p|ArW1 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 T@;zUGKgQ4R_!o|z?2G>$FQHzK literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/displaypub.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/displaypub.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb52e02b972add2cc1cc7179c03e6f4e422a5cf1 GIT binary patch literal 6073 zcmbtYUu+!38K1q|yW2aT6SguR^N@8rhq*^7%zG zGdXK=Q`PWu7R#z$E>_AVv*ZZ1JgqvjrfOKCVrw;3)P!Re$1<4%>Y<X!291 z)S@YbHUrbtDr6sDaepcU`{~VgB(SL87t>@!#neYKUlKAVa*~^Urd*n~W~yA9vQ50p z$1LG|2~04&>AY;D4f%|e zPZ${^M!0=9W^@^;GpT&i$Qla1q?XxfDX*Mlxo&rB0F)Cx3{77DU|e;$W;xgu-PQz| z66+23O*HKp?n^6BRg@zo;bE^g+eaj%EGj#c^Bllvc_kGo19gE#LxVvvzek*fD={}oU zQ+ihhSC!oR`_`4*CcZPhX%)N>xafWJO;qQZL#XshLvosyz8E}-ElwCh5hNQ@J;~U` zV8okJBlgCgmhrLwF+Scoz7|8Ulu?Z*#8FgB?D|f&wQptc1Nl(Q%mwqpcUR^>>-?C^z{ zn?`Uc2@8qEO;#(=+SJ3yM(~1jGV-*|f1^6jEcSY;!RGMXS>D(cx%KUP7;y4114Bw` zt_j*m*2UoQ5PNlqv7bVN*Ok}P4W%J1Fd@Cw6=RJwf{Ahu`ZZ#6sc2;Q)KCm5bd2y{ zVhAge%nX2gf$<(E-RzARO|mWq?n3=)Qcl+X10M=vu#ZK`$l-2Mdem&YjS~G2q-AtYlw13^ebN>*p>wMeg@gmp6w!CIg47*p>9@^Q%v&49!psAw zp=q=C{}+zNz1ZN#A9Yq+AfwKkwIBhLO+6=VHS~VlnkTXrm7&P0LnQK&O zdXQ7~I1&=O$0~!cMbWTLnwR>U8yoN@BB+)_IZ=&b*3pwco){uxT%@MB9L73;Os?4KiAWGeH^zffO-tK3G+Fuu9Ya72AR<(6zvY89)WfQXDq?zXYEKM zi;<~_fzDXS$irBZM@K8;)zBJW4xzv;oZNk47-P1&Q_ znVW=aj}vJhB#jSw?TK&hH)MYDK-o^UO`1gJ=h@(v5FRta;MsvZw>A2C^L8e|%yObv&KqE$2xdTcn@ilB$-vo?}Lr5SsI97@ScU9=pW zLNJR!?rxFfVO@(dISB}t9{?^gtSDDGPEcbi&^3(h!7||V9n-&5!b**3P&4&l9H}x) z)>pvtz4W_g&d_?~3zY{hj*i1CM|F;`*+qmY@H8VDEdcz4O}oz`?IrJiY7e@#RD3 zhBkV(pL2fM_-yO06?tXyoy_~s|MA!#j(xP_BWHc^iA!6b{A}yat10xpnqk@Al}FaV zu(EfZ8$8!o+ctPPyEmd!ZD*h+gZ~KXwK90R+W0UYQIm*|&xOPbBf@e!iW8C~spVYo zEmDcXb(C+HT9b2$`p7f3srd}rhh2E(pyO1AI|1Fayo?w)Nj6G{%WX zQ7y55D&5QTEBvx@{}rX{?abNCr%EplT9=eQoVjlI<+9S}5n)d7yAYe0$i>_w0&ta= zCN4;ab7?wvmJk*T1vgVD_;(t3&K3$kt7>-eB~>VZ!xakNS&;WZ6yHzPL#W*D;7m$p zD-T7T+uc_xip& zo2Auhe}leaFRGhM48D13%g~>8tSOIweCU!g-eRo2HKp&e((ePEE|d5psE}>GN6+N+ z{4uJ&PZitF=@yA<@|u2#!$7optoA8mgoa5@8-|hXY&4k?CAaN z;ic!6C)edZX!XG8)p#b6*?4mNFMF@k)7QOnV&ED>%SVLZD7U@4Ykn~oR( zOT=Yk@aNw-ax$NH0QdWND{$`$^Z9hO;@b8KKFCA4*X#fBK literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/error.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/error.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2efed5107401c000a1bc28eed5c433cd8f1e498c GIT binary patch literal 1802 zcmb7EOOG2x5S|&^Ywzqs;UU2(G+dBT)|0>igb)&sWMu(Xw3|q14~*I~wf3;>?n!r# z?eTekKu+X>a^n!?e{kUvi3{?TKLD(`Rdsi%>Z`B%x1F8P!}Y`O zj|abQc;266tQOjColS9jYsXP0RGcjb$k>!ZwOJ5;ih zC=H!3{Gvchn@_{=1NNoPxMcg9%K>P#?|_zEri$GK4Ks9nmq~WO2VCxb142L`RayEbpdvE(C&<9QgzBb63{ z^zAr)P;gP5Jn_yb>htfT`v$a$3Y1X_;|O!G`H4B-J7bXJNM!vecg23xx%FXWG7Eb- zPfqv%OtefPA{Zi|BszJisYgy+N5wQyoO*xMTe`LKzr4n4c)YGL^^a<0fF(8W>9Pk? zJNpS0CQ)NUrB2q3LHrr61D+XRc9PcLfs+-ik#k! zc%l`HSfATu$c{6CQ$oP@G%@)_T&VM!M4Oad5)L$ST?vr44{e%B9H;Im7eG}*TEX*J z^GTe^9P^)W!!$f7knY%91dOvp;Y}pgWQa4$GRu%eQemk@o-2*lDvI5~$wxxanB!XxVTz0G}rc4cDfvzf0MJ~#5m4SH`F0T_3ByN(j#)Vv0!eysRl^?*5 zkYF*hpPh**R5t6Ej2oN>Y`VeUZ3O!NXR4=CxVOGYvvGN10i}?Z{ zpSM1%zRu6}TlknhVe>7DziPhk|6Skm>x)l(fAe9v@NiqS8h-29?)8O-`(l@j*WSHg Tyc0dU_4V3**!`C-I)eWPyH3)= literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/events.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/events.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e44762e8654964caf572e5149e921d9bab85870 GIT binary patch literal 6287 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 BtR?^e literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/excolors.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/excolors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3142e332487baaa705d155c7831be01be353c8c GIT binary patch literal 5323 zcmeI0?{C}28OM*ZC`)qWSpNM>F&(Fo)!I^=A1xAW*_t5Dvbsi*W*FjPGZ^t~)0Rk$ zr0i&L(QFv7w=wo2CNRv)i(we@rvFFZ%*cQQ#9kEGtL+tA2Pn{2d%on+auTW=2JF=) zz`Fb1bNAfchhK_Ef1b-_8GU~G^ml8YjxqK(i0G3LmBTlw@`!0{nQ4-is7cEbm0h(& zy=%Fvo?K4W8Y_OR=l#yv}W9mFoO{l{XySG?aDK&}zD| zrc_OhE4rcF`mp7!n?^bNcg(m{>hk)6@gD`l@2K}`+{@nKRy}C7y`E#ys#s)DWazt# z{tm~f_J}!B6nr8opD-ud75hZmVHdLq2> zMEFKx|I#6Y!Xd$3)OH7I!XYPKZWR$YBt8O%^u~^XL;7MPa7cVMIHW&z3>*?4fkOsk z$G{=+5jbQxb_^Uc8XJK_;<>>ghsa1JB&wuQYA>oji zoWddTMB$M52pkg6`r926pA8O)cNH8GAAv(+iE402d;|`O_ca`H`gP(&2M&qn28YB) z;E;G9e7i$pS3tS``wkiYze9pw%l}!2IA$U*P*ggH;jrf5oTY5*&bqRy^P2YRvCZNQ({kwC zR?cP>`rKLPVvKGpszC=i+fj`wSIkxA*a0m#zJ+O{??`K%tQ?1oeHneuFwHMLPQj zJy05E)MA)nG#nGALtV56OAPA`%d9toi5;^MCEJST-3oU?1@-<(cnQ32LB{JAL%ejf zJ}(un!%Jc|PYx1!T{PZH@Vb{a#LQkc8gYYK!!cA#g=?g7n9%DM1iU1AcyhqVONE5J zRJim~!s~w>sW)(}Eu!zqi?}7c?nOPgA!sMz-Qpz-r!-{YZO2N|mzSlxN|@EcTaAU+ z7%v@+yUjIEzG-o8c&QJY7TpV8@_I`(yi5=ds@b3#cIpZ0qG#CWTCK^w)LmYyncJTH z<8|HP)(B?kLh@t~PMEgUgSKSVY_w>X8Gc{fTAp;>#_3v7zWKQFBb!@xrAglvjc-*P zZaa-l`=~5$abv4e)9+Op!F%C_^1}IwO%u*H)as_X#_fuDW2{t7i&qFae!%QW}s3RJ0zq zzIulm59O&$_C?pUobrDlF}e2`!vQ}r7BRfyUh!p8emdO4P4}jsfhMM4Sagei4>U0a z!?c_BbI`;T42Rue|0Faq1;g##Z9fl9Ou=w-chet$9uD)r@4oMkK#ztDYi`XSgBFYz z-9>)_niymLd3W9~KoeukH{nkBQ_#c|46*(h=ris0y#akT>_6g;_(f=9j(oH3tY3mA z#?k)fq03;n@puCan~$4cEl}g3JPC%Uh~c$Y7?KYQ5yMOFC0`~L`4D^PffhcTbLadV zwD4ih&G{#xg%80n4=sGSv%BLDKnowP?ymYn(1Ou>?tA_OwD94YyXF_5g%5EJr=W!o zvFB-M;X}+f11)@r^_QTD39hm1%Kkhw`3}rS-BG^+eXh-L0h(@AFg)v?^)Erc{R+d& z)OaW>V0b#lhs1FFC5EITAA(^9TKEtQd!U66!7vAX+=tM@hhUh87Cr>S0chbvFdTsv zJ_N%tXu%i^C!mE7!LR@=dFIx~Vm5{HpafN&Fwi#><@FB}vkk$%K?VOfxC_bw87qqyzTBVbV-U IL&5le0yI-s*#H0l literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/extensions.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62fa77ce50719c8d01e3c875d397a02d5394894e GIT binary patch literal 6303 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 pZ)E77Af1|Ju^01m9fre*obpQF;IX literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/formatters.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/formatters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0024ad6115e6e775e7237a300776061aea157bf GIT binary patch literal 40845 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/guarded_eval.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/guarded_eval.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9872ea5f2a2fbd28b509ee509a91f0c97c3576c8 GIT binary patch literal 34286 zcmcJ&349w@dM8)~6fOcJK!W!Pink6@_kEZaDOndKi?Tyh-N>_^nPfJ*3ya!u+xy%7 z?f-jKg^Q58Guf2HSFgTzU*G$#_wX0Fxj7u3Z$|&|;1@E-{jc<)KjoTd;*D;*y z%^lA3<_$Z&&S96=HJtCwA1?3~47WvG6*!P~%d zQpJVidIOVh(R$Iqak34$+J>5jo4w7$E#4NM8?iEokc2!YeGW@+L2NtHul24)S~L3+ z)Gw*Qz#Zm9$2CsOm2y8cs%3wuRl&PX3(rHiGfVh-E!>6h{4C)cwD1CiyR(G1N^WU` z)H+}&Ly6utu~4#zMSxjEqY4`k#Num$ccauG)v%hDAg9s~(JS=m_0-?qO=6j}SuB^F z(q_sLsVk6rOFC4nlr|5T#VUks6|1jt-ffB8YmmD~+LYN3iTt;-I@BW88YxGQ<=w%c zb%55VKzA}|1E7t1eZ9L3oU|*E+itPRy9W?s0ZcceMu2Ecza4a7dgR={Vnz}o=-P8Rq^z~9IM-vs#gvcNY3KAQ!; z1@O1Bz_$YaP8Rq!!2eMe_;$cUS>QVW|L?NEcLM%{Ebv{vT<=NAD&-@5>*{ctKaxwE zM{Isdr^MZR30iXDhpXd@djS6+3w$r&|0D~1AK>#@;QImpohMVmD1MGML*2gdjMo@2I0;d?n6IeIr#4cc(k_-Q8b@_Ts zZIzuwY?0xnF2w&Iv&5&>XckW)-hlYDWc-zJt>S6K9TdA0E4c^X=TW1_=P!t75XUDz z1B`XyJSRT;Bi?&a8j?0k!_tT}DwSP$u)1b|{)ep4&$2@QQ -XNCTktkA#B0^K3) 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 PPj;*v{38J`ES&!Vi?%FJ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/hooks.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/hooks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6230786673e9b3eaaeb4b598c77637a9a56485db GIT binary patch literal 6249 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputsplitter.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputsplitter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43f018ab6db16c0b7a58cca06de2253c8b0dac2e GIT binary patch literal 28868 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97f886598a9afaf8aa63208bf92b029ec4ce36ee GIT binary patch literal 23986 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer2.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d98267cd4b9e10a5e0446c5f051663882e3da4e8 GIT binary patch literal 35719 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

    DkgyKBB9CjwE{wY}y!fEB`{hm3I*O79F01 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 BNa6qh literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/logger.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/logger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb222dc9093aaa7cd38f53d91ad60879e22e8897 GIT binary patch literal 9192 zcmcIKU2Gdidb3=T;-4gnqAgjrsC6XTq9arOk$+B?#7=BW_C=O*v6GzD#=I4GB~qq# zdAm!?BB-2w$hGppsiic9q+WWKivuhp2gF4mnzvrBhZaR&B#VZbJw3Q+U-G6{PTCp; zuHQGyT~Z2t34(S6&d$#_GvCa7|D%7cuJ#Z}7gv5U@;@9Q|Be+iIf{k#51}wi1Tshj zMzE!rL56;9gEsnQ2U+^H58CP1G3c-nksbA!6P3OK`w?T*Mr%v0W(mgl&2s5$j$nw5 z^b*1TE)g7}`y<3U0`KLXF^oo@&7hwHmQzuy(=`snwmv z9)`s;^vhh9*7Jc()v#z znFV`5B5D!L2qWmw|JM7;`136U3QVN4c`7TlR$4P7yXACD!abVk!XSd}vx zmfc!%OjI>~ENwLNaV>dSj5u_=DyD`NL`1>$6*p!`<|-o2VS0L@^9@y0)Xog#oq~9| zQ-i6}msIN;y(~(XJ5$M_&NQW?gVFs5I@P2m?oIRYOZPL+nehLjC`1q{PcC4*ANvL(oo_94t zX*n%Q0EFHj}e{!cgL{ z`r)$JemF=cpH7RCpgV_P%bB$997)MTd`h>=mqkT)Dze6FVs=|ny3D7N0`eJ$x5tH5 zZUnAEir93|n|vxGo>CMUE<6Sh2oSL;$mhBpD=MPSaY`MwxMQlQ#jrW+HxJKj=>`C` z6|$?O;H_P1II-+Ku^QO1)O_@luI1)qD}m!nzT<_)9aHxAs+D?xi(4Cl3YO`iG(iCl zg&=!xPUlF3>5nkVcIddvP$X3xXkj<<73|EGV*sY2!~^VV>u*k8pImb7plI~REuMgG zq)3X#mv8~k!sA+_hA=e2Wsy<5(oJde1zxM7muL|}&IT>W<S*w*ZIe}ix5fXZ{z*2+3hbqJ;K_*AV78Aonx)dW^1cPT z;P{o(6#syuHDKB%{RzxnMd$ug8_6LC)?O_zi|m!Y%Kd^X3&4{uI)lq(5@m~qBudjL z649oVvmhB#2DxJs7*s2-3ge4+2jjoZxwxNsE{yaP&c#E|W$0^evZW%vT*cN(XItC@ z+>1qt-)c9{zGX)GbJ&fS?q={C+;U6VZB)9qKS(404|mZ8*!vLsX-0{D1N^^uHjGe> zlxk7v-)gPqJ&itRmP+5sbSKo5&oSxFxktmLF=pwbVu2yhzuRmrearh#lDAX9Kc26l zv`A^RS;~3Lz5Fpy&!l(Kr#)}=`Gi`*-(>Aps71UdtIKY;60do3UZD;lwY}C%)#fUr zon~9 zr2(u)>&)TyE6;SW1Z$Q`6d}}uG-xv0CzwbuEBA_$sDSmr@th=%qv^1hTC&vC${{1=g@I!3~L`#DRUN zXrj=c4S_kq(It{45W{5b27^V}0{H0+pLJxk;k`#AjP4SpxGaF*plpS%r_4J#Gp?Xq zR!~(b+aSw2qWkvke<#aE_q_8N+6kZi9@0}L`Wfon^O5a}7rwf$9NSGMsZs+FN;PI^ zJm@xA)$M6sOX$v|N-bbpQU-$y>@YC6#4)hE@Jr2R`>33hsGY0Z(J}+WS5`E=N)f?4 zQ$^jSror72uV^}(lr-J0h-pQ4WMS5n?ig2~OLq*XGHOCWUo28X?VZi|QPe1sh@XN? zq}LesAewU&5mrtKIx`F_$TBQOSCleiDh@L*&iEQu9$NnNVk`^UY&Z!c)V~CN01Mei zeEyp+Tz_H7+qxPEEwvmgw6xxuoS*!hWw^cTgsG3N5vDr2<|4k}lDFkv<3jM4%>{2@ z$s1Z6U$FnuS6)WD8BFOLHHD@&w4)2nd#GXk#7P3d*@l^h+0aaA%2^0(o$Z+En5uf@ z4NNEQdqb<+n{OSNKeEtu=f&GE-fR7JRet;Fsgr-!_ozBJ=el3beOkL^T9_T18OztU z6?TU2G~aGsRF`)in6CNUNrFvt(R_VmHMn*5%*>fNDIeUs>JQAiXWVmbxAxBOU98Fb zk9^$g0{He`vJxes!oEzYS~W{p}ma z)_*dd-`;EOZDr%$KCRzY#JOs@sWV@{Z?!3OD>5HhIC`I%&K8=v$AsO|!^|jJ-MTZsHzTKxWUC_2ZkHa6XI&$}0PE}UO%z5Rn<3HJ_ul>At}D}TbTM2|0rkN>)U zIehX#!SDxF4 zK>*w%O_gB)!ZHXaoDom9>l{e)c*2Um$Wo^~JRIe~TjbP)oJk2Fqq%|pz6%`B4ass! zlrvRExg!0A!FKUV67>-v)GGh=K>EI+;^gOI*k<=X9S@jG{s{Lg}Y}wk%R*>HI{fKscLGJdnKcB z6LN+d%cvUYECq4{lcJiV6Qvb7E<&sew@cA7K-%RrMuOnfCeR6|c$mv^D6J#WY@n}* zOi2}H>x|1PLp9=1P-z=F%#l_=hfqbK*8ui0Lv>;-Cc+xtJPY@#J5v0Rm{O5cK;j$X z-c!21Y#lBQ8oku?Qvg*zfDA;wllW?vw(eT??gGaiq*K6C)({XvxX2LUL! zZLVuUycb;dAD(hN^41z!qGi=rw?-WG`@bNL>H}+j;t$^Z@%0}swBD}`ullzvZQZkY z=wAKZ?g#$E|AE!WV)!0=cTe7bsIY6#9r?Dr^xUCo`vx@SOmyf%cvZL_*96tar_XF znrY`D1@&iJOfp8R4>_M&e3UT3vJ|2azoH?*>=vz@Ju@l>wL~H7?*SG>mMGdN-C6%x z3}2NJv<%Q-qs6|^@;X1x(P$(#avZdrHv^H#J+$Q2vWj}54ERGz^Do?F%8|Y8on*iR7sQywzB?8;=;;{vE6Xn zp>@)3;xGwsdJs@><{agLX9ixxo^h(^P;W}+s$j!<@h=X_4%ZkbtwcjFo2E9R9Dq;= znyoYmWwviwE2<h>%P116BCxitRjA4QL$q7bB>f>3hnHn|wb4-4 zjPrCvv>&1X7z{A9RX3JUmFsqlwm?8ZQ-)~?_&(03uxO~S0|?}y@do62RrxM9R1KV? z5gJ47pWk|X8Nt4O&01KW?y>$rB8#~KBR88D{Y4!6KDa;blY)e+VO8N$H;znaC^gp-k zf9`?5ZLNWDZBxho`*977`mZM*65RfnR8151H@dEfp5J|-7q8WFZ!E$c>{Gve&;@9*j9fk)9dV4;W~pSN-M zv6$|Op{0~bVc8dp{V2nyiak}am>|bvF$LcWm1fL1$aEJttsuCx3Hltbyn-Fy!>k{( zbC@B!D{;tlH$4_~`tK5|_6>P}F%bo`5d75hkiAPjwV!x&{6t|}%R0N&!96~}I+`DQ z7)LY2;A$JDCl}}U&RwyV;P3|+{Q5W^$=lvza#G7 zks6wNLEbTet5pw4-7=}0-n~Ma9+K8&(z?)lXW;fgo^(C&one{AsW-nM_@!(8FTYgZ Az5oCK literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/macro.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/macro.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfaf44d0b2a255482f87712d51d05478275d9283 GIT binary patch literal 2498 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

    6zMq(JuLf#o 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/oinspect.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/oinspect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ef3b7d93d5b300e75d9b8a5da889a5cc26a47f6 GIT binary patch literal 43663 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 IaI5M60}W}+cmMzZ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/page.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/page.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92a859a7e8a0c13c1c7c334345bffdf06ef37853 GIT binary patch literal 12712 zcmcI~Yit}xc5e4{&wDt0zhA8A6!d7 z3>iW4o$BeCAx*3o3#7>DuCA^+Rb6%J)OWtBk4s8C9KwrB|6|D4#c}^c4_2_}A`hl{ zj+^6Tu8)&>*%sydcy_n-+1Op^6WCqs6WQI~XJ>aup96OxYKuAhoII5kqpp~{&&}fY zs3+#_^Rl=j>Wh{1m9V%o>W`K7m9n@iS{5tsD`#^K%e5%6Md2gQn6iqma@|Nf$Ej_2d!{(uj7QFY zGfl3S8{V^->2l-9K9qK`9&GDtlbcXe`-DwyHt&HglmFXuF*p>C4@sfmXmB7L4eMb= zlLiy2bo%0iKAebmg%Yab@$@EiMf2>W;PITo>v&>Z(uc#EG^U|IF0(Y8NQ`Kml9rId zIz-0XbZJ15!f`7@*O(rTYF(0adQciyD2Ftp=pHpJONl|q3+j@rj4E+iiH9aSS(e0D zRF-0is}Q3jhoUN7xpsU(U)dYrjjAhgZESQjq3Vi!VN_9rdN>hBx_B|D5997d9sS`^ z_C0uX%3*CZ8l0f$Wp$!gxu#R*&~RcDcZW8i=}HW-aw?`PYAhTNM*Fq!q=H2E=)|5- zA~qV-LqbvSlYZ0lgEw)RNKs&4p-D?`zs9@Io+ln@?0-+e_>RIM9I zrFP58)oy5=K02c1?_F1w_|@)cc%a)H&OKebc6V!GUD-Jr42=Yb6sgUePo|zw8Ztc#r zb}zN=y0h)h_Qlo%OH~J_PiD)T=f@UHw@-^JqIbF{E&p0k=2RO+Nd)8XT2^Gz5w&4UWY_lAe&zQ{hq4a_J>ai4MLb1=S&shq@*| zrD#Hhg3+iVOF<0+Xv%f5ENf~frE10RK@~3ljh{nvW`rak=90Fz`9I??aqsfI@6zaq zRFNT~BF%7&jI+C&TGdaDvW8|#t%ICLu0zpaY(NeknXC_L{jBOk(FB^K9qF=Ok)hPe zartVBd$;~h&tl-j2d6TD6H}bpfK;^wmjE=MvQdA%#6%m;oIsTZrkh^+aDj{m9?sXp zFN!Bv@kw9%cdzXl_|A*5?{&liYvv%$7}nwY(e>Xt2P-hgHkf&2E3J8x!tDK)c_=hs zCKu1Uq)iqlu@2^Ch`JZ;Vj(G7b5<6aUGLOOtamzT2@8=jD^|EiDhqKdmK0?>DY7Ng zx?{ErvMpt&_p+mb>*2m9b6m>t2h`xOWTu>jmL}~<=VVd6Jf~M%ZL%zsW}{ZVzbZ#RjA{Ha**D1v8h!PPR6V4=ZulPpp4fIhClUNaG20MC&rA>V zRI)8!{5wLRL?v}mX}%c(7A%!CMRl>qs1i5qqbjO3YzfV9GOMhNsulFsoZ~SVNyDLN zp?=(*gWPlTwp7+JZO{5E zm;Egnf6J0zTBu&AS@gG0om%l%q@S4YTzL6r*OEUl_4JCkxF@0jCvU={|?7_LCvqu;9 zELFBm_pJEJ(;W+9refOwt4QA*;f|irP_|^XI4rp()-^?&A+@< zDrH-?FQ_-8v)jmT$iQ-K|6!T5Z+^m}wdh1W0vW;jj z1#X<*LbcPBSr?F7O4;>VD_M4KXbA0AZ&~-G{RcKO;jh@o`9d9flO<>4Rs>v=*<(7e zE6fS71eqiW^OnJhI3^u%20*q6@)B{DY)20> zW>-`dE1DT_p+q#H0T1sSp6wTWx6 zxN&(LXc=;~oLuMS6PJ$lUU)v>HpADiq`*Zoo$x)w$us_02^I)xEw%O;uad76~jUzKh z=C?0YEqS+3^<;fz>9!x9pTE3t_-^xKe-rvy^rz7ehwnboyXxS|q(xWjswmo}&s;U1 zxvE!dMEeOoTivu=y**RC{cY`?$+sq#s&`L&Rz1j+^;g}9&%~GfEz`oPhuhZv&bhbF z{iHV|Zdw$p(<52Y^ZNPkpMUKFB-?$z#&s;-UNArbV&o ztA__TU+tG1522;4chLv|(XUtQIA7(B!!t1XHZP4Czk5=FZmCA zpe?$Nf4yp__g`Z*@-

  1. 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 JO&9Im{{b8@#zp`D literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/prefilter.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/prefilter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75e76aa489fc8d078ed54941e09e6bcc6da4e40e GIT binary patch literal 28510 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 L&XN|Y8ASg-ERkpp literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/profileapp.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/profileapp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f8167f4526b2e17646af8487a0c794b3f56da08 GIT binary patch literal 13236 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�@XSnwSz~FRiMj;^dpj zJV7ZpLMS?P={IZ|=!t$5y$6jK`d2_mAZI!QdO>&{_&P{j-W1bLowx;TvlcBUOm8M7yV4#R5$h zd{u>CP~q1Ks*ZPJT&4U7i$hotd`ZMR4Dpl?Y0-l-frimEb=xQ;8fdIGQ>;$03R=7@eqqESj=JZH(20zW%@}7S*w%y_yHE*heEUFvN;_$AZt~>eqTF} z>K{cMS3Uw_SVKl#gJRXnvg|X?#d2%?49ow9Iq(OIg|+<7&ai`DF#CSRoca~BZ;9Er zDhNKV=w5BJd$^)&)$8|jMPap@2^=eWS2-@kEi(R9!4}|(-sdeYHuSuOXG804E;hUv z+P%)e?|REowrk;)bq0P`|AJ-wfuc}hgfbH>F~Nm5mznKP@yTCe{0q&?OiQIL{N()S z-HWfBSZqC6X}JiJwq9n7!rZq@%$BE}{Z9&?k1R%p7CTO@TG-aJEP(7C=kR^B#I&sQ aZ?UY0bd5Lbla^+7*FyX682BMR@qYn0(Cgj+ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/profiledir.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/profiledir.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..534a6a150a7be83f28bd11f16551578feb9b1032 GIT binary patch literal 11297 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 IGwfXc7u0+>O#lD@ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/prompts.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d252570da9fa42a2a89ff8e48d312099aa90b0a1 GIT binary patch literal 1460 zcmZ`(&2Q936rZuZj@b>YpnNHO$U+=yXxA!1IUx=es6whxrIyP|FmgPTtg|29&dhG) z%^o=95Cknn9FksuN|h>V4{y2VYv61M`5s);0BKihpfi3i6`(#icrTgsfEDQL~vb&XH)~&BttqRY~mam zup8f=3{BWgViWS5-t^4WTIzMe)C%OXO6}$q>!2wVf02cqL?%z^E zDj%4TJ{Nso3#GeFHPN-c==A+owCHye-H1E$wQnx@D$?TXZV)zuWug2VKV%+1jHU3q zGH!RZs&$jpVJzxInz6yL{q)zyW*iuG0^lxrbM)kf_29r*9Y4Kc{Zbi$i-eO)!v+Vb z0?%k204O3Wpr>V}7^nUAA>A(WP#8UkLjtA*tjN-oM4vh3Px>qUkw~n_vocasJ0FWZ zu02B@0Dn$7w##)TUK*JRgI4Q*n90pJ2I>+3FyqWVtlX=-cII9zCe#e=Yvk>+l((tNC$>^K*) zf^T{bcB&J!1!E~BY{$IU!u2d;Klg%G;Q>l`95Ne{!zm iimb=q-mJFTbfWPE++wzrQz08uvJjnz?dbvu)ErbA0| zbK^{B`uooA0w6^@PV-M!;=#A)oc+#Yzwdm{{jW7OUJlnEuKd~fPfl~(-_nhBxlG{R z^EQsV#y!hP+yzeJC0ml8vR$z81lyDLDdB>^U?J(4a$ayU*pYNyaG~9qbWeFMcvzh) z>7DXj@bO%NliZT$JG|tTd?@`=4a$HNL|H4y0Fl+CPcky-(_N$n^% zOIuKGWw0oTfIFlPl$}y1$}Xu3Ww*2q|F*wj|EK%~zm1b?@E4H%lUuDNR({_$L9}*M zYAwiWeH%ML*W0}Dd!bJ9UgqUGDSQ+a_}xLjk{?inK>=^)RRzP!ogd z0W~lv1ZWdM_-%ifN|BWvtn6fE7c0A2x$R+2>irgXp@g;hNNTCL*L>rY?6*k zyYbs7?Llpmv=?Qwv=3#AbVAyXmR9Ki?%JdQ=^*afr9-&eEIHy^e)5)}!OpHWCb!K`xt!UzmmPjVFgset?f#J9aue(lUG+7;b5}Sb3ip_rD&blbE#7nw>+ zGfBC>udlK@u|z7FNXgNW_~=DBC7HLMZ7z3BOlPL1ljU|cdc>|fjpy*o+A)!YG%jPV zSh(&+F%VBEY28EnPyzQDpzXQmb@xDeG#$qpMosdkSHd~*XUE^YKSptl%i>tL#3{X6 zxzD7@G-xhgS?+tBWP8)5309TGT0Ey&2M=elon)u}Z`z3D&T*Q@dPWj7c6`zO_iT~_ zy=-p^7IVJLN1SIPHr;J*l&bqoXwUdeVs2basG=lKEAnVulO<72q()_N=&6i0kxq$+ zqI>rBh}M&0T#?18cq%@Qj)@dNi&VvUN)kuoDRD#=<;$9^q(EvJQIW?JD(++{s{3P= zQDSp0<28wM_2NWa6;o+3u4zhQWJZ(4h*NjZ#+6heHLmIcL3;g3bB2j@>N%rHca100 zBXJOP;JEeZDMd*ux;qw2#i!(041_Nbq|!?eKYO9?Syfilz8RE#l6UT^6oi%C|%d!M?n^?_+QC(!n1dy55tI9(ynJo;%+%wBmgb@*LNj=tG7JbdzvbK}l>-JIGI5%p0p_$|6?OFRIQTDoP z(!H(%w^wc7ZWZv{y!{+E&dm#1?j-lZIpA<$)G~cmo|~+xz!sEsSX4Xj%sLl>TF`0% z?K|c$6RVx)zTKABWoKN4>sf)z3g<9;o~>Y(iwN;ou!V!NCdS1ih*(UI zRnz-eVthuCRdFOE8lae(nHm9gMZI1T*U%WFX=Qw7N=|7i8ZE^UII6(3{P+Q zVz<}@RqPkFndzi4ZQ6z7#y#yFCZLMg0m9FQXB%kk8uh5uvK1Md5oO2~Iy=G5_QBDy zxeoIH=(l!$8=W6`Pu8ABBObk_ayCU{j89_|a&j7zR~`l~Jp@*b;Z4La@0f97xpA}-xcPvWJU2>oji*~X@n6Euz;J#>CdC8neu z!KECg1{aVLc7;xfui;PqHi`xA(`L>Q{m9o)YHBSu^%a`>R+@I_{H0w7KMWqa{>-B7 zn&+ygSSzm7iZ_CX^6o>ogLOHf)X;X9b9j1l1Et!AYwoM=YyPYLrE@E_9l7JBU~Mk* zaqXsjJ`;n7l!&upPn zTe4l;!EuT!>yYeoAclE|B+TCEHsoi9CW@<(!AGQ*|OdO z4X7+3EZp-hU=OT&1h)$T$tk(W$eMTaoQ=!6vsID;_ZvPn8F~;?)-}c_xUBPs{2%j> znXbvE2m6#~~iO=%B@p^1lwhkF5q>Bo@5wpd-qsB=aWv40~!r(t+2z3VNp%M-czc>St zre%hQ#k7Lkk&*OeX!)ZPvN}9m5wpXF=`&2H!+B)}TVO8VsPDyrfQdn|)f5OJXrpn7 zq>U1vHCD^kHHHyJ5~;Y7DfeglDWU<)tr~k4jf$5bK_E2a5>WQ{iwC274l@McX{gC$ zgVBPS&}a2$btk3+%)cP^gGG}Xk2oM-7+T#k79W*I(@7|;9vN1M0otYM1eEm3axL*! zdz$Uj025LtFq+Z9=6~rQ}&MigZU@9Ze)60bPh+mQ~$Bm8$YpnnDdp zzRI}lwlcPJW*RgiD|AjN$EbgEMv0&aI2l1Klu8gR}U=>e1GU450%`3+uoYj!&kx!10|O?H}Uc}OM$w@<5$LW_EMlB zXJ2)5^_xnerebJYA+&8J6kY=d>Pn3rpZJ_!=fa8ATF&8mW$2}$+}KTF)16@BYng>J z!1>DDOLKWw%PsfAAGw>C8g9Bb-xk^y23~peB^=vr1)*)}OhMSSY`Y=sD)}0UzV?Ez zeZ{wB;UvvRemM&};Pr1@`Nq=0m0(v+Saov#+J(nHad6(+kAp2s-OG-f!DunKzYyI2 z&iG335lDJpaN#jS3RIuxWhw9mHsTsru{yKd7*EbB$^Hg}Go5Or(=YHDL8Dj9uB`oS z^OX8JaLx-j`vtf$0ORCmzmoF}8%}H~V2Aaam6GO6eIW#ge$gV48^d)Y(CU_n=V!|IO(NY#r|OTQ((uUxlRb zS>-%R=m!qC7_hGJn5 zbmtB(d=vcgv9E41{MuJuI=OIs;l)x*>(cS>hL-u|-ERqnVDG}2k6bk$*S9Y{w=CbR z-&d?ZQm8-j?%+!O$(*a?t6w~m_qFGRc7r-iio&=Y1hT0z)&qD2^qFH+`7JkT6QBuO z{Ojm`IzFnU6;rDtLkLt+IeTy}lf4AtHj_$`ZGsbf8{jWxoT%|JIVNA0N5@DA!f-Hc zpYqYo)XOQ-Eg=LUSS{OVHla;0IjX|+Asa?k=;$Q*1SPioct76AME~%bVTMJjOfz9) zdJW9EKEp)s8Y_xnI$jx9ok?hhd5C4gUttaiDQGMoGSLz0wY#9C95Za1g$vv3@I6}thq#LQ*;SGiffi_^;LWjCkTsXb$x<&4&dWA0Z~ zv>k^OtXM5^B|QTzZVfe=q(c&L2!?cp63Hx*;9^L?xl6hgGkHvFx}S)kf7l}YVR2+8 zLCRniGRv+aB@q*n;k1iGxq~(cT-Jj-BJcsiZD5#H%=Jf;BZoA)mAPPANyF#@h6yO4 z;4?N!Fg4sB(8*Fz2B3#VnKE-$_f@r?j`)~$q}NsU1RgbVgX>Q7*Q<=i$WsCDq8>;< zLm*x>kn4gvk)G8XBk;FysAjF_%x4Ig#!R4vij7rZKkqNVK{~2_vZg62;%c%B$r( zt+(7^Xd!{-VohhErt|s}@9fWa9bT#F|AgZ`eINN-mbT^n(d*l8_@m2vQ2fe{YEly# zi@xrHuluHNdkHGfnJZ_${U}uji@wf+ue0cj-0(%pEiff>14VyV!QXY$zjM{;@YI#+ zLf6`_w&zZK;^u0Ce{}L!U4)nh{muP$u6D~^fOQ}FYgaK~-Dm1%O!@mYCq(=Ee*cLc z?tRg5BI0_#$8+M4{r!VH%C~TeD>>S~E3`y9@rO-MhqtmR%4?|q&(wh&ci4mbTedjr zR*&(Vzd0{7Jt#Ryd$i;49yv#@abU|0?c0rP+YPN+9_-6ku`jVHNndt>O>5_E6~DUG zFKc_*Ch_yOe_)&C%M5IrYlLkDx+B|*#THC+>}M<11doLS0v} zZfBuxXU>WD>k0mm`|t0&IDaeNs$xu*U5}hqn)Z_kM|YvPNXsDGuaZEK~bhagg*17N88AEZBZP& z@E+3(416>6?|UQjz9YyC(Y>kC%YrQ2U+B^BX1$UdajTxsSqEYQ z>#uoV);C%9X;fOXg4S-`S$oHG6P)DvC;Yr0F@X)j&)JHM$3Qa!`k`6aOKtiswL1rxlXtX1I* znK(C@Gj;t=GYx&tOdHJ^I({c?O;Y0qGi+wKy0h-z30L#RGt1aAHZ$hqnYE%nYoJI= zJO<`ICnx36va{NB3NagmeAz}s*$R_>Ig13*h$JkLp^6%Fj;hMa)Op~YLZGJ{iY4Dw z9L{Y+p|_^c&-_|265!=7Kl@}#CYM>9D#<)B+-sIEi)nVunCch9uq?wpV%RVn37VXi zSq*vpaEl0h*cfr=PQzD&Nyk%}@>r)XYf8M@*=Gj4pgzKs`mH{{s`w7eSTHQ$ft6bfb8Lw0hk>IX$j) zQr)vu(4nFWgawhE)cBsu%zU4-ZBswvd*+(V#0!|4)<#1??-%DBEYieKoL8m^5n27p zKca%!>wiMfpHe|17`^}+HPZN?hHJbQ!gG_os4H<#(2^gaB3Dn?PLN zc>hR^&=eGiNjaIT4FRg@^tA3Hzn&SXhr=&D3luHLaiBPU>_O~qV2^1TDD0$4=w2x? zX2uh-E$Ku`hi_sUllTMj<}ocrA=i)Lupqxeq!xhl)SJhfPW4H(_rJ<#7QW^i6 z%9A;as{Cs_-~e~4PeEUWLXOZ|<1Jyw?NCcGw5t%>RSX>{gbuv(%|d8!;fd0^+HVv> z0}s|_3!#$_)aDPKDTIa=p19+Jcjb+}H(gsx4Xuljoa+wUk>S^p3xl`2b`-n%3tj!i zu2Y4sQ^l^w3tf+|be;WBcxoxW5PwB}NzR>KJo$mMWkq4Vc!lNZuU4GNKg6mw>OivX;r*fW>yRPVNEx22k4&3ZIc+-98=e2_iLnUur(c50| zwl95k#S0hdM=o!vrfzZI+L^0omemh8?_KVAL%P2E&G8$X_pXHY6>9e7Y?Tg~4>upK zbU3^c>Mzvv=WMqE&HqmM%RTv)(<_0&ynFDr%fIL^rd$JIE?7h<{?%Qo1FS(&=7Y`O(txMy}O@%EFl^+&Dseu+}T3->Gw9}!%zRsc0f1X&seyB3(`;7yzQL3 z`PX;%a*n6@U*E0gw(R@0zWFdys^8z+GPGUzYoUHW3cku2HIqqnLT)1Ob+n zYFouMYbkBYB}7)Cc(1>{tZEAfEGOBad~^ekcRd#5>KO{T0M)S^bgT5L1m#QzF_+p} zrT&&fZS$mh)>WRfph_^#dR{B5vz0bH4X+D1iM6u&O2Iz2Gn(U#?udhCJk;z1l@H54FZ%0ALmBtHw` z9g=MGTx$Op?+-?;!KgL!q-J|2$t+%XRV(FK5wG|uGR{VIWqH(8j~rkl!%tROdn6eD zDUPH;$`yeGM~W6ncnaV_Mw3&N6b`DTKp)P>-%0DB=a|M&7T<^^k(^GG#xN%C2x}L^ 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 YG`f892a`tAxp(*d_`-c^Vnq3W0RwYLhyVZp literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/release.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/release.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9264256ae8c4a2ef9dd582a7be1b1a8cc044fdda GIT binary patch literal 846 zcmY*XJ#W)M81`45wwUihd`Y|#!3AXJqK386v-Ww`;%&AmyS#vi(KBI*H| z3BiI8104|R2U4+jr?hH^p+VsZ z?T8toA}AyWJjQ&2vmz>GTA(x)RK_aOZ~+%_>63&ixQukHp^44PoE~3!0$p$@7}$v% zqZtq*YJ>4$bu(%Qz7dk31C7W$C~(~aBMtl$V#UPJXTq^)#@f=;<@!SXUf1bSn3H1t zJ`msWabTiN+)oACVNiEWEv4xw$Eg3rk++{+NhN4Hv^`2-3Is+nCkR+ zZwY1jEMZ!PHl*G8DjcO9K1S9v%AH!gsl?(3vLc{SxIxd*?1SI8y6(D_9d*IHId4%n zf_msQHk=kv>+}|_MnJ$K**%-#=5gVU7vNqO?vfc^Dt$xrH4lffD2l&@8;6EaJD2E# z>Pe`j*>s{0Q+k*eiql*A7kyW~l_*2K`mX(^{hn?uY%3pL?&(*P@-MkMs9oNk{aLe; zhr`lTq7Ei!xAkxOcYSx_aiVdB^2J2uP`y1U&i~2DWr@?0P`aMvhZEOcY2*_3@)!I! B36uZ; literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/shellapp.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/shellapp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76ffc43587a71c409c287c0ba4f30c2bd12f3cb2 GIT binary patch literal 24057 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/usage.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/usage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29033610b732ae01d171883bbc8e2287a5ba4844 GIT binary patch literal 13514 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 t.List[t.Tuple[str, str]]: + """Return list of shell aliases to auto-define. + """ + # Note: the aliases defined here should be safe to use on a kernel + # regardless of what frontend it is attached to. Frontends that use a + # kernel in-process can define additional aliases that will only work in + # their case. For example, things like 'less' or 'clear' that manipulate + # the terminal should NOT be declared here, as they will only work if the + # kernel is running inside a true terminal, and not over the network. + + if os.name == 'posix': + default_aliases = [('mkdir', 'mkdir'), ('rmdir', 'rmdir'), + ('mv', 'mv'), ('rm', 'rm'), ('cp', 'cp'), + ('cat', 'cat'), + ] + # Useful set of ls aliases. The GNU and BSD options are a little + # different, so we make aliases that provide as similar as possible + # behavior in ipython, by passing the right flags for each platform + if sys.platform.startswith('linux'): + ls_aliases = [('ls', 'ls -F --color'), + # long ls + ('ll', 'ls -F -o --color'), + # ls normal files only + ('lf', 'ls -F -o --color %l | grep ^-'), + # ls symbolic links + ('lk', 'ls -F -o --color %l | grep ^l'), + # directories or links to directories, + ('ldir', 'ls -F -o --color %l | grep /$'), + # things which are executable + ('lx', 'ls -F -o --color %l | grep ^-..x'), + ] + elif sys.platform.startswith('openbsd') or sys.platform.startswith('netbsd'): + # OpenBSD, NetBSD. The ls implementation on these platforms do not support + # the -G switch and lack the ability to use colorized output. + ls_aliases = [('ls', 'ls -F'), + # long ls + ('ll', 'ls -F -l'), + # ls normal files only + ('lf', 'ls -F -l %l | grep ^-'), + # ls symbolic links + ('lk', 'ls -F -l %l | grep ^l'), + # directories or links to directories, + ('ldir', 'ls -F -l %l | grep /$'), + # things which are executable + ('lx', 'ls -F -l %l | grep ^-..x'), + ] + else: + # BSD, OSX, etc. + ls_aliases = [('ls', 'ls -F -G'), + # long ls + ('ll', 'ls -F -l -G'), + # ls normal files only + ('lf', 'ls -F -l -G %l | grep ^-'), + # ls symbolic links + ('lk', 'ls -F -l -G %l | grep ^l'), + # directories or links to directories, + ('ldir', 'ls -F -G -l %l | grep /$'), + # things which are executable + ('lx', 'ls -F -l -G %l | grep ^-..x'), + ] + default_aliases = default_aliases + ls_aliases + elif os.name in ['nt', 'dos']: + default_aliases = [('ls', 'dir /on'), + ('ddir', 'dir /ad /on'), ('ldir', 'dir /ad /on'), + ('mkdir', 'mkdir'), ('rmdir', 'rmdir'), + ('echo', 'echo'), ('ren', 'ren'), ('copy', 'copy'), + ] + else: + default_aliases = [] + + return default_aliases + + +class AliasError(Exception): + pass + + +class InvalidAliasError(AliasError): + pass + +class Alias(object): + """Callable object storing the details of one alias. + + Instances are registered as magic functions to allow use of aliases. + """ + + # Prepare blacklist + blacklist = {'cd','popd','pushd','dhist','alias','unalias'} + + def __init__(self, shell, name, cmd): + self.shell = shell + self.name = name + self.cmd = cmd + self.__doc__ = "Alias for `!{}`".format(cmd) + self.nargs = self.validate() + + def validate(self): + """Validate the alias, and return the number of arguments.""" + if self.name in self.blacklist: + raise InvalidAliasError("The name %s can't be aliased " + "because it is a keyword or builtin." % self.name) + try: + caller = self.shell.magics_manager.magics['line'][self.name] + except KeyError: + pass + else: + if not isinstance(caller, Alias): + raise InvalidAliasError("The name %s can't be aliased " + "because it is another magic command." % self.name) + + if not (isinstance(self.cmd, str)): + raise InvalidAliasError("An alias command must be a string, " + "got: %r" % self.cmd) + + nargs = self.cmd.count('%s') - self.cmd.count('%%s') + + if (nargs > 0) and (self.cmd.find('%l') >= 0): + raise InvalidAliasError('The %s and %l specifiers are mutually ' + 'exclusive in alias definitions.') + + return nargs + + def __repr__(self): + return "".format(self.name, self.cmd) + + def __call__(self, rest=''): + cmd = self.cmd + nargs = self.nargs + # Expand the %l special to be the user's input line + if cmd.find('%l') >= 0: + cmd = cmd.replace('%l', rest) + rest = '' + + if nargs==0: + if cmd.find('%%s') >= 1: + cmd = cmd.replace('%%s', '%s') + # Simple, argument-less aliases + cmd = '%s %s' % (cmd, rest) + else: + # Handle aliases with positional arguments + args = rest.split(None, nargs) + if len(args) < nargs: + raise UsageError('Alias <%s> requires %s arguments, %s given.' % + (self.name, nargs, len(args))) + cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:])) + + self.shell.system(cmd) + +#----------------------------------------------------------------------------- +# Main AliasManager class +#----------------------------------------------------------------------------- + +class AliasManager(Configurable): + default_aliases: List = List(default_aliases()).tag(config=True) + user_aliases: List = List(default_value=[]).tag(config=True) + shell = Instance( + "IPython.core.interactiveshell.InteractiveShellABC", allow_none=True + ) + + def __init__(self, shell=None, **kwargs): + super(AliasManager, self).__init__(shell=shell, **kwargs) + # For convenient access + if self.shell is not None: + self.linemagics = self.shell.magics_manager.magics["line"] + self.init_aliases() + + def init_aliases(self): + # Load default & user aliases + for name, cmd in self.default_aliases + self.user_aliases: + if ( + cmd.startswith("ls ") + and self.shell is not None + and self.shell.colors == "NoColor" + ): + cmd = cmd.replace(" --color", "") + self.soft_define_alias(name, cmd) + + @property + def aliases(self): + return [(n, func.cmd) for (n, func) in self.linemagics.items() + if isinstance(func, Alias)] + + def soft_define_alias(self, name, cmd): + """Define an alias, but don't raise on an AliasError.""" + try: + self.define_alias(name, cmd) + except AliasError as e: + error("Invalid alias: %s" % e) + + def define_alias(self, name, cmd): + """Define a new alias after validating it. + + This will raise an :exc:`AliasError` if there are validation + problems. + """ + caller = Alias(shell=self.shell, name=name, cmd=cmd) + self.shell.magics_manager.register_function(caller, magic_kind='line', + magic_name=name) + + def get_alias(self, name): + """Return an alias, or None if no alias by that name exists.""" + aname = self.linemagics.get(name, None) + return aname if isinstance(aname, Alias) else None + + def is_alias(self, name): + """Return whether or not a given name has been defined as an alias""" + return self.get_alias(name) is not None + + def undefine_alias(self, name): + if self.is_alias(name): + del self.linemagics[name] + else: + raise ValueError('%s is not an alias' % name) + + def clear_aliases(self): + for name, _ in self.aliases: + self.undefine_alias(name) + + def retrieve_alias(self, name): + """Retrieve the command to which an alias expands.""" + caller = self.get_alias(name) + if caller: + return caller.cmd + else: + raise ValueError('%s is not an alias' % name) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/application.py b/.venv/lib/python3.12/site-packages/IPython/core/application.py new file mode 100644 index 0000000..841e867 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/application.py @@ -0,0 +1,492 @@ +# encoding: utf-8 +""" +An application for IPython. + +All top-level applications should use the classes in this module for +handling configuration and creating configurables. + +The job of an :class:`Application` is to create the master configuration +object and then create the configurable objects, passing the config to them. +""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +import atexit +from copy import deepcopy +import logging +import os +import shutil +import sys + +from pathlib import Path + +from traitlets.config.application import Application, catch_config_error +from traitlets.config.loader import ConfigFileNotFound, PyFileConfigLoader +from IPython.core import release, crashhandler +from IPython.core.profiledir import ProfileDir, ProfileDirError +from IPython.paths import get_ipython_dir, get_ipython_package_dir +from IPython.utils.path import ensure_dir_exists +from traitlets import ( + List, Unicode, Type, Bool, Set, Instance, Undefined, + default, observe, +) + +if os.name == "nt": + programdata = os.environ.get("PROGRAMDATA", None) + if programdata is not None: + SYSTEM_CONFIG_DIRS = [str(Path(programdata) / "ipython")] + else: # PROGRAMDATA is not defined by default on XP. + SYSTEM_CONFIG_DIRS = [] +else: + SYSTEM_CONFIG_DIRS = [ + "/usr/local/etc/ipython", + "/etc/ipython", + ] + + +ENV_CONFIG_DIRS = [] +_env_config_dir = os.path.join(sys.prefix, 'etc', 'ipython') +if _env_config_dir not in SYSTEM_CONFIG_DIRS: + # only add ENV_CONFIG if sys.prefix is not already included + ENV_CONFIG_DIRS.append(_env_config_dir) + + +_envvar = os.environ.get('IPYTHON_SUPPRESS_CONFIG_ERRORS') +if _envvar in {None, ''}: + IPYTHON_SUPPRESS_CONFIG_ERRORS = None +else: + if _envvar.lower() in {'1','true'}: + IPYTHON_SUPPRESS_CONFIG_ERRORS = True + elif _envvar.lower() in {'0','false'} : + IPYTHON_SUPPRESS_CONFIG_ERRORS = False + else: + sys.exit("Unsupported value for environment variable: 'IPYTHON_SUPPRESS_CONFIG_ERRORS' is set to '%s' which is none of {'0', '1', 'false', 'true', ''}."% _envvar ) + +# aliases and flags + +base_aliases = {} +if isinstance(Application.aliases, dict): + # traitlets 5 + base_aliases.update(Application.aliases) +base_aliases.update( + { + "profile-dir": "ProfileDir.location", + "profile": "BaseIPythonApplication.profile", + "ipython-dir": "BaseIPythonApplication.ipython_dir", + "log-level": "Application.log_level", + "config": "BaseIPythonApplication.extra_config_file", + } +) + +base_flags = dict() +if isinstance(Application.flags, dict): + # traitlets 5 + base_flags.update(Application.flags) +base_flags.update( + dict( + debug=( + {"Application": {"log_level": logging.DEBUG}}, + "set log level to logging.DEBUG (maximize logging output)", + ), + quiet=( + {"Application": {"log_level": logging.CRITICAL}}, + "set log level to logging.CRITICAL (minimize logging output)", + ), + init=( + { + "BaseIPythonApplication": { + "copy_config_files": True, + "auto_create": True, + } + }, + """Initialize profile with default config files. This is equivalent + to running `ipython profile create ` prior to startup. + """, + ), + ) +) + + +class ProfileAwareConfigLoader(PyFileConfigLoader): + """A Python file config loader that is aware of IPython profiles.""" + def load_subconfig(self, fname, path=None, profile=None): + if profile is not None: + try: + profile_dir = ProfileDir.find_profile_dir_by_name( + get_ipython_dir(), + profile, + ) + except ProfileDirError: + return + path = profile_dir.location + return super(ProfileAwareConfigLoader, self).load_subconfig(fname, path=path) + +class BaseIPythonApplication(Application): + name = "ipython" + description = "IPython: an enhanced interactive Python shell." + version = Unicode(release.version) + + aliases = base_aliases + flags = base_flags + classes = List([ProfileDir]) + + # enable `load_subconfig('cfg.py', profile='name')` + python_config_loader_class = ProfileAwareConfigLoader + + # Track whether the config_file has changed, + # because some logic happens only if we aren't using the default. + config_file_specified = Set() + + config_file_name = Unicode() + @default('config_file_name') + def _config_file_name_default(self): + return self.name.replace('-','_') + u'_config.py' + @observe('config_file_name') + def _config_file_name_changed(self, change): + if change['new'] != change['old']: + self.config_file_specified.add(change['new']) + + # The directory that contains IPython's builtin profiles. + builtin_profile_dir = Unicode( + os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default') + ) + + config_file_paths = List(Unicode()) + @default('config_file_paths') + def _config_file_paths_default(self): + return [] + + extra_config_file = Unicode( + help="""Path to an extra config file to load. + + If specified, load this config file in addition to any other IPython config. + """).tag(config=True) + @observe('extra_config_file') + def _extra_config_file_changed(self, change): + old = change['old'] + new = change['new'] + try: + self.config_files.remove(old) + except ValueError: + pass + self.config_file_specified.add(new) + self.config_files.append(new) + + profile = Unicode(u'default', + help="""The IPython profile to use.""" + ).tag(config=True) + + @observe('profile') + def _profile_changed(self, change): + self.builtin_profile_dir = os.path.join( + get_ipython_package_dir(), u'config', u'profile', change['new'] + ) + + add_ipython_dir_to_sys_path = Bool( + False, + """Should the IPython profile directory be added to sys path ? + + This option was non-existing before IPython 8.0, and ipython_dir was added to + sys path to allow import of extensions present there. This was historical + baggage from when pip did not exist. This now default to false, + but can be set to true for legacy reasons. + """, + ).tag(config=True) + + ipython_dir = Unicode( + help=""" + The name of the IPython directory. This directory is used for logging + configuration (through profiles), history storage, etc. The default + is usually $HOME/.ipython. This option can also be specified through + the environment variable IPYTHONDIR. + """ + ).tag(config=True) + @default('ipython_dir') + def _ipython_dir_default(self): + d = get_ipython_dir() + self._ipython_dir_changed({ + 'name': 'ipython_dir', + 'old': d, + 'new': d, + }) + return d + + _in_init_profile_dir = False + + profile_dir = Instance(ProfileDir, allow_none=True) + + @default('profile_dir') + def _profile_dir_default(self): + # avoid recursion + if self._in_init_profile_dir: + return + # profile_dir requested early, force initialization + self.init_profile_dir() + return self.profile_dir + + overwrite = Bool(False, + help="""Whether to overwrite existing config files when copying""" + ).tag(config=True) + + auto_create = Bool(False, + help="""Whether to create profile dir if it doesn't exist""" + ).tag(config=True) + + config_files = List(Unicode()) + + @default('config_files') + def _config_files_default(self): + return [self.config_file_name] + + copy_config_files = Bool(False, + help="""Whether to install the default config files into the profile dir. + If a new profile is being created, and IPython contains config files for that + profile, then they will be staged into the new directory. Otherwise, + default config files will be automatically generated. + """).tag(config=True) + + verbose_crash = Bool(False, + help="""Create a massive crash report when IPython encounters what may be an + internal error. The default is to append a short message to the + usual traceback""").tag(config=True) + + # The class to use as the crash handler. + crash_handler_class = Type(crashhandler.CrashHandler) + + @catch_config_error + def __init__(self, **kwargs): + super(BaseIPythonApplication, self).__init__(**kwargs) + # ensure current working directory exists + try: + os.getcwd() + except: + # exit if cwd doesn't exist + self.log.error("Current working directory doesn't exist.") + self.exit(1) + + #------------------------------------------------------------------------- + # Various stages of Application creation + #------------------------------------------------------------------------- + + def init_crash_handler(self): + """Create a crash handler, typically setting sys.excepthook to it.""" + self.crash_handler = self.crash_handler_class(self) + sys.excepthook = self.excepthook + def unset_crashhandler(): + sys.excepthook = sys.__excepthook__ + atexit.register(unset_crashhandler) + + def excepthook(self, etype, evalue, tb): + """this is sys.excepthook after init_crashhandler + + set self.verbose_crash=True to use our full crashhandler, instead of + a regular traceback with a short message (crash_handler_lite) + """ + + if self.verbose_crash: + return self.crash_handler(etype, evalue, tb) + else: + return crashhandler.crash_handler_lite(etype, evalue, tb) + + @observe('ipython_dir') + def _ipython_dir_changed(self, change): + old = change['old'] + new = change['new'] + if old is not Undefined: + str_old = os.path.abspath(old) + if str_old in sys.path: + sys.path.remove(str_old) + if self.add_ipython_dir_to_sys_path: + str_path = os.path.abspath(new) + sys.path.append(str_path) + ensure_dir_exists(new) + readme = os.path.join(new, "README") + readme_src = os.path.join( + get_ipython_package_dir(), "config", "profile", "README" + ) + if not os.path.exists(readme) and os.path.exists(readme_src): + shutil.copy(readme_src, readme) + for d in ("extensions", "nbextensions"): + path = os.path.join(new, d) + try: + ensure_dir_exists(path) + except OSError as e: + # this will not be EEXIST + self.log.error("couldn't create path %s: %s", path, e) + self.log.debug("IPYTHONDIR set to: %s", new) + + def load_config_file(self, suppress_errors=IPYTHON_SUPPRESS_CONFIG_ERRORS): + """Load the config file. + + By default, errors in loading config are handled, and a warning + printed on screen. For testing, the suppress_errors option is set + to False, so errors will make tests fail. + + `suppress_errors` default value is to be `None` in which case the + behavior default to the one of `traitlets.Application`. + + The default value can be set : + - to `False` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '0', or 'false' (case insensitive). + - to `True` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '1' or 'true' (case insensitive). + - to `None` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '' (empty string) or leaving it unset. + + Any other value are invalid, and will make IPython exit with a non-zero return code. + """ + + + self.log.debug("Searching path %s for config files", self.config_file_paths) + base_config = 'ipython_config.py' + self.log.debug("Attempting to load config file: %s" % + base_config) + try: + if suppress_errors is not None: + old_value = Application.raise_config_file_errors + Application.raise_config_file_errors = not suppress_errors; + Application.load_config_file( + self, + base_config, + path=self.config_file_paths + ) + except ConfigFileNotFound: + # ignore errors loading parent + self.log.debug("Config file %s not found", base_config) + pass + if suppress_errors is not None: + Application.raise_config_file_errors = old_value + + for config_file_name in self.config_files: + if not config_file_name or config_file_name == base_config: + continue + self.log.debug("Attempting to load config file: %s" % + self.config_file_name) + try: + Application.load_config_file( + self, + config_file_name, + path=self.config_file_paths + ) + except ConfigFileNotFound: + # Only warn if the default config file was NOT being used. + if config_file_name in self.config_file_specified: + msg = self.log.warning + else: + msg = self.log.debug + msg("Config file not found, skipping: %s", config_file_name) + except Exception: + # For testing purposes. + if not suppress_errors: + raise + self.log.warning("Error loading config file: %s" % + self.config_file_name, exc_info=True) + + def init_profile_dir(self): + """initialize the profile dir""" + self._in_init_profile_dir = True + if self.profile_dir is not None: + # already ran + return + if 'ProfileDir.location' not in self.config: + # location not specified, find by profile name + try: + p = ProfileDir.find_profile_dir_by_name(self.ipython_dir, self.profile, self.config) + except ProfileDirError: + # not found, maybe create it (always create default profile) + if self.auto_create or self.profile == 'default': + try: + p = ProfileDir.create_profile_dir_by_name(self.ipython_dir, self.profile, self.config) + except ProfileDirError: + self.log.fatal("Could not create profile: %r"%self.profile) + self.exit(1) + else: + self.log.info("Created profile dir: %r"%p.location) + else: + self.log.fatal("Profile %r not found."%self.profile) + self.exit(1) + else: + self.log.debug("Using existing profile dir: %r", p.location) + else: + location = self.config.ProfileDir.location + # location is fully specified + try: + p = ProfileDir.find_profile_dir(location, self.config) + except ProfileDirError: + # not found, maybe create it + if self.auto_create: + try: + p = ProfileDir.create_profile_dir(location, self.config) + except ProfileDirError: + self.log.fatal("Could not create profile directory: %r"%location) + self.exit(1) + else: + self.log.debug("Creating new profile dir: %r"%location) + else: + self.log.fatal("Profile directory %r not found."%location) + self.exit(1) + else: + self.log.debug("Using existing profile dir: %r", p.location) + # if profile_dir is specified explicitly, set profile name + dir_name = os.path.basename(p.location) + if dir_name.startswith('profile_'): + self.profile = dir_name[8:] + + self.profile_dir = p + self.config_file_paths.append(p.location) + self._in_init_profile_dir = False + + def init_config_files(self): + """[optionally] copy default config files into profile dir.""" + self.config_file_paths.extend(ENV_CONFIG_DIRS) + self.config_file_paths.extend(SYSTEM_CONFIG_DIRS) + # copy config files + path = Path(self.builtin_profile_dir) + if self.copy_config_files: + src = self.profile + + cfg = self.config_file_name + if path and (path / cfg).exists(): + self.log.warning( + "Staging %r from %s into %r [overwrite=%s]" + % (cfg, src, self.profile_dir.location, self.overwrite) + ) + self.profile_dir.copy_config_file(cfg, path=path, overwrite=self.overwrite) + else: + self.stage_default_config_file() + else: + # Still stage *bundled* config files, but not generated ones + # This is necessary for `ipython profile=sympy` to load the profile + # on the first go + files = path.glob("*.py") + for fullpath in files: + cfg = fullpath.name + if self.profile_dir.copy_config_file(cfg, path=path, overwrite=False): + # file was copied + self.log.warning("Staging bundled %s from %s into %r"%( + cfg, self.profile, self.profile_dir.location) + ) + + + def stage_default_config_file(self): + """auto generate default config file, and stage it into the profile.""" + s = self.generate_config_file() + config_file = Path(self.profile_dir.location) / self.config_file_name + if self.overwrite or not config_file.exists(): + self.log.warning("Generating default config file: %r", (config_file)) + config_file.write_text(s, encoding="utf-8") + + @catch_config_error + def initialize(self, argv=None): + # don't hook up crash handler before parsing command-line + self.parse_command_line(argv) + self.init_crash_handler() + if self.subapp is not None: + # stop here if subapp is taking over + return + # save a copy of CLI config to re-load after config files + # so that it has highest priority + cl_config = deepcopy(self.config) + self.init_profile_dir() + self.init_config_files() + self.load_config_file() + # enforce cl-opts override configfile opts: + self.update_config(cl_config) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/async_helpers.py b/.venv/lib/python3.12/site-packages/IPython/core/async_helpers.py new file mode 100644 index 0000000..4dfac54 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/async_helpers.py @@ -0,0 +1,155 @@ +""" +Async helper function that are invalid syntax on Python 3.5 and below. + +This code is best effort, and may have edge cases not behaving as expected. In +particular it contain a number of heuristics to detect whether code is +effectively async and need to run in an event loop or not. + +Some constructs (like top-level `return`, or `yield`) are taken care of +explicitly to actually raise a SyntaxError and stay as close as possible to +Python semantics. +""" + +import ast +import asyncio +import inspect +from functools import wraps + +_asyncio_event_loop = None + + +def get_asyncio_loop(): + """asyncio has deprecated get_event_loop + + Replicate it here, with our desired semantics: + + - always returns a valid, not-closed loop + - not thread-local like asyncio's, + because we only want one loop for IPython + - if called from inside a coroutine (e.g. in ipykernel), + return the running loop + + .. versionadded:: 8.0 + """ + try: + return asyncio.get_running_loop() + except RuntimeError: + # not inside a coroutine, + # track our own global + pass + + # not thread-local like asyncio's, + # because we only track one event loop to run for IPython itself, + # always in the main thread. + global _asyncio_event_loop + if _asyncio_event_loop is None or _asyncio_event_loop.is_closed(): + _asyncio_event_loop = asyncio.new_event_loop() + return _asyncio_event_loop + + +class _AsyncIORunner: + def __call__(self, coro): + """ + Handler for asyncio autoawait + """ + return get_asyncio_loop().run_until_complete(coro) + + def __str__(self): + return "asyncio" + + +_asyncio_runner = _AsyncIORunner() + + +class _AsyncIOProxy: + """Proxy-object for an asyncio + + Any coroutine methods will be wrapped in event_loop.run_ + """ + + def __init__(self, obj, event_loop): + self._obj = obj + self._event_loop = event_loop + + def __repr__(self): + return f"<_AsyncIOProxy({self._obj!r})>" + + def __getattr__(self, key): + attr = getattr(self._obj, key) + if inspect.iscoroutinefunction(attr): + # if it's a coroutine method, + # return a threadsafe wrapper onto the _current_ asyncio loop + @wraps(attr) + def _wrapped(*args, **kwargs): + concurrent_future = asyncio.run_coroutine_threadsafe( + attr(*args, **kwargs), self._event_loop + ) + return asyncio.wrap_future(concurrent_future) + + return _wrapped + else: + return attr + + def __dir__(self): + return dir(self._obj) + + +def _curio_runner(coroutine): + """ + handler for curio autoawait + """ + import curio + + return curio.run(coroutine) + + +def _trio_runner(async_fn): + import trio + + async def loc(coro): + """ + We need the dummy no-op async def to protect from + trio's internal. See https://github.com/python-trio/trio/issues/89 + """ + return await coro + + return trio.run(loc, async_fn) + + +def _pseudo_sync_runner(coro): + """ + A runner that does not really allow async execution, and just advance the coroutine. + + See discussion in https://github.com/python-trio/trio/issues/608, + + Credit to Nathaniel Smith + """ + try: + coro.send(None) + except StopIteration as exc: + return exc.value + else: + # TODO: do not raise but return an execution result with the right info. + raise RuntimeError( + "{coro_name!r} needs a real async loop".format(coro_name=coro.__name__) + ) + + +def _should_be_async(cell: str) -> bool: + """Detect if a block of code need to be wrapped in an `async def` + + Attempt to parse the block of code, it it compile we're fine. + Otherwise we wrap if and try to compile. + + If it works, assume it should be async. Otherwise Return False. + + Not handled yet: If the block of code has a return statement as the top + level, it will be seen as async. This is a know limitation. + """ + try: + code = compile( + cell, "<>", "exec", flags=getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0) + ) + return inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE + except (SyntaxError, MemoryError): + return False diff --git a/.venv/lib/python3.12/site-packages/IPython/core/autocall.py b/.venv/lib/python3.12/site-packages/IPython/core/autocall.py new file mode 100644 index 0000000..54beec3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/autocall.py @@ -0,0 +1,70 @@ +# encoding: utf-8 +""" +Autocall capabilities for IPython.core. + +Authors: + +* Brian Granger +* Fernando Perez +* Thomas Kluyver + +Notes +----- +""" + +#----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + + +#----------------------------------------------------------------------------- +# Code +#----------------------------------------------------------------------------- + +class IPyAutocall(object): + """ Instances of this class are always autocalled + + This happens regardless of 'autocall' variable state. Use this to + develop macro-like mechanisms. + """ + _ip = None + rewrite = True + def __init__(self, ip=None): + self._ip = ip + + def set_ip(self, ip): + """Will be used to set _ip point to current ipython instance b/f call + + Override this method if you don't want this to happen. + + """ + self._ip = ip + + +class ExitAutocall(IPyAutocall): + """An autocallable object which will be added to the user namespace so that + exit, exit(), quit or quit() are all valid ways to close the shell.""" + rewrite = False + + def __call__(self): + self._ip.ask_exit() + +class ZMQExitAutocall(ExitAutocall): + """Exit IPython. Autocallable, so it needn't be explicitly called. + + Parameters + ---------- + keep_kernel : bool + If True, leave the kernel alive. Otherwise, tell the kernel to exit too + (default). + """ + def __call__(self, keep_kernel=False): + self._ip.keepkernel_on_exit = keep_kernel + self._ip.ask_exit() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py b/.venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py new file mode 100644 index 0000000..a8ea4ab --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py @@ -0,0 +1,86 @@ +""" +A context manager for managing things injected into :mod:`builtins`. +""" +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. +import builtins as builtin_mod + +from traitlets.config.configurable import Configurable + +from traitlets import Instance + + +class __BuiltinUndefined(object): pass +BuiltinUndefined = __BuiltinUndefined() + +class __HideBuiltin(object): pass +HideBuiltin = __HideBuiltin() + + +class BuiltinTrap(Configurable): + + shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', + allow_none=True) + + def __init__(self, shell=None): + super(BuiltinTrap, self).__init__(shell=shell, config=None) + self._orig_builtins = {} + # We define this to track if a single BuiltinTrap is nested. + # Only turn off the trap when the outermost call to __exit__ is made. + self._nested_level = 0 + self.shell = shell + # builtins we always add - if set to HideBuiltin, they will just + # be removed instead of being replaced by something else + self.auto_builtins = {'exit': HideBuiltin, + 'quit': HideBuiltin, + 'get_ipython': self.shell.get_ipython, + } + + def __enter__(self): + if self._nested_level == 0: + self.activate() + self._nested_level += 1 + # I return self, so callers can use add_builtin in a with clause. + return self + + def __exit__(self, type, value, traceback): + if self._nested_level == 1: + self.deactivate() + self._nested_level -= 1 + # Returning False will cause exceptions to propagate + return False + + def add_builtin(self, key, value): + """Add a builtin and save the original.""" + bdict = builtin_mod.__dict__ + orig = bdict.get(key, BuiltinUndefined) + if value is HideBuiltin: + if orig is not BuiltinUndefined: #same as 'key in bdict' + self._orig_builtins[key] = orig + del bdict[key] + else: + self._orig_builtins[key] = orig + bdict[key] = value + + def remove_builtin(self, key, orig): + """Remove an added builtin and re-set the original.""" + if orig is BuiltinUndefined: + del builtin_mod.__dict__[key] + else: + builtin_mod.__dict__[key] = orig + + def activate(self): + """Store ipython references in the __builtin__ namespace.""" + + add_builtin = self.add_builtin + for name, func in self.auto_builtins.items(): + add_builtin(name, func) + + def deactivate(self): + """Remove any builtins which might have been added by add_builtins, or + restore overwritten ones to their previous values.""" + remove_builtin = self.remove_builtin + for key, val in self._orig_builtins.items(): + remove_builtin(key, val) + self._orig_builtins.clear() + self._builtins_added = False diff --git a/.venv/lib/python3.12/site-packages/IPython/core/compilerop.py b/.venv/lib/python3.12/site-packages/IPython/core/compilerop.py new file mode 100644 index 0000000..7799a4f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/compilerop.py @@ -0,0 +1,214 @@ +"""Compiler tools with improved interactive support. + +Provides compilation machinery similar to codeop, but with caching support so +we can provide interactive tracebacks. + +Authors +------- +* Robert Kern +* Fernando Perez +* Thomas Kluyver +""" + +# Note: though it might be more natural to name this module 'compiler', that +# name is in the stdlib and name collisions with the stdlib tend to produce +# weird problems (often with third-party tools). + +#----------------------------------------------------------------------------- +# Copyright (C) 2010-2011 The IPython Development Team. +# +# Distributed under the terms of the BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +# Stdlib imports +import __future__ +from ast import PyCF_ONLY_AST +import codeop +import functools +import hashlib +import linecache +import operator +import time +from contextlib import contextmanager + +#----------------------------------------------------------------------------- +# Constants +#----------------------------------------------------------------------------- + +# Roughly equal to PyCF_MASK | PyCF_MASK_OBSOLETE as defined in pythonrun.h, +# this is used as a bitmask to extract future-related code flags. +PyCF_MASK = functools.reduce(operator.or_, + (getattr(__future__, fname).compiler_flag + for fname in __future__.all_feature_names)) + +#----------------------------------------------------------------------------- +# Local utilities +#----------------------------------------------------------------------------- + +def code_name(code, number=0): + """ Compute a (probably) unique name for code for caching. + + This now expects code to be unicode. + """ + hash_digest = hashlib.sha1(code.encode("utf-8")).hexdigest() + # Include the number and 12 characters of the hash in the name. It's + # pretty much impossible that in a single session we'll have collisions + # even with truncated hashes, and the full one makes tracebacks too long + return ''.format(number, hash_digest[:12]) + +#----------------------------------------------------------------------------- +# Classes and functions +#----------------------------------------------------------------------------- + +class CachingCompiler(codeop.Compile): + """A compiler that caches code compiled from interactive statements. + """ + + def __init__(self): + codeop.Compile.__init__(self) + + # Caching a dictionary { filename: execution_count } for nicely + # rendered tracebacks. The filename corresponds to the filename + # argument used for the builtins.compile function. + self._filename_map = {} + + def ast_parse(self, source, filename='', symbol='exec'): + """Parse code to an AST with the current compiler flags active. + + Arguments are exactly the same as ast.parse (in the standard library), + and are passed to the built-in compile function.""" + return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1) + + def reset_compiler_flags(self): + """Reset compiler flags to default state.""" + # This value is copied from codeop.Compile.__init__, so if that ever + # changes, it will need to be updated. + self.flags = codeop.PyCF_DONT_IMPLY_DEDENT + + @property + def compiler_flags(self): + """Flags currently active in the compilation process. + """ + return self.flags + + def get_code_name(self, raw_code, transformed_code, number): + """Compute filename given the code, and the cell number. + + Parameters + ---------- + raw_code : str + The raw cell code. + transformed_code : str + The executable Python source code to cache and compile. + number : int + A number which forms part of the code's name. Used for the execution + counter. + + Returns + ------- + The computed filename. + """ + return code_name(transformed_code, number) + + def format_code_name(self, name): + """Return a user-friendly label and name for a code block. + + Parameters + ---------- + name : str + The name for the code block returned from get_code_name + + Returns + ------- + A (label, name) pair that can be used in tracebacks, or None if the default formatting should be used. + """ + if name in self._filename_map: + return "Cell", "In[%s]" % self._filename_map[name] + + def cache(self, transformed_code, number=0, raw_code=None): + """Make a name for a block of code, and cache the code. + + Parameters + ---------- + transformed_code : str + The executable Python source code to cache and compile. + number : int + A number which forms part of the code's name. Used for the execution + counter. + raw_code : str + The raw code before transformation, if None, set to `transformed_code`. + + Returns + ------- + The name of the cached code (as a string). Pass this as the filename + argument to compilation, so that tracebacks are correctly hooked up. + """ + if raw_code is None: + raw_code = transformed_code + + name = self.get_code_name(raw_code, transformed_code, number) + + # Save the execution count + self._filename_map[name] = number + + # Since Python 2.5, setting mtime to `None` means the lines will + # never be removed by `linecache.checkcache`. This means all the + # monkeypatching has *never* been necessary, since this code was + # only added in 2010, at which point IPython had already stopped + # supporting Python 2.4. + # + # Note that `linecache.clearcache` and `linecache.updatecache` may + # still remove our code from the cache, but those show explicit + # intent, and we should not try to interfere. Normally the former + # is never called except when out of memory, and the latter is only + # called for lines *not* in the cache. + entry = ( + len(transformed_code), + None, + [line + "\n" for line in transformed_code.splitlines()], + name, + ) + linecache.cache[name] = entry + return name + + @contextmanager + def extra_flags(self, flags): + ## bits that we'll set to 1 + turn_on_bits = ~self.flags & flags + + + self.flags = self.flags | flags + try: + yield + finally: + # turn off only the bits we turned on so that something like + # __future__ that set flags stays. + self.flags &= ~turn_on_bits + + +def check_linecache_ipython(*args): + """Deprecated since IPython 8.6. Call linecache.checkcache() directly. + + It was already not necessary to call this function directly. If no + CachingCompiler had been created, this function would fail badly. If + an instance had been created, this function would've been monkeypatched + into place. + + As of IPython 8.6, the monkeypatching has gone away entirely. But there + were still internal callers of this function, so maybe external callers + also existed? + """ + import warnings + + warnings.warn( + "Deprecated Since IPython 8.6, Just call linecache.checkcache() directly.", + DeprecationWarning, + stacklevel=2, + ) + linecache.checkcache() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/completer.py b/.venv/lib/python3.12/site-packages/IPython/core/completer.py new file mode 100644 index 0000000..b39a922 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/completer.py @@ -0,0 +1,3421 @@ +"""Completion for IPython. + +This module started as fork of the rlcompleter module in the Python standard +library. The original enhancements made to rlcompleter have been sent +upstream and were accepted as of Python 2.3, + +This module now support a wide variety of completion mechanism both available +for normal classic Python code, as well as completer for IPython specific +Syntax like magics. + +Latex and Unicode completion +============================ + +IPython and compatible frontends not only can complete your code, but can help +you to input a wide range of characters. In particular we allow you to insert +a unicode character using the tab completion mechanism. + +Forward latex/unicode completion +-------------------------------- + +Forward completion allows you to easily type a unicode character using its latex +name, or unicode long description. To do so type a backslash follow by the +relevant name and press tab: + + +Using latex completion: + +.. code:: + + \\alpha + α + +or using unicode completion: + + +.. code:: + + \\GREEK SMALL LETTER ALPHA + α + + +Only valid Python identifiers will complete. Combining characters (like arrow or +dots) are also available, unlike latex they need to be put after the their +counterpart that is to say, ``F\\\\vec`` is correct, not ``\\\\vecF``. + +Some browsers are known to display combining characters incorrectly. + +Backward latex completion +------------------------- + +It is sometime challenging to know how to type a character, if you are using +IPython, or any compatible frontend you can prepend backslash to the character +and press :kbd:`Tab` to expand it to its latex form. + +.. code:: + + \\α + \\alpha + + +Both forward and backward completions can be deactivated by setting the +:std:configtrait:`Completer.backslash_combining_completions` option to +``False``. + + +Experimental +============ + +Starting with IPython 6.0, this module can make use of the Jedi library to +generate completions both using static analysis of the code, and dynamically +inspecting multiple namespaces. Jedi is an autocompletion and static analysis +for Python. The APIs attached to this new mechanism is unstable and will +raise unless use in an :any:`provisionalcompleter` context manager. + +You will find that the following are experimental: + + - :any:`provisionalcompleter` + - :any:`IPCompleter.completions` + - :any:`Completion` + - :any:`rectify_completions` + +.. note:: + + better name for :any:`rectify_completions` ? + +We welcome any feedback on these new API, and we also encourage you to try this +module in debug mode (start IPython with ``--Completer.debug=True``) in order +to have extra logging information if :any:`jedi` is crashing, or if current +IPython completer pending deprecations are returning results not yet handled +by :any:`jedi` + +Using Jedi for tab completion allow snippets like the following to work without +having to execute any code: + + >>> myvar = ['hello', 42] + ... myvar[1].bi + +Tab completion will be able to infer that ``myvar[1]`` is a real number without +executing almost any code unlike the deprecated :any:`IPCompleter.greedy` +option. + +Be sure to update :any:`jedi` to the latest stable version or to try the +current development version to get better completions. + +Matchers +======== + +All completions routines are implemented using unified *Matchers* API. +The matchers API is provisional and subject to change without notice. + +The built-in matchers include: + +- :any:`IPCompleter.dict_key_matcher`: dictionary key completions, +- :any:`IPCompleter.magic_matcher`: completions for magics, +- :any:`IPCompleter.unicode_name_matcher`, + :any:`IPCompleter.fwd_unicode_matcher` + and :any:`IPCompleter.latex_name_matcher`: see `Forward latex/unicode completion`_, +- :any:`back_unicode_name_matcher` and :any:`back_latex_name_matcher`: see `Backward latex completion`_, +- :any:`IPCompleter.file_matcher`: paths to files and directories, +- :any:`IPCompleter.python_func_kw_matcher` - function keywords, +- :any:`IPCompleter.python_matches` - globals and attributes (v1 API), +- ``IPCompleter.jedi_matcher`` - static analysis with Jedi, +- :any:`IPCompleter.custom_completer_matcher` - pluggable completer with a default + implementation in :any:`InteractiveShell` which uses IPython hooks system + (`complete_command`) with string dispatch (including regular expressions). + Differently to other matchers, ``custom_completer_matcher`` will not suppress + Jedi results to match behaviour in earlier IPython versions. + +Custom matchers can be added by appending to ``IPCompleter.custom_matchers`` list. + +Matcher API +----------- + +Simplifying some details, the ``Matcher`` interface can described as + +.. code-block:: + + MatcherAPIv1 = Callable[[str], list[str]] + MatcherAPIv2 = Callable[[CompletionContext], SimpleMatcherResult] + + Matcher = MatcherAPIv1 | MatcherAPIv2 + +The ``MatcherAPIv1`` reflects the matcher API as available prior to IPython 8.6.0 +and remains supported as a simplest way for generating completions. This is also +currently the only API supported by the IPython hooks system `complete_command`. + +To distinguish between matcher versions ``matcher_api_version`` attribute is used. +More precisely, the API allows to omit ``matcher_api_version`` for v1 Matchers, +and requires a literal ``2`` for v2 Matchers. + +Once the API stabilises future versions may relax the requirement for specifying +``matcher_api_version`` by switching to :any:`functools.singledispatch`, therefore +please do not rely on the presence of ``matcher_api_version`` for any purposes. + +Suppression of competing matchers +--------------------------------- + +By default results from all matchers are combined, in the order determined by +their priority. Matchers can request to suppress results from subsequent +matchers by setting ``suppress`` to ``True`` in the ``MatcherResult``. + +When multiple matchers simultaneously request suppression, the results from of +the matcher with higher priority will be returned. + +Sometimes it is desirable to suppress most but not all other matchers; +this can be achieved by adding a set of identifiers of matchers which +should not be suppressed to ``MatcherResult`` under ``do_not_suppress`` key. + +The suppression behaviour can is user-configurable via +:std:configtrait:`IPCompleter.suppress_competing_matchers`. +""" + + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. +# +# Some of this code originated from rlcompleter in the Python standard library +# Copyright (C) 2001 Python Software Foundation, www.python.org + +from __future__ import annotations +import builtins as builtin_mod +import enum +import glob +import inspect +import itertools +import keyword +import ast +import os +import re +import string +import sys +import tokenize +import time +import unicodedata +import uuid +import warnings +from ast import literal_eval +from collections import defaultdict +from contextlib import contextmanager +from dataclasses import dataclass +from functools import cached_property, partial +from types import SimpleNamespace +from typing import ( + Iterable, + Iterator, + List, + Tuple, + Union, + Any, + Sequence, + Dict, + Optional, + TYPE_CHECKING, + Set, + Sized, + TypeVar, + Literal, +) + +from IPython.core.guarded_eval import guarded_eval, EvaluationContext +from IPython.core.error import TryNext +from IPython.core.inputtransformer2 import ESC_MAGIC +from IPython.core.latex_symbols import latex_symbols, reverse_latex_symbol +from IPython.core.oinspect import InspectColors +from IPython.testing.skipdoctest import skip_doctest +from IPython.utils import generics +from IPython.utils.decorators import sphinx_options +from IPython.utils.dir2 import dir2, get_real_method +from IPython.utils.docs import GENERATING_DOCUMENTATION +from IPython.utils.path import ensure_dir_exists +from IPython.utils.process import arg_split +from traitlets import ( + Bool, + Enum, + Int, + List as ListTrait, + Unicode, + Dict as DictTrait, + Union as UnionTrait, + observe, +) +from traitlets.config.configurable import Configurable + +import __main__ + +# skip module docstests +__skip_doctest__ = True + + +try: + import jedi + jedi.settings.case_insensitive_completion = False + import jedi.api.helpers + import jedi.api.classes + JEDI_INSTALLED = True +except ImportError: + JEDI_INSTALLED = False + + +if TYPE_CHECKING or GENERATING_DOCUMENTATION and sys.version_info >= (3, 11): + from typing import cast + from typing_extensions import TypedDict, NotRequired, Protocol, TypeAlias, TypeGuard +else: + from typing import Generic + + def cast(type_, obj): + """Workaround for `TypeError: MatcherAPIv2() takes no arguments`""" + return obj + + # do not require on runtime + NotRequired = Tuple # requires Python >=3.11 + TypedDict = Dict # by extension of `NotRequired` requires 3.11 too + Protocol = object # requires Python >=3.8 + TypeAlias = Any # requires Python >=3.10 + TypeGuard = Generic # requires Python >=3.10 +if GENERATING_DOCUMENTATION: + from typing import TypedDict + +# ----------------------------------------------------------------------------- +# Globals +#----------------------------------------------------------------------------- + +# ranges where we have most of the valid unicode names. We could be more finer +# grained but is it worth it for performance While unicode have character in the +# range 0, 0x110000, we seem to have name for about 10% of those. (131808 as I +# write this). With below range we cover them all, with a density of ~67% +# biggest next gap we consider only adds up about 1% density and there are 600 +# gaps that would need hard coding. +_UNICODE_RANGES = [(32, 0x323B0), (0xE0001, 0xE01F0)] + +# Public API +__all__ = ["Completer", "IPCompleter"] + +if sys.platform == 'win32': + PROTECTABLES = ' ' +else: + PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&' + +# Protect against returning an enormous number of completions which the frontend +# may have trouble processing. +MATCHES_LIMIT = 500 + +# Completion type reported when no type can be inferred. +_UNKNOWN_TYPE = "" + +# sentinel value to signal lack of a match +not_found = object() + +class ProvisionalCompleterWarning(FutureWarning): + """ + Exception raise by an experimental feature in this module. + + Wrap code in :any:`provisionalcompleter` context manager if you + are certain you want to use an unstable feature. + """ + pass + +warnings.filterwarnings('error', category=ProvisionalCompleterWarning) + + +@skip_doctest +@contextmanager +def provisionalcompleter(action='ignore'): + """ + This context manager has to be used in any place where unstable completer + behavior and API may be called. + + >>> with provisionalcompleter(): + ... completer.do_experimental_things() # works + + >>> completer.do_experimental_things() # raises. + + .. note:: + + Unstable + + By using this context manager you agree that the API in use may change + without warning, and that you won't complain if they do so. + + You also understand that, if the API is not to your liking, you should report + a bug to explain your use case upstream. + + We'll be happy to get your feedback, feature requests, and improvements on + any of the unstable APIs! + """ + with warnings.catch_warnings(): + warnings.filterwarnings(action, category=ProvisionalCompleterWarning) + yield + + +def has_open_quotes(s: str) -> Union[str, bool]: + """Return whether a string has open quotes. + + This simply counts whether the number of quote characters of either type in + the string is odd. + + Returns + ------- + If there is an open quote, the quote character is returned. Else, return + False. + """ + # We check " first, then ', so complex cases with nested quotes will get + # the " to take precedence. + if s.count('"') % 2: + return '"' + elif s.count("'") % 2: + return "'" + else: + return False + + +def protect_filename(s: str, protectables: str = PROTECTABLES) -> str: + """Escape a string to protect certain characters.""" + if set(s) & set(protectables): + if sys.platform == "win32": + return '"' + s + '"' + else: + return "".join(("\\" + c if c in protectables else c) for c in s) + else: + return s + + +def expand_user(path:str) -> Tuple[str, bool, str]: + """Expand ``~``-style usernames in strings. + + This is similar to :func:`os.path.expanduser`, but it computes and returns + extra information that will be useful if the input was being used in + computing completions, and you wish to return the completions with the + original '~' instead of its expanded value. + + Parameters + ---------- + path : str + String to be expanded. If no ~ is present, the output is the same as the + input. + + Returns + ------- + newpath : str + Result of ~ expansion in the input path. + tilde_expand : bool + Whether any expansion was performed or not. + tilde_val : str + The value that ~ was replaced with. + """ + # Default values + tilde_expand = False + tilde_val = '' + newpath = path + + if path.startswith('~'): + tilde_expand = True + rest = len(path)-1 + newpath = os.path.expanduser(path) + if rest: + tilde_val = newpath[:-rest] + else: + tilde_val = newpath + + return newpath, tilde_expand, tilde_val + + +def compress_user(path:str, tilde_expand:bool, tilde_val:str) -> str: + """Does the opposite of expand_user, with its outputs. + """ + if tilde_expand: + return path.replace(tilde_val, '~') + else: + return path + + +def completions_sorting_key(word): + """key for sorting completions + + This does several things: + + - Demote any completions starting with underscores to the end + - Insert any %magic and %%cellmagic completions in the alphabetical order + by their name + """ + prio1, prio2 = 0, 0 + + if word.startswith('__'): + prio1 = 2 + elif word.startswith('_'): + prio1 = 1 + + if word.endswith('='): + prio1 = -1 + + if word.startswith('%%'): + # If there's another % in there, this is something else, so leave it alone + if "%" not in word[2:]: + word = word[2:] + prio2 = 2 + elif word.startswith('%'): + if "%" not in word[1:]: + word = word[1:] + prio2 = 1 + + return prio1, word, prio2 + + +class _FakeJediCompletion: + """ + This is a workaround to communicate to the UI that Jedi has crashed and to + report a bug. Will be used only id :any:`IPCompleter.debug` is set to true. + + Added in IPython 6.0 so should likely be removed for 7.0 + + """ + + def __init__(self, name): + + self.name = name + self.complete = name + self.type = 'crashed' + self.name_with_symbols = name + self.signature = "" + self._origin = "fake" + self.text = "crashed" + + def __repr__(self): + return '' + + +_JediCompletionLike = Union["jedi.api.Completion", _FakeJediCompletion] + + +class Completion: + """ + Completion object used and returned by IPython completers. + + .. warning:: + + Unstable + + This function is unstable, API may change without warning. + It will also raise unless use in proper context manager. + + This act as a middle ground :any:`Completion` object between the + :any:`jedi.api.classes.Completion` object and the Prompt Toolkit completion + object. While Jedi need a lot of information about evaluator and how the + code should be ran/inspected, PromptToolkit (and other frontend) mostly + need user facing information. + + - Which range should be replaced replaced by what. + - Some metadata (like completion type), or meta information to displayed to + the use user. + + For debugging purpose we can also store the origin of the completion (``jedi``, + ``IPython.python_matches``, ``IPython.magics_matches``...). + """ + + __slots__ = ['start', 'end', 'text', 'type', 'signature', '_origin'] + + def __init__( + self, + start: int, + end: int, + text: str, + *, + type: Optional[str] = None, + _origin="", + signature="", + ) -> None: + warnings.warn( + "``Completion`` is a provisional API (as of IPython 6.0). " + "It may change without warnings. " + "Use in corresponding context manager.", + category=ProvisionalCompleterWarning, + stacklevel=2, + ) + + self.start = start + self.end = end + self.text = text + self.type = type + self.signature = signature + self._origin = _origin + + def __repr__(self): + return '' % \ + (self.start, self.end, self.text, self.type or '?', self.signature or '?') + + def __eq__(self, other) -> bool: + """ + Equality and hash do not hash the type (as some completer may not be + able to infer the type), but are use to (partially) de-duplicate + completion. + + Completely de-duplicating completion is a bit tricker that just + comparing as it depends on surrounding text, which Completions are not + aware of. + """ + return self.start == other.start and \ + self.end == other.end and \ + self.text == other.text + + def __hash__(self): + return hash((self.start, self.end, self.text)) + + +class SimpleCompletion: + """Completion item to be included in the dictionary returned by new-style Matcher (API v2). + + .. warning:: + + Provisional + + This class is used to describe the currently supported attributes of + simple completion items, and any additional implementation details + should not be relied on. Additional attributes may be included in + future versions, and meaning of text disambiguated from the current + dual meaning of "text to insert" and "text to used as a label". + """ + + __slots__ = ["text", "type"] + + def __init__(self, text: str, *, type: Optional[str] = None): + self.text = text + self.type = type + + def __repr__(self): + return f"" + + +class _MatcherResultBase(TypedDict): + """Definition of dictionary to be returned by new-style Matcher (API v2).""" + + #: Suffix of the provided ``CompletionContext.token``, if not given defaults to full token. + matched_fragment: NotRequired[str] + + #: Whether to suppress results from all other matchers (True), some + #: matchers (set of identifiers) or none (False); default is False. + suppress: NotRequired[Union[bool, Set[str]]] + + #: Identifiers of matchers which should NOT be suppressed when this matcher + #: requests to suppress all other matchers; defaults to an empty set. + do_not_suppress: NotRequired[Set[str]] + + #: Are completions already ordered and should be left as-is? default is False. + ordered: NotRequired[bool] + + +@sphinx_options(show_inherited_members=True, exclude_inherited_from=["dict"]) +class SimpleMatcherResult(_MatcherResultBase, TypedDict): + """Result of new-style completion matcher.""" + + # note: TypedDict is added again to the inheritance chain + # in order to get __orig_bases__ for documentation + + #: List of candidate completions + completions: Sequence[SimpleCompletion] | Iterator[SimpleCompletion] + + +class _JediMatcherResult(_MatcherResultBase): + """Matching result returned by Jedi (will be processed differently)""" + + #: list of candidate completions + completions: Iterator[_JediCompletionLike] + + +AnyMatcherCompletion = Union[_JediCompletionLike, SimpleCompletion] +AnyCompletion = TypeVar("AnyCompletion", AnyMatcherCompletion, Completion) + + +@dataclass +class CompletionContext: + """Completion context provided as an argument to matchers in the Matcher API v2.""" + + # rationale: many legacy matchers relied on completer state (`self.text_until_cursor`) + # which was not explicitly visible as an argument of the matcher, making any refactor + # prone to errors; by explicitly passing `cursor_position` we can decouple the matchers + # from the completer, and make substituting them in sub-classes easier. + + #: Relevant fragment of code directly preceding the cursor. + #: The extraction of token is implemented via splitter heuristic + #: (following readline behaviour for legacy reasons), which is user configurable + #: (by switching the greedy mode). + token: str + + #: The full available content of the editor or buffer + full_text: str + + #: Cursor position in the line (the same for ``full_text`` and ``text``). + cursor_position: int + + #: Cursor line in ``full_text``. + cursor_line: int + + #: The maximum number of completions that will be used downstream. + #: Matchers can use this information to abort early. + #: The built-in Jedi matcher is currently excepted from this limit. + # If not given, return all possible completions. + limit: Optional[int] + + @cached_property + def text_until_cursor(self) -> str: + return self.line_with_cursor[: self.cursor_position] + + @cached_property + def line_with_cursor(self) -> str: + return self.full_text.split("\n")[self.cursor_line] + + +#: Matcher results for API v2. +MatcherResult = Union[SimpleMatcherResult, _JediMatcherResult] + + +class _MatcherAPIv1Base(Protocol): + def __call__(self, text: str) -> List[str]: + """Call signature.""" + ... + + #: Used to construct the default matcher identifier + __qualname__: str + + +class _MatcherAPIv1Total(_MatcherAPIv1Base, Protocol): + #: API version + matcher_api_version: Optional[Literal[1]] + + def __call__(self, text: str) -> List[str]: + """Call signature.""" + ... + + +#: Protocol describing Matcher API v1. +MatcherAPIv1: TypeAlias = Union[_MatcherAPIv1Base, _MatcherAPIv1Total] + + +class MatcherAPIv2(Protocol): + """Protocol describing Matcher API v2.""" + + #: API version + matcher_api_version: Literal[2] = 2 + + def __call__(self, context: CompletionContext) -> MatcherResult: + """Call signature.""" + ... + + #: Used to construct the default matcher identifier + __qualname__: str + + +Matcher: TypeAlias = Union[MatcherAPIv1, MatcherAPIv2] + + +def _is_matcher_v1(matcher: Matcher) -> TypeGuard[MatcherAPIv1]: + api_version = _get_matcher_api_version(matcher) + return api_version == 1 + + +def _is_matcher_v2(matcher: Matcher) -> TypeGuard[MatcherAPIv2]: + api_version = _get_matcher_api_version(matcher) + return api_version == 2 + + +def _is_sizable(value: Any) -> TypeGuard[Sized]: + """Determines whether objects is sizable""" + return hasattr(value, "__len__") + + +def _is_iterator(value: Any) -> TypeGuard[Iterator]: + """Determines whether objects is sizable""" + return hasattr(value, "__next__") + + +def has_any_completions(result: MatcherResult) -> bool: + """Check if any result includes any completions.""" + completions = result["completions"] + if _is_sizable(completions): + return len(completions) != 0 + if _is_iterator(completions): + try: + old_iterator = completions + first = next(old_iterator) + result["completions"] = cast( + Iterator[SimpleCompletion], + itertools.chain([first], old_iterator), + ) + return True + except StopIteration: + return False + raise ValueError( + "Completions returned by matcher need to be an Iterator or a Sizable" + ) + + +def completion_matcher( + *, + priority: Optional[float] = None, + identifier: Optional[str] = None, + api_version: int = 1, +) -> Callable[[Matcher], Matcher]: + """Adds attributes describing the matcher. + + Parameters + ---------- + priority : Optional[float] + The priority of the matcher, determines the order of execution of matchers. + Higher priority means that the matcher will be executed first. Defaults to 0. + identifier : Optional[str] + identifier of the matcher allowing users to modify the behaviour via traitlets, + and also used to for debugging (will be passed as ``origin`` with the completions). + + Defaults to matcher function's ``__qualname__`` (for example, + ``IPCompleter.file_matcher`` for the built-in matched defined + as a ``file_matcher`` method of the ``IPCompleter`` class). + api_version: Optional[int] + version of the Matcher API used by this matcher. + Currently supported values are 1 and 2. + Defaults to 1. + """ + + def wrapper(func: Matcher): + func.matcher_priority = priority or 0 # type: ignore + func.matcher_identifier = identifier or func.__qualname__ # type: ignore + func.matcher_api_version = api_version # type: ignore + if TYPE_CHECKING: + if api_version == 1: + func = cast(MatcherAPIv1, func) + elif api_version == 2: + func = cast(MatcherAPIv2, func) + return func + + return wrapper + + +def _get_matcher_priority(matcher: Matcher): + return getattr(matcher, "matcher_priority", 0) + + +def _get_matcher_id(matcher: Matcher): + return getattr(matcher, "matcher_identifier", matcher.__qualname__) + + +def _get_matcher_api_version(matcher): + return getattr(matcher, "matcher_api_version", 1) + + +context_matcher = partial(completion_matcher, api_version=2) + + +_IC = Iterable[Completion] + + +def _deduplicate_completions(text: str, completions: _IC)-> _IC: + """ + Deduplicate a set of completions. + + .. warning:: + + Unstable + + This function is unstable, API may change without warning. + + Parameters + ---------- + text : str + text that should be completed. + completions : Iterator[Completion] + iterator over the completions to deduplicate + + Yields + ------ + `Completions` objects + Completions coming from multiple sources, may be different but end up having + the same effect when applied to ``text``. If this is the case, this will + consider completions as equal and only emit the first encountered. + Not folded in `completions()` yet for debugging purpose, and to detect when + the IPython completer does return things that Jedi does not, but should be + at some point. + """ + completions = list(completions) + if not completions: + return + + new_start = min(c.start for c in completions) + new_end = max(c.end for c in completions) + + seen = set() + for c in completions: + new_text = text[new_start:c.start] + c.text + text[c.end:new_end] + if new_text not in seen: + yield c + seen.add(new_text) + + +def rectify_completions(text: str, completions: _IC, *, _debug: bool = False) -> _IC: + """ + Rectify a set of completions to all have the same ``start`` and ``end`` + + .. warning:: + + Unstable + + This function is unstable, API may change without warning. + It will also raise unless use in proper context manager. + + Parameters + ---------- + text : str + text that should be completed. + completions : Iterator[Completion] + iterator over the completions to rectify + _debug : bool + Log failed completion + + Notes + ----- + :any:`jedi.api.classes.Completion` s returned by Jedi may not have the same start and end, though + the Jupyter Protocol requires them to behave like so. This will readjust + the completion to have the same ``start`` and ``end`` by padding both + extremities with surrounding text. + + During stabilisation should support a ``_debug`` option to log which + completion are return by the IPython completer and not found in Jedi in + order to make upstream bug report. + """ + warnings.warn("`rectify_completions` is a provisional API (as of IPython 6.0). " + "It may change without warnings. " + "Use in corresponding context manager.", + category=ProvisionalCompleterWarning, stacklevel=2) + + completions = list(completions) + if not completions: + return + starts = (c.start for c in completions) + ends = (c.end for c in completions) + + new_start = min(starts) + new_end = max(ends) + + seen_jedi = set() + seen_python_matches = set() + for c in completions: + new_text = text[new_start:c.start] + c.text + text[c.end:new_end] + if c._origin == 'jedi': + seen_jedi.add(new_text) + elif c._origin == "IPCompleter.python_matcher": + seen_python_matches.add(new_text) + yield Completion(new_start, new_end, new_text, type=c.type, _origin=c._origin, signature=c.signature) + diff = seen_python_matches.difference(seen_jedi) + if diff and _debug: + print('IPython.python matches have extras:', diff) + + +if sys.platform == 'win32': + DELIMS = ' \t\n`!@#$^&*()=+[{]}|;\'",<>?' +else: + DELIMS = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?' + +GREEDY_DELIMS = ' =\r\n' + + +class CompletionSplitter(object): + """An object to split an input line in a manner similar to readline. + + By having our own implementation, we can expose readline-like completion in + a uniform manner to all frontends. This object only needs to be given the + line of text to be split and the cursor position on said line, and it + returns the 'word' to be completed on at the cursor after splitting the + entire line. + + What characters are used as splitting delimiters can be controlled by + setting the ``delims`` attribute (this is a property that internally + automatically builds the necessary regular expression)""" + + # Private interface + + # A string of delimiter characters. The default value makes sense for + # IPython's most typical usage patterns. + _delims = DELIMS + + # The expression (a normal string) to be compiled into a regular expression + # for actual splitting. We store it as an attribute mostly for ease of + # debugging, since this type of code can be so tricky to debug. + _delim_expr = None + + # The regular expression that does the actual splitting + _delim_re = None + + def __init__(self, delims=None): + delims = CompletionSplitter._delims if delims is None else delims + self.delims = delims + + @property + def delims(self): + """Return the string of delimiter characters.""" + return self._delims + + @delims.setter + def delims(self, delims): + """Set the delimiters for line splitting.""" + expr = '[' + ''.join('\\'+ c for c in delims) + ']' + self._delim_re = re.compile(expr) + self._delims = delims + self._delim_expr = expr + + def split_line(self, line, cursor_pos=None): + """Split a line of text with a cursor at the given position. + """ + cut_line = line if cursor_pos is None else line[:cursor_pos] + return self._delim_re.split(cut_line)[-1] + + + +class Completer(Configurable): + + greedy = Bool( + False, + help="""Activate greedy completion. + + .. deprecated:: 8.8 + Use :std:configtrait:`Completer.evaluation` and :std:configtrait:`Completer.auto_close_dict_keys` instead. + + When enabled in IPython 8.8 or newer, changes configuration as follows: + + - ``Completer.evaluation = 'unsafe'`` + - ``Completer.auto_close_dict_keys = True`` + """, + ).tag(config=True) + + evaluation = Enum( + ("forbidden", "minimal", "limited", "unsafe", "dangerous"), + default_value="limited", + help="""Policy for code evaluation under completion. + + Successive options allow to enable more eager evaluation for better + completion suggestions, including for nested dictionaries, nested lists, + or even results of function calls. + Setting ``unsafe`` or higher can lead to evaluation of arbitrary user + code on :kbd:`Tab` with potentially unwanted or dangerous side effects. + + Allowed values are: + + - ``forbidden``: no evaluation of code is permitted, + - ``minimal``: evaluation of literals and access to built-in namespace; + no item/attribute evaluationm no access to locals/globals, + no evaluation of any operations or comparisons. + - ``limited``: access to all namespaces, evaluation of hard-coded methods + (for example: :any:`dict.keys`, :any:`object.__getattr__`, + :any:`object.__getitem__`) on allow-listed objects (for example: + :any:`dict`, :any:`list`, :any:`tuple`, ``pandas.Series``), + - ``unsafe``: evaluation of all methods and function calls but not of + syntax with side-effects like `del x`, + - ``dangerous``: completely arbitrary evaluation. + """, + ).tag(config=True) + + use_jedi = Bool(default_value=JEDI_INSTALLED, + help="Experimental: Use Jedi to generate autocompletions. " + "Default to True if jedi is installed.").tag(config=True) + + jedi_compute_type_timeout = Int(default_value=400, + help="""Experimental: restrict time (in milliseconds) during which Jedi can compute types. + Set to 0 to stop computing types. Non-zero value lower than 100ms may hurt + performance by preventing jedi to build its cache. + """).tag(config=True) + + debug = Bool(default_value=False, + help='Enable debug for the Completer. Mostly print extra ' + 'information for experimental jedi integration.')\ + .tag(config=True) + + backslash_combining_completions = Bool(True, + help="Enable unicode completions, e.g. \\alpha . " + "Includes completion of latex commands, unicode names, and expanding " + "unicode characters back to latex commands.").tag(config=True) + + auto_close_dict_keys = Bool( + False, + help=""" + Enable auto-closing dictionary keys. + + When enabled string keys will be suffixed with a final quote + (matching the opening quote), tuple keys will also receive a + separating comma if needed, and keys which are final will + receive a closing bracket (``]``). + """, + ).tag(config=True) + + def __init__(self, namespace=None, global_namespace=None, **kwargs): + """Create a new completer for the command line. + + Completer(namespace=ns, global_namespace=ns2) -> completer instance. + + If unspecified, the default namespace where completions are performed + is __main__ (technically, __main__.__dict__). Namespaces should be + given as dictionaries. + + An optional second namespace can be given. This allows the completer + to handle cases where both the local and global scopes need to be + distinguished. + """ + + # Don't bind to namespace quite yet, but flag whether the user wants a + # specific namespace or to use __main__.__dict__. This will allow us + # to bind to __main__.__dict__ at completion time, not now. + if namespace is None: + self.use_main_ns = True + else: + self.use_main_ns = False + self.namespace = namespace + + # The global namespace, if given, can be bound directly + if global_namespace is None: + self.global_namespace = {} + else: + self.global_namespace = global_namespace + + self.custom_matchers = [] + + super(Completer, self).__init__(**kwargs) + + def complete(self, text, state): + """Return the next possible completion for 'text'. + + This is called successively with state == 0, 1, 2, ... until it + returns None. The completion should begin with 'text'. + + """ + if self.use_main_ns: + self.namespace = __main__.__dict__ + + if state == 0: + if "." in text: + self.matches = self.attr_matches(text) + else: + self.matches = self.global_matches(text) + try: + return self.matches[state] + except IndexError: + return None + + def global_matches(self, text): + """Compute matches when text is a simple name. + + Return a list of all keywords, built-in functions and names currently + defined in self.namespace or self.global_namespace that match. + + """ + matches = [] + match_append = matches.append + n = len(text) + for lst in [ + keyword.kwlist, + builtin_mod.__dict__.keys(), + list(self.namespace.keys()), + list(self.global_namespace.keys()), + ]: + for word in lst: + if word[:n] == text and word != "__builtins__": + match_append(word) + + snake_case_re = re.compile(r"[^_]+(_[^_]+)+?\Z") + for lst in [list(self.namespace.keys()), list(self.global_namespace.keys())]: + shortened = { + "_".join([sub[0] for sub in word.split("_")]): word + for word in lst + if snake_case_re.match(word) + } + for word in shortened.keys(): + if word[:n] == text and word != "__builtins__": + match_append(shortened[word]) + return matches + + def attr_matches(self, text): + """Compute matches when text contains a dot. + + Assuming the text is of the form NAME.NAME....[NAME], and is + evaluatable in self.namespace or self.global_namespace, it will be + evaluated and its attributes (as revealed by dir()) are used as + possible completions. (For class instances, class members are + also considered.) + + WARNING: this can still invoke arbitrary C code, if an object + with a __getattr__ hook is evaluated. + + """ + return self._attr_matches(text)[0] + + # we simple attribute matching with normal identifiers. + _ATTR_MATCH_RE = re.compile(r"(.+)\.(\w*)$") + + def _attr_matches( + self, text: str, include_prefix: bool = True + ) -> Tuple[Sequence[str], str]: + m2 = self._ATTR_MATCH_RE.match(self.line_buffer) + if not m2: + return [], "" + expr, attr = m2.group(1, 2) + + obj = self._evaluate_expr(expr) + + if obj is not_found: + return [], "" + + if self.limit_to__all__ and hasattr(obj, '__all__'): + words = get__all__entries(obj) + else: + words = dir2(obj) + + try: + words = generics.complete_object(obj, words) + except TryNext: + pass + except AssertionError: + raise + except Exception: + # Silence errors from completion function + pass + # Build match list to return + n = len(attr) + + # Note: ideally we would just return words here and the prefix + # reconciliator would know that we intend to append to rather than + # replace the input text; this requires refactoring to return range + # which ought to be replaced (as does jedi). + if include_prefix: + tokens = _parse_tokens(expr) + rev_tokens = reversed(tokens) + skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE} + name_turn = True + + parts = [] + for token in rev_tokens: + if token.type in skip_over: + continue + if token.type == tokenize.NAME and name_turn: + parts.append(token.string) + name_turn = False + elif ( + token.type == tokenize.OP and token.string == "." and not name_turn + ): + parts.append(token.string) + name_turn = True + else: + # short-circuit if not empty nor name token + break + + prefix_after_space = "".join(reversed(parts)) + else: + prefix_after_space = "" + + return ( + ["%s.%s" % (prefix_after_space, w) for w in words if w[:n] == attr], + "." + attr, + ) + + def _trim_expr(self, code: str) -> str: + """ + Trim the code until it is a valid expression and not a tuple; + + return the trimmed expression for guarded_eval. + """ + while code: + code = code[1:] + try: + res = ast.parse(code) + except SyntaxError: + continue + + assert res is not None + if len(res.body) != 1: + continue + expr = res.body[0].value + if isinstance(expr, ast.Tuple) and not code[-1] == ")": + # we skip implicit tuple, like when trimming `fun(a,b` + # as `a,b` would be a tuple, and we actually expect to get only `b` + continue + return code + return "" + + def _evaluate_expr(self, expr): + obj = not_found + done = False + while not done and expr: + try: + obj = guarded_eval( + expr, + EvaluationContext( + globals=self.global_namespace, + locals=self.namespace, + evaluation=self.evaluation, + ), + ) + done = True + except Exception as e: + if self.debug: + print("Evaluation exception", e) + # trim the expression to remove any invalid prefix + # e.g. user starts `(d[`, so we get `expr = '(d'`, + # where parenthesis is not closed. + # TODO: make this faster by reusing parts of the computation? + expr = self._trim_expr(expr) + return obj + +def get__all__entries(obj): + """returns the strings in the __all__ attribute""" + try: + words = getattr(obj, '__all__') + except Exception: + return [] + + return [w for w in words if isinstance(w, str)] + + +class _DictKeyState(enum.Flag): + """Represent state of the key match in context of other possible matches. + + - given `d1 = {'a': 1}` completion on `d1['` will yield `{'a': END_OF_ITEM}` as there is no tuple. + - given `d2 = {('a', 'b'): 1}`: `d2['a', '` will yield `{'b': END_OF_TUPLE}` as there is no tuple members to add beyond `'b'`. + - given `d3 = {('a', 'b'): 1}`: `d3['` will yield `{'a': IN_TUPLE}` as `'a'` can be added. + - given `d4 = {'a': 1, ('a', 'b'): 2}`: `d4['` will yield `{'a': END_OF_ITEM & END_OF_TUPLE}` + """ + + BASELINE = 0 + END_OF_ITEM = enum.auto() + END_OF_TUPLE = enum.auto() + IN_TUPLE = enum.auto() + + +def _parse_tokens(c): + """Parse tokens even if there is an error.""" + tokens = [] + token_generator = tokenize.generate_tokens(iter(c.splitlines()).__next__) + while True: + try: + tokens.append(next(token_generator)) + except tokenize.TokenError: + return tokens + except StopIteration: + return tokens + + +def _match_number_in_dict_key_prefix(prefix: str) -> Union[str, None]: + """Match any valid Python numeric literal in a prefix of dictionary keys. + + References: + - https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals + - https://docs.python.org/3/library/tokenize.html + """ + if prefix[-1].isspace(): + # if user typed a space we do not have anything to complete + # even if there was a valid number token before + return None + tokens = _parse_tokens(prefix) + rev_tokens = reversed(tokens) + skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE} + number = None + for token in rev_tokens: + if token.type in skip_over: + continue + if number is None: + if token.type == tokenize.NUMBER: + number = token.string + continue + else: + # we did not match a number + return None + if token.type == tokenize.OP: + if token.string == ",": + break + if token.string in {"+", "-"}: + number = token.string + number + else: + return None + return number + + +_INT_FORMATS = { + "0b": bin, + "0o": oct, + "0x": hex, +} + + +def match_dict_keys( + keys: List[Union[str, bytes, Tuple[Union[str, bytes], ...]]], + prefix: str, + delims: str, + extra_prefix: Optional[Tuple[Union[str, bytes], ...]] = None, +) -> Tuple[str, int, Dict[str, _DictKeyState]]: + """Used by dict_key_matches, matching the prefix to a list of keys + + Parameters + ---------- + keys + list of keys in dictionary currently being completed. + prefix + Part of the text already typed by the user. E.g. `mydict[b'fo` + delims + String of delimiters to consider when finding the current key. + extra_prefix : optional + Part of the text already typed in multi-key index cases. E.g. for + `mydict['foo', "bar", 'b`, this would be `('foo', 'bar')`. + + Returns + ------- + A tuple of three elements: ``quote``, ``token_start``, ``matched``, with + ``quote`` being the quote that need to be used to close current string. + ``token_start`` the position where the replacement should start occurring, + ``matches`` a dictionary of replacement/completion keys on keys and values + indicating whether the state. + """ + prefix_tuple = extra_prefix if extra_prefix else () + + prefix_tuple_size = sum( + [ + # for pandas, do not count slices as taking space + not isinstance(k, slice) + for k in prefix_tuple + ] + ) + text_serializable_types = (str, bytes, int, float, slice) + + def filter_prefix_tuple(key): + # Reject too short keys + if len(key) <= prefix_tuple_size: + return False + # Reject keys which cannot be serialised to text + for k in key: + if not isinstance(k, text_serializable_types): + return False + # Reject keys that do not match the prefix + for k, pt in zip(key, prefix_tuple): + if k != pt and not isinstance(pt, slice): + return False + # All checks passed! + return True + + filtered_key_is_final: Dict[Union[str, bytes, int, float], _DictKeyState] = ( + defaultdict(lambda: _DictKeyState.BASELINE) + ) + + for k in keys: + # If at least one of the matches is not final, mark as undetermined. + # This can happen with `d = {111: 'b', (111, 222): 'a'}` where + # `111` appears final on first match but is not final on the second. + + if isinstance(k, tuple): + if filter_prefix_tuple(k): + key_fragment = k[prefix_tuple_size] + filtered_key_is_final[key_fragment] |= ( + _DictKeyState.END_OF_TUPLE + if len(k) == prefix_tuple_size + 1 + else _DictKeyState.IN_TUPLE + ) + elif prefix_tuple_size > 0: + # we are completing a tuple but this key is not a tuple, + # so we should ignore it + pass + else: + if isinstance(k, text_serializable_types): + filtered_key_is_final[k] |= _DictKeyState.END_OF_ITEM + + filtered_keys = filtered_key_is_final.keys() + + if not prefix: + return "", 0, {repr(k): v for k, v in filtered_key_is_final.items()} + + quote_match = re.search("(?:\"|')", prefix) + is_user_prefix_numeric = False + + if quote_match: + quote = quote_match.group() + valid_prefix = prefix + quote + try: + prefix_str = literal_eval(valid_prefix) + except Exception: + return "", 0, {} + else: + # If it does not look like a string, let's assume + # we are dealing with a number or variable. + number_match = _match_number_in_dict_key_prefix(prefix) + + # We do not want the key matcher to suggest variable names so we yield: + if number_match is None: + # The alternative would be to assume that user forgort the quote + # and if the substring matches, suggest adding it at the start. + return "", 0, {} + + prefix_str = number_match + is_user_prefix_numeric = True + quote = "" + + pattern = '[^' + ''.join('\\' + c for c in delims) + ']*$' + token_match = re.search(pattern, prefix, re.UNICODE) + assert token_match is not None # silence mypy + token_start = token_match.start() + token_prefix = token_match.group() + + matched: Dict[str, _DictKeyState] = {} + + str_key: Union[str, bytes] + + for key in filtered_keys: + if isinstance(key, (int, float)): + # User typed a number but this key is not a number. + if not is_user_prefix_numeric: + continue + str_key = str(key) + if isinstance(key, int): + int_base = prefix_str[:2].lower() + # if user typed integer using binary/oct/hex notation: + if int_base in _INT_FORMATS: + int_format = _INT_FORMATS[int_base] + str_key = int_format(key) + else: + # User typed a string but this key is a number. + if is_user_prefix_numeric: + continue + str_key = key + try: + if not str_key.startswith(prefix_str): + continue + except (AttributeError, TypeError, UnicodeError): + # Python 3+ TypeError on b'a'.startswith('a') or vice-versa + continue + + # reformat remainder of key to begin with prefix + rem = str_key[len(prefix_str) :] + # force repr wrapped in ' + rem_repr = repr(rem + '"') if isinstance(rem, str) else repr(rem + b'"') + rem_repr = rem_repr[1 + rem_repr.index("'"):-2] + if quote == '"': + # The entered prefix is quoted with ", + # but the match is quoted with '. + # A contained " hence needs escaping for comparison: + rem_repr = rem_repr.replace('"', '\\"') + + # then reinsert prefix from start of token + match = "%s%s" % (token_prefix, rem_repr) + + matched[match] = filtered_key_is_final[key] + return quote, token_start, matched + + +def cursor_to_position(text:str, line:int, column:int)->int: + """ + Convert the (line,column) position of the cursor in text to an offset in a + string. + + Parameters + ---------- + text : str + The text in which to calculate the cursor offset + line : int + Line of the cursor; 0-indexed + column : int + Column of the cursor 0-indexed + + Returns + ------- + Position of the cursor in ``text``, 0-indexed. + + See Also + -------- + position_to_cursor : reciprocal of this function + + """ + lines = text.split('\n') + assert line <= len(lines), '{} <= {}'.format(str(line), str(len(lines))) + + return sum(len(line) + 1 for line in lines[:line]) + column + +def position_to_cursor(text:str, offset:int)->Tuple[int, int]: + """ + Convert the position of the cursor in text (0 indexed) to a line + number(0-indexed) and a column number (0-indexed) pair + + Position should be a valid position in ``text``. + + Parameters + ---------- + text : str + The text in which to calculate the cursor offset + offset : int + Position of the cursor in ``text``, 0-indexed. + + Returns + ------- + (line, column) : (int, int) + Line of the cursor; 0-indexed, column of the cursor 0-indexed + + See Also + -------- + cursor_to_position : reciprocal of this function + + """ + + assert 0 <= offset <= len(text) , "0 <= %s <= %s" % (offset , len(text)) + + before = text[:offset] + blines = before.split('\n') # ! splitnes trim trailing \n + line = before.count('\n') + col = len(blines[-1]) + return line, col + + +def _safe_isinstance(obj, module, class_name, *attrs): + """Checks if obj is an instance of module.class_name if loaded + """ + if module in sys.modules: + m = sys.modules[module] + for attr in [class_name, *attrs]: + m = getattr(m, attr) + return isinstance(obj, m) + + +@context_matcher() +def back_unicode_name_matcher(context: CompletionContext): + """Match Unicode characters back to Unicode name + + Same as :any:`back_unicode_name_matches`, but adopted to new Matcher API. + """ + fragment, matches = back_unicode_name_matches(context.text_until_cursor) + return _convert_matcher_v1_result_to_v2( + matches, type="unicode", fragment=fragment, suppress_if_matches=True + ) + + +def back_unicode_name_matches(text: str) -> Tuple[str, Sequence[str]]: + """Match Unicode characters back to Unicode name + + This does ``☃`` -> ``\\snowman`` + + Note that snowman is not a valid python3 combining character but will be expanded. + Though it will not recombine back to the snowman character by the completion machinery. + + This will not either back-complete standard sequences like \\n, \\b ... + + .. deprecated:: 8.6 + You can use :meth:`back_unicode_name_matcher` instead. + + Returns + ======= + + Return a tuple with two elements: + + - The Unicode character that was matched (preceded with a backslash), or + empty string, + - a sequence (of 1), name for the match Unicode character, preceded by + backslash, or empty if no match. + """ + if len(text)<2: + return '', () + maybe_slash = text[-2] + if maybe_slash != '\\': + return '', () + + char = text[-1] + # no expand on quote for completion in strings. + # nor backcomplete standard ascii keys + if char in string.ascii_letters or char in ('"',"'"): + return '', () + try : + unic = unicodedata.name(char) + return '\\'+char,('\\'+unic,) + except KeyError: + pass + return '', () + + +@context_matcher() +def back_latex_name_matcher(context: CompletionContext): + """Match latex characters back to unicode name + + Same as :any:`back_latex_name_matches`, but adopted to new Matcher API. + """ + fragment, matches = back_latex_name_matches(context.text_until_cursor) + return _convert_matcher_v1_result_to_v2( + matches, type="latex", fragment=fragment, suppress_if_matches=True + ) + + +def back_latex_name_matches(text: str) -> Tuple[str, Sequence[str]]: + """Match latex characters back to unicode name + + This does ``\\ℵ`` -> ``\\aleph`` + + .. deprecated:: 8.6 + You can use :meth:`back_latex_name_matcher` instead. + """ + if len(text)<2: + return '', () + maybe_slash = text[-2] + if maybe_slash != '\\': + return '', () + + + char = text[-1] + # no expand on quote for completion in strings. + # nor backcomplete standard ascii keys + if char in string.ascii_letters or char in ('"',"'"): + return '', () + try : + latex = reverse_latex_symbol[char] + # '\\' replace the \ as well + return '\\'+char,[latex] + except KeyError: + pass + return '', () + + +def _formatparamchildren(parameter) -> str: + """ + Get parameter name and value from Jedi Private API + + Jedi does not expose a simple way to get `param=value` from its API. + + Parameters + ---------- + parameter + Jedi's function `Param` + + Returns + ------- + A string like 'a', 'b=1', '*args', '**kwargs' + + """ + description = parameter.description + if not description.startswith('param '): + raise ValueError('Jedi function parameter description have change format.' + 'Expected "param ...", found %r".' % description) + return description[6:] + +def _make_signature(completion)-> str: + """ + Make the signature from a jedi completion + + Parameters + ---------- + completion : jedi.Completion + object does not complete a function type + + Returns + ------- + a string consisting of the function signature, with the parenthesis but + without the function name. example: + `(a, *args, b=1, **kwargs)` + + """ + + # it looks like this might work on jedi 0.17 + if hasattr(completion, 'get_signatures'): + signatures = completion.get_signatures() + if not signatures: + return '(?)' + + c0 = completion.get_signatures()[0] + return '('+c0.to_string().split('(', maxsplit=1)[1] + + return '(%s)'% ', '.join([f for f in (_formatparamchildren(p) for signature in completion.get_signatures() + for p in signature.defined_names()) if f]) + + +_CompleteResult = Dict[str, MatcherResult] + + +DICT_MATCHER_REGEX = re.compile( + r"""(?x) +( # match dict-referring - or any get item object - expression + .+ +) +\[ # open bracket +\s* # and optional whitespace +# Capture any number of serializable objects (e.g. "a", "b", 'c') +# and slices +((?:(?: + (?: # closed string + [uUbB]? # string prefix (r not handled) + (?: + '(?:[^']|(? SimpleMatcherResult: + """Utility to help with transition""" + result = { + "completions": [SimpleCompletion(text=match, type=type) for match in matches], + "suppress": (True if matches else False) if suppress_if_matches else False, + } + if fragment is not None: + result["matched_fragment"] = fragment + return cast(SimpleMatcherResult, result) + + +class IPCompleter(Completer): + """Extension of the completer class with IPython-specific features""" + + @observe('greedy') + def _greedy_changed(self, change): + """update the splitter and readline delims when greedy is changed""" + if change["new"]: + self.evaluation = "unsafe" + self.auto_close_dict_keys = True + self.splitter.delims = GREEDY_DELIMS + else: + self.evaluation = "limited" + self.auto_close_dict_keys = False + self.splitter.delims = DELIMS + + dict_keys_only = Bool( + False, + help=""" + Whether to show dict key matches only. + + (disables all matchers except for `IPCompleter.dict_key_matcher`). + """, + ) + + suppress_competing_matchers = UnionTrait( + [Bool(allow_none=True), DictTrait(Bool(None, allow_none=True))], + default_value=None, + help=""" + Whether to suppress completions from other *Matchers*. + + When set to ``None`` (default) the matchers will attempt to auto-detect + whether suppression of other matchers is desirable. For example, at + the beginning of a line followed by `%` we expect a magic completion + to be the only applicable option, and after ``my_dict['`` we usually + expect a completion with an existing dictionary key. + + If you want to disable this heuristic and see completions from all matchers, + set ``IPCompleter.suppress_competing_matchers = False``. + To disable the heuristic for specific matchers provide a dictionary mapping: + ``IPCompleter.suppress_competing_matchers = {'IPCompleter.dict_key_matcher': False}``. + + Set ``IPCompleter.suppress_competing_matchers = True`` to limit + completions to the set of matchers with the highest priority; + this is equivalent to ``IPCompleter.merge_completions`` and + can be beneficial for performance, but will sometimes omit relevant + candidates from matchers further down the priority list. + """, + ).tag(config=True) + + merge_completions = Bool( + True, + help="""Whether to merge completion results into a single list + + If False, only the completion results from the first non-empty + completer will be returned. + + As of version 8.6.0, setting the value to ``False`` is an alias for: + ``IPCompleter.suppress_competing_matchers = True.``. + """, + ).tag(config=True) + + disable_matchers = ListTrait( + Unicode(), + help="""List of matchers to disable. + + The list should contain matcher identifiers (see :any:`completion_matcher`). + """, + ).tag(config=True) + + omit__names = Enum( + (0, 1, 2), + default_value=2, + help="""Instruct the completer to omit private method names + + Specifically, when completing on ``object.``. + + When 2 [default]: all names that start with '_' will be excluded. + + When 1: all 'magic' names (``__foo__``) will be excluded. + + When 0: nothing will be excluded. + """ + ).tag(config=True) + limit_to__all__ = Bool(False, + help=""" + DEPRECATED as of version 5.0. + + Instruct the completer to use __all__ for the completion + + Specifically, when completing on ``object.``. + + When True: only those names in obj.__all__ will be included. + + When False [default]: the __all__ attribute is ignored + """, + ).tag(config=True) + + profile_completions = Bool( + default_value=False, + help="If True, emit profiling data for completion subsystem using cProfile." + ).tag(config=True) + + profiler_output_dir = Unicode( + default_value=".completion_profiles", + help="Template for path at which to output profile data for completions." + ).tag(config=True) + + @observe('limit_to__all__') + def _limit_to_all_changed(self, change): + warnings.warn('`IPython.core.IPCompleter.limit_to__all__` configuration ' + 'value has been deprecated since IPython 5.0, will be made to have ' + 'no effects and then removed in future version of IPython.', + UserWarning) + + def __init__( + self, shell=None, namespace=None, global_namespace=None, config=None, **kwargs + ): + """IPCompleter() -> completer + + Return a completer object. + + Parameters + ---------- + shell + a pointer to the ipython shell itself. This is needed + because this completer knows about magic functions, and those can + only be accessed via the ipython instance. + namespace : dict, optional + an optional dict where completions are performed. + global_namespace : dict, optional + secondary optional dict for completions, to + handle cases (such as IPython embedded inside functions) where + both Python scopes are visible. + config : Config + traitlet's config object + **kwargs + passed to super class unmodified. + """ + + self.magic_escape = ESC_MAGIC + self.splitter = CompletionSplitter() + + # _greedy_changed() depends on splitter and readline being defined: + super().__init__( + namespace=namespace, + global_namespace=global_namespace, + config=config, + **kwargs, + ) + + # List where completion matches will be stored + self.matches = [] + self.shell = shell + # Regexp to split filenames with spaces in them + self.space_name_re = re.compile(r'([^\\] )') + # Hold a local ref. to glob.glob for speed + self.glob = glob.glob + + # Determine if we are running on 'dumb' terminals, like (X)Emacs + # buffers, to avoid completion problems. + term = os.environ.get('TERM','xterm') + self.dumb_terminal = term in ['dumb','emacs'] + + # Special handling of backslashes needed in win32 platforms + if sys.platform == "win32": + self.clean_glob = self._clean_glob_win32 + else: + self.clean_glob = self._clean_glob + + #regexp to parse docstring for function signature + self.docstring_sig_re = re.compile(r'^[\w|\s.]+\(([^)]*)\).*') + self.docstring_kwd_re = re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)') + #use this if positional argument name is also needed + #= re.compile(r'[\s|\[]*(\w+)(?:\s*=?\s*.*)') + + self.magic_arg_matchers = [ + self.magic_config_matcher, + self.magic_color_matcher, + ] + + # This is set externally by InteractiveShell + self.custom_completers = None + + # This is a list of names of unicode characters that can be completed + # into their corresponding unicode value. The list is large, so we + # lazily initialize it on first use. Consuming code should access this + # attribute through the `@unicode_names` property. + self._unicode_names = None + + self._backslash_combining_matchers = [ + self.latex_name_matcher, + self.unicode_name_matcher, + back_latex_name_matcher, + back_unicode_name_matcher, + self.fwd_unicode_matcher, + ] + + if not self.backslash_combining_completions: + for matcher in self._backslash_combining_matchers: + self.disable_matchers.append(_get_matcher_id(matcher)) + + if not self.merge_completions: + self.suppress_competing_matchers = True + + @property + def matchers(self) -> List[Matcher]: + """All active matcher routines for completion""" + if self.dict_keys_only: + return [self.dict_key_matcher] + + if self.use_jedi: + return [ + *self.custom_matchers, + *self._backslash_combining_matchers, + *self.magic_arg_matchers, + self.custom_completer_matcher, + self.magic_matcher, + self._jedi_matcher, + self.dict_key_matcher, + self.file_matcher, + ] + else: + return [ + *self.custom_matchers, + *self._backslash_combining_matchers, + *self.magic_arg_matchers, + self.custom_completer_matcher, + self.dict_key_matcher, + self.magic_matcher, + self.python_matcher, + self.file_matcher, + self.python_func_kw_matcher, + ] + + def all_completions(self, text:str) -> List[str]: + """ + Wrapper around the completion methods for the benefit of emacs. + """ + prefix = text.rpartition('.')[0] + with provisionalcompleter(): + return ['.'.join([prefix, c.text]) if prefix and self.use_jedi else c.text + for c in self.completions(text, len(text))] + + return self.complete(text)[1] + + def _clean_glob(self, text:str): + return self.glob("%s*" % text) + + def _clean_glob_win32(self, text:str): + return [f.replace("\\","/") + for f in self.glob("%s*" % text)] + + @context_matcher() + def file_matcher(self, context: CompletionContext) -> SimpleMatcherResult: + """Same as :any:`file_matches`, but adopted to new Matcher API.""" + matches = self.file_matches(context.token) + # TODO: add a heuristic for suppressing (e.g. if it has OS-specific delimiter, + # starts with `/home/`, `C:\`, etc) + return _convert_matcher_v1_result_to_v2(matches, type="path") + + def file_matches(self, text: str) -> List[str]: + """Match filenames, expanding ~USER type strings. + + Most of the seemingly convoluted logic in this completer is an + attempt to handle filenames with spaces in them. And yet it's not + quite perfect, because Python's readline doesn't expose all of the + GNU readline details needed for this to be done correctly. + + For a filename with a space in it, the printed completions will be + only the parts after what's already been typed (instead of the + full completions, as is normally done). I don't think with the + current (as of Python 2.3) Python readline it's possible to do + better. + + .. deprecated:: 8.6 + You can use :meth:`file_matcher` instead. + """ + + # chars that require escaping with backslash - i.e. chars + # that readline treats incorrectly as delimiters, but we + # don't want to treat as delimiters in filename matching + # when escaped with backslash + if text.startswith('!'): + text = text[1:] + text_prefix = u'!' + else: + text_prefix = u'' + + text_until_cursor = self.text_until_cursor + # track strings with open quotes + open_quotes = has_open_quotes(text_until_cursor) + + if '(' in text_until_cursor or '[' in text_until_cursor: + lsplit = text + else: + try: + # arg_split ~ shlex.split, but with unicode bugs fixed by us + lsplit = arg_split(text_until_cursor)[-1] + except ValueError: + # typically an unmatched ", or backslash without escaped char. + if open_quotes: + lsplit = text_until_cursor.split(open_quotes)[-1] + else: + return [] + except IndexError: + # tab pressed on empty line + lsplit = "" + + if not open_quotes and lsplit != protect_filename(lsplit): + # if protectables are found, do matching on the whole escaped name + has_protectables = True + text0,text = text,lsplit + else: + has_protectables = False + text = os.path.expanduser(text) + + if text == "": + return [text_prefix + protect_filename(f) for f in self.glob("*")] + + # Compute the matches from the filesystem + if sys.platform == 'win32': + m0 = self.clean_glob(text) + else: + m0 = self.clean_glob(text.replace('\\', '')) + + if has_protectables: + # If we had protectables, we need to revert our changes to the + # beginning of filename so that we don't double-write the part + # of the filename we have so far + len_lsplit = len(lsplit) + matches = [text_prefix + text0 + + protect_filename(f[len_lsplit:]) for f in m0] + else: + if open_quotes: + # if we have a string with an open quote, we don't need to + # protect the names beyond the quote (and we _shouldn't_, as + # it would cause bugs when the filesystem call is made). + matches = m0 if sys.platform == "win32" else\ + [protect_filename(f, open_quotes) for f in m0] + else: + matches = [text_prefix + + protect_filename(f) for f in m0] + + # Mark directories in input list by appending '/' to their names. + return [x+'/' if os.path.isdir(x) else x for x in matches] + + @context_matcher() + def magic_matcher(self, context: CompletionContext) -> SimpleMatcherResult: + """Match magics.""" + text = context.token + matches = self.magic_matches(text) + result = _convert_matcher_v1_result_to_v2(matches, type="magic") + is_magic_prefix = len(text) > 0 and text[0] == "%" + result["suppress"] = is_magic_prefix and bool(result["completions"]) + return result + + def magic_matches(self, text: str) -> List[str]: + """Match magics. + + .. deprecated:: 8.6 + You can use :meth:`magic_matcher` instead. + """ + # Get all shell magics now rather than statically, so magics loaded at + # runtime show up too. + lsm = self.shell.magics_manager.lsmagic() + line_magics = lsm['line'] + cell_magics = lsm['cell'] + pre = self.magic_escape + pre2 = pre+pre + + explicit_magic = text.startswith(pre) + + # Completion logic: + # - user gives %%: only do cell magics + # - user gives %: do both line and cell magics + # - no prefix: do both + # In other words, line magics are skipped if the user gives %% explicitly + # + # We also exclude magics that match any currently visible names: + # https://github.com/ipython/ipython/issues/4877, unless the user has + # typed a %: + # https://github.com/ipython/ipython/issues/10754 + bare_text = text.lstrip(pre) + global_matches = self.global_matches(bare_text) + if not explicit_magic: + def matches(magic): + """ + Filter magics, in particular remove magics that match + a name present in global namespace. + """ + return ( magic.startswith(bare_text) and + magic not in global_matches ) + else: + def matches(magic): + return magic.startswith(bare_text) + + comp = [ pre2+m for m in cell_magics if matches(m)] + if not text.startswith(pre2): + comp += [ pre+m for m in line_magics if matches(m)] + + return comp + + @context_matcher() + def magic_config_matcher(self, context: CompletionContext) -> SimpleMatcherResult: + """Match class names and attributes for %config magic.""" + # NOTE: uses `line_buffer` equivalent for compatibility + matches = self.magic_config_matches(context.line_with_cursor) + return _convert_matcher_v1_result_to_v2(matches, type="param") + + def magic_config_matches(self, text: str) -> List[str]: + """Match class names and attributes for %config magic. + + .. deprecated:: 8.6 + You can use :meth:`magic_config_matcher` instead. + """ + texts = text.strip().split() + + if len(texts) > 0 and (texts[0] == 'config' or texts[0] == '%config'): + # get all configuration classes + classes = sorted(set([ c for c in self.shell.configurables + if c.__class__.class_traits(config=True) + ]), key=lambda x: x.__class__.__name__) + classnames = [ c.__class__.__name__ for c in classes ] + + # return all classnames if config or %config is given + if len(texts) == 1: + return classnames + + # match classname + classname_texts = texts[1].split('.') + classname = classname_texts[0] + classname_matches = [ c for c in classnames + if c.startswith(classname) ] + + # return matched classes or the matched class with attributes + if texts[1].find('.') < 0: + return classname_matches + elif len(classname_matches) == 1 and \ + classname_matches[0] == classname: + cls = classes[classnames.index(classname)].__class__ + help = cls.class_get_help() + # strip leading '--' from cl-args: + help = re.sub(re.compile(r'^--', re.MULTILINE), '', help) + return [ attr.split('=')[0] + for attr in help.strip().splitlines() + if attr.startswith(texts[1]) ] + return [] + + @context_matcher() + def magic_color_matcher(self, context: CompletionContext) -> SimpleMatcherResult: + """Match color schemes for %colors magic.""" + # NOTE: uses `line_buffer` equivalent for compatibility + matches = self.magic_color_matches(context.line_with_cursor) + return _convert_matcher_v1_result_to_v2(matches, type="param") + + def magic_color_matches(self, text: str) -> List[str]: + """Match color schemes for %colors magic. + + .. deprecated:: 8.6 + You can use :meth:`magic_color_matcher` instead. + """ + texts = text.split() + if text.endswith(' '): + # .split() strips off the trailing whitespace. Add '' back + # so that: '%colors ' -> ['%colors', ''] + texts.append('') + + if len(texts) == 2 and (texts[0] == 'colors' or texts[0] == '%colors'): + prefix = texts[1] + return [ color for color in InspectColors.keys() + if color.startswith(prefix) ] + return [] + + @context_matcher(identifier="IPCompleter.jedi_matcher") + def _jedi_matcher(self, context: CompletionContext) -> _JediMatcherResult: + matches = self._jedi_matches( + cursor_column=context.cursor_position, + cursor_line=context.cursor_line, + text=context.full_text, + ) + return { + "completions": matches, + # static analysis should not suppress other matchers + "suppress": False, + } + + def _jedi_matches( + self, cursor_column: int, cursor_line: int, text: str + ) -> Iterator[_JediCompletionLike]: + """ + Return a list of :any:`jedi.api.Completion`\\s object from a ``text`` and + cursor position. + + Parameters + ---------- + cursor_column : int + column position of the cursor in ``text``, 0-indexed. + cursor_line : int + line position of the cursor in ``text``, 0-indexed + text : str + text to complete + + Notes + ----- + If ``IPCompleter.debug`` is ``True`` may return a :any:`_FakeJediCompletion` + object containing a string with the Jedi debug information attached. + + .. deprecated:: 8.6 + You can use :meth:`_jedi_matcher` instead. + """ + namespaces = [self.namespace] + if self.global_namespace is not None: + namespaces.append(self.global_namespace) + + completion_filter = lambda x:x + offset = cursor_to_position(text, cursor_line, cursor_column) + # filter output if we are completing for object members + if offset: + pre = text[offset-1] + if pre == '.': + if self.omit__names == 2: + completion_filter = lambda c:not c.name.startswith('_') + elif self.omit__names == 1: + completion_filter = lambda c:not (c.name.startswith('__') and c.name.endswith('__')) + elif self.omit__names == 0: + completion_filter = lambda x:x + else: + raise ValueError("Don't understand self.omit__names == {}".format(self.omit__names)) + + interpreter = jedi.Interpreter(text[:offset], namespaces) + try_jedi = True + + try: + # find the first token in the current tree -- if it is a ' or " then we are in a string + completing_string = False + try: + first_child = next(c for c in interpreter._get_module().tree_node.children if hasattr(c, 'value')) + except StopIteration: + pass + else: + # note the value may be ', ", or it may also be ''' or """, or + # in some cases, """what/you/typed..., but all of these are + # strings. + completing_string = len(first_child.value) > 0 and first_child.value[0] in {"'", '"'} + + # if we are in a string jedi is likely not the right candidate for + # now. Skip it. + try_jedi = not completing_string + except Exception as e: + # many of things can go wrong, we are using private API just don't crash. + if self.debug: + print("Error detecting if completing a non-finished string :", e, '|') + + if not try_jedi: + return iter([]) + try: + return filter(completion_filter, interpreter.complete(column=cursor_column, line=cursor_line + 1)) + except Exception as e: + if self.debug: + return iter( + [ + _FakeJediCompletion( + 'Oops Jedi has crashed, please report a bug with the following:\n"""\n%s\ns"""' + % (e) + ) + ] + ) + else: + return iter([]) + + @context_matcher() + def python_matcher(self, context: CompletionContext) -> SimpleMatcherResult: + """Match attributes or global python names""" + text = context.line_with_cursor + if "." in text: + try: + matches, fragment = self._attr_matches(text, include_prefix=False) + if text.endswith(".") and self.omit__names: + if self.omit__names == 1: + # true if txt is _not_ a __ name, false otherwise: + no__name = lambda txt: re.match(r".*\.__.*?__", txt) is None + else: + # true if txt is _not_ a _ name, false otherwise: + no__name = ( + lambda txt: re.match(r"\._.*?", txt[txt.rindex(".") :]) + is None + ) + matches = filter(no__name, matches) + return _convert_matcher_v1_result_to_v2( + matches, type="attribute", fragment=fragment + ) + except NameError: + # catches . + matches = [] + return _convert_matcher_v1_result_to_v2(matches, type="attribute") + else: + matches = self.global_matches(context.token) + # TODO: maybe distinguish between functions, modules and just "variables" + return _convert_matcher_v1_result_to_v2(matches, type="variable") + + @completion_matcher(api_version=1) + def python_matches(self, text: str) -> Iterable[str]: + """Match attributes or global python names. + + .. deprecated:: 8.27 + You can use :meth:`python_matcher` instead.""" + if "." in text: + try: + matches = self.attr_matches(text) + if text.endswith('.') and self.omit__names: + if self.omit__names == 1: + # true if txt is _not_ a __ name, false otherwise: + no__name = (lambda txt: + re.match(r'.*\.__.*?__',txt) is None) + else: + # true if txt is _not_ a _ name, false otherwise: + no__name = (lambda txt: + re.match(r'\._.*?',txt[txt.rindex('.'):]) is None) + matches = filter(no__name, matches) + except NameError: + # catches . + matches = [] + else: + matches = self.global_matches(text) + return matches + + def _default_arguments_from_docstring(self, doc): + """Parse the first line of docstring for call signature. + + Docstring should be of the form 'min(iterable[, key=func])\n'. + It can also parse cython docstring of the form + 'Minuit.migrad(self, int ncall=10000, resume=True, int nsplit=1)'. + """ + if doc is None: + return [] + + #care only the firstline + line = doc.lstrip().splitlines()[0] + + #p = re.compile(r'^[\w|\s.]+\(([^)]*)\).*') + #'min(iterable[, key=func])\n' -> 'iterable[, key=func]' + sig = self.docstring_sig_re.search(line) + if sig is None: + return [] + # iterable[, key=func]' -> ['iterable[' ,' key=func]'] + sig = sig.groups()[0].split(',') + ret = [] + for s in sig: + #re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)') + ret += self.docstring_kwd_re.findall(s) + return ret + + def _default_arguments(self, obj): + """Return the list of default arguments of obj if it is callable, + or empty list otherwise.""" + call_obj = obj + ret = [] + if inspect.isbuiltin(obj): + pass + elif not (inspect.isfunction(obj) or inspect.ismethod(obj)): + if inspect.isclass(obj): + #for cython embedsignature=True the constructor docstring + #belongs to the object itself not __init__ + ret += self._default_arguments_from_docstring( + getattr(obj, '__doc__', '')) + # for classes, check for __init__,__new__ + call_obj = (getattr(obj, '__init__', None) or + getattr(obj, '__new__', None)) + # for all others, check if they are __call__able + elif hasattr(obj, '__call__'): + call_obj = obj.__call__ + ret += self._default_arguments_from_docstring( + getattr(call_obj, '__doc__', '')) + + _keeps = (inspect.Parameter.KEYWORD_ONLY, + inspect.Parameter.POSITIONAL_OR_KEYWORD) + + try: + sig = inspect.signature(obj) + ret.extend(k for k, v in sig.parameters.items() if + v.kind in _keeps) + except ValueError: + pass + + return list(set(ret)) + + @context_matcher() + def python_func_kw_matcher(self, context: CompletionContext) -> SimpleMatcherResult: + """Match named parameters (kwargs) of the last open function.""" + matches = self.python_func_kw_matches(context.token) + return _convert_matcher_v1_result_to_v2(matches, type="param") + + def python_func_kw_matches(self, text): + """Match named parameters (kwargs) of the last open function. + + .. deprecated:: 8.6 + You can use :meth:`python_func_kw_matcher` instead. + """ + + if "." in text: # a parameter cannot be dotted + return [] + try: regexp = self.__funcParamsRegex + except AttributeError: + regexp = self.__funcParamsRegex = re.compile(r''' + '.*?(?,a=1)", the candidate is "foo" + tokens = regexp.findall(self.text_until_cursor) + iterTokens = reversed(tokens) + openPar = 0 + + for token in iterTokens: + if token == ')': + openPar -= 1 + elif token == '(': + openPar += 1 + if openPar > 0: + # found the last unclosed parenthesis + break + else: + return [] + # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" ) + ids = [] + isId = re.compile(r'\w+$').match + + while True: + try: + ids.append(next(iterTokens)) + if not isId(ids[-1]): + ids.pop() + break + if not next(iterTokens) == '.': + break + except StopIteration: + break + + # Find all named arguments already assigned to, as to avoid suggesting + # them again + usedNamedArgs = set() + par_level = -1 + for token, next_token in zip(tokens, tokens[1:]): + if token == '(': + par_level += 1 + elif token == ')': + par_level -= 1 + + if par_level != 0: + continue + + if next_token != '=': + continue + + usedNamedArgs.add(token) + + argMatches = [] + try: + callableObj = '.'.join(ids[::-1]) + namedArgs = self._default_arguments(eval(callableObj, + self.namespace)) + + # Remove used named arguments from the list, no need to show twice + for namedArg in set(namedArgs) - usedNamedArgs: + if namedArg.startswith(text): + argMatches.append("%s=" %namedArg) + except: + pass + + return argMatches + + @staticmethod + def _get_keys(obj: Any) -> List[Any]: + # Objects can define their own completions by defining an + # _ipy_key_completions_() method. + method = get_real_method(obj, '_ipython_key_completions_') + if method is not None: + return method() + + # Special case some common in-memory dict-like types + if isinstance(obj, dict) or _safe_isinstance(obj, "pandas", "DataFrame"): + try: + return list(obj.keys()) + except Exception: + return [] + elif _safe_isinstance(obj, "pandas", "core", "indexing", "_LocIndexer"): + try: + return list(obj.obj.keys()) + except Exception: + return [] + elif _safe_isinstance(obj, 'numpy', 'ndarray') or\ + _safe_isinstance(obj, 'numpy', 'void'): + return obj.dtype.names or [] + return [] + + @context_matcher() + def dict_key_matcher(self, context: CompletionContext) -> SimpleMatcherResult: + """Match string keys in a dictionary, after e.g. ``foo[``.""" + matches = self.dict_key_matches(context.token) + return _convert_matcher_v1_result_to_v2( + matches, type="dict key", suppress_if_matches=True + ) + + def dict_key_matches(self, text: str) -> List[str]: + """Match string keys in a dictionary, after e.g. ``foo[``. + + .. deprecated:: 8.6 + You can use :meth:`dict_key_matcher` instead. + """ + + # Short-circuit on closed dictionary (regular expression would + # not match anyway, but would take quite a while). + if self.text_until_cursor.strip().endswith("]"): + return [] + + match = DICT_MATCHER_REGEX.search(self.text_until_cursor) + + if match is None: + return [] + + expr, prior_tuple_keys, key_prefix = match.groups() + + obj = self._evaluate_expr(expr) + + if obj is not_found: + return [] + + keys = self._get_keys(obj) + if not keys: + return keys + + tuple_prefix = guarded_eval( + prior_tuple_keys, + EvaluationContext( + globals=self.global_namespace, + locals=self.namespace, + evaluation=self.evaluation, # type: ignore + in_subscript=True, + ), + ) + + closing_quote, token_offset, matches = match_dict_keys( + keys, key_prefix, self.splitter.delims, extra_prefix=tuple_prefix + ) + if not matches: + return [] + + # get the cursor position of + # - the text being completed + # - the start of the key text + # - the start of the completion + text_start = len(self.text_until_cursor) - len(text) + if key_prefix: + key_start = match.start(3) + completion_start = key_start + token_offset + else: + key_start = completion_start = match.end() + + # grab the leading prefix, to make sure all completions start with `text` + if text_start > key_start: + leading = '' + else: + leading = text[text_start:completion_start] + + # append closing quote and bracket as appropriate + # this is *not* appropriate if the opening quote or bracket is outside + # the text given to this method, e.g. `d["""a\nt + can_close_quote = False + can_close_bracket = False + + continuation = self.line_buffer[len(self.text_until_cursor) :].strip() + + if continuation.startswith(closing_quote): + # do not close if already closed, e.g. `d['a'` + continuation = continuation[len(closing_quote) :] + else: + can_close_quote = True + + continuation = continuation.strip() + + # e.g. `pandas.DataFrame` has different tuple indexer behaviour, + # handling it is out of scope, so let's avoid appending suffixes. + has_known_tuple_handling = isinstance(obj, dict) + + can_close_bracket = ( + not continuation.startswith("]") and self.auto_close_dict_keys + ) + can_close_tuple_item = ( + not continuation.startswith(",") + and has_known_tuple_handling + and self.auto_close_dict_keys + ) + can_close_quote = can_close_quote and self.auto_close_dict_keys + + # fast path if closing quote should be appended but not suffix is allowed + if not can_close_quote and not can_close_bracket and closing_quote: + return [leading + k for k in matches] + + results = [] + + end_of_tuple_or_item = _DictKeyState.END_OF_TUPLE | _DictKeyState.END_OF_ITEM + + for k, state_flag in matches.items(): + result = leading + k + if can_close_quote and closing_quote: + result += closing_quote + + if state_flag == end_of_tuple_or_item: + # We do not know which suffix to add, + # e.g. both tuple item and string + # match this item. + pass + + if state_flag in end_of_tuple_or_item and can_close_bracket: + result += "]" + if state_flag == _DictKeyState.IN_TUPLE and can_close_tuple_item: + result += ", " + results.append(result) + return results + + @context_matcher() + def unicode_name_matcher(self, context: CompletionContext): + """Same as :any:`unicode_name_matches`, but adopted to new Matcher API.""" + fragment, matches = self.unicode_name_matches(context.text_until_cursor) + return _convert_matcher_v1_result_to_v2( + matches, type="unicode", fragment=fragment, suppress_if_matches=True + ) + + @staticmethod + def unicode_name_matches(text: str) -> Tuple[str, List[str]]: + """Match Latex-like syntax for unicode characters base + on the name of the character. + + This does ``\\GREEK SMALL LETTER ETA`` -> ``η`` + + Works only on valid python 3 identifier, or on combining characters that + will combine to form a valid identifier. + """ + slashpos = text.rfind('\\') + if slashpos > -1: + s = text[slashpos+1:] + try : + unic = unicodedata.lookup(s) + # allow combining chars + if ('a'+unic).isidentifier(): + return '\\'+s,[unic] + except KeyError: + pass + return '', [] + + @context_matcher() + def latex_name_matcher(self, context: CompletionContext): + """Match Latex syntax for unicode characters. + + This does both ``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` + """ + fragment, matches = self.latex_matches(context.text_until_cursor) + return _convert_matcher_v1_result_to_v2( + matches, type="latex", fragment=fragment, suppress_if_matches=True + ) + + def latex_matches(self, text: str) -> Tuple[str, Sequence[str]]: + """Match Latex syntax for unicode characters. + + This does both ``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` + + .. deprecated:: 8.6 + You can use :meth:`latex_name_matcher` instead. + """ + slashpos = text.rfind('\\') + if slashpos > -1: + s = text[slashpos:] + if s in latex_symbols: + # Try to complete a full latex symbol to unicode + # \\alpha -> α + return s, [latex_symbols[s]] + else: + # If a user has partially typed a latex symbol, give them + # a full list of options \al -> [\aleph, \alpha] + matches = [k for k in latex_symbols if k.startswith(s)] + if matches: + return s, matches + return '', () + + @context_matcher() + def custom_completer_matcher(self, context): + """Dispatch custom completer. + + If a match is found, suppresses all other matchers except for Jedi. + """ + matches = self.dispatch_custom_completer(context.token) or [] + result = _convert_matcher_v1_result_to_v2( + matches, type=_UNKNOWN_TYPE, suppress_if_matches=True + ) + result["ordered"] = True + result["do_not_suppress"] = {_get_matcher_id(self._jedi_matcher)} + return result + + def dispatch_custom_completer(self, text): + """ + .. deprecated:: 8.6 + You can use :meth:`custom_completer_matcher` instead. + """ + if not self.custom_completers: + return + + line = self.line_buffer + if not line.strip(): + return None + + # Create a little structure to pass all the relevant information about + # the current completion to any custom completer. + event = SimpleNamespace() + event.line = line + event.symbol = text + cmd = line.split(None,1)[0] + event.command = cmd + event.text_until_cursor = self.text_until_cursor + + # for foo etc, try also to find completer for %foo + if not cmd.startswith(self.magic_escape): + try_magic = self.custom_completers.s_matches( + self.magic_escape + cmd) + else: + try_magic = [] + + for c in itertools.chain(self.custom_completers.s_matches(cmd), + try_magic, + self.custom_completers.flat_matches(self.text_until_cursor)): + try: + res = c(event) + if res: + # first, try case sensitive match + withcase = [r for r in res if r.startswith(text)] + if withcase: + return withcase + # if none, then case insensitive ones are ok too + text_low = text.lower() + return [r for r in res if r.lower().startswith(text_low)] + except TryNext: + pass + except KeyboardInterrupt: + """ + If custom completer take too long, + let keyboard interrupt abort and return nothing. + """ + break + + return None + + def completions(self, text: str, offset: int)->Iterator[Completion]: + """ + Returns an iterator over the possible completions + + .. warning:: + + Unstable + + This function is unstable, API may change without warning. + It will also raise unless use in proper context manager. + + Parameters + ---------- + text : str + Full text of the current input, multi line string. + offset : int + Integer representing the position of the cursor in ``text``. Offset + is 0-based indexed. + + Yields + ------ + Completion + + Notes + ----- + The cursor on a text can either be seen as being "in between" + characters or "On" a character depending on the interface visible to + the user. For consistency the cursor being on "in between" characters X + and Y is equivalent to the cursor being "on" character Y, that is to say + the character the cursor is on is considered as being after the cursor. + + Combining characters may span more that one position in the + text. + + .. note:: + + If ``IPCompleter.debug`` is :any:`True` will yield a ``--jedi/ipython--`` + fake Completion token to distinguish completion returned by Jedi + and usual IPython completion. + + .. note:: + + Completions are not completely deduplicated yet. If identical + completions are coming from different sources this function does not + ensure that each completion object will only be present once. + """ + warnings.warn("_complete is a provisional API (as of IPython 6.0). " + "It may change without warnings. " + "Use in corresponding context manager.", + category=ProvisionalCompleterWarning, stacklevel=2) + + seen = set() + profiler:Optional[cProfile.Profile] + try: + if self.profile_completions: + import cProfile + profiler = cProfile.Profile() + profiler.enable() + else: + profiler = None + + for c in self._completions(text, offset, _timeout=self.jedi_compute_type_timeout/1000): + if c and (c in seen): + continue + yield c + seen.add(c) + except KeyboardInterrupt: + """if completions take too long and users send keyboard interrupt, + do not crash and return ASAP. """ + pass + finally: + if profiler is not None: + profiler.disable() + ensure_dir_exists(self.profiler_output_dir) + output_path = os.path.join(self.profiler_output_dir, str(uuid.uuid4())) + print("Writing profiler output to", output_path) + profiler.dump_stats(output_path) + + def _completions(self, full_text: str, offset: int, *, _timeout) -> Iterator[Completion]: + """ + Core completion module.Same signature as :any:`completions`, with the + extra `timeout` parameter (in seconds). + + Computing jedi's completion ``.type`` can be quite expensive (it is a + lazy property) and can require some warm-up, more warm up than just + computing the ``name`` of a completion. The warm-up can be : + + - Long warm-up the first time a module is encountered after + install/update: actually build parse/inference tree. + + - first time the module is encountered in a session: load tree from + disk. + + We don't want to block completions for tens of seconds so we give the + completer a "budget" of ``_timeout`` seconds per invocation to compute + completions types, the completions that have not yet been computed will + be marked as "unknown" an will have a chance to be computed next round + are things get cached. + + Keep in mind that Jedi is not the only thing treating the completion so + keep the timeout short-ish as if we take more than 0.3 second we still + have lots of processing to do. + + """ + deadline = time.monotonic() + _timeout + + before = full_text[:offset] + cursor_line, cursor_column = position_to_cursor(full_text, offset) + + jedi_matcher_id = _get_matcher_id(self._jedi_matcher) + + def is_non_jedi_result( + result: MatcherResult, identifier: str + ) -> TypeGuard[SimpleMatcherResult]: + return identifier != jedi_matcher_id + + results = self._complete( + full_text=full_text, cursor_line=cursor_line, cursor_pos=cursor_column + ) + + non_jedi_results: Dict[str, SimpleMatcherResult] = { + identifier: result + for identifier, result in results.items() + if is_non_jedi_result(result, identifier) + } + + jedi_matches = ( + cast(_JediMatcherResult, results[jedi_matcher_id])["completions"] + if jedi_matcher_id in results + else () + ) + + iter_jm = iter(jedi_matches) + if _timeout: + for jm in iter_jm: + try: + type_ = jm.type + except Exception: + if self.debug: + print("Error in Jedi getting type of ", jm) + type_ = None + delta = len(jm.name_with_symbols) - len(jm.complete) + if type_ == 'function': + signature = _make_signature(jm) + else: + signature = '' + yield Completion(start=offset - delta, + end=offset, + text=jm.name_with_symbols, + type=type_, + signature=signature, + _origin='jedi') + + if time.monotonic() > deadline: + break + + for jm in iter_jm: + delta = len(jm.name_with_symbols) - len(jm.complete) + yield Completion( + start=offset - delta, + end=offset, + text=jm.name_with_symbols, + type=_UNKNOWN_TYPE, # don't compute type for speed + _origin="jedi", + signature="", + ) + + # TODO: + # Suppress this, right now just for debug. + if jedi_matches and non_jedi_results and self.debug: + some_start_offset = before.rfind( + next(iter(non_jedi_results.values()))["matched_fragment"] + ) + yield Completion( + start=some_start_offset, + end=offset, + text="--jedi/ipython--", + _origin="debug", + type="none", + signature="", + ) + + ordered: List[Completion] = [] + sortable: List[Completion] = [] + + for origin, result in non_jedi_results.items(): + matched_text = result["matched_fragment"] + start_offset = before.rfind(matched_text) + is_ordered = result.get("ordered", False) + container = ordered if is_ordered else sortable + + # I'm unsure if this is always true, so let's assert and see if it + # crash + assert before.endswith(matched_text) + + for simple_completion in result["completions"]: + completion = Completion( + start=start_offset, + end=offset, + text=simple_completion.text, + _origin=origin, + signature="", + type=simple_completion.type or _UNKNOWN_TYPE, + ) + container.append(completion) + + yield from list(self._deduplicate(ordered + self._sort(sortable)))[ + :MATCHES_LIMIT + ] + + def complete(self, text=None, line_buffer=None, cursor_pos=None) -> Tuple[str, Sequence[str]]: + """Find completions for the given text and line context. + + Note that both the text and the line_buffer are optional, but at least + one of them must be given. + + Parameters + ---------- + text : string, optional + Text to perform the completion on. If not given, the line buffer + is split using the instance's CompletionSplitter object. + line_buffer : string, optional + If not given, the completer attempts to obtain the current line + buffer via readline. This keyword allows clients which are + requesting for text completions in non-readline contexts to inform + the completer of the entire text. + cursor_pos : int, optional + Index of the cursor in the full line buffer. Should be provided by + remote frontends where kernel has no access to frontend state. + + Returns + ------- + Tuple of two items: + text : str + Text that was actually used in the completion. + matches : list + A list of completion matches. + + Notes + ----- + This API is likely to be deprecated and replaced by + :any:`IPCompleter.completions` in the future. + + """ + warnings.warn('`Completer.complete` is pending deprecation since ' + 'IPython 6.0 and will be replaced by `Completer.completions`.', + PendingDeprecationWarning) + # potential todo, FOLD the 3rd throw away argument of _complete + # into the first 2 one. + # TODO: Q: does the above refer to jedi completions (i.e. 0-indexed?) + # TODO: should we deprecate now, or does it stay? + + results = self._complete( + line_buffer=line_buffer, cursor_pos=cursor_pos, text=text, cursor_line=0 + ) + + jedi_matcher_id = _get_matcher_id(self._jedi_matcher) + + return self._arrange_and_extract( + results, + # TODO: can we confirm that excluding Jedi here was a deliberate choice in previous version? + skip_matchers={jedi_matcher_id}, + # this API does not support different start/end positions (fragments of token). + abort_if_offset_changes=True, + ) + + def _arrange_and_extract( + self, + results: Dict[str, MatcherResult], + skip_matchers: Set[str], + abort_if_offset_changes: bool, + ): + sortable: List[AnyMatcherCompletion] = [] + ordered: List[AnyMatcherCompletion] = [] + most_recent_fragment = None + for identifier, result in results.items(): + if identifier in skip_matchers: + continue + if not result["completions"]: + continue + if not most_recent_fragment: + most_recent_fragment = result["matched_fragment"] + if ( + abort_if_offset_changes + and result["matched_fragment"] != most_recent_fragment + ): + break + if result.get("ordered", False): + ordered.extend(result["completions"]) + else: + sortable.extend(result["completions"]) + + if not most_recent_fragment: + most_recent_fragment = "" # to satisfy typechecker (and just in case) + + return most_recent_fragment, [ + m.text for m in self._deduplicate(ordered + self._sort(sortable)) + ] + + def _complete(self, *, cursor_line, cursor_pos, line_buffer=None, text=None, + full_text=None) -> _CompleteResult: + """ + Like complete but can also returns raw jedi completions as well as the + origin of the completion text. This could (and should) be made much + cleaner but that will be simpler once we drop the old (and stateful) + :any:`complete` API. + + With current provisional API, cursor_pos act both (depending on the + caller) as the offset in the ``text`` or ``line_buffer``, or as the + ``column`` when passing multiline strings this could/should be renamed + but would add extra noise. + + Parameters + ---------- + cursor_line + Index of the line the cursor is on. 0 indexed. + cursor_pos + Position of the cursor in the current line/line_buffer/text. 0 + indexed. + line_buffer : optional, str + The current line the cursor is in, this is mostly due to legacy + reason that readline could only give a us the single current line. + Prefer `full_text`. + text : str + The current "token" the cursor is in, mostly also for historical + reasons. as the completer would trigger only after the current line + was parsed. + full_text : str + Full text of the current cell. + + Returns + ------- + An ordered dictionary where keys are identifiers of completion + matchers and values are ``MatcherResult``s. + """ + + # if the cursor position isn't given, the only sane assumption we can + # make is that it's at the end of the line (the common case) + if cursor_pos is None: + cursor_pos = len(line_buffer) if text is None else len(text) + + if self.use_main_ns: + self.namespace = __main__.__dict__ + + # if text is either None or an empty string, rely on the line buffer + if (not line_buffer) and full_text: + line_buffer = full_text.split('\n')[cursor_line] + if not text: # issue #11508: check line_buffer before calling split_line + text = ( + self.splitter.split_line(line_buffer, cursor_pos) if line_buffer else "" + ) + + # If no line buffer is given, assume the input text is all there was + if line_buffer is None: + line_buffer = text + + # deprecated - do not use `line_buffer` in new code. + self.line_buffer = line_buffer + self.text_until_cursor = self.line_buffer[:cursor_pos] + + if not full_text: + full_text = line_buffer + + context = CompletionContext( + full_text=full_text, + cursor_position=cursor_pos, + cursor_line=cursor_line, + token=text, + limit=MATCHES_LIMIT, + ) + + # Start with a clean slate of completions + results: Dict[str, MatcherResult] = {} + + jedi_matcher_id = _get_matcher_id(self._jedi_matcher) + + suppressed_matchers: Set[str] = set() + + matchers = { + _get_matcher_id(matcher): matcher + for matcher in sorted( + self.matchers, key=_get_matcher_priority, reverse=True + ) + } + + for matcher_id, matcher in matchers.items(): + matcher_id = _get_matcher_id(matcher) + + if matcher_id in self.disable_matchers: + continue + + if matcher_id in results: + warnings.warn(f"Duplicate matcher ID: {matcher_id}.") + + if matcher_id in suppressed_matchers: + continue + + result: MatcherResult + try: + if _is_matcher_v1(matcher): + result = _convert_matcher_v1_result_to_v2( + matcher(text), type=_UNKNOWN_TYPE + ) + elif _is_matcher_v2(matcher): + result = matcher(context) + else: + api_version = _get_matcher_api_version(matcher) + raise ValueError(f"Unsupported API version {api_version}") + except BaseException: + # Show the ugly traceback if the matcher causes an + # exception, but do NOT crash the kernel! + sys.excepthook(*sys.exc_info()) + continue + + # set default value for matched fragment if suffix was not selected. + result["matched_fragment"] = result.get("matched_fragment", context.token) + + if not suppressed_matchers: + suppression_recommended: Union[bool, Set[str]] = result.get( + "suppress", False + ) + + suppression_config = ( + self.suppress_competing_matchers.get(matcher_id, None) + if isinstance(self.suppress_competing_matchers, dict) + else self.suppress_competing_matchers + ) + should_suppress = ( + (suppression_config is True) + or (suppression_recommended and (suppression_config is not False)) + ) and has_any_completions(result) + + if should_suppress: + suppression_exceptions: Set[str] = result.get( + "do_not_suppress", set() + ) + if isinstance(suppression_recommended, Iterable): + to_suppress = set(suppression_recommended) + else: + to_suppress = set(matchers) + suppressed_matchers = to_suppress - suppression_exceptions + + new_results = {} + for previous_matcher_id, previous_result in results.items(): + if previous_matcher_id not in suppressed_matchers: + new_results[previous_matcher_id] = previous_result + results = new_results + + results[matcher_id] = result + + _, matches = self._arrange_and_extract( + results, + # TODO Jedi completions non included in legacy stateful API; was this deliberate or omission? + # if it was omission, we can remove the filtering step, otherwise remove this comment. + skip_matchers={jedi_matcher_id}, + abort_if_offset_changes=False, + ) + + # populate legacy stateful API + self.matches = matches + + return results + + @staticmethod + def _deduplicate( + matches: Sequence[AnyCompletion], + ) -> Iterable[AnyCompletion]: + filtered_matches: Dict[str, AnyCompletion] = {} + for match in matches: + text = match.text + if ( + text not in filtered_matches + or filtered_matches[text].type == _UNKNOWN_TYPE + ): + filtered_matches[text] = match + + return filtered_matches.values() + + @staticmethod + def _sort(matches: Sequence[AnyCompletion]): + return sorted(matches, key=lambda x: completions_sorting_key(x.text)) + + @context_matcher() + def fwd_unicode_matcher(self, context: CompletionContext): + """Same as :any:`fwd_unicode_match`, but adopted to new Matcher API.""" + # TODO: use `context.limit` to terminate early once we matched the maximum + # number that will be used downstream; can be added as an optional to + # `fwd_unicode_match(text: str, limit: int = None)` or we could re-implement here. + fragment, matches = self.fwd_unicode_match(context.text_until_cursor) + return _convert_matcher_v1_result_to_v2( + matches, type="unicode", fragment=fragment, suppress_if_matches=True + ) + + def fwd_unicode_match(self, text: str) -> Tuple[str, Sequence[str]]: + """ + Forward match a string starting with a backslash with a list of + potential Unicode completions. + + Will compute list of Unicode character names on first call and cache it. + + .. deprecated:: 8.6 + You can use :meth:`fwd_unicode_matcher` instead. + + Returns + ------- + At tuple with: + - matched text (empty if no matches) + - list of potential completions, empty tuple otherwise) + """ + # TODO: self.unicode_names is here a list we traverse each time with ~100k elements. + # We could do a faster match using a Trie. + + # Using pygtrie the following seem to work: + + # s = PrefixSet() + + # for c in range(0,0x10FFFF + 1): + # try: + # s.add(unicodedata.name(chr(c))) + # except ValueError: + # pass + # [''.join(k) for k in s.iter(prefix)] + + # But need to be timed and adds an extra dependency. + + slashpos = text.rfind('\\') + # if text starts with slash + if slashpos > -1: + # PERF: It's important that we don't access self._unicode_names + # until we're inside this if-block. _unicode_names is lazily + # initialized, and it takes a user-noticeable amount of time to + # initialize it, so we don't want to initialize it unless we're + # actually going to use it. + s = text[slashpos + 1 :] + sup = s.upper() + candidates = [x for x in self.unicode_names if x.startswith(sup)] + if candidates: + return s, candidates + candidates = [x for x in self.unicode_names if sup in x] + if candidates: + return s, candidates + splitsup = sup.split(" ") + candidates = [ + x for x in self.unicode_names if all(u in x for u in splitsup) + ] + if candidates: + return s, candidates + + return "", () + + # if text does not start with slash + else: + return '', () + + @property + def unicode_names(self) -> List[str]: + """List of names of unicode code points that can be completed. + + The list is lazily initialized on first access. + """ + if self._unicode_names is None: + names = [] + for c in range(0,0x10FFFF + 1): + try: + names.append(unicodedata.name(chr(c))) + except ValueError: + pass + self._unicode_names = _unicode_name_compute(_UNICODE_RANGES) + + return self._unicode_names + +def _unicode_name_compute(ranges:List[Tuple[int,int]]) -> List[str]: + names = [] + for start,stop in ranges: + for c in range(start, stop) : + try: + names.append(unicodedata.name(chr(c))) + except ValueError: + pass + return names diff --git a/.venv/lib/python3.12/site-packages/IPython/core/completerlib.py b/.venv/lib/python3.12/site-packages/IPython/core/completerlib.py new file mode 100644 index 0000000..f15490f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/completerlib.py @@ -0,0 +1,382 @@ +# encoding: utf-8 +"""Implementations for various useful completers. + +These are all loaded by default by IPython. +""" +#----------------------------------------------------------------------------- +# Copyright (C) 2010-2011 The IPython Development Team. +# +# Distributed under the terms of the BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +# Stdlib imports +import glob +import inspect +import os +import re +import sys +from importlib import import_module +from importlib.machinery import all_suffixes + + +# Third-party imports +from time import time +from zipimport import zipimporter + +# Our own imports +from .completer import expand_user, compress_user +from .error import TryNext +from ..utils._process_common import arg_split + +# FIXME: this should be pulled in with the right call via the component system +from IPython import get_ipython + +from typing import List + +#----------------------------------------------------------------------------- +# Globals and constants +#----------------------------------------------------------------------------- +_suffixes = all_suffixes() + +# Time in seconds after which the rootmodules will be stored permanently in the +# ipython ip.db database (kept in the user's .ipython dir). +TIMEOUT_STORAGE = 2 + +# Time in seconds after which we give up +TIMEOUT_GIVEUP = 20 + +# Regular expression for the python import statement +import_re = re.compile(r'(?P[^\W\d]\w*?)' + r'(?P[/\\]__init__)?' + r'(?P%s)$' % + r'|'.join(re.escape(s) for s in _suffixes)) + +# RE for the ipython %run command (python + ipython scripts) +magic_run_re = re.compile(r'.*(\.ipy|\.ipynb|\.py[w]?)$') + +#----------------------------------------------------------------------------- +# Local utilities +#----------------------------------------------------------------------------- + + +def module_list(path: str) -> List[str]: + """ + Return the list containing the names of the modules available in the given + folder. + """ + # sys.path has the cwd as an empty string, but isdir/listdir need it as '.' + if path == '': + path = '.' + + # A few local constants to be used in loops below + pjoin = os.path.join + + if os.path.isdir(path): + # Build a list of all files in the directory and all files + # in its subdirectories. For performance reasons, do not + # recurse more than one level into subdirectories. + files: List[str] = [] + for root, dirs, nondirs in os.walk(path, followlinks=True): + subdir = root[len(path)+1:] + if subdir: + files.extend(pjoin(subdir, f) for f in nondirs) + dirs[:] = [] # Do not recurse into additional subdirectories. + else: + files.extend(nondirs) + + else: + try: + files = list(zipimporter(path)._files.keys()) # type: ignore + except Exception: + files = [] + + # Build a list of modules which match the import_re regex. + modules = [] + for f in files: + m = import_re.match(f) + if m: + modules.append(m.group('name')) + return list(set(modules)) + + +def get_root_modules(): + """ + Returns a list containing the names of all the modules available in the + folders of the pythonpath. + + ip.db['rootmodules_cache'] maps sys.path entries to list of modules. + """ + ip = get_ipython() + if ip is None: + # No global shell instance to store cached list of modules. + # Don't try to scan for modules every time. + return list(sys.builtin_module_names) + + if getattr(ip.db, "_mock", False): + rootmodules_cache = {} + else: + rootmodules_cache = ip.db.get("rootmodules_cache", {}) + rootmodules = list(sys.builtin_module_names) + start_time = time() + store = False + for path in sys.path: + try: + modules = rootmodules_cache[path] + except KeyError: + modules = module_list(path) + try: + modules.remove('__init__') + except ValueError: + pass + if path not in ('', '.'): # cwd modules should not be cached + rootmodules_cache[path] = modules + if time() - start_time > TIMEOUT_STORAGE and not store: + store = True + print("\nCaching the list of root modules, please wait!") + print("(This will only be done once - type '%rehashx' to " + "reset cache!)\n") + sys.stdout.flush() + if time() - start_time > TIMEOUT_GIVEUP: + print("This is taking too long, we give up.\n") + return [] + rootmodules.extend(modules) + if store: + ip.db['rootmodules_cache'] = rootmodules_cache + rootmodules = list(set(rootmodules)) + return rootmodules + + +def is_importable(module, attr: str, only_modules) -> bool: + if only_modules: + try: + mod = getattr(module, attr) + except ModuleNotFoundError: + # See gh-14434 + return False + return inspect.ismodule(mod) + else: + return not(attr[:2] == '__' and attr[-2:] == '__') + +def is_possible_submodule(module, attr): + try: + obj = getattr(module, attr) + except AttributeError: + # Is possibly an unimported submodule + return True + except TypeError: + # https://github.com/ipython/ipython/issues/9678 + return False + return inspect.ismodule(obj) + + +def try_import(mod: str, only_modules=False) -> List[str]: + """ + Try to import given module and return list of potential completions. + """ + mod = mod.rstrip('.') + try: + m = import_module(mod) + except: + return [] + + m_is_init = '__init__' in (getattr(m, '__file__', '') or '') + + completions = [] + if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init: + completions.extend( [attr for attr in dir(m) if + is_importable(m, attr, only_modules)]) + + m_all = getattr(m, "__all__", []) + if only_modules: + completions.extend(attr for attr in m_all if is_possible_submodule(m, attr)) + else: + completions.extend(m_all) + + if m_is_init: + file_ = m.__file__ + file_path = os.path.dirname(file_) # type: ignore + if file_path is not None: + completions.extend(module_list(file_path)) + completions_set = {c for c in completions if isinstance(c, str)} + completions_set.discard('__init__') + return list(completions_set) + + +#----------------------------------------------------------------------------- +# Completion-related functions. +#----------------------------------------------------------------------------- + +def quick_completer(cmd, completions): + r""" Easily create a trivial completer for a command. + + Takes either a list of completions, or all completions in string (that will + be split on whitespace). + + Example:: + + [d:\ipython]|1> import ipy_completers + [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz']) + [d:\ipython]|3> foo b + bar baz + [d:\ipython]|3> foo ba + """ + + if isinstance(completions, str): + completions = completions.split() + + def do_complete(self, event): + return completions + + get_ipython().set_hook('complete_command',do_complete, str_key = cmd) + +def module_completion(line): + """ + Returns a list containing the completion possibilities for an import line. + + The line looks like this : + 'import xml.d' + 'from xml.dom import' + """ + + words = line.split(' ') + nwords = len(words) + + # from whatever -> 'import ' + if nwords == 3 and words[0] == 'from': + return ['import '] + + # 'from xy' or 'import xy' + if nwords < 3 and (words[0] in {'%aimport', 'import', 'from'}) : + if nwords == 1: + return get_root_modules() + mod = words[1].split('.') + if len(mod) < 2: + return get_root_modules() + completion_list = try_import('.'.join(mod[:-1]), True) + return ['.'.join(mod[:-1] + [el]) for el in completion_list] + + # 'from xyz import abc' + if nwords >= 3 and words[0] == 'from': + mod = words[1] + return try_import(mod) + +#----------------------------------------------------------------------------- +# Completers +#----------------------------------------------------------------------------- +# These all have the func(self, event) signature to be used as custom +# completers + +def module_completer(self,event): + """Give completions after user has typed 'import ...' or 'from ...'""" + + # This works in all versions of python. While 2.5 has + # pkgutil.walk_packages(), that particular routine is fairly dangerous, + # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full + # of possibly problematic side effects. + # This search the folders in the sys.path for available modules. + + return module_completion(event.line) + +# FIXME: there's a lot of logic common to the run, cd and builtin file +# completers, that is currently reimplemented in each. + +def magic_run_completer(self, event): + """Complete files that end in .py or .ipy or .ipynb for the %run command. + """ + comps = arg_split(event.line, strict=False) + # relpath should be the current token that we need to complete. + if (len(comps) > 1) and (not event.line.endswith(' ')): + relpath = comps[-1].strip("'\"") + else: + relpath = '' + + #print("\nev=", event) # dbg + #print("rp=", relpath) # dbg + #print('comps=', comps) # dbg + + lglob = glob.glob + isdir = os.path.isdir + relpath, tilde_expand, tilde_val = expand_user(relpath) + + # Find if the user has already typed the first filename, after which we + # should complete on all files, since after the first one other files may + # be arguments to the input script. + + if any(magic_run_re.match(c) for c in comps): + matches = [f.replace('\\','/') + ('/' if isdir(f) else '') + for f in lglob(relpath+'*')] + else: + dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') if isdir(f)] + pys = [f.replace('\\','/') + for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') + + lglob(relpath+'*.ipynb') + lglob(relpath + '*.pyw')] + + matches = dirs + pys + + #print('run comp:', dirs+pys) # dbg + return [compress_user(p, tilde_expand, tilde_val) for p in matches] + + +def cd_completer(self, event): + """Completer function for cd, which only returns directories.""" + ip = get_ipython() + relpath = event.symbol + + #print(event) # dbg + if event.line.endswith('-b') or ' -b ' in event.line: + # return only bookmark completions + bkms = self.db.get('bookmarks', None) + if bkms: + return bkms.keys() + else: + return [] + + if event.symbol == '-': + width_dh = str(len(str(len(ip.user_ns['_dh']) + 1))) + # jump in directory history by number + fmt = '-%0' + width_dh +'d [%s]' + ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])] + if len(ents) > 1: + return ents + return [] + + if event.symbol.startswith('--'): + return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']] + + # Expand ~ in path and normalize directory separators. + relpath, tilde_expand, tilde_val = expand_user(relpath) + relpath = relpath.replace('\\','/') + + found = [] + for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*') + if os.path.isdir(f)]: + if ' ' in d: + # we don't want to deal with any of that, complex code + # for this is elsewhere + raise TryNext + + found.append(d) + + if not found: + if os.path.isdir(relpath): + return [compress_user(relpath, tilde_expand, tilde_val)] + + # if no completions so far, try bookmarks + bks = self.db.get('bookmarks',{}) + bkmatches = [s for s in bks if s.startswith(event.symbol)] + if bkmatches: + return bkmatches + + raise TryNext + + return [compress_user(p, tilde_expand, tilde_val) for p in found] + +def reset_completer(self, event): + "A completer for %reset magic" + return '-f -s in out array dhist'.split() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/crashhandler.py b/.venv/lib/python3.12/site-packages/IPython/core/crashhandler.py new file mode 100644 index 0000000..9c75c5d --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/crashhandler.py @@ -0,0 +1,248 @@ +# encoding: utf-8 +"""sys.excepthook for IPython itself, leaves a detailed report on disk. + +Authors: + +* Fernando Perez +* Brian E. Granger +""" + +#----------------------------------------------------------------------------- +# Copyright (C) 2001-2007 Fernando Perez. +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +import sys +import traceback +from pprint import pformat +from pathlib import Path + +import builtins as builtin_mod + +from IPython.core import ultratb +from IPython.core.application import Application +from IPython.core.release import author_email +from IPython.utils.sysinfo import sys_info + +from IPython.core.release import __version__ as version + +from typing import Optional, Dict +import types + +#----------------------------------------------------------------------------- +# Code +#----------------------------------------------------------------------------- + +# Template for the user message. +_default_message_template = """\ +Oops, {app_name} crashed. We do our best to make it stable, but... + +A crash report was automatically generated with the following information: + - A verbatim copy of the crash traceback. + - A copy of your input history during this session. + - Data on your current {app_name} configuration. + +It was left in the file named: +\t'{crash_report_fname}' +If you can email this file to the developers, the information in it will help +them in understanding and correcting the problem. + +You can mail it to: {contact_name} at {contact_email} +with the subject '{app_name} Crash Report'. + +If you want to do it now, the following command will work (under Unix): +mail -s '{app_name} Crash Report' {contact_email} < {crash_report_fname} + +In your email, please also include information about: +- The operating system under which the crash happened: Linux, macOS, Windows, + other, and which exact version (for example: Ubuntu 16.04.3, macOS 10.13.2, + Windows 10 Pro), and whether it is 32-bit or 64-bit; +- How {app_name} was installed: using pip or conda, from GitHub, as part of + a Docker container, or other, providing more detail if possible; +- How to reproduce the crash: what exact sequence of instructions can one + input to get the same crash? Ideally, find a minimal yet complete sequence + of instructions that yields the crash. + +To ensure accurate tracking of this issue, please file a report about it at: +{bug_tracker} +""" + +_lite_message_template = """ +If you suspect this is an IPython {version} bug, please report it at: + https://github.com/ipython/ipython/issues +or send an email to the mailing list at {email} + +You can print a more detailed traceback right now with "%tb", or use "%debug" +to interactively debug it. + +Extra-detailed tracebacks for bug-reporting purposes can be enabled via: + {config}Application.verbose_crash=True +""" + + +class CrashHandler: + """Customizable crash handlers for IPython applications. + + Instances of this class provide a :meth:`__call__` method which can be + used as a ``sys.excepthook``. The :meth:`__call__` signature is:: + + def __call__(self, etype, evalue, etb) + """ + + message_template = _default_message_template + section_sep = '\n\n'+'*'*75+'\n\n' + info: Dict[str, Optional[str]] + + def __init__( + self, + app: Application, + contact_name: Optional[str] = None, + contact_email: Optional[str] = None, + bug_tracker: Optional[str] = None, + show_crash_traceback: bool = True, + call_pdb: bool = False, + ): + """Create a new crash handler + + Parameters + ---------- + app : Application + A running :class:`Application` instance, which will be queried at + crash time for internal information. + contact_name : str + A string with the name of the person to contact. + contact_email : str + A string with the email address of the contact. + bug_tracker : str + A string with the URL for your project's bug tracker. + show_crash_traceback : bool + If false, don't print the crash traceback on stderr, only generate + the on-disk report + call_pdb + Whether to call pdb on crash + + Attributes + ---------- + These instances contain some non-argument attributes which allow for + further customization of the crash handler's behavior. Please see the + source for further details. + + """ + self.crash_report_fname = "Crash_report_%s.txt" % app.name + self.app = app + self.call_pdb = call_pdb + #self.call_pdb = True # dbg + self.show_crash_traceback = show_crash_traceback + self.info = dict(app_name = app.name, + contact_name = contact_name, + contact_email = contact_email, + bug_tracker = bug_tracker, + crash_report_fname = self.crash_report_fname) + + def __call__( + self, + etype: type[BaseException], + evalue: BaseException, + etb: types.TracebackType, + ) -> None: + """Handle an exception, call for compatible with sys.excepthook""" + + # do not allow the crash handler to be called twice without reinstalling it + # this prevents unlikely errors in the crash handling from entering an + # infinite loop. + sys.excepthook = sys.__excepthook__ + + # Report tracebacks shouldn't use color in general (safer for users) + color_scheme = 'NoColor' + + # Use this ONLY for developer debugging (keep commented out for release) + # color_scheme = 'Linux' # dbg + ipython_dir = getattr(self.app, "ipython_dir", None) + if ipython_dir is not None: + assert isinstance(ipython_dir, str) + rptdir = Path(ipython_dir) + else: + rptdir = Path.cwd() + if not rptdir.is_dir(): + rptdir = Path.cwd() + report_name = rptdir / self.crash_report_fname + # write the report filename into the instance dict so it can get + # properly expanded out in the user message template + self.crash_report_fname = str(report_name) + self.info["crash_report_fname"] = str(report_name) + TBhandler = ultratb.VerboseTB( + color_scheme=color_scheme, + long_header=True, + call_pdb=self.call_pdb, + ) + if self.call_pdb: + TBhandler(etype,evalue,etb) + return + else: + traceback = TBhandler.text(etype,evalue,etb,context=31) + + # print traceback to screen + if self.show_crash_traceback: + print(traceback, file=sys.stderr) + + # and generate a complete report on disk + try: + report = open(report_name, "w", encoding="utf-8") + except: + print('Could not create crash report on disk.', file=sys.stderr) + return + + with report: + # Inform user on stderr of what happened + print('\n'+'*'*70+'\n', file=sys.stderr) + print(self.message_template.format(**self.info), file=sys.stderr) + + # Construct report on disk + report.write(self.make_report(str(traceback))) + + builtin_mod.input("Hit to quit (your terminal may close):") + + def make_report(self, traceback: str) -> str: + """Return a string containing a crash report.""" + + sec_sep = self.section_sep + + report = ['*'*75+'\n\n'+'IPython post-mortem report\n\n'] + rpt_add = report.append + rpt_add(sys_info()) + + try: + config = pformat(self.app.config) + rpt_add(sec_sep) + rpt_add("Application name: %s\n\n" % self.app.name) + rpt_add("Current user configuration structure:\n\n") + rpt_add(config) + except: + pass + rpt_add(sec_sep+'Crash traceback:\n\n' + traceback) + + return ''.join(report) + + +def crash_handler_lite( + etype: type[BaseException], evalue: BaseException, tb: types.TracebackType +) -> None: + """a light excepthook, adding a small message to the usual traceback""" + traceback.print_exception(etype, evalue, tb) + + from IPython.core.interactiveshell import InteractiveShell + if InteractiveShell.initialized(): + # we are in a Shell environment, give %magic example + config = "%config " + else: + # we are not in a shell, show generic config + config = "c." + print(_lite_message_template.format(email=author_email, config=config, version=version), file=sys.stderr) + diff --git a/.venv/lib/python3.12/site-packages/IPython/core/debugger.py b/.venv/lib/python3.12/site-packages/IPython/core/debugger.py new file mode 100644 index 0000000..76c42e0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/debugger.py @@ -0,0 +1,1136 @@ +""" +Pdb debugger class. + + +This is an extension to PDB which adds a number of new features. +Note that there is also the `IPython.terminal.debugger` class which provides UI +improvements. + +We also strongly recommend to use this via the `ipdb` package, which provides +extra configuration options. + +Among other things, this subclass of PDB: + - supports many IPython magics like pdef/psource + - hide frames in tracebacks based on `__tracebackhide__` + - allows to skip frames based on `__debuggerskip__` + + +Global Configuration +-------------------- + +The IPython debugger will by read the global ``~/.pdbrc`` file. +That is to say you can list all commands supported by ipdb in your `~/.pdbrc` +configuration file, to globally configure pdb. + +Example:: + + # ~/.pdbrc + skip_predicates debuggerskip false + skip_hidden false + context 25 + +Features +-------- + +The IPython debugger can hide and skip frames when printing or moving through +the stack. This can have a performance impact, so can be configures. + +The skipping and hiding frames are configurable via the `skip_predicates` +command. + +By default, frames from readonly files will be hidden, frames containing +``__tracebackhide__ = True`` will be hidden. + +Frames containing ``__debuggerskip__`` will be stepped over, frames whose parent +frames value of ``__debuggerskip__`` is ``True`` will also be skipped. + + >>> def helpers_helper(): + ... pass + ... + ... def helper_1(): + ... print("don't step in me") + ... helpers_helpers() # will be stepped over unless breakpoint set. + ... + ... + ... def helper_2(): + ... print("in me neither") + ... + +One can define a decorator that wraps a function between the two helpers: + + >>> def pdb_skipped_decorator(function): + ... + ... + ... def wrapped_fn(*args, **kwargs): + ... __debuggerskip__ = True + ... helper_1() + ... __debuggerskip__ = False + ... result = function(*args, **kwargs) + ... __debuggerskip__ = True + ... helper_2() + ... # setting __debuggerskip__ to False again is not necessary + ... return result + ... + ... return wrapped_fn + +When decorating a function, ipdb will directly step into ``bar()`` by +default: + + >>> @foo_decorator + ... def bar(x, y): + ... return x * y + + +You can toggle the behavior with + + ipdb> skip_predicates debuggerskip false + +or configure it in your ``.pdbrc`` + + + +License +------- + +Modified from the standard pdb.Pdb class to avoid including readline, so that +the command line completion of other programs which include this isn't +damaged. + +In the future, this class will be expanded with improvements over the standard +pdb. + +The original code in this file is mainly lifted out of cmd.py in Python 2.2, +with minor changes. Licensing should therefore be under the standard Python +terms. For details on the PSF (Python Software Foundation) standard license, +see: + +https://docs.python.org/2/license.html + + +All the changes since then are under the same license as IPython. + +""" + +#***************************************************************************** +# +# This file is licensed under the PSF license. +# +# Copyright (C) 2001 Python Software Foundation, www.python.org +# Copyright (C) 2005-2006 Fernando Perez. +# +# +#***************************************************************************** + +from __future__ import annotations + +import inspect +import linecache +import os +import re +import sys +from contextlib import contextmanager +from functools import lru_cache + +from IPython import get_ipython +from IPython.core.excolors import exception_colors +from IPython.utils import PyColorize, coloransi, py3compat + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + # otherwise circular import + from IPython.core.interactiveshell import InteractiveShell + +# skip module docstests +__skip_doctest__ = True + +prompt = 'ipdb> ' + +# We have to check this directly from sys.argv, config struct not yet available +from pdb import Pdb as OldPdb + +# Allow the set_trace code to operate outside of an ipython instance, even if +# it does so with some limitations. The rest of this support is implemented in +# the Tracer constructor. + +DEBUGGERSKIP = "__debuggerskip__" + + +# this has been implemented in Pdb in Python 3.13 (https://github.com/python/cpython/pull/106676 +# on lower python versions, we backported the feature. +CHAIN_EXCEPTIONS = sys.version_info < (3, 13) + + +def make_arrow(pad): + """generate the leading arrow in front of traceback or debugger""" + if pad >= 2: + return '-'*(pad-2) + '> ' + elif pad == 1: + return '>' + return '' + + +def BdbQuit_excepthook(et, ev, tb, excepthook=None): + """Exception hook which handles `BdbQuit` exceptions. + + All other exceptions are processed using the `excepthook` + parameter. + """ + raise ValueError( + "`BdbQuit_excepthook` is deprecated since version 5.1. It is still around only because it is still imported by ipdb.", + ) + + +RGX_EXTRA_INDENT = re.compile(r'(?<=\n)\s+') + + +def strip_indentation(multiline_string): + return RGX_EXTRA_INDENT.sub('', multiline_string) + + +def decorate_fn_with_doc(new_fn, old_fn, additional_text=""): + """Make new_fn have old_fn's doc string. This is particularly useful + for the ``do_...`` commands that hook into the help system. + Adapted from from a comp.lang.python posting + by Duncan Booth.""" + def wrapper(*args, **kw): + return new_fn(*args, **kw) + if old_fn.__doc__: + wrapper.__doc__ = strip_indentation(old_fn.__doc__) + additional_text + return wrapper + + +class Pdb(OldPdb): + """Modified Pdb class, does not load readline. + + for a standalone version that uses prompt_toolkit, see + `IPython.terminal.debugger.TerminalPdb` and + `IPython.terminal.debugger.set_trace()` + + + This debugger can hide and skip frames that are tagged according to some predicates. + See the `skip_predicates` commands. + + """ + + shell: InteractiveShell + + if CHAIN_EXCEPTIONS: + MAX_CHAINED_EXCEPTION_DEPTH = 999 + + default_predicates = { + "tbhide": True, + "readonly": False, + "ipython_internal": True, + "debuggerskip": True, + } + + def __init__(self, completekey=None, stdin=None, stdout=None, context=5, **kwargs): + """Create a new IPython debugger. + + Parameters + ---------- + completekey : default None + Passed to pdb.Pdb. + stdin : default None + Passed to pdb.Pdb. + stdout : default None + Passed to pdb.Pdb. + context : int + Number of lines of source code context to show when + displaying stacktrace information. + **kwargs + Passed to pdb.Pdb. + + Notes + ----- + The possibilities are python version dependent, see the python + docs for more info. + """ + + # Parent constructor: + try: + self.context = int(context) + if self.context <= 0: + raise ValueError("Context must be a positive integer") + except (TypeError, ValueError) as e: + raise ValueError("Context must be a positive integer") from e + + # `kwargs` ensures full compatibility with stdlib's `pdb.Pdb`. + OldPdb.__init__(self, completekey, stdin, stdout, **kwargs) + + # IPython changes... + self.shell = get_ipython() + + if self.shell is None: + save_main = sys.modules['__main__'] + # No IPython instance running, we must create one + from IPython.terminal.interactiveshell import \ + TerminalInteractiveShell + self.shell = TerminalInteractiveShell.instance() + # needed by any code which calls __import__("__main__") after + # the debugger was entered. See also #9941. + sys.modules["__main__"] = save_main + + + color_scheme = self.shell.colors + + self.aliases = {} + + # Create color table: we copy the default one from the traceback + # module and add a few attributes needed for debugging + self.color_scheme_table = exception_colors() + + # shorthands + C = coloransi.TermColors + cst = self.color_scheme_table + + + # Add a python parser so we can syntax highlight source while + # debugging. + self.parser = PyColorize.Parser(style=color_scheme) + self.set_colors(color_scheme) + + # Set the prompt - the default prompt is '(Pdb)' + self.prompt = prompt + self.skip_hidden = True + self.report_skipped = True + + # list of predicates we use to skip frames + self._predicates = self.default_predicates + + if CHAIN_EXCEPTIONS: + self._chained_exceptions = tuple() + self._chained_exception_index = 0 + + # + def set_colors(self, scheme): + """Shorthand access to the color table scheme selector method.""" + self.color_scheme_table.set_active_scheme(scheme) + self.parser.style = scheme + + def set_trace(self, frame=None): + if frame is None: + frame = sys._getframe().f_back + self.initial_frame = frame + return super().set_trace(frame) + + def _hidden_predicate(self, frame): + """ + Given a frame return whether it it should be hidden or not by IPython. + """ + + if self._predicates["readonly"]: + fname = frame.f_code.co_filename + # we need to check for file existence and interactively define + # function would otherwise appear as RO. + if os.path.isfile(fname) and not os.access(fname, os.W_OK): + return True + + if self._predicates["tbhide"]: + if frame in (self.curframe, getattr(self, "initial_frame", None)): + return False + frame_locals = self._get_frame_locals(frame) + if "__tracebackhide__" not in frame_locals: + return False + return frame_locals["__tracebackhide__"] + return False + + def hidden_frames(self, stack): + """ + Given an index in the stack return whether it should be skipped. + + This is used in up/down and where to skip frames. + """ + # The f_locals dictionary is updated from the actual frame + # locals whenever the .f_locals accessor is called, so we + # avoid calling it here to preserve self.curframe_locals. + # Furthermore, there is no good reason to hide the current frame. + ip_hide = [self._hidden_predicate(s[0]) for s in stack] + ip_start = [i for i, s in enumerate(ip_hide) if s == "__ipython_bottom__"] + if ip_start and self._predicates["ipython_internal"]: + ip_hide = [h if i > ip_start[0] else True for (i, h) in enumerate(ip_hide)] + return ip_hide + + if CHAIN_EXCEPTIONS: + + def _get_tb_and_exceptions(self, tb_or_exc): + """ + Given a tracecack or an exception, return a tuple of chained exceptions + and current traceback to inspect. + This will deal with selecting the right ``__cause__`` or ``__context__`` + as well as handling cycles, and return a flattened list of exceptions we + can jump to with do_exceptions. + """ + _exceptions = [] + if isinstance(tb_or_exc, BaseException): + traceback, current = tb_or_exc.__traceback__, tb_or_exc + + while current is not None: + if current in _exceptions: + break + _exceptions.append(current) + if current.__cause__ is not None: + current = current.__cause__ + elif ( + current.__context__ is not None + and not current.__suppress_context__ + ): + current = current.__context__ + + if len(_exceptions) >= self.MAX_CHAINED_EXCEPTION_DEPTH: + self.message( + f"More than {self.MAX_CHAINED_EXCEPTION_DEPTH}" + " chained exceptions found, not all exceptions" + "will be browsable with `exceptions`." + ) + break + else: + traceback = tb_or_exc + return tuple(reversed(_exceptions)), traceback + + @contextmanager + def _hold_exceptions(self, exceptions): + """ + Context manager to ensure proper cleaning of exceptions references + When given a chained exception instead of a traceback, + pdb may hold references to many objects which may leak memory. + We use this context manager to make sure everything is properly cleaned + """ + try: + self._chained_exceptions = exceptions + self._chained_exception_index = len(exceptions) - 1 + yield + finally: + # we can't put those in forget as otherwise they would + # be cleared on exception change + self._chained_exceptions = tuple() + self._chained_exception_index = 0 + + def do_exceptions(self, arg): + """exceptions [number] + List or change current exception in an exception chain. + Without arguments, list all the current exception in the exception + chain. Exceptions will be numbered, with the current exception indicated + with an arrow. + If given an integer as argument, switch to the exception at that index. + """ + if not self._chained_exceptions: + self.message( + "Did not find chained exceptions. To move between" + " exceptions, pdb/post_mortem must be given an exception" + " object rather than a traceback." + ) + return + if not arg: + for ix, exc in enumerate(self._chained_exceptions): + prompt = ">" if ix == self._chained_exception_index else " " + rep = repr(exc) + if len(rep) > 80: + rep = rep[:77] + "..." + indicator = ( + " -" + if self._chained_exceptions[ix].__traceback__ is None + else f"{ix:>3}" + ) + self.message(f"{prompt} {indicator} {rep}") + else: + try: + number = int(arg) + except ValueError: + self.error("Argument must be an integer") + return + if 0 <= number < len(self._chained_exceptions): + if self._chained_exceptions[number].__traceback__ is None: + self.error( + "This exception does not have a traceback, cannot jump to it" + ) + return + + self._chained_exception_index = number + self.setup(None, self._chained_exceptions[number].__traceback__) + self.print_stack_entry(self.stack[self.curindex]) + else: + self.error("No exception with that number") + + def interaction(self, frame, tb_or_exc): + try: + if CHAIN_EXCEPTIONS: + # this context manager is part of interaction in 3.13 + _chained_exceptions, tb = self._get_tb_and_exceptions(tb_or_exc) + if isinstance(tb_or_exc, BaseException): + assert tb is not None, "main exception must have a traceback" + with self._hold_exceptions(_chained_exceptions): + OldPdb.interaction(self, frame, tb) + else: + OldPdb.interaction(self, frame, tb_or_exc) + + except KeyboardInterrupt: + self.stdout.write("\n" + self.shell.get_exception_only()) + + def precmd(self, line): + """Perform useful escapes on the command before it is executed.""" + + if line.endswith("??"): + line = "pinfo2 " + line[:-2] + elif line.endswith("?"): + line = "pinfo " + line[:-1] + + line = super().precmd(line) + + return line + + def new_do_quit(self, arg): + return OldPdb.do_quit(self, arg) + + do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit) + + def print_stack_trace(self, context=None): + Colors = self.color_scheme_table.active_colors + ColorsNormal = Colors.Normal + if context is None: + context = self.context + try: + context = int(context) + if context <= 0: + raise ValueError("Context must be a positive integer") + except (TypeError, ValueError) as e: + raise ValueError("Context must be a positive integer") from e + try: + skipped = 0 + for hidden, frame_lineno in zip(self.hidden_frames(self.stack), self.stack): + if hidden and self.skip_hidden: + skipped += 1 + continue + if skipped: + print( + f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n" + ) + skipped = 0 + self.print_stack_entry(frame_lineno, context=context) + if skipped: + print( + f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n" + ) + except KeyboardInterrupt: + pass + + def print_stack_entry(self, frame_lineno, prompt_prefix='\n-> ', + context=None): + if context is None: + context = self.context + try: + context = int(context) + if context <= 0: + raise ValueError("Context must be a positive integer") + except (TypeError, ValueError) as e: + raise ValueError("Context must be a positive integer") from e + print(self.format_stack_entry(frame_lineno, '', context), file=self.stdout) + + # vds: >> + frame, lineno = frame_lineno + filename = frame.f_code.co_filename + self.shell.hooks.synchronize_with_editor(filename, lineno, 0) + # vds: << + + def _get_frame_locals(self, frame): + """ " + Accessing f_local of current frame reset the namespace, so we want to avoid + that or the following can happen + + ipdb> foo + "old" + ipdb> foo = "new" + ipdb> foo + "new" + ipdb> where + ipdb> foo + "old" + + So if frame is self.current_frame we instead return self.curframe_locals + + """ + if frame is getattr(self, "curframe", None): + return self.curframe_locals + else: + return frame.f_locals + + def format_stack_entry(self, frame_lineno, lprefix=': ', context=None): + if context is None: + context = self.context + try: + context = int(context) + if context <= 0: + print("Context must be a positive integer", file=self.stdout) + except (TypeError, ValueError): + print("Context must be a positive integer", file=self.stdout) + + import reprlib + + ret = [] + + Colors = self.color_scheme_table.active_colors + ColorsNormal = Colors.Normal + tpl_link = "%s%%s%s" % (Colors.filenameEm, ColorsNormal) + tpl_call = "%s%%s%s%%s%s" % (Colors.vName, Colors.valEm, ColorsNormal) + tpl_line = "%%s%s%%s %s%%s" % (Colors.lineno, ColorsNormal) + tpl_line_em = "%%s%s%%s %s%%s%s" % (Colors.linenoEm, Colors.line, ColorsNormal) + + frame, lineno = frame_lineno + + return_value = '' + loc_frame = self._get_frame_locals(frame) + if "__return__" in loc_frame: + rv = loc_frame["__return__"] + # return_value += '->' + return_value += reprlib.repr(rv) + "\n" + ret.append(return_value) + + #s = filename + '(' + `lineno` + ')' + filename = self.canonic(frame.f_code.co_filename) + link = tpl_link % py3compat.cast_unicode(filename) + + if frame.f_code.co_name: + func = frame.f_code.co_name + else: + func = "" + + call = "" + if func != "?": + if "__args__" in loc_frame: + args = reprlib.repr(loc_frame["__args__"]) + else: + args = '()' + call = tpl_call % (func, args) + + # The level info should be generated in the same format pdb uses, to + # avoid breaking the pdbtrack functionality of python-mode in *emacs. + if frame is self.curframe: + ret.append('> ') + else: + ret.append(" ") + ret.append("%s(%s)%s\n" % (link, lineno, call)) + + start = lineno - 1 - context//2 + lines = linecache.getlines(filename) + start = min(start, len(lines) - context) + start = max(start, 0) + lines = lines[start : start + context] + + for i, line in enumerate(lines): + show_arrow = start + 1 + i == lineno + linetpl = (frame is self.curframe or show_arrow) and tpl_line_em or tpl_line + ret.append( + self.__format_line( + linetpl, filename, start + 1 + i, line, arrow=show_arrow + ) + ) + return "".join(ret) + + def __format_line(self, tpl_line, filename, lineno, line, arrow=False): + bp_mark = "" + bp_mark_color = "" + + new_line, err = self.parser.format2(line, 'str') + if not err: + line = new_line + + bp = None + if lineno in self.get_file_breaks(filename): + bps = self.get_breaks(filename, lineno) + bp = bps[-1] + + if bp: + Colors = self.color_scheme_table.active_colors + bp_mark = str(bp.number) + bp_mark_color = Colors.breakpoint_enabled + if not bp.enabled: + bp_mark_color = Colors.breakpoint_disabled + + numbers_width = 7 + if arrow: + # This is the line with the error + pad = numbers_width - len(str(lineno)) - len(bp_mark) + num = '%s%s' % (make_arrow(pad), str(lineno)) + else: + num = '%*s' % (numbers_width - len(bp_mark), str(lineno)) + + return tpl_line % (bp_mark_color + bp_mark, num, line) + + def print_list_lines(self, filename, first, last): + """The printing (as opposed to the parsing part of a 'list' + command.""" + try: + Colors = self.color_scheme_table.active_colors + ColorsNormal = Colors.Normal + tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal) + tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal) + src = [] + if filename == "" and hasattr(self, "_exec_filename"): + filename = self._exec_filename + + for lineno in range(first, last+1): + line = linecache.getline(filename, lineno) + if not line: + break + + if lineno == self.curframe.f_lineno: + line = self.__format_line( + tpl_line_em, filename, lineno, line, arrow=True + ) + else: + line = self.__format_line( + tpl_line, filename, lineno, line, arrow=False + ) + + src.append(line) + self.lineno = lineno + + print(''.join(src), file=self.stdout) + + except KeyboardInterrupt: + pass + + def do_skip_predicates(self, args): + """ + Turn on/off individual predicates as to whether a frame should be hidden/skip. + + The global option to skip (or not) hidden frames is set with skip_hidden + + To change the value of a predicate + + skip_predicates key [true|false] + + Call without arguments to see the current values. + + To permanently change the value of an option add the corresponding + command to your ``~/.pdbrc`` file. If you are programmatically using the + Pdb instance you can also change the ``default_predicates`` class + attribute. + """ + if not args.strip(): + print("current predicates:") + for p, v in self._predicates.items(): + print(" ", p, ":", v) + return + type_value = args.strip().split(" ") + if len(type_value) != 2: + print( + f"Usage: skip_predicates , with one of {set(self._predicates.keys())}" + ) + return + + type_, value = type_value + if type_ not in self._predicates: + print(f"{type_!r} not in {set(self._predicates.keys())}") + return + if value.lower() not in ("true", "yes", "1", "no", "false", "0"): + print( + f"{value!r} is invalid - use one of ('true', 'yes', '1', 'no', 'false', '0')" + ) + return + + self._predicates[type_] = value.lower() in ("true", "yes", "1") + if not any(self._predicates.values()): + print( + "Warning, all predicates set to False, skip_hidden may not have any effects." + ) + + def do_skip_hidden(self, arg): + """ + Change whether or not we should skip frames with the + __tracebackhide__ attribute. + """ + if not arg.strip(): + print( + f"skip_hidden = {self.skip_hidden}, use 'yes','no', 'true', or 'false' to change." + ) + elif arg.strip().lower() in ("true", "yes"): + self.skip_hidden = True + elif arg.strip().lower() in ("false", "no"): + self.skip_hidden = False + if not any(self._predicates.values()): + print( + "Warning, all predicates set to False, skip_hidden may not have any effects." + ) + + def do_list(self, arg): + """Print lines of code from the current stack frame + """ + self.lastcmd = 'list' + last = None + if arg and arg != ".": + try: + x = eval(arg, {}, {}) + if type(x) == type(()): + first, last = x + first = int(first) + last = int(last) + if last < first: + # Assume it's a count + last = first + last + else: + first = max(1, int(x) - 5) + except: + print('*** Error in argument:', repr(arg), file=self.stdout) + return + elif self.lineno is None or arg == ".": + first = max(1, self.curframe.f_lineno - 5) + else: + first = self.lineno + 1 + if last is None: + last = first + 10 + self.print_list_lines(self.curframe.f_code.co_filename, first, last) + + # vds: >> + lineno = first + filename = self.curframe.f_code.co_filename + self.shell.hooks.synchronize_with_editor(filename, lineno, 0) + # vds: << + + do_l = do_list + + def getsourcelines(self, obj): + lines, lineno = inspect.findsource(obj) + if inspect.isframe(obj) and obj.f_globals is self._get_frame_locals(obj): + # must be a module frame: do not try to cut a block out of it + return lines, 1 + elif inspect.ismodule(obj): + return lines, 1 + return inspect.getblock(lines[lineno:]), lineno+1 + + def do_longlist(self, arg): + """Print lines of code from the current stack frame. + + Shows more lines than 'list' does. + """ + self.lastcmd = 'longlist' + try: + lines, lineno = self.getsourcelines(self.curframe) + except OSError as err: + self.error(err) + return + last = lineno + len(lines) + self.print_list_lines(self.curframe.f_code.co_filename, lineno, last) + do_ll = do_longlist + + def do_debug(self, arg): + """debug code + Enter a recursive debugger that steps through the code + argument (which is an arbitrary expression or statement to be + executed in the current environment). + """ + trace_function = sys.gettrace() + sys.settrace(None) + globals = self.curframe.f_globals + locals = self.curframe_locals + p = self.__class__(completekey=self.completekey, + stdin=self.stdin, stdout=self.stdout) + p.use_rawinput = self.use_rawinput + p.prompt = "(%s) " % self.prompt.strip() + self.message("ENTERING RECURSIVE DEBUGGER") + sys.call_tracing(p.run, (arg, globals, locals)) + self.message("LEAVING RECURSIVE DEBUGGER") + sys.settrace(trace_function) + self.lastcmd = p.lastcmd + + def do_pdef(self, arg): + """Print the call signature for any callable object. + + The debugger interface to %pdef""" + namespaces = [ + ("Locals", self.curframe_locals), + ("Globals", self.curframe.f_globals), + ] + self.shell.find_line_magic("pdef")(arg, namespaces=namespaces) + + def do_pdoc(self, arg): + """Print the docstring for an object. + + The debugger interface to %pdoc.""" + namespaces = [ + ("Locals", self.curframe_locals), + ("Globals", self.curframe.f_globals), + ] + self.shell.find_line_magic("pdoc")(arg, namespaces=namespaces) + + def do_pfile(self, arg): + """Print (or run through pager) the file where an object is defined. + + The debugger interface to %pfile. + """ + namespaces = [ + ("Locals", self.curframe_locals), + ("Globals", self.curframe.f_globals), + ] + self.shell.find_line_magic("pfile")(arg, namespaces=namespaces) + + def do_pinfo(self, arg): + """Provide detailed information about an object. + + The debugger interface to %pinfo, i.e., obj?.""" + namespaces = [ + ("Locals", self.curframe_locals), + ("Globals", self.curframe.f_globals), + ] + self.shell.find_line_magic("pinfo")(arg, namespaces=namespaces) + + def do_pinfo2(self, arg): + """Provide extra detailed information about an object. + + The debugger interface to %pinfo2, i.e., obj??.""" + namespaces = [ + ("Locals", self.curframe_locals), + ("Globals", self.curframe.f_globals), + ] + self.shell.find_line_magic("pinfo2")(arg, namespaces=namespaces) + + def do_psource(self, arg): + """Print (or run through pager) the source code for an object.""" + namespaces = [ + ("Locals", self.curframe_locals), + ("Globals", self.curframe.f_globals), + ] + self.shell.find_line_magic("psource")(arg, namespaces=namespaces) + + def do_where(self, arg): + """w(here) + Print a stack trace, with the most recent frame at the bottom. + An arrow indicates the "current frame", which determines the + context of most commands. 'bt' is an alias for this command. + + Take a number as argument as an (optional) number of context line to + print""" + if arg: + try: + context = int(arg) + except ValueError as err: + self.error(err) + return + self.print_stack_trace(context) + else: + self.print_stack_trace() + + do_w = do_where + + def break_anywhere(self, frame): + """ + _stop_in_decorator_internals is overly restrictive, as we may still want + to trace function calls, so we need to also update break_anywhere so + that is we don't `stop_here`, because of debugger skip, we may still + stop at any point inside the function + + """ + + sup = super().break_anywhere(frame) + if sup: + return sup + if self._predicates["debuggerskip"]: + if DEBUGGERSKIP in frame.f_code.co_varnames: + return True + if frame.f_back and self._get_frame_locals(frame.f_back).get(DEBUGGERSKIP): + return True + return False + + def _is_in_decorator_internal_and_should_skip(self, frame): + """ + Utility to tell us whether we are in a decorator internal and should stop. + + """ + # if we are disabled don't skip + if not self._predicates["debuggerskip"]: + return False + + return self._cachable_skip(frame) + + @lru_cache(1024) + def _cached_one_parent_frame_debuggerskip(self, frame): + """ + Cache looking up for DEBUGGERSKIP on parent frame. + + This should speedup walking through deep frame when one of the highest + one does have a debugger skip. + + This is likely to introduce fake positive though. + """ + while getattr(frame, "f_back", None): + frame = frame.f_back + if self._get_frame_locals(frame).get(DEBUGGERSKIP): + return True + return None + + @lru_cache(1024) + def _cachable_skip(self, frame): + # if frame is tagged, skip by default. + if DEBUGGERSKIP in frame.f_code.co_varnames: + return True + + # if one of the parent frame value set to True skip as well. + if self._cached_one_parent_frame_debuggerskip(frame): + return True + + return False + + def stop_here(self, frame): + if self._is_in_decorator_internal_and_should_skip(frame) is True: + return False + + hidden = False + if self.skip_hidden: + hidden = self._hidden_predicate(frame) + if hidden: + if self.report_skipped: + Colors = self.color_scheme_table.active_colors + ColorsNormal = Colors.Normal + print( + f"{Colors.excName} [... skipped 1 hidden frame]{ColorsNormal}\n" + ) + return super().stop_here(frame) + + def do_up(self, arg): + """u(p) [count] + Move the current frame count (default one) levels up in the + stack trace (to an older frame). + + Will skip hidden frames. + """ + # modified version of upstream that skips + # frames with __tracebackhide__ + if self.curindex == 0: + self.error("Oldest frame") + return + try: + count = int(arg or 1) + except ValueError: + self.error("Invalid frame count (%s)" % arg) + return + skipped = 0 + if count < 0: + _newframe = 0 + else: + counter = 0 + hidden_frames = self.hidden_frames(self.stack) + for i in range(self.curindex - 1, -1, -1): + if hidden_frames[i] and self.skip_hidden: + skipped += 1 + continue + counter += 1 + if counter >= count: + break + else: + # if no break occurred. + self.error( + "all frames above hidden, use `skip_hidden False` to get get into those." + ) + return + + Colors = self.color_scheme_table.active_colors + ColorsNormal = Colors.Normal + _newframe = i + self._select_frame(_newframe) + if skipped: + print( + f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n" + ) + + def do_down(self, arg): + """d(own) [count] + Move the current frame count (default one) levels down in the + stack trace (to a newer frame). + + Will skip hidden frames. + """ + if self.curindex + 1 == len(self.stack): + self.error("Newest frame") + return + try: + count = int(arg or 1) + except ValueError: + self.error("Invalid frame count (%s)" % arg) + return + if count < 0: + _newframe = len(self.stack) - 1 + else: + counter = 0 + skipped = 0 + hidden_frames = self.hidden_frames(self.stack) + for i in range(self.curindex + 1, len(self.stack)): + if hidden_frames[i] and self.skip_hidden: + skipped += 1 + continue + counter += 1 + if counter >= count: + break + else: + self.error( + "all frames below hidden, use `skip_hidden False` to get get into those." + ) + return + + Colors = self.color_scheme_table.active_colors + ColorsNormal = Colors.Normal + if skipped: + print( + f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n" + ) + _newframe = i + + self._select_frame(_newframe) + + do_d = do_down + do_u = do_up + + def do_context(self, context): + """context number_of_lines + Set the number of lines of source code to show when displaying + stacktrace information. + """ + try: + new_context = int(context) + if new_context <= 0: + raise ValueError() + self.context = new_context + except ValueError: + self.error( + f"The 'context' command requires a positive integer argument (current value {self.context})." + ) + + +class InterruptiblePdb(Pdb): + """Version of debugger where KeyboardInterrupt exits the debugger altogether.""" + + def cmdloop(self, intro=None): + """Wrap cmdloop() such that KeyboardInterrupt stops the debugger.""" + try: + return OldPdb.cmdloop(self, intro=intro) + except KeyboardInterrupt: + self.stop_here = lambda frame: False + self.do_quit("") + sys.settrace(None) + self.quitting = False + raise + + def _cmdloop(self): + while True: + try: + # keyboard interrupts allow for an easy way to cancel + # the current command, so allow them during interactive input + self.allow_kbdint = True + self.cmdloop() + self.allow_kbdint = False + break + except KeyboardInterrupt: + self.message('--KeyboardInterrupt--') + raise + + +def set_trace(frame=None, header=None): + """ + Start debugging from `frame`. + + If frame is not specified, debugging starts from caller's frame. + """ + pdb = Pdb() + if header is not None: + pdb.message(header) + pdb.set_trace(frame or sys._getframe().f_back) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/display.py b/.venv/lib/python3.12/site-packages/IPython/core/display.py new file mode 100644 index 0000000..a943447 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/display.py @@ -0,0 +1,1373 @@ +# -*- coding: utf-8 -*- +"""Top-level display functions for displaying object in different formats.""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + + +from binascii import b2a_base64, hexlify +import html +import json +import mimetypes +import os +import struct +import warnings +from copy import deepcopy +from os.path import splitext +from pathlib import Path, PurePath + +from typing import Optional + +from IPython.testing.skipdoctest import skip_doctest +from . import display_functions + + +__all__ = [ + "display_pretty", + "display_html", + "display_markdown", + "display_svg", + "display_png", + "display_jpeg", + "display_webp", + "display_latex", + "display_json", + "display_javascript", + "display_pdf", + "DisplayObject", + "TextDisplayObject", + "Pretty", + "HTML", + "Markdown", + "Math", + "Latex", + "SVG", + "ProgressBar", + "JSON", + "GeoJSON", + "Javascript", + "Image", + "set_matplotlib_formats", + "set_matplotlib_close", + "Video", +] + +_deprecated_names = ["display", "clear_output", "publish_display_data", "update_display", "DisplayHandle"] + +__all__ = __all__ + _deprecated_names + + +# ----- warn to import from IPython.display ----- + +from warnings import warn + + +def __getattr__(name): + if name in _deprecated_names: + warn( + f"Importing {name} from IPython.core.display is deprecated since IPython 7.14, please import from IPython.display", + DeprecationWarning, + stacklevel=2, + ) + return getattr(display_functions, name) + + if name in globals().keys(): + return globals()[name] + else: + raise AttributeError(f"module {__name__} has no attribute {name}") + + +#----------------------------------------------------------------------------- +# utility functions +#----------------------------------------------------------------------------- + +def _safe_exists(path): + """Check path, but don't let exceptions raise""" + try: + return os.path.exists(path) + except Exception: + return False + + +def _display_mimetype(mimetype, objs, raw=False, metadata=None): + """internal implementation of all display_foo methods + + Parameters + ---------- + mimetype : str + The mimetype to be published (e.g. 'image/png') + *objs : object + The Python objects to display, or if raw=True raw text data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + if metadata: + metadata = {mimetype: metadata} + if raw: + # turn list of pngdata into list of { 'image/png': pngdata } + objs = [ {mimetype: obj} for obj in objs ] + display_functions.display(*objs, raw=raw, metadata=metadata, include=[mimetype]) + +#----------------------------------------------------------------------------- +# Main functions +#----------------------------------------------------------------------------- + + +def display_pretty(*objs, **kwargs): + """Display the pretty (default) representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw text data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('text/plain', objs, **kwargs) + + +def display_html(*objs, **kwargs): + """Display the HTML representation of an object. + + Note: If raw=False and the object does not have a HTML + representation, no HTML will be shown. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw HTML data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('text/html', objs, **kwargs) + + +def display_markdown(*objs, **kwargs): + """Displays the Markdown representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw markdown data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + + _display_mimetype('text/markdown', objs, **kwargs) + + +def display_svg(*objs, **kwargs): + """Display the SVG representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw svg data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('image/svg+xml', objs, **kwargs) + + +def display_png(*objs, **kwargs): + """Display the PNG representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw png data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('image/png', objs, **kwargs) + + +def display_jpeg(*objs, **kwargs): + """Display the JPEG representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw JPEG data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('image/jpeg', objs, **kwargs) + + +def display_webp(*objs, **kwargs): + """Display the WEBP representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw JPEG data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype("image/webp", objs, **kwargs) + + +def display_latex(*objs, **kwargs): + """Display the LaTeX representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw latex data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('text/latex', objs, **kwargs) + + +def display_json(*objs, **kwargs): + """Display the JSON representation of an object. + + Note that not many frontends support displaying JSON. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw json data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('application/json', objs, **kwargs) + + +def display_javascript(*objs, **kwargs): + """Display the Javascript representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw javascript data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('application/javascript', objs, **kwargs) + + +def display_pdf(*objs, **kwargs): + """Display the PDF representation of an object. + + Parameters + ---------- + *objs : object + The Python objects to display, or if raw=True raw javascript data to + display. + raw : bool + Are the data objects raw data or Python objects that need to be + formatted before display? [default: False] + metadata : dict (optional) + Metadata to be associated with the specific mimetype output. + """ + _display_mimetype('application/pdf', objs, **kwargs) + + +#----------------------------------------------------------------------------- +# Smart classes +#----------------------------------------------------------------------------- + + +class DisplayObject(object): + """An object that wraps data to be displayed.""" + + _read_flags = 'r' + _show_mem_addr = False + metadata = None + + def __init__(self, data=None, url=None, filename=None, metadata=None): + """Create a display object given raw data. + + When this object is returned by an expression or passed to the + display function, it will result in the data being displayed + in the frontend. The MIME type of the data should match the + subclasses used, so the Png subclass should be used for 'image/png' + data. If the data is a URL, the data will first be downloaded + and then displayed. + + Parameters + ---------- + data : unicode, str or bytes + The raw data or a URL or file to load the data from + url : unicode + A URL to download the data from. + filename : unicode + Path to a local file to load the data from. + metadata : dict + Dict of metadata associated to be the object when displayed + """ + if isinstance(data, (Path, PurePath)): + data = str(data) + + if data is not None and isinstance(data, str): + if data.startswith('http') and url is None: + url = data + filename = None + data = None + elif _safe_exists(data) and filename is None: + url = None + filename = data + data = None + + self.url = url + self.filename = filename + # because of @data.setter methods in + # subclasses ensure url and filename are set + # before assigning to self.data + self.data = data + + if metadata is not None: + self.metadata = metadata + elif self.metadata is None: + self.metadata = {} + + self.reload() + self._check_data() + + def __repr__(self): + if not self._show_mem_addr: + cls = self.__class__ + r = "<%s.%s object>" % (cls.__module__, cls.__name__) + else: + r = super(DisplayObject, self).__repr__() + return r + + def _check_data(self): + """Override in subclasses if there's something to check.""" + pass + + def _data_and_metadata(self): + """shortcut for returning metadata with shape information, if defined""" + if self.metadata: + return self.data, deepcopy(self.metadata) + else: + return self.data + + def reload(self): + """Reload the raw data from file or URL.""" + if self.filename is not None: + encoding = None if "b" in self._read_flags else "utf-8" + with open(self.filename, self._read_flags, encoding=encoding) as f: + self.data = f.read() + elif self.url is not None: + # Deferred import + from urllib.request import urlopen + response = urlopen(self.url) + data = response.read() + # extract encoding from header, if there is one: + encoding = None + if 'content-type' in response.headers: + for sub in response.headers['content-type'].split(';'): + sub = sub.strip() + if sub.startswith('charset'): + encoding = sub.split('=')[-1].strip() + break + if 'content-encoding' in response.headers: + # TODO: do deflate? + if 'gzip' in response.headers['content-encoding']: + import gzip + from io import BytesIO + + # assume utf-8 if encoding is not specified + with gzip.open( + BytesIO(data), "rt", encoding=encoding or "utf-8" + ) as fp: + encoding = None + data = fp.read() + + # decode data, if an encoding was specified + # We only touch self.data once since + # subclasses such as SVG have @data.setter methods + # that transform self.data into ... well svg. + if encoding: + self.data = data.decode(encoding, 'replace') + else: + self.data = data + + +class TextDisplayObject(DisplayObject): + """Create a text display object given raw data. + + Parameters + ---------- + data : str or unicode + The raw data or a URL or file to load the data from. + url : unicode + A URL to download the data from. + filename : unicode + Path to a local file to load the data from. + metadata : dict + Dict of metadata associated to be the object when displayed + """ + def _check_data(self): + if self.data is not None and not isinstance(self.data, str): + raise TypeError("%s expects text, not %r" % (self.__class__.__name__, self.data)) + +class Pretty(TextDisplayObject): + + def _repr_pretty_(self, pp, cycle): + return pp.text(self.data) + + +class HTML(TextDisplayObject): + + def __init__(self, data=None, url=None, filename=None, metadata=None): + def warn(): + if not data: + return False + + # + # Avoid calling lower() on the entire data, because it could be a + # long string and we're only interested in its beginning and end. + # + prefix = data[:10].lower() + suffix = data[-10:].lower() + return prefix.startswith("') + m_warn.assert_not_called() + + display.HTML('') + m_warn.assert_called_with('Consider using IPython.display.IFrame instead') + + m_warn.reset_mock() + display.HTML('') + m_warn.assert_called_with('Consider using IPython.display.IFrame instead') + +def test_progress(): + p = display.ProgressBar(10) + assert "0/10" in repr(p) + p.html_width = "100%" + p.progress = 5 + assert ( + p._repr_html_() == "" + ) + + +def test_progress_iter(): + with capture_output(display=False) as captured: + for i in display.ProgressBar(5): + out = captured.stdout + assert "{0}/5".format(i) in out + out = captured.stdout + assert "5/5" in out + + +def test_json(): + d = {'a': 5} + lis = [d] + metadata = [ + {'expanded': False, 'root': 'root'}, + {'expanded': True, 'root': 'root'}, + {'expanded': False, 'root': 'custom'}, + {'expanded': True, 'root': 'custom'}, + ] + json_objs = [ + display.JSON(d), + display.JSON(d, expanded=True), + display.JSON(d, root='custom'), + display.JSON(d, expanded=True, root='custom'), + ] + for j, md in zip(json_objs, metadata): + assert j._repr_json_() == (d, md) + + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + j = display.JSON(json.dumps(d)) + assert len(w) == 1 + assert j._repr_json_() == (d, metadata[0]) + + json_objs = [ + display.JSON(lis), + display.JSON(lis, expanded=True), + display.JSON(lis, root='custom'), + display.JSON(lis, expanded=True, root='custom'), + ] + for j, md in zip(json_objs, metadata): + assert j._repr_json_() == (lis, md) + + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + j = display.JSON(json.dumps(lis)) + assert len(w) == 1 + assert j._repr_json_() == (lis, metadata[0]) + + +def test_video_embedding(): + """use a tempfile, with dummy-data, to ensure that video embedding doesn't crash""" + v = display.Video("http://ignored") + assert not v.embed + html = v._repr_html_() + assert 'src="data:' not in html + assert 'src="http://ignored"' in html + + with pytest.raises(ValueError): + v = display.Video(b'abc') + + with NamedFileInTemporaryDirectory('test.mp4') as f: + f.write(b'abc') + f.close() + + v = display.Video(f.name) + assert not v.embed + html = v._repr_html_() + assert 'src="data:' not in html + + v = display.Video(f.name, embed=True) + html = v._repr_html_() + assert 'src="data:video/mp4;base64,YWJj"' in html + + v = display.Video(f.name, embed=True, mimetype='video/other') + html = v._repr_html_() + assert 'src="data:video/other;base64,YWJj"' in html + + v = display.Video(b'abc', embed=True, mimetype='video/mp4') + html = v._repr_html_() + assert 'src="data:video/mp4;base64,YWJj"' in html + + v = display.Video(u'YWJj', embed=True, mimetype='video/xyz') + html = v._repr_html_() + assert 'src="data:video/xyz;base64,YWJj"' in html + +def test_html_metadata(): + s = "

    Test

    " + h = display.HTML(s, metadata={"isolated": True}) + assert h._repr_html_() == (s, {"isolated": True}) + + +def test_display_id(): + ip = get_ipython() + with mock.patch.object(ip.display_pub, 'publish') as pub: + handle = display.display('x') + assert handle is None + handle = display.display('y', display_id='secret') + assert isinstance(handle, display.DisplayHandle) + handle2 = display.display('z', display_id=True) + assert isinstance(handle2, display.DisplayHandle) + assert handle.display_id != handle2.display_id + + assert pub.call_count == 3 + args, kwargs = pub.call_args_list[0] + assert args == () + assert kwargs == { + 'data': { + 'text/plain': repr('x') + }, + 'metadata': {}, + } + args, kwargs = pub.call_args_list[1] + assert args == () + assert kwargs == { + 'data': { + 'text/plain': repr('y') + }, + 'metadata': {}, + 'transient': { + 'display_id': handle.display_id, + }, + } + args, kwargs = pub.call_args_list[2] + assert args == () + assert kwargs == { + 'data': { + 'text/plain': repr('z') + }, + 'metadata': {}, + 'transient': { + 'display_id': handle2.display_id, + }, + } + + +def test_update_display(): + ip = get_ipython() + with mock.patch.object(ip.display_pub, 'publish') as pub: + with pytest.raises(TypeError): + display.update_display('x') + display.update_display('x', display_id='1') + display.update_display('y', display_id='2') + args, kwargs = pub.call_args_list[0] + assert args == () + assert kwargs == { + 'data': { + 'text/plain': repr('x') + }, + 'metadata': {}, + 'transient': { + 'display_id': '1', + }, + 'update': True, + } + args, kwargs = pub.call_args_list[1] + assert args == () + assert kwargs == { + 'data': { + 'text/plain': repr('y') + }, + 'metadata': {}, + 'transient': { + 'display_id': '2', + }, + 'update': True, + } + + +def test_display_handle(): + ip = get_ipython() + handle = display.DisplayHandle() + assert isinstance(handle.display_id, str) + handle = display.DisplayHandle("my-id") + assert handle.display_id == "my-id" + with mock.patch.object(ip.display_pub, "publish") as pub: + handle.display("x") + handle.update("y") + + args, kwargs = pub.call_args_list[0] + assert args == () + assert kwargs == { + 'data': { + 'text/plain': repr('x') + }, + 'metadata': {}, + 'transient': { + 'display_id': handle.display_id, + } + } + args, kwargs = pub.call_args_list[1] + assert args == () + assert kwargs == { + 'data': { + 'text/plain': repr('y') + }, + 'metadata': {}, + 'transient': { + 'display_id': handle.display_id, + }, + 'update': True, + } + + +def test_image_alt_tag(): + """Simple test for display.Image(args, alt=x,)""" + thisurl = "http://example.com/image.png" + img = display.Image(url=thisurl, alt="an image") + assert 'an image' % (thisurl) == img._repr_html_() + img = display.Image(url=thisurl, unconfined=True, alt="an image") + assert ( + 'an image' % (thisurl) + == img._repr_html_() + ) + img = display.Image(url=thisurl, alt='>"& <') + assert '>"& <' % (thisurl) == img._repr_html_() + + img = display.Image(url=thisurl, metadata={"alt": "an image"}) + assert img.alt == "an image" + here = os.path.dirname(__file__) + img = display.Image(os.path.join(here, "2x2.png"), alt="an image") + assert img.alt == "an image" + _, md = img._repr_png_() + assert md["alt"] == "an image" + + +def test_image_bad_filename_raises_proper_exception(): + with pytest.raises(FileNotFoundError): + display.Image("/this/file/does/not/exist/")._repr_png_() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py new file mode 100644 index 0000000..22899f3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py @@ -0,0 +1,112 @@ +import sys +from IPython.testing.tools import AssertPrints, AssertNotPrints +from IPython.core.displayhook import CapturingDisplayHook +from IPython.utils.capture import CapturedIO + +def test_output_displayed(): + """Checking to make sure that output is displayed""" + + with AssertPrints('2'): + ip.run_cell('1+1', store_history=True) + + with AssertPrints('2'): + ip.run_cell('1+1 # comment with a semicolon;', store_history=True) + + with AssertPrints('2'): + ip.run_cell('1+1\n#commented_out_function();', store_history=True) + + +def test_output_quiet(): + """Checking to make sure that output is quiet""" + + with AssertNotPrints('2'): + ip.run_cell('1+1;', store_history=True) + + with AssertNotPrints('2'): + ip.run_cell('1+1; # comment with a semicolon', store_history=True) + + with AssertNotPrints('2'): + ip.run_cell('1+1;\n#commented_out_function()', store_history=True) + +def test_underscore_no_overwrite_user(): + ip.run_cell('_ = 42', store_history=True) + ip.run_cell('1+1', store_history=True) + + with AssertPrints('42'): + ip.run_cell('print(_)', store_history=True) + + ip.run_cell('del _', store_history=True) + ip.run_cell('6+6', store_history=True) + with AssertPrints('12'): + ip.run_cell('_', store_history=True) + + +def test_underscore_no_overwrite_builtins(): + ip.run_cell("import gettext ; gettext.install('foo')", store_history=True) + ip.run_cell('3+3', store_history=True) + + with AssertPrints('gettext'): + ip.run_cell('print(_)', store_history=True) + + ip.run_cell('_ = "userset"', store_history=True) + + with AssertPrints('userset'): + ip.run_cell('print(_)', store_history=True) + ip.run_cell('import builtins; del builtins._') + + +def test_interactivehooks_ast_modes(): + """ + Test that ast nodes can be triggered with different modes + """ + saved_mode = ip.ast_node_interactivity + ip.ast_node_interactivity = 'last_expr_or_assign' + + try: + with AssertPrints('2'): + ip.run_cell('a = 1+1', store_history=True) + + with AssertPrints('9'): + ip.run_cell('b = 1+8 # comment with a semicolon;', store_history=False) + + with AssertPrints('7'): + ip.run_cell('c = 1+6\n#commented_out_function();', store_history=True) + + ip.run_cell('d = 11', store_history=True) + with AssertPrints('12'): + ip.run_cell('d += 1', store_history=True) + + with AssertNotPrints('42'): + ip.run_cell('(u,v) = (41+1, 43-1)') + + finally: + ip.ast_node_interactivity = saved_mode + +def test_interactivehooks_ast_modes_semi_suppress(): + """ + Test that ast nodes can be triggered with different modes and suppressed + by semicolon + """ + saved_mode = ip.ast_node_interactivity + ip.ast_node_interactivity = 'last_expr_or_assign' + + try: + with AssertNotPrints('2'): + ip.run_cell('x = 1+1;', store_history=True) + + with AssertNotPrints('7'): + ip.run_cell('y = 1+6; # comment with a semicolon', store_history=True) + + with AssertNotPrints('9'): + ip.run_cell('z = 1+8;\n#commented_out_function()', store_history=True) + + finally: + ip.ast_node_interactivity = saved_mode + +def test_capture_display_hook_format(): + """Tests that the capture display hook conforms to the CapturedIO output format""" + hook = CapturingDisplayHook(ip) + hook({"foo": "bar"}) + captured = CapturedIO(sys.stdout, sys.stderr, hook.outputs) + # Should not raise with RichOutput transformation error + captured.outputs diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py new file mode 100644 index 0000000..61bc01d --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py @@ -0,0 +1,78 @@ +import unittest +from unittest.mock import Mock + +from IPython.core import events +import IPython.testing.tools as tt + + +@events._define_event +def ping_received(): + pass + + +@events._define_event +def event_with_argument(argument): + pass + + +class CallbackTests(unittest.TestCase): + def setUp(self): + self.em = events.EventManager(get_ipython(), + {'ping_received': ping_received, + 'event_with_argument': event_with_argument}) + + def test_register_unregister(self): + cb = Mock() + + self.em.register('ping_received', cb) + self.em.trigger('ping_received') + self.assertEqual(cb.call_count, 1) + + self.em.unregister('ping_received', cb) + self.em.trigger('ping_received') + self.assertEqual(cb.call_count, 1) + + def test_bare_function_missed_unregister(self): + def cb1(): + ... + + def cb2(): + ... + + self.em.register("ping_received", cb1) + self.assertRaises(ValueError, self.em.unregister, "ping_received", cb2) + self.em.unregister("ping_received", cb1) + + def test_cb_error(self): + cb = Mock(side_effect=ValueError) + self.em.register('ping_received', cb) + with tt.AssertPrints("Error in callback"): + self.em.trigger('ping_received') + + def test_cb_keyboard_interrupt(self): + cb = Mock(side_effect=KeyboardInterrupt) + self.em.register('ping_received', cb) + with tt.AssertPrints("Error in callback"): + self.em.trigger('ping_received') + + def test_unregister_during_callback(self): + invoked = [False] * 3 + + def func1(*_): + invoked[0] = True + self.em.unregister('ping_received', func1) + self.em.register('ping_received', func3) + + def func2(*_): + invoked[1] = True + self.em.unregister('ping_received', func2) + + def func3(*_): + invoked[2] = True + + self.em.register('ping_received', func1) + self.em.register('ping_received', func2) + + self.em.trigger('ping_received') + self.assertEqual([True, True, False], invoked) + self.assertEqual([func3], self.em.callbacks['ping_received']) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py new file mode 100644 index 0000000..c8e8002 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py @@ -0,0 +1,112 @@ +import unittest +import re +from IPython.utils.capture import capture_output +import sys +import pytest +from tempfile import TemporaryDirectory +from IPython.testing import tools as tt + + +def _exceptiongroup_common( + outer_chain: str, + inner_chain: str, + native: bool, +) -> None: + pre_raise = "exceptiongroup." if not native else "" + pre_catch = pre_raise if sys.version_info < (3, 11) else "" + filestr = f""" + {"import exceptiongroup" if not native else ""} + import pytest + + def f(): raise ValueError("From f()") + def g(): raise BaseException("From g()") + + def inner(inner_chain): + excs = [] + for callback in [f, g]: + try: + callback() + except BaseException as err: + excs.append(err) + if excs: + if inner_chain == "none": + raise {pre_raise}BaseExceptionGroup("Oops", excs) + try: + raise SyntaxError() + except SyntaxError as e: + if inner_chain == "from": + raise {pre_raise}BaseExceptionGroup("Oops", excs) from e + else: + raise {pre_raise}BaseExceptionGroup("Oops", excs) + + def outer(outer_chain, inner_chain): + try: + inner(inner_chain) + except {pre_catch}BaseExceptionGroup as e: + if outer_chain == "none": + raise + if outer_chain == "from": + raise IndexError() from e + else: + raise IndexError + + + outer("{outer_chain}", "{inner_chain}") + """ + with capture_output() as cap: + ip.run_cell(filestr) + + match_lines = [] + if inner_chain == "another": + match_lines += [ + "During handling of the above exception, another exception occurred:", + ] + elif inner_chain == "from": + match_lines += [ + "The above exception was the direct cause of the following exception:", + ] + + match_lines += [ + " + Exception Group Traceback (most recent call last):", + f" | {pre_catch}BaseExceptionGroup: Oops (2 sub-exceptions)", + " | ValueError: From f()", + " | BaseException: From g()", + ] + + if outer_chain == "another": + match_lines += [ + "During handling of the above exception, another exception occurred:", + "IndexError", + ] + elif outer_chain == "from": + match_lines += [ + "The above exception was the direct cause of the following exception:", + "IndexError", + ] + + error_lines = cap.stderr.split("\n") + + err_index = match_index = 0 + for expected in match_lines: + for i, actual in enumerate(error_lines): + if actual == expected: + error_lines = error_lines[i + 1 :] + break + else: + assert False, f"{expected} not found in cap.stderr" + + +@pytest.mark.skipif( + sys.version_info < (3, 11), reason="Native ExceptionGroup not implemented" +) +@pytest.mark.parametrize("outer_chain", ["none", "from", "another"]) +@pytest.mark.parametrize("inner_chain", ["none", "from", "another"]) +def test_native_exceptiongroup(outer_chain, inner_chain) -> None: + _exceptiongroup_common(outer_chain, inner_chain, native=True) + + +@pytest.mark.parametrize("outer_chain", ["none", "from", "another"]) +@pytest.mark.parametrize("inner_chain", ["none", "from", "another"]) +def test_native_exceptiongroup(outer_chain, inner_chain) -> None: + pytest.importorskip("exceptiongroup") + _exceptiongroup_common(outer_chain, inner_chain, native=False) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py new file mode 100644 index 0000000..24ecf7e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py @@ -0,0 +1,95 @@ +import os.path + +from tempfile import TemporaryDirectory + +import IPython.testing.tools as tt +from IPython.utils.syspathcontext import prepended_to_syspath + +ext1_content = """ +def load_ipython_extension(ip): + print("Running ext1 load") + +def unload_ipython_extension(ip): + print("Running ext1 unload") +""" + +ext2_content = """ +def load_ipython_extension(ip): + print("Running ext2 load") +""" + +ext3_content = """ +def load_ipython_extension(ip): + ip2 = get_ipython() + print(ip is ip2) +""" + +def test_extension_loading(): + em = get_ipython().extension_manager + with TemporaryDirectory() as td: + ext1 = os.path.join(td, "ext1.py") + with open(ext1, "w", encoding="utf-8") as f: + f.write(ext1_content) + + ext2 = os.path.join(td, "ext2.py") + with open(ext2, "w", encoding="utf-8") as f: + f.write(ext2_content) + + with prepended_to_syspath(td): + assert 'ext1' not in em.loaded + assert 'ext2' not in em.loaded + + # Load extension + with tt.AssertPrints("Running ext1 load"): + assert em.load_extension('ext1') is None + assert 'ext1' in em.loaded + + # Should refuse to load it again + with tt.AssertNotPrints("Running ext1 load"): + assert em.load_extension('ext1') == 'already loaded' + + # Reload + with tt.AssertPrints("Running ext1 unload"): + with tt.AssertPrints("Running ext1 load", suppress=False): + em.reload_extension('ext1') + + # Unload + with tt.AssertPrints("Running ext1 unload"): + assert em.unload_extension('ext1') is None + + # Can't unload again + with tt.AssertNotPrints("Running ext1 unload"): + assert em.unload_extension('ext1') == 'not loaded' + assert em.unload_extension('ext2') == 'not loaded' + + # Load extension 2 + with tt.AssertPrints("Running ext2 load"): + assert em.load_extension('ext2') is None + + # Can't unload this + assert em.unload_extension('ext2') == 'no unload function' + + # But can reload it + with tt.AssertPrints("Running ext2 load"): + em.reload_extension('ext2') + + +def test_extension_builtins(): + em = get_ipython().extension_manager + with TemporaryDirectory() as td: + ext3 = os.path.join(td, "ext3.py") + with open(ext3, "w", encoding="utf-8") as f: + f.write(ext3_content) + + assert 'ext3' not in em.loaded + + with prepended_to_syspath(td): + # Load extension + with tt.AssertPrints("True"): + assert em.load_extension('ext3') is None + assert 'ext3' in em.loaded + + +def test_non_extension(): + em = get_ipython().extension_manager + assert em.load_extension("sys") == "no load function" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py new file mode 100644 index 0000000..5f8eeda --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py @@ -0,0 +1,545 @@ +"""Tests for the Formatters.""" + +from math import pi + +try: + import numpy +except: + numpy = None +import pytest + +from IPython import get_ipython +from traitlets.config import Config +from IPython.core.formatters import ( + PlainTextFormatter, HTMLFormatter, PDFFormatter, _mod_name_key, + DisplayFormatter, JSONFormatter, +) +from IPython.utils.io import capture_output + +class A(object): + def __repr__(self): + return 'A()' + +class B(A): + def __repr__(self): + return 'B()' + +class C: + pass + +class BadRepr(object): + def __repr__(self): + raise ValueError("bad repr") + +class BadPretty(object): + _repr_pretty_ = None + +class GoodPretty(object): + def _repr_pretty_(self, pp, cycle): + pp.text('foo') + + def __repr__(self): + return 'GoodPretty()' + +def foo_printer(obj, pp, cycle): + pp.text('foo') + +def test_pretty(): + f = PlainTextFormatter() + f.for_type(A, foo_printer) + assert f(A()) == "foo" + assert f(B()) == "B()" + assert f(GoodPretty()) == "foo" + # Just don't raise an exception for the following: + f(BadPretty()) + + f.pprint = False + assert f(A()) == "A()" + assert f(B()) == "B()" + assert f(GoodPretty()) == "GoodPretty()" + + +def test_deferred(): + f = PlainTextFormatter() + +def test_precision(): + """test various values for float_precision.""" + f = PlainTextFormatter() + assert f(pi) == repr(pi) + f.float_precision = 0 + if numpy: + po = numpy.get_printoptions() + assert po["precision"] == 0 + assert f(pi) == "3" + f.float_precision = 2 + if numpy: + po = numpy.get_printoptions() + assert po["precision"] == 2 + assert f(pi) == "3.14" + f.float_precision = "%g" + if numpy: + po = numpy.get_printoptions() + assert po["precision"] == 2 + assert f(pi) == "3.14159" + f.float_precision = "%e" + assert f(pi) == "3.141593e+00" + f.float_precision = "" + if numpy: + po = numpy.get_printoptions() + assert po["precision"] == 8 + assert f(pi) == repr(pi) + + +def test_bad_precision(): + """test various invalid values for float_precision.""" + f = PlainTextFormatter() + def set_fp(p): + f.float_precision = p + + pytest.raises(ValueError, set_fp, "%") + pytest.raises(ValueError, set_fp, "%.3f%i") + pytest.raises(ValueError, set_fp, "foo") + pytest.raises(ValueError, set_fp, -1) + +def test_for_type(): + f = PlainTextFormatter() + + # initial return, None + assert f.for_type(C, foo_printer) is None + # no func queries + assert f.for_type(C) is foo_printer + # shouldn't change anything + assert f.for_type(C) is foo_printer + # None should do the same + assert f.for_type(C, None) is foo_printer + assert f.for_type(C, None) is foo_printer + +def test_for_type_string(): + f = PlainTextFormatter() + + type_str = '%s.%s' % (C.__module__, 'C') + + # initial return, None + assert f.for_type(type_str, foo_printer) is None + # no func queries + assert f.for_type(type_str) is foo_printer + assert _mod_name_key(C) in f.deferred_printers + assert f.for_type(C) is foo_printer + assert _mod_name_key(C) not in f.deferred_printers + assert C in f.type_printers + +def test_for_type_by_name(): + f = PlainTextFormatter() + + mod = C.__module__ + + # initial return, None + assert f.for_type_by_name(mod, "C", foo_printer) is None + # no func queries + assert f.for_type_by_name(mod, "C") is foo_printer + # shouldn't change anything + assert f.for_type_by_name(mod, "C") is foo_printer + # None should do the same + assert f.for_type_by_name(mod, "C", None) is foo_printer + assert f.for_type_by_name(mod, "C", None) is foo_printer + + +def test_lookup(): + f = PlainTextFormatter() + + f.for_type(C, foo_printer) + assert f.lookup(C()) is foo_printer + with pytest.raises(KeyError): + f.lookup(A()) + +def test_lookup_string(): + f = PlainTextFormatter() + type_str = '%s.%s' % (C.__module__, 'C') + + f.for_type(type_str, foo_printer) + assert f.lookup(C()) is foo_printer + # should move from deferred to imported dict + assert _mod_name_key(C) not in f.deferred_printers + assert C in f.type_printers + +def test_lookup_by_type(): + f = PlainTextFormatter() + f.for_type(C, foo_printer) + assert f.lookup_by_type(C) is foo_printer + with pytest.raises(KeyError): + f.lookup_by_type(A) + +def test_lookup_by_type_string(): + f = PlainTextFormatter() + type_str = '%s.%s' % (C.__module__, 'C') + f.for_type(type_str, foo_printer) + + # verify insertion + assert _mod_name_key(C) in f.deferred_printers + assert C not in f.type_printers + + assert f.lookup_by_type(type_str) is foo_printer + # lookup by string doesn't cause import + assert _mod_name_key(C) in f.deferred_printers + assert C not in f.type_printers + + assert f.lookup_by_type(C) is foo_printer + # should move from deferred to imported dict + assert _mod_name_key(C) not in f.deferred_printers + assert C in f.type_printers + +def test_in_formatter(): + f = PlainTextFormatter() + f.for_type(C, foo_printer) + type_str = '%s.%s' % (C.__module__, 'C') + assert C in f + assert type_str in f + +def test_string_in_formatter(): + f = PlainTextFormatter() + type_str = '%s.%s' % (C.__module__, 'C') + f.for_type(type_str, foo_printer) + assert type_str in f + assert C in f + +def test_pop(): + f = PlainTextFormatter() + f.for_type(C, foo_printer) + assert f.lookup_by_type(C) is foo_printer + assert f.pop(C, None) is foo_printer + f.for_type(C, foo_printer) + assert f.pop(C) is foo_printer + with pytest.raises(KeyError): + f.lookup_by_type(C) + with pytest.raises(KeyError): + f.pop(C) + with pytest.raises(KeyError): + f.pop(A) + assert f.pop(A, None) is None + +def test_pop_string(): + f = PlainTextFormatter() + type_str = '%s.%s' % (C.__module__, 'C') + + with pytest.raises(KeyError): + f.pop(type_str) + + f.for_type(type_str, foo_printer) + f.pop(type_str) + with pytest.raises(KeyError): + f.lookup_by_type(C) + with pytest.raises(KeyError): + f.pop(type_str) + + f.for_type(C, foo_printer) + assert f.pop(type_str, None) is foo_printer + with pytest.raises(KeyError): + f.lookup_by_type(C) + with pytest.raises(KeyError): + f.pop(type_str) + assert f.pop(type_str, None) is None + + +def test_error_method(): + f = HTMLFormatter() + class BadHTML(object): + def _repr_html_(self): + raise ValueError("Bad HTML") + bad = BadHTML() + with capture_output() as captured: + result = f(bad) + assert result is None + assert "Traceback" in captured.stdout + assert "Bad HTML" in captured.stdout + assert "_repr_html_" in captured.stdout + +def test_nowarn_notimplemented(): + f = HTMLFormatter() + class HTMLNotImplemented(object): + def _repr_html_(self): + raise NotImplementedError + h = HTMLNotImplemented() + with capture_output() as captured: + result = f(h) + assert result is None + assert "" == captured.stderr + assert "" == captured.stdout + + +def test_warn_error_for_type(): + f = HTMLFormatter() + f.for_type(int, lambda i: name_error) + with capture_output() as captured: + result = f(5) + assert result is None + assert "Traceback" in captured.stdout + assert "NameError" in captured.stdout + assert "name_error" in captured.stdout + +def test_error_pretty_method(): + f = PlainTextFormatter() + class BadPretty(object): + def _repr_pretty_(self): + return "hello" + bad = BadPretty() + with capture_output() as captured: + result = f(bad) + assert result is None + assert "Traceback" in captured.stdout + assert "_repr_pretty_" in captured.stdout + assert "given" in captured.stdout + assert "argument" in captured.stdout + + +def test_bad_repr_traceback(): + f = PlainTextFormatter() + bad = BadRepr() + with capture_output() as captured: + result = f(bad) + # catches error, returns None + assert result is None + assert "Traceback" in captured.stdout + assert "__repr__" in captured.stdout + assert "ValueError" in captured.stdout + + +class MakePDF(object): + def _repr_pdf_(self): + return 'PDF' + +def test_pdf_formatter(): + pdf = MakePDF() + f = PDFFormatter() + assert f(pdf) == "PDF" + + +def test_print_method_bound(): + f = HTMLFormatter() + class MyHTML(object): + def _repr_html_(self): + return "hello" + with capture_output() as captured: + result = f(MyHTML) + assert result is None + assert "FormatterWarning" not in captured.stderr + + with capture_output() as captured: + result = f(MyHTML()) + assert result == "hello" + assert captured.stderr == "" + + +def test_print_method_weird(): + + class TextMagicHat(object): + def __getattr__(self, key): + return key + + f = HTMLFormatter() + + text_hat = TextMagicHat() + assert text_hat._repr_html_ == "_repr_html_" + with capture_output() as captured: + result = f(text_hat) + + assert result is None + assert "FormatterWarning" not in captured.stderr + + class CallableMagicHat(object): + def __getattr__(self, key): + return lambda : key + + call_hat = CallableMagicHat() + with capture_output() as captured: + result = f(call_hat) + + assert result is None + + class BadReprArgs(object): + def _repr_html_(self, extra, args): + return "html" + + bad = BadReprArgs() + with capture_output() as captured: + result = f(bad) + + assert result is None + assert "FormatterWarning" not in captured.stderr + + +def test_format_config(): + """config objects don't pretend to support fancy reprs with lazy attrs""" + f = HTMLFormatter() + cfg = Config() + with capture_output() as captured: + result = f(cfg) + assert result is None + assert captured.stderr == "" + + with capture_output() as captured: + result = f(Config) + assert result is None + assert captured.stderr == "" + + +def test_pretty_max_seq_length(): + f = PlainTextFormatter(max_seq_length=1) + lis = list(range(3)) + text = f(lis) + assert text == "[0, ...]" + f.max_seq_length = 0 + text = f(lis) + assert text == "[0, 1, 2]" + text = f(list(range(1024))) + lines = text.splitlines() + assert len(lines) == 1024 + + +def test_ipython_display_formatter(): + """Objects with _ipython_display_ defined bypass other formatters""" + f = get_ipython().display_formatter + catcher = [] + class SelfDisplaying(object): + def _ipython_display_(self): + catcher.append(self) + + class NotSelfDisplaying(object): + def __repr__(self): + return "NotSelfDisplaying" + + def _ipython_display_(self): + raise NotImplementedError + + save_enabled = f.ipython_display_formatter.enabled + f.ipython_display_formatter.enabled = True + + yes = SelfDisplaying() + no = NotSelfDisplaying() + + d, md = f.format(no) + assert d == {"text/plain": repr(no)} + assert md == {} + assert catcher == [] + + d, md = f.format(yes) + assert d == {} + assert md == {} + assert catcher == [yes] + + f.ipython_display_formatter.enabled = save_enabled + + +def test_repr_mime(): + class HasReprMime(object): + def _repr_mimebundle_(self, include=None, exclude=None): + return { + 'application/json+test.v2': { + 'x': 'y' + }, + 'plain/text' : '', + 'image/png' : 'i-overwrite' + } + + def _repr_png_(self): + return 'should-be-overwritten' + def _repr_html_(self): + return 'hi!' + + f = get_ipython().display_formatter + html_f = f.formatters['text/html'] + save_enabled = html_f.enabled + html_f.enabled = True + obj = HasReprMime() + d, md = f.format(obj) + html_f.enabled = save_enabled + + assert sorted(d) == [ + "application/json+test.v2", + "image/png", + "plain/text", + "text/html", + "text/plain", + ] + assert md == {} + + d, md = f.format(obj, include={"image/png"}) + assert list(d.keys()) == [ + "image/png" + ], "Include should filter out even things from repr_mimebundle" + + assert d["image/png"] == "i-overwrite", "_repr_mimebundle_ take precedence" + + +def test_pass_correct_include_exclude(): + class Tester(object): + + def __init__(self, include=None, exclude=None): + self.include = include + self.exclude = exclude + + def _repr_mimebundle_(self, include, exclude, **kwargs): + if include and (include != self.include): + raise ValueError('include got modified: display() may be broken.') + if exclude and (exclude != self.exclude): + raise ValueError('exclude got modified: display() may be broken.') + + return None + + include = {'a', 'b', 'c'} + exclude = {'c', 'e' , 'f'} + + f = get_ipython().display_formatter + f.format(Tester(include=include, exclude=exclude), include=include, exclude=exclude) + f.format(Tester(exclude=exclude), exclude=exclude) + f.format(Tester(include=include), include=include) + + +def test_repr_mime_meta(): + class HasReprMimeMeta(object): + def _repr_mimebundle_(self, include=None, exclude=None): + data = { + 'image/png': 'base64-image-data', + } + metadata = { + 'image/png': { + 'width': 5, + 'height': 10, + } + } + return (data, metadata) + + f = get_ipython().display_formatter + obj = HasReprMimeMeta() + d, md = f.format(obj) + assert sorted(d) == ["image/png", "text/plain"] + assert md == { + "image/png": { + "width": 5, + "height": 10, + } + } + + +def test_repr_mime_failure(): + class BadReprMime(object): + def _repr_mimebundle_(self, include=None, exclude=None): + raise RuntimeError + + f = get_ipython().display_formatter + obj = BadReprMime() + d, md = f.format(obj) + assert "text/plain" in d + + +def test_custom_repr_namedtuple_partialmethod(): + from functools import partialmethod + from typing import NamedTuple + + class Foo(NamedTuple): ... + + Foo.__repr__ = partialmethod(lambda obj: "Hello World") + foo = Foo() + + f = PlainTextFormatter() + assert f.pprint + assert f(foo) == "Hello World" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py new file mode 100644 index 0000000..f9057d8 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py @@ -0,0 +1,785 @@ +import sys +from contextlib import contextmanager +from typing import ( + Annotated, + AnyStr, + NamedTuple, + Literal, + NewType, + Optional, + Protocol, + TypeGuard, + Union, + TypedDict, +) +from functools import partial +from IPython.core.guarded_eval import ( + EvaluationContext, + GuardRejection, + guarded_eval, + _unbind_method, +) +from IPython.testing import decorators as dec +import pytest + + +if sys.version_info < (3, 11): + from typing_extensions import Self, LiteralString +else: + from typing import Self, LiteralString + +if sys.version_info < (3, 12): + from typing_extensions import TypeAliasType +else: + from typing import TypeAliasType + + +def create_context(evaluation: str, **kwargs): + return EvaluationContext(locals=kwargs, globals={}, evaluation=evaluation) + + +forbidden = partial(create_context, "forbidden") +minimal = partial(create_context, "minimal") +limited = partial(create_context, "limited") +unsafe = partial(create_context, "unsafe") +dangerous = partial(create_context, "dangerous") + +LIMITED_OR_HIGHER = [limited, unsafe, dangerous] +MINIMAL_OR_HIGHER = [minimal, *LIMITED_OR_HIGHER] + + +@contextmanager +def module_not_installed(module: str): + import sys + + try: + to_restore = sys.modules[module] + del sys.modules[module] + except KeyError: + to_restore = None + try: + yield + finally: + sys.modules[module] = to_restore + + +def test_external_not_installed(): + """ + Because attribute check requires checking if object is not of allowed + external type, this tests logic for absence of external module. + """ + + class Custom: + def __init__(self): + self.test = 1 + + def __getattr__(self, key): + return key + + with module_not_installed("pandas"): + context = limited(x=Custom()) + with pytest.raises(GuardRejection): + guarded_eval("x.test", context) + + +@dec.skip_without("pandas") +def test_external_changed_api(monkeypatch): + """Check that the execution rejects if external API changed paths""" + import pandas as pd + + series = pd.Series([1], index=["a"]) + + with monkeypatch.context() as m: + m.delattr(pd, "Series") + context = limited(data=series) + with pytest.raises(GuardRejection): + guarded_eval("data.iloc[0]", context) + + +@dec.skip_without("pandas") +def test_pandas_series_iloc(): + import pandas as pd + + series = pd.Series([1], index=["a"]) + context = limited(data=series) + assert guarded_eval("data.iloc[0]", context) == 1 + + +def test_rejects_custom_properties(): + class BadProperty: + @property + def iloc(self): + return [None] + + series = BadProperty() + context = limited(data=series) + + with pytest.raises(GuardRejection): + guarded_eval("data.iloc[0]", context) + + +@dec.skip_without("pandas") +def test_accepts_non_overriden_properties(): + import pandas as pd + + class GoodProperty(pd.Series): + pass + + series = GoodProperty([1], index=["a"]) + context = limited(data=series) + + assert guarded_eval("data.iloc[0]", context) == 1 + + +@dec.skip_without("pandas") +def test_pandas_series(): + import pandas as pd + + context = limited(data=pd.Series([1], index=["a"])) + assert guarded_eval('data["a"]', context) == 1 + with pytest.raises(KeyError): + guarded_eval('data["c"]', context) + + +@dec.skip_without("pandas") +def test_pandas_bad_series(): + import pandas as pd + + class BadItemSeries(pd.Series): + def __getitem__(self, key): + return "CUSTOM_ITEM" + + class BadAttrSeries(pd.Series): + def __getattr__(self, key): + return "CUSTOM_ATTR" + + bad_series = BadItemSeries([1], index=["a"]) + context = limited(data=bad_series) + + with pytest.raises(GuardRejection): + guarded_eval('data["a"]', context) + with pytest.raises(GuardRejection): + guarded_eval('data["c"]', context) + + # note: here result is a bit unexpected because + # pandas `__getattr__` calls `__getitem__`; + # FIXME - special case to handle it? + assert guarded_eval("data.a", context) == "CUSTOM_ITEM" + + context = unsafe(data=bad_series) + assert guarded_eval('data["a"]', context) == "CUSTOM_ITEM" + + bad_attr_series = BadAttrSeries([1], index=["a"]) + context = limited(data=bad_attr_series) + assert guarded_eval('data["a"]', context) == 1 + with pytest.raises(GuardRejection): + guarded_eval("data.a", context) + + +@dec.skip_without("pandas") +def test_pandas_dataframe_loc(): + import pandas as pd + from pandas.testing import assert_series_equal + + data = pd.DataFrame([{"a": 1}]) + context = limited(data=data) + assert_series_equal(guarded_eval('data.loc[:, "a"]', context), data["a"]) + + +def test_named_tuple(): + class GoodNamedTuple(NamedTuple): + a: str + pass + + class BadNamedTuple(NamedTuple): + a: str + + def __getitem__(self, key): + return None + + good = GoodNamedTuple(a="x") + bad = BadNamedTuple(a="x") + + context = limited(data=good) + assert guarded_eval("data[0]", context) == "x" + + context = limited(data=bad) + with pytest.raises(GuardRejection): + guarded_eval("data[0]", context) + + +def test_dict(): + context = limited(data={"a": 1, "b": {"x": 2}, ("x", "y"): 3}) + assert guarded_eval('data["a"]', context) == 1 + assert guarded_eval('data["b"]', context) == {"x": 2} + assert guarded_eval('data["b"]["x"]', context) == 2 + assert guarded_eval('data["x", "y"]', context) == 3 + + assert guarded_eval("data.keys", context) + + +def test_set(): + context = limited(data={"a", "b"}) + assert guarded_eval("data.difference", context) + + +def test_list(): + context = limited(data=[1, 2, 3]) + assert guarded_eval("data[1]", context) == 2 + assert guarded_eval("data.copy", context) + + +def test_dict_literal(): + context = limited() + assert guarded_eval("{}", context) == {} + assert guarded_eval('{"a": 1}', context) == {"a": 1} + + +def test_list_literal(): + context = limited() + assert guarded_eval("[]", context) == [] + assert guarded_eval('[1, "a"]', context) == [1, "a"] + + +def test_set_literal(): + context = limited() + assert guarded_eval("set()", context) == set() + assert guarded_eval('{"a"}', context) == {"a"} + + +def test_evaluates_if_expression(): + context = limited() + assert guarded_eval("2 if True else 3", context) == 2 + assert guarded_eval("4 if False else 5", context) == 5 + + +def test_object(): + obj = object() + context = limited(obj=obj) + assert guarded_eval("obj.__dir__", context) == obj.__dir__ + + +@pytest.mark.parametrize( + "code,expected", + [ + ["int.numerator", int.numerator], + ["float.is_integer", float.is_integer], + ["complex.real", complex.real], + ], +) +def test_number_attributes(code, expected): + assert guarded_eval(code, limited()) == expected + + +def test_method_descriptor(): + context = limited() + assert guarded_eval("list.copy.__name__", context) == "copy" + + +class HeapType: + pass + + +class CallCreatesHeapType: + def __call__(self) -> HeapType: + return HeapType() + + +class CallCreatesBuiltin: + def __call__(self) -> frozenset: + return frozenset() + + +class HasStaticMethod: + @staticmethod + def static_method() -> HeapType: + return HeapType() + + +class InitReturnsFrozenset: + def __new__(self) -> frozenset: # type:ignore[misc] + return frozenset() + + +class StringAnnotation: + def heap(self) -> "HeapType": + return HeapType() + + def copy(self) -> "StringAnnotation": + return StringAnnotation() + + +CustomIntType = NewType("CustomIntType", int) +CustomHeapType = NewType("CustomHeapType", HeapType) +IntTypeAlias = TypeAliasType("IntTypeAlias", int) +HeapTypeAlias = TypeAliasType("HeapTypeAlias", HeapType) + + +class TestProtocol(Protocol): + def test_method(self) -> bool: + pass + + +class TestProtocolImplementer(TestProtocol): + def test_method(self) -> bool: + return True + + +class Movie(TypedDict): + name: str + year: int + + +class SpecialTyping: + def custom_int_type(self) -> CustomIntType: + return CustomIntType(1) + + def custom_heap_type(self) -> CustomHeapType: + return CustomHeapType(HeapType()) + + # TODO: remove type:ignore comment once mypy + # supports explicit calls to `TypeAliasType`, see: + # https://github.com/python/mypy/issues/16614 + def int_type_alias(self) -> IntTypeAlias: # type:ignore[valid-type] + return 1 + + def heap_type_alias(self) -> HeapTypeAlias: # type:ignore[valid-type] + return 1 + + def literal(self) -> Literal[False]: + return False + + def literal_string(self) -> LiteralString: + return "test" + + def self(self) -> Self: + return self + + def any_str(self, x: AnyStr) -> AnyStr: + return x + + def annotated(self) -> Annotated[float, "positive number"]: + return 1 + + def annotated_self(self) -> Annotated[Self, "self with metadata"]: + self._metadata = "test" + return self + + def int_type_guard(self, x) -> TypeGuard[int]: + return isinstance(x, int) + + def optional_float(self) -> Optional[float]: + return 1.0 + + def union_str_and_int(self) -> Union[str, int]: + return "" + + def protocol(self) -> TestProtocol: + return TestProtocolImplementer() + + def typed_dict(self) -> Movie: + return {"name": "The Matrix", "year": 1999} + + +@pytest.mark.parametrize( + "data,code,expected,equality", + [ + [[1, 2, 3], "data.index(2)", 1, True], + [{"a": 1}, "data.keys().isdisjoint({})", True, True], + [StringAnnotation(), "data.heap()", HeapType, False], + [StringAnnotation(), "data.copy()", StringAnnotation, False], + # test cases for `__call__` + [CallCreatesHeapType(), "data()", HeapType, False], + [CallCreatesBuiltin(), "data()", frozenset, False], + # Test cases for `__init__` + [HeapType, "data()", HeapType, False], + [InitReturnsFrozenset, "data()", frozenset, False], + [HeapType(), "data.__class__()", HeapType, False], + # supported special cases for typing + [SpecialTyping(), "data.custom_int_type()", int, False], + [SpecialTyping(), "data.custom_heap_type()", HeapType, False], + [SpecialTyping(), "data.int_type_alias()", int, False], + [SpecialTyping(), "data.heap_type_alias()", HeapType, False], + [SpecialTyping(), "data.self()", SpecialTyping, False], + [SpecialTyping(), "data.literal()", False, True], + [SpecialTyping(), "data.literal_string()", str, False], + [SpecialTyping(), "data.any_str('a')", str, False], + [SpecialTyping(), "data.any_str(b'a')", bytes, False], + [SpecialTyping(), "data.annotated()", float, False], + [SpecialTyping(), "data.annotated_self()", SpecialTyping, False], + [SpecialTyping(), "data.int_type_guard()", int, False], + # test cases for static methods + [HasStaticMethod, "data.static_method()", HeapType, False], + ], +) +def test_evaluates_calls(data, code, expected, equality): + context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) + value = guarded_eval(code, context) + if equality: + assert value == expected + else: + assert isinstance(value, expected) + + +@pytest.mark.parametrize( + "data,code,expected_attributes", + [ + [SpecialTyping(), "data.optional_float()", ["is_integer"]], + [ + SpecialTyping(), + "data.union_str_and_int()", + ["capitalize", "as_integer_ratio"], + ], + [SpecialTyping(), "data.protocol()", ["test_method"]], + [SpecialTyping(), "data.typed_dict()", ["keys", "values", "items"]], + ], +) +def test_mocks_attributes_of_call_results(data, code, expected_attributes): + context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) + result = guarded_eval(code, context) + for attr in expected_attributes: + assert hasattr(result, attr) + assert attr in dir(result) + + +@pytest.mark.parametrize( + "data,code,expected_items", + [ + [SpecialTyping(), "data.typed_dict()", {"year": int, "name": str}], + ], +) +def test_mocks_items_of_call_results(data, code, expected_items): + context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) + result = guarded_eval(code, context) + ipython_keys = result._ipython_key_completions_() + for key, value in expected_items.items(): + assert isinstance(result[key], value) + assert key in ipython_keys + + +@pytest.mark.parametrize( + "data,bad", + [ + [[1, 2, 3], "data.append(4)"], + [{"a": 1}, "data.update()"], + ], +) +def test_rejects_calls_with_side_effects(data, bad): + context = limited(data=data) + + with pytest.raises(GuardRejection): + guarded_eval(bad, context) + + +@pytest.mark.parametrize( + "code,expected", + [ + ["(1\n+\n1)", 2], + ["list(range(10))[-1:]", [9]], + ["list(range(20))[3:-2:3]", [3, 6, 9, 12, 15]], + ], +) +@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) +def test_evaluates_complex_cases(code, expected, context): + assert guarded_eval(code, context()) == expected + + +@pytest.mark.parametrize( + "code,expected", + [ + ["1", 1], + ["1.0", 1.0], + ["0xdeedbeef", 0xDEEDBEEF], + ["True", True], + ["None", None], + ["{}", {}], + ["[]", []], + ], +) +@pytest.mark.parametrize("context", MINIMAL_OR_HIGHER) +def test_evaluates_literals(code, expected, context): + assert guarded_eval(code, context()) == expected + + +@pytest.mark.parametrize( + "code,expected", + [ + ["-5", -5], + ["+5", +5], + ["~5", -6], + ], +) +@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) +def test_evaluates_unary_operations(code, expected, context): + assert guarded_eval(code, context()) == expected + + +@pytest.mark.parametrize( + "code,expected", + [ + ["1 + 1", 2], + ["3 - 1", 2], + ["2 * 3", 6], + ["5 // 2", 2], + ["5 / 2", 2.5], + ["5**2", 25], + ["2 >> 1", 1], + ["2 << 1", 4], + ["1 | 2", 3], + ["1 & 1", 1], + ["1 & 2", 0], + ], +) +@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) +def test_evaluates_binary_operations(code, expected, context): + assert guarded_eval(code, context()) == expected + + +@pytest.mark.parametrize( + "code,expected", + [ + ["2 > 1", True], + ["2 < 1", False], + ["2 <= 1", False], + ["2 <= 2", True], + ["1 >= 2", False], + ["2 >= 2", True], + ["2 == 2", True], + ["1 == 2", False], + ["1 != 2", True], + ["1 != 1", False], + ["1 < 4 < 3", False], + ["(1 < 4) < 3", True], + ["4 > 3 > 2 > 1", True], + ["4 > 3 > 2 > 9", False], + ["1 < 2 < 3 < 4", True], + ["9 < 2 < 3 < 4", False], + ["1 < 2 > 1 > 0 > -1 < 1", True], + ["1 in [1] in [[1]]", True], + ["1 in [1] in [[2]]", False], + ["1 in [1]", True], + ["0 in [1]", False], + ["1 not in [1]", False], + ["0 not in [1]", True], + ["True is True", True], + ["False is False", True], + ["True is False", False], + ["True is not True", False], + ["False is not True", True], + ], +) +@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) +def test_evaluates_comparisons(code, expected, context): + assert guarded_eval(code, context()) == expected + + +def test_guards_comparisons(): + class GoodEq(int): + pass + + class BadEq(int): + def __eq__(self, other): + assert False + + context = limited(bad=BadEq(1), good=GoodEq(1)) + + with pytest.raises(GuardRejection): + guarded_eval("bad == 1", context) + + with pytest.raises(GuardRejection): + guarded_eval("bad != 1", context) + + with pytest.raises(GuardRejection): + guarded_eval("1 == bad", context) + + with pytest.raises(GuardRejection): + guarded_eval("1 != bad", context) + + assert guarded_eval("good == 1", context) is True + assert guarded_eval("good != 1", context) is False + assert guarded_eval("1 == good", context) is True + assert guarded_eval("1 != good", context) is False + + +def test_guards_unary_operations(): + class GoodOp(int): + pass + + class BadOpInv(int): + def __inv__(self, other): + assert False + + class BadOpInverse(int): + def __inv__(self, other): + assert False + + context = limited(good=GoodOp(1), bad1=BadOpInv(1), bad2=BadOpInverse(1)) + + with pytest.raises(GuardRejection): + guarded_eval("~bad1", context) + + with pytest.raises(GuardRejection): + guarded_eval("~bad2", context) + + +def test_guards_binary_operations(): + class GoodOp(int): + pass + + class BadOp(int): + def __add__(self, other): + assert False + + context = limited(good=GoodOp(1), bad=BadOp(1)) + + with pytest.raises(GuardRejection): + guarded_eval("1 + bad", context) + + with pytest.raises(GuardRejection): + guarded_eval("bad + 1", context) + + assert guarded_eval("good + 1", context) == 2 + assert guarded_eval("1 + good", context) == 2 + + +def test_guards_attributes(): + class GoodAttr(float): + pass + + class BadAttr1(float): + def __getattr__(self, key): + assert False + + class BadAttr2(float): + def __getattribute__(self, key): + assert False + + context = limited(good=GoodAttr(0.5), bad1=BadAttr1(0.5), bad2=BadAttr2(0.5)) + + with pytest.raises(GuardRejection): + guarded_eval("bad1.as_integer_ratio", context) + + with pytest.raises(GuardRejection): + guarded_eval("bad2.as_integer_ratio", context) + + assert guarded_eval("good.as_integer_ratio()", context) == (1, 2) + + +@pytest.mark.parametrize("context", MINIMAL_OR_HIGHER) +def test_access_builtins(context): + assert guarded_eval("round", context()) == round + + +def test_access_builtins_fails(): + context = limited() + with pytest.raises(NameError): + guarded_eval("this_is_not_builtin", context) + + +def test_rejects_forbidden(): + context = forbidden() + with pytest.raises(GuardRejection): + guarded_eval("1", context) + + +def test_guards_locals_and_globals(): + context = EvaluationContext( + locals={"local_a": "a"}, globals={"global_b": "b"}, evaluation="minimal" + ) + + with pytest.raises(GuardRejection): + guarded_eval("local_a", context) + + with pytest.raises(GuardRejection): + guarded_eval("global_b", context) + + +def test_access_locals_and_globals(): + context = EvaluationContext( + locals={"local_a": "a"}, globals={"global_b": "b"}, evaluation="limited" + ) + assert guarded_eval("local_a", context) == "a" + assert guarded_eval("global_b", context) == "b" + + +@pytest.mark.parametrize( + "code", + ["def func(): pass", "class C: pass", "x = 1", "x += 1", "del x", "import ast"], +) +@pytest.mark.parametrize("context", [minimal(), limited(), unsafe()]) +def test_rejects_side_effect_syntax(code, context): + with pytest.raises(SyntaxError): + guarded_eval(code, context) + + +def test_subscript(): + context = EvaluationContext( + locals={}, globals={}, evaluation="limited", in_subscript=True + ) + empty_slice = slice(None, None, None) + assert guarded_eval("", context) == tuple() + assert guarded_eval(":", context) == empty_slice + assert guarded_eval("1:2:3", context) == slice(1, 2, 3) + assert guarded_eval(':, "a"', context) == (empty_slice, "a") + + +def test_unbind_method(): + class X(list): + def index(self, k): + return "CUSTOM" + + x = X() + assert _unbind_method(x.index) is X.index + assert _unbind_method([].index) is list.index + assert _unbind_method(list.index) is None + + +def test_assumption_instance_attr_do_not_matter(): + """This is semi-specified in Python documentation. + + However, since the specification says 'not guaranteed + to work' rather than 'is forbidden to work', future + versions could invalidate this assumptions. This test + is meant to catch such a change if it ever comes true. + """ + + class T: + def __getitem__(self, k): + return "a" + + def __getattr__(self, k): + return "a" + + def f(self): + return "b" + + t = T() + t.__getitem__ = f + t.__getattr__ = f + assert t[1] == "a" + assert t[1] == "a" + + +def test_assumption_named_tuples_share_getitem(): + """Check assumption on named tuples sharing __getitem__""" + from typing import NamedTuple + + class A(NamedTuple): + pass + + class B(NamedTuple): + pass + + assert A.__getitem__ == B.__getitem__ + + +@dec.skip_without("numpy") +def test_module_access(): + import numpy + + context = limited(numpy=numpy) + assert guarded_eval("numpy.linalg.norm", context) == numpy.linalg.norm + + context = minimal(numpy=numpy) + with pytest.raises(GuardRejection): + guarded_eval("np.linalg.norm", context) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py new file mode 100644 index 0000000..905d9ab --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py @@ -0,0 +1,75 @@ +"""Tests for input handlers. +""" +#----------------------------------------------------------------------------- +# Module imports +#----------------------------------------------------------------------------- + +# our own packages +from IPython.core import autocall +from IPython.testing import tools as tt +import pytest +from collections.abc import Callable + +#----------------------------------------------------------------------------- +# Globals +#----------------------------------------------------------------------------- + +# Test functions +#----------------------------------------------------------------------------- + +class CallableIndexable(object): + def __getitem__(self, idx): return True + def __call__(self, *args, **kws): return True + + +class Autocallable(autocall.IPyAutocall): + def __call__(self): + return "called" + + +@pytest.mark.parametrize( + "autocall, input, output", + [ + # For many of the below, we're also checking that leading whitespace + # turns off the esc char, which it should unless there is a continuation + # line. + ("1", '"no change"', '"no change"'), # normal + ("1", "lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), # magic + # Only explicit escapes or instances of IPyAutocallable should get + # expanded + ("0", 'len "abc"', 'len "abc"'), + ("0", "autocallable", "autocallable()"), + # Don't add extra brackets (gh-1117) + ("0", "autocallable()", "autocallable()"), + ("1", 'len "abc"', 'len("abc")'), + ("1", 'len "abc";', 'len("abc");'), # ; is special -- moves out of parens + # Autocall is turned off if first arg is [] and the object + # is both callable and indexable. Like so: + ("1", "len [1,2]", "len([1,2])"), # len doesn't support __getitem__... + ("1", "call_idx [1]", "call_idx [1]"), # call_idx *does*.. + ("1", "call_idx 1", "call_idx(1)"), + ("1", "len", "len"), # only at 2 does it auto-call on single args + ("2", 'len "abc"', 'len("abc")'), + ("2", 'len "abc";', 'len("abc");'), + ("2", "len [1,2]", "len([1,2])"), + ("2", "call_idx [1]", "call_idx [1]"), + ("2", "call_idx 1", "call_idx(1)"), + # T his is what's different: + ("2", "len", "len()"), # only at 2 does it auto-call on single args + ("0", "Callable[[int], None]", "Callable[[int], None]"), + ("1", "Callable[[int], None]", "Callable[[int], None]"), + ("1", "Callable[[int], None]", "Callable[[int], None]"), + ], +) +def test_handlers_I(autocall, input, output): + autocallable = Autocallable() + ip.user_ns["autocallable"] = autocallable + + call_idx = CallableIndexable() + ip.user_ns["call_idx"] = call_idx + + ip.user_ns["Callable"] = Callable + + ip.run_line_magic("autocall", autocall) + assert ip.prefilter_manager.prefilter_lines(input) == output + ip.run_line_magic("autocall", "1") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py new file mode 100644 index 0000000..fa64fe0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py @@ -0,0 +1,306 @@ +# coding: utf-8 +"""Tests for the IPython tab-completion machinery. +""" +#----------------------------------------------------------------------------- +# Module imports +#----------------------------------------------------------------------------- + +# stdlib +import io +import sys +import tempfile +from datetime import datetime +from pathlib import Path + +from tempfile import TemporaryDirectory +# our own packages +from traitlets.config.loader import Config + +from IPython.core.history import HistoryAccessor, HistoryManager, extract_hist_ranges + + +def test_proper_default_encoding(): + assert sys.getdefaultencoding() == "utf-8" + +def test_history(): + ip = get_ipython() + with TemporaryDirectory() as tmpdir: + tmp_path = Path(tmpdir) + hist_manager_ori = ip.history_manager + hist_file = tmp_path / "history.sqlite" + try: + ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file) + hist = ["a=1", "def f():\n test = 1\n return test", "b='€Æ¾÷ß'"] + for i, h in enumerate(hist, start=1): + ip.history_manager.store_inputs(i, h) + + ip.history_manager.db_log_output = True + # Doesn't match the input, but we'll just check it's stored. + ip.history_manager.output_hist_reprs[3] = "spam" + ip.history_manager.store_output(3) + + assert ip.history_manager.input_hist_raw == [""] + hist + + # Detailed tests for _get_range_session + grs = ip.history_manager._get_range_session + assert list(grs(start=2, stop=-1)) == list(zip([0], [2], hist[1:-1])) + assert list(grs(start=-2)) == list(zip([0, 0], [2, 3], hist[-2:])) + assert list(grs(output=True)) == list( + zip([0, 0, 0], [1, 2, 3], zip(hist, [None, None, "spam"])) + ) + + # Check whether specifying a range beyond the end of the current + # session results in an error (gh-804) + ip.run_line_magic("hist", "2-500") + + # Check that we can write non-ascii characters to a file + ip.run_line_magic("hist", "-f %s" % (tmp_path / "test1")) + ip.run_line_magic("hist", "-pf %s" % (tmp_path / "test2")) + ip.run_line_magic("hist", "-nf %s" % (tmp_path / "test3")) + ip.run_line_magic("save", "%s 1-10" % (tmp_path / "test4")) + + # New session + ip.history_manager.reset() + newcmds = ["z=5", "class X(object):\n pass", "k='p'", "z=5"] + for i, cmd in enumerate(newcmds, start=1): + ip.history_manager.store_inputs(i, cmd) + gothist = ip.history_manager.get_range(start=1, stop=4) + assert list(gothist) == list(zip([0, 0, 0], [1, 2, 3], newcmds)) + # Previous session: + gothist = ip.history_manager.get_range(-1, 1, 4) + assert list(gothist) == list(zip([1, 1, 1], [1, 2, 3], hist)) + + newhist = [(2, i, c) for (i, c) in enumerate(newcmds, 1)] + + # Check get_hist_tail + gothist = ip.history_manager.get_tail(5, output=True, + include_latest=True) + expected = [(1, 3, (hist[-1], "spam"))] \ + + [(s, n, (c, None)) for (s, n, c) in newhist] + assert list(gothist) == expected + + gothist = ip.history_manager.get_tail(2) + expected = newhist[-3:-1] + assert list(gothist) == expected + + # Check get_hist_search + + gothist = ip.history_manager.search("*test*") + assert list(gothist) == [(1, 2, hist[1])] + + gothist = ip.history_manager.search("*=*") + assert list(gothist) == [ + (1, 1, hist[0]), + (1, 2, hist[1]), + (1, 3, hist[2]), + newhist[0], + newhist[2], + newhist[3], + ] + + gothist = ip.history_manager.search("*=*", n=4) + assert list(gothist) == [ + (1, 3, hist[2]), + newhist[0], + newhist[2], + newhist[3], + ] + + gothist = ip.history_manager.search("*=*", unique=True) + assert list(gothist) == [ + (1, 1, hist[0]), + (1, 2, hist[1]), + (1, 3, hist[2]), + newhist[2], + newhist[3], + ] + + gothist = ip.history_manager.search("*=*", unique=True, n=3) + assert list(gothist) == [(1, 3, hist[2]), newhist[2], newhist[3]] + + gothist = ip.history_manager.search("b*", output=True) + assert list(gothist) == [(1, 3, (hist[2], "spam"))] + + # Cross testing: check that magic %save can get previous session. + testfilename = (tmp_path / "test.py").resolve() + ip.run_line_magic("save", str(testfilename) + " ~1/1-3") + with io.open(testfilename, encoding="utf-8") as testfile: + assert testfile.read() == "# coding: utf-8\n" + "\n".join(hist) + "\n" + + # Duplicate line numbers - check that it doesn't crash, and + # gets a new session + ip.history_manager.store_inputs(1, "rogue") + ip.history_manager.writeout_cache() + assert ip.history_manager.session_number == 3 + + # Check that session and line values are not just max values + sessid, lineno, entry = newhist[-1] + assert lineno > 1 + ip.history_manager.reset() + lineno = 1 + ip.history_manager.store_inputs(lineno, entry) + gothist = ip.history_manager.search("*=*", unique=True) + hist = list(gothist)[-1] + assert sessid < hist[0] + assert hist[1:] == (lineno, entry) + finally: + # Ensure saving thread is shut down before we try to clean up the files + ip.history_manager.save_thread.stop() + # Forcibly close database rather than relying on garbage collection + ip.history_manager.db.close() + # Restore history manager + ip.history_manager = hist_manager_ori + + +def test_extract_hist_ranges(): + instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5 ~10/" + expected = [(0, 1, 2), # 0 == current session + (2, 3, 4), + (-4, 5, 7), + (-4, 7, 10), + (-9, 2, None), # None == to end + (-8, 1, None), + (-7, 1, 6), + (-10, 1, None)] + actual = list(extract_hist_ranges(instr)) + assert actual == expected + + +def test_extract_hist_ranges_empty_str(): + instr = "" + expected = [(0, 1, None)] # 0 == current session, None == to end + actual = list(extract_hist_ranges(instr)) + assert actual == expected + + +def test_magic_rerun(): + """Simple test for %rerun (no args -> rerun last line)""" + ip = get_ipython() + ip.run_cell("a = 10", store_history=True) + ip.run_cell("a += 1", store_history=True) + assert ip.user_ns["a"] == 11 + ip.run_cell("%rerun", store_history=True) + assert ip.user_ns["a"] == 12 + +def test_timestamp_type(): + ip = get_ipython() + info = ip.history_manager.get_session_info() + assert isinstance(info[1], datetime) + +def test_hist_file_config(): + cfg = Config() + tfile = tempfile.NamedTemporaryFile(delete=False) + cfg.HistoryManager.hist_file = Path(tfile.name) + try: + hm = HistoryManager(shell=get_ipython(), config=cfg) + assert hm.hist_file == cfg.HistoryManager.hist_file + finally: + try: + Path(tfile.name).unlink() + except OSError: + # same catch as in testing.tools.TempFileMixin + # On Windows, even though we close the file, we still can't + # delete it. I have no clue why + pass + +def test_histmanager_disabled(): + """Ensure that disabling the history manager doesn't create a database.""" + cfg = Config() + cfg.HistoryAccessor.enabled = False + + ip = get_ipython() + with TemporaryDirectory() as tmpdir: + hist_manager_ori = ip.history_manager + hist_file = Path(tmpdir) / "history.sqlite" + cfg.HistoryManager.hist_file = hist_file + try: + ip.history_manager = HistoryManager(shell=ip, config=cfg) + hist = ["a=1", "def f():\n test = 1\n return test", "b='€Æ¾÷ß'"] + for i, h in enumerate(hist, start=1): + ip.history_manager.store_inputs(i, h) + assert ip.history_manager.input_hist_raw == [""] + hist + ip.history_manager.reset() + ip.history_manager.end_session() + finally: + ip.history_manager = hist_manager_ori + + # hist_file should not be created + assert hist_file.exists() is False + + +def test_get_tail_session_awareness(): + """Test .get_tail() is: + - session specific in HistoryManager + - session agnostic in HistoryAccessor + same for .get_last_session_id() + """ + ip = get_ipython() + with TemporaryDirectory() as tmpdir: + tmp_path = Path(tmpdir) + hist_file = tmp_path / "history.sqlite" + get_source = lambda x: x[2] + hm1 = None + hm2 = None + ha = None + try: + # hm1 creates a new session and adds history entries, + # ha catches up + hm1 = HistoryManager(shell=ip, hist_file=hist_file) + hm1_last_sid = hm1.get_last_session_id + ha = HistoryAccessor(hist_file=hist_file) + ha_last_sid = ha.get_last_session_id + + hist1 = ["a=1", "b=1", "c=1"] + for i, h in enumerate(hist1 + [""], start=1): + hm1.store_inputs(i, h) + assert list(map(get_source, hm1.get_tail())) == hist1 + assert list(map(get_source, ha.get_tail())) == hist1 + sid1 = hm1_last_sid() + assert sid1 is not None + assert ha_last_sid() == sid1 + + # hm2 creates a new session and adds entries, + # ha catches up + hm2 = HistoryManager(shell=ip, hist_file=hist_file) + hm2_last_sid = hm2.get_last_session_id + + hist2 = ["a=2", "b=2", "c=2"] + for i, h in enumerate(hist2 + [""], start=1): + hm2.store_inputs(i, h) + tail = hm2.get_tail(n=3) + assert list(map(get_source, tail)) == hist2 + tail = ha.get_tail(n=3) + assert list(map(get_source, tail)) == hist2 + sid2 = hm2_last_sid() + assert sid2 is not None + assert ha_last_sid() == sid2 + assert sid2 != sid1 + + # but hm1 still maintains its point of reference + # and adding more entries to it doesn't change others + # immediate perspective + assert hm1_last_sid() == sid1 + tail = hm1.get_tail(n=3) + assert list(map(get_source, tail)) == hist1 + + hist3 = ["a=3", "b=3", "c=3"] + for i, h in enumerate(hist3 + [""], start=5): + hm1.store_inputs(i, h) + tail = hm1.get_tail(n=7) + assert list(map(get_source, tail)) == hist1 + [""] + hist3 + tail = hm2.get_tail(n=3) + assert list(map(get_source, tail)) == hist2 + tail = ha.get_tail(n=3) + assert list(map(get_source, tail)) == hist2 + assert hm1_last_sid() == sid1 + assert hm2_last_sid() == sid2 + assert ha_last_sid() == sid2 + finally: + if hm1: + hm1.save_thread.stop() + hm1.db.close() + if hm2: + hm2.save_thread.stop() + hm2.db.close() + if ha: + ha.db.close() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py new file mode 100644 index 0000000..6e0b1c1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +"""Tests for CommandChainDispatcher.""" + + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +import pytest +from IPython.core.error import TryNext +from IPython.core.hooks import CommandChainDispatcher + +#----------------------------------------------------------------------------- +# Local utilities +#----------------------------------------------------------------------------- + +# Define two classes, one which succeeds and one which raises TryNext. Each +# sets the attribute `called` to True when it is called. +class Okay(object): + def __init__(self, message): + self.message = message + self.called = False + def __call__(self): + self.called = True + return self.message + +class Fail(object): + def __init__(self, message): + self.message = message + self.called = False + def __call__(self): + self.called = True + raise TryNext(self.message) + +#----------------------------------------------------------------------------- +# Test functions +#----------------------------------------------------------------------------- + +def test_command_chain_dispatcher_ff(): + """Test two failing hooks""" + fail1 = Fail("fail1") + fail2 = Fail("fail2") + dp = CommandChainDispatcher([(0, fail1), (10, fail2)]) + + with pytest.raises(TryNext) as e: + dp() + assert str(e.value) == "fail2" + + assert fail1.called is True + assert fail2.called is True + +def test_command_chain_dispatcher_fofo(): + """Test a mixture of failing and succeeding hooks.""" + fail1 = Fail("fail1") + fail2 = Fail("fail2") + okay1 = Okay("okay1") + okay2 = Okay("okay2") + + dp = CommandChainDispatcher([(0, fail1), + # (5, okay1), # add this later + (10, fail2), + (15, okay2)]) + dp.add(okay1, 5) + + assert dp() == "okay1" + + assert fail1.called is True + assert okay1.called is True + assert fail2.called is False + assert okay2.called is False + +def test_command_chain_dispatcher_eq_priority(): + okay1 = Okay(u'okay1') + okay2 = Okay(u'okay2') + dp = CommandChainDispatcher([(1, okay1)]) + dp.add(okay2, 1) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py new file mode 100644 index 0000000..7aa278f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py @@ -0,0 +1,52 @@ +# encoding: utf-8 + +def test_import_completer(): + from IPython.core import completer + +def test_import_crashhandler(): + from IPython.core import crashhandler + +def test_import_debugger(): + from IPython.core import debugger + +def test_import_excolors(): + from IPython.core import excolors + +def test_import_history(): + from IPython.core import history + +def test_import_hooks(): + from IPython.core import hooks + +def test_import_getipython(): + from IPython.core import getipython + +def test_import_interactiveshell(): + from IPython.core import interactiveshell + +def test_import_logger(): + from IPython.core import logger + +def test_import_macro(): + from IPython.core import macro + +def test_import_magic(): + from IPython.core import magic + +def test_import_oinspect(): + from IPython.core import oinspect + +def test_import_prefilter(): + from IPython.core import prefilter + +def test_import_prompts(): + from IPython.core import prompts + +def test_import_release(): + from IPython.core import release + +def test_import_ultratb(): + from IPython.core import ultratb + +def test_import_usage(): + from IPython.core import usage diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py new file mode 100644 index 0000000..61e06df --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py @@ -0,0 +1,643 @@ +# -*- coding: utf-8 -*- +"""Tests for the inputsplitter module.""" + + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +import unittest +import pytest +import sys + +with pytest.warns(DeprecationWarning, match="inputsplitter"): + from IPython.core import inputsplitter as isp +from IPython.core.inputtransformer import InputTransformer +from IPython.core.tests.test_inputtransformer import syntax, syntax_ml +from IPython.testing import tools as tt + +#----------------------------------------------------------------------------- +# Semi-complete examples (also used as tests) +#----------------------------------------------------------------------------- + +# Note: at the bottom, there's a slightly more complete version of this that +# can be useful during development of code here. + +def mini_interactive_loop(input_func): + """Minimal example of the logic of an interactive interpreter loop. + + This serves as an example, and it is used by the test system with a fake + raw_input that simulates interactive input.""" + + from IPython.core.inputsplitter import InputSplitter + + isp = InputSplitter() + # In practice, this input loop would be wrapped in an outside loop to read + # input indefinitely, until some exit/quit command was issued. Here we + # only illustrate the basic inner loop. + while isp.push_accepts_more(): + indent = ' '*isp.get_indent_spaces() + prompt = '>>> ' + indent + line = indent + input_func(prompt) + isp.push(line) + + # Here we just return input so we can use it in a test suite, but a real + # interpreter would instead send it for execution somewhere. + src = isp.source_reset() + # print('Input source was:\n', src) # dbg + return src + +#----------------------------------------------------------------------------- +# Test utilities, just for local use +#----------------------------------------------------------------------------- + + +def pseudo_input(lines): + """Return a function that acts like raw_input but feeds the input list.""" + ilines = iter(lines) + def raw_in(prompt): + try: + return next(ilines) + except StopIteration: + return '' + return raw_in + +#----------------------------------------------------------------------------- +# Tests +#----------------------------------------------------------------------------- +def test_spaces(): + tests = [('', 0), + (' ', 1), + ('\n', 0), + (' \n', 1), + ('x', 0), + (' x', 1), + (' x',2), + (' x',4), + # Note: tabs are counted as a single whitespace! + ('\tx', 1), + ('\t x', 2), + ] + with pytest.warns(PendingDeprecationWarning): + tt.check_pairs(isp.num_ini_spaces, tests) + + +def test_remove_comments(): + tests = [('text', 'text'), + ('text # comment', 'text '), + ('text # comment\n', 'text \n'), + ('text # comment \n', 'text \n'), + ('line # c \nline\n','line \nline\n'), + ('line # c \nline#c2 \nline\nline #c\n\n', + 'line \nline\nline\nline \n\n'), + ] + tt.check_pairs(isp.remove_comments, tests) + + +def test_get_input_encoding(): + encoding = isp.get_input_encoding() + assert isinstance(encoding, str) + # simple-minded check that at least encoding a simple string works with the + # encoding we got. + assert "test".encode(encoding) == b"test" + + +class NoInputEncodingTestCase(unittest.TestCase): + def setUp(self): + self.old_stdin = sys.stdin + class X: pass + fake_stdin = X() + sys.stdin = fake_stdin + + def test(self): + # Verify that if sys.stdin has no 'encoding' attribute we do the right + # thing + enc = isp.get_input_encoding() + self.assertEqual(enc, 'ascii') + + def tearDown(self): + sys.stdin = self.old_stdin + + +class InputSplitterTestCase(unittest.TestCase): + def setUp(self): + self.isp = isp.InputSplitter() + + def test_reset(self): + isp = self.isp + isp.push('x=1') + isp.reset() + self.assertEqual(isp._buffer, []) + self.assertEqual(isp.get_indent_spaces(), 0) + self.assertEqual(isp.source, '') + self.assertEqual(isp.code, None) + self.assertEqual(isp._is_complete, False) + + def test_source(self): + self.isp._store('1') + self.isp._store('2') + self.assertEqual(self.isp.source, '1\n2\n') + self.assertEqual(len(self.isp._buffer)>0, True) + self.assertEqual(self.isp.source_reset(), '1\n2\n') + self.assertEqual(self.isp._buffer, []) + self.assertEqual(self.isp.source, '') + + def test_indent(self): + isp = self.isp # shorthand + isp.push('x=1') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\n x=1') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('y=2\n') + self.assertEqual(isp.get_indent_spaces(), 0) + + def test_indent2(self): + isp = self.isp + isp.push('if 1:') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push(' x=1') + self.assertEqual(isp.get_indent_spaces(), 4) + # Blank lines shouldn't change the indent level + isp.push(' '*2) + self.assertEqual(isp.get_indent_spaces(), 4) + + def test_indent3(self): + isp = self.isp + # When a multiline statement contains parens or multiline strings, we + # shouldn't get confused. + isp.push("if 1:") + isp.push(" x = (1+\n 2)") + self.assertEqual(isp.get_indent_spaces(), 4) + + def test_indent4(self): + isp = self.isp + # whitespace after ':' should not screw up indent level + isp.push('if 1: \n x=1') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('y=2\n') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\t\n x=1') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('y=2\n') + self.assertEqual(isp.get_indent_spaces(), 0) + + def test_dedent_pass(self): + isp = self.isp # shorthand + # should NOT cause dedent + isp.push('if 1:\n passes = 5') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('if 1:\n pass') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\n pass ') + self.assertEqual(isp.get_indent_spaces(), 0) + + def test_dedent_break(self): + isp = self.isp # shorthand + # should NOT cause dedent + isp.push('while 1:\n breaks = 5') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('while 1:\n break') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('while 1:\n break ') + self.assertEqual(isp.get_indent_spaces(), 0) + + def test_dedent_continue(self): + isp = self.isp # shorthand + # should NOT cause dedent + isp.push('while 1:\n continues = 5') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('while 1:\n continue') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('while 1:\n continue ') + self.assertEqual(isp.get_indent_spaces(), 0) + + def test_dedent_raise(self): + isp = self.isp # shorthand + # should NOT cause dedent + isp.push('if 1:\n raised = 4') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('if 1:\n raise TypeError()') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\n raise') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\n raise ') + self.assertEqual(isp.get_indent_spaces(), 0) + + def test_dedent_return(self): + isp = self.isp # shorthand + # should NOT cause dedent + isp.push('if 1:\n returning = 4') + self.assertEqual(isp.get_indent_spaces(), 4) + isp.push('if 1:\n return 5 + 493') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\n return') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\n return ') + self.assertEqual(isp.get_indent_spaces(), 0) + isp.push('if 1:\n return(0)') + self.assertEqual(isp.get_indent_spaces(), 0) + + def test_push(self): + isp = self.isp + self.assertEqual(isp.push('x=1'), True) + + def test_push2(self): + isp = self.isp + self.assertEqual(isp.push('if 1:'), False) + for line in [' x=1', '# a comment', ' y=2']: + print(line) + self.assertEqual(isp.push(line), True) + + def test_push3(self): + isp = self.isp + isp.push('if True:') + isp.push(' a = 1') + self.assertEqual(isp.push('b = [1,'), False) + + def test_push_accepts_more(self): + isp = self.isp + isp.push('x=1') + self.assertEqual(isp.push_accepts_more(), False) + + def test_push_accepts_more2(self): + isp = self.isp + isp.push('if 1:') + self.assertEqual(isp.push_accepts_more(), True) + isp.push(' x=1') + self.assertEqual(isp.push_accepts_more(), True) + isp.push('') + self.assertEqual(isp.push_accepts_more(), False) + + def test_push_accepts_more3(self): + isp = self.isp + isp.push("x = (2+\n3)") + self.assertEqual(isp.push_accepts_more(), False) + + def test_push_accepts_more4(self): + isp = self.isp + # When a multiline statement contains parens or multiline strings, we + # shouldn't get confused. + # FIXME: we should be able to better handle de-dents in statements like + # multiline strings and multiline expressions (continued with \ or + # parens). Right now we aren't handling the indentation tracking quite + # correctly with this, though in practice it may not be too much of a + # problem. We'll need to see. + isp.push("if 1:") + isp.push(" x = (2+") + isp.push(" 3)") + self.assertEqual(isp.push_accepts_more(), True) + isp.push(" y = 3") + self.assertEqual(isp.push_accepts_more(), True) + isp.push('') + self.assertEqual(isp.push_accepts_more(), False) + + def test_push_accepts_more5(self): + isp = self.isp + isp.push('try:') + isp.push(' a = 5') + isp.push('except:') + isp.push(' raise') + # We want to be able to add an else: block at this point, so it should + # wait for a blank line. + self.assertEqual(isp.push_accepts_more(), True) + + def test_continuation(self): + isp = self.isp + isp.push("import os, \\") + self.assertEqual(isp.push_accepts_more(), True) + isp.push("sys") + self.assertEqual(isp.push_accepts_more(), False) + + def test_syntax_error(self): + isp = self.isp + # Syntax errors immediately produce a 'ready' block, so the invalid + # Python can be sent to the kernel for evaluation with possible ipython + # special-syntax conversion. + isp.push('run foo') + self.assertEqual(isp.push_accepts_more(), False) + + def test_unicode(self): + self.isp.push(u"Pérez") + self.isp.push(u'\xc3\xa9') + self.isp.push(u"u'\xc3\xa9'") + + @pytest.mark.xfail( + reason="Bug in python 3.9.8 – bpo 45738", + condition=sys.version_info in [(3, 11, 0, "alpha", 2)], + raises=SystemError, + strict=True, + ) + def test_line_continuation(self): + """ Test issue #2108.""" + isp = self.isp + # A blank line after a line continuation should not accept more + isp.push("1 \\\n\n") + self.assertEqual(isp.push_accepts_more(), False) + # Whitespace after a \ is a SyntaxError. The only way to test that + # here is to test that push doesn't accept more (as with + # test_syntax_error() above). + isp.push(r"1 \ ") + self.assertEqual(isp.push_accepts_more(), False) + # Even if the line is continuable (c.f. the regular Python + # interpreter) + isp.push(r"(1 \ ") + self.assertEqual(isp.push_accepts_more(), False) + + def test_check_complete(self): + isp = self.isp + self.assertEqual(isp.check_complete("a = 1"), ('complete', None)) + self.assertEqual(isp.check_complete("for a in range(5):"), ('incomplete', 4)) + self.assertEqual(isp.check_complete("raise = 2"), ('invalid', None)) + self.assertEqual(isp.check_complete("a = [1,\n2,"), ('incomplete', 0)) + self.assertEqual(isp.check_complete("def a():\n x=1\n global x"), ('invalid', None)) + +class InteractiveLoopTestCase(unittest.TestCase): + """Tests for an interactive loop like a python shell. + """ + def check_ns(self, lines, ns): + """Validate that the given input lines produce the resulting namespace. + + Note: the input lines are given exactly as they would be typed in an + auto-indenting environment, as mini_interactive_loop above already does + auto-indenting and prepends spaces to the input. + """ + src = mini_interactive_loop(pseudo_input(lines)) + test_ns = {} + exec(src, test_ns) + # We can't check that the provided ns is identical to the test_ns, + # because Python fills test_ns with extra keys (copyright, etc). But + # we can check that the given dict is *contained* in test_ns + for k,v in ns.items(): + self.assertEqual(test_ns[k], v) + + def test_simple(self): + self.check_ns(['x=1'], dict(x=1)) + + def test_simple2(self): + self.check_ns(['if 1:', 'x=2'], dict(x=2)) + + def test_xy(self): + self.check_ns(['x=1; y=2'], dict(x=1, y=2)) + + def test_abc(self): + self.check_ns(['if 1:','a=1','b=2','c=3'], dict(a=1, b=2, c=3)) + + def test_multi(self): + self.check_ns(['x =(1+','1+','2)'], dict(x=4)) + + +class IPythonInputTestCase(InputSplitterTestCase): + """By just creating a new class whose .isp is a different instance, we + re-run the same test battery on the new input splitter. + + In addition, this runs the tests over the syntax and syntax_ml dicts that + were tested by individual functions, as part of the OO interface. + + It also makes some checks on the raw buffer storage. + """ + + def setUp(self): + self.isp = isp.IPythonInputSplitter() + + def test_syntax(self): + """Call all single-line syntax tests from the main object""" + isp = self.isp + for example in syntax.values(): + for raw, out_t in example: + if raw.startswith(' '): + continue + + isp.push(raw+'\n') + out_raw = isp.source_raw + out = isp.source_reset() + self.assertEqual(out.rstrip(), out_t, + tt.pair_fail_msg.format("inputsplitter",raw, out_t, out)) + self.assertEqual(out_raw.rstrip(), raw.rstrip()) + + def test_syntax_multiline(self): + isp = self.isp + for example in syntax_ml.values(): + for line_pairs in example: + out_t_parts = [] + raw_parts = [] + for lraw, out_t_part in line_pairs: + if out_t_part is not None: + out_t_parts.append(out_t_part) + + if lraw is not None: + isp.push(lraw) + raw_parts.append(lraw) + + out_raw = isp.source_raw + out = isp.source_reset() + out_t = '\n'.join(out_t_parts).rstrip() + raw = '\n'.join(raw_parts).rstrip() + self.assertEqual(out.rstrip(), out_t) + self.assertEqual(out_raw.rstrip(), raw) + + def test_syntax_multiline_cell(self): + isp = self.isp + for example in syntax_ml.values(): + + out_t_parts = [] + for line_pairs in example: + raw = '\n'.join(r for r, _ in line_pairs if r is not None) + out_t = '\n'.join(t for _,t in line_pairs if t is not None) + out = isp.transform_cell(raw) + # Match ignoring trailing whitespace + self.assertEqual(out.rstrip(), out_t.rstrip()) + + def test_cellmagic_preempt(self): + isp = self.isp + for raw, name, line, cell in [ + ("%%cellm a\nIn[1]:", u'cellm', u'a', u'In[1]:'), + ("%%cellm \nline\n>>> hi", u'cellm', u'', u'line\n>>> hi'), + (">>> %%cellm \nline\n>>> hi", u'cellm', u'', u'line\nhi'), + ("%%cellm \n>>> hi", u'cellm', u'', u'>>> hi'), + ("%%cellm \nline1\nline2", u'cellm', u'', u'line1\nline2'), + ("%%cellm \nline1\\\\\nline2", u'cellm', u'', u'line1\\\\\nline2'), + ]: + expected = "get_ipython().run_cell_magic(%r, %r, %r)" % ( + name, line, cell + ) + out = isp.transform_cell(raw) + self.assertEqual(out.rstrip(), expected.rstrip()) + + def test_multiline_passthrough(self): + isp = self.isp + class CommentTransformer(InputTransformer): + def __init__(self): + self._lines = [] + + def push(self, line): + self._lines.append(line + '#') + + def reset(self): + text = '\n'.join(self._lines) + self._lines = [] + return text + + isp.physical_line_transforms.insert(0, CommentTransformer()) + + for raw, expected in [ + ("a=5", "a=5#"), + ("%ls foo", "get_ipython().run_line_magic(%r, %r)" % (u'ls', u'foo#')), + ("!ls foo\n%ls bar", "get_ipython().system(%r)\nget_ipython().run_line_magic(%r, %r)" % ( + u'ls foo#', u'ls', u'bar#' + )), + ("1\n2\n3\n%ls foo\n4\n5", "1#\n2#\n3#\nget_ipython().run_line_magic(%r, %r)\n4#\n5#" % (u'ls', u'foo#')), + ]: + out = isp.transform_cell(raw) + self.assertEqual(out.rstrip(), expected.rstrip()) + +#----------------------------------------------------------------------------- +# Main - use as a script, mostly for developer experiments +#----------------------------------------------------------------------------- + +if __name__ == '__main__': + # A simple demo for interactive experimentation. This code will not get + # picked up by any test suite. + from IPython.core.inputsplitter import IPythonInputSplitter + + # configure here the syntax to use, prompt and whether to autoindent + #isp, start_prompt = InputSplitter(), '>>> ' + isp, start_prompt = IPythonInputSplitter(), 'In> ' + + autoindent = True + #autoindent = False + + try: + while True: + prompt = start_prompt + while isp.push_accepts_more(): + indent = ' '*isp.get_indent_spaces() + if autoindent: + line = indent + input(prompt+indent) + else: + line = input(prompt) + isp.push(line) + prompt = '... ' + + # Here we just return input so we can use it in a test suite, but a + # real interpreter would instead send it for execution somewhere. + #src = isp.source; raise EOFError # dbg + raw = isp.source_raw + src = isp.source_reset() + print('Input source was:\n', src) + print('Raw source was:\n', raw) + except EOFError: + print('Bye') + +# Tests for cell magics support + +def test_last_blank(): + assert isp.last_blank("") is False + assert isp.last_blank("abc") is False + assert isp.last_blank("abc\n") is False + assert isp.last_blank("abc\na") is False + + assert isp.last_blank("\n") is True + assert isp.last_blank("\n ") is True + assert isp.last_blank("abc\n ") is True + assert isp.last_blank("abc\n\n") is True + assert isp.last_blank("abc\nd\n\n") is True + assert isp.last_blank("abc\nd\ne\n\n") is True + assert isp.last_blank("abc \n \n \n\n") is True + + +def test_last_two_blanks(): + assert isp.last_two_blanks("") is False + assert isp.last_two_blanks("abc") is False + assert isp.last_two_blanks("abc\n") is False + assert isp.last_two_blanks("abc\n\na") is False + assert isp.last_two_blanks("abc\n \n") is False + assert isp.last_two_blanks("abc\n\n") is False + + assert isp.last_two_blanks("\n\n") is True + assert isp.last_two_blanks("\n\n ") is True + assert isp.last_two_blanks("\n \n") is True + assert isp.last_two_blanks("abc\n\n ") is True + assert isp.last_two_blanks("abc\n\n\n") is True + assert isp.last_two_blanks("abc\n\n \n") is True + assert isp.last_two_blanks("abc\n\n \n ") is True + assert isp.last_two_blanks("abc\n\n \n \n") is True + assert isp.last_two_blanks("abc\nd\n\n\n") is True + assert isp.last_two_blanks("abc\nd\ne\nf\n\n\n") is True + + +class CellMagicsCommon(object): + + def test_whole_cell(self): + src = "%%cellm line\nbody\n" + out = self.sp.transform_cell(src) + ref = "get_ipython().run_cell_magic('cellm', 'line', 'body')\n" + assert out == ref + + def test_cellmagic_help(self): + self.sp.push('%%cellm?') + assert self.sp.push_accepts_more() is False + + def tearDown(self): + self.sp.reset() + + +class CellModeCellMagics(CellMagicsCommon, unittest.TestCase): + sp = isp.IPythonInputSplitter(line_input_checker=False) + + def test_incremental(self): + sp = self.sp + sp.push("%%cellm firstline\n") + assert sp.push_accepts_more() is True # 1 + sp.push("line2\n") + assert sp.push_accepts_more() is True # 2 + sp.push("\n") + # This should accept a blank line and carry on until the cell is reset + assert sp.push_accepts_more() is True # 3 + + def test_no_strip_coding(self): + src = '\n'.join([ + '%%writefile foo.py', + '# coding: utf-8', + 'print(u"üñîçø∂é")', + ]) + out = self.sp.transform_cell(src) + assert "# coding: utf-8" in out + + +class LineModeCellMagics(CellMagicsCommon, unittest.TestCase): + sp = isp.IPythonInputSplitter(line_input_checker=True) + + def test_incremental(self): + sp = self.sp + sp.push("%%cellm line2\n") + assert sp.push_accepts_more() is True # 1 + sp.push("\n") + # In this case, a blank line should end the cell magic + assert sp.push_accepts_more() is False # 2 + + +indentation_samples = [ + ('a = 1', 0), + ('for a in b:', 4), + ('def f():', 4), + ('def f(): #comment', 4), + ('a = ":#not a comment"', 0), + ('def f():\n a = 1', 4), + ('def f():\n return 1', 0), + ('for a in b:\n' + ' if a < 0:' + ' continue', 3), + ('a = {', 4), + ('a = {\n' + ' 1,', 5), + ('b = """123', 0), + ('', 0), + ('def f():\n pass', 0), + ('class Bar:\n def f():\n pass', 4), + ('class Bar:\n def f():\n raise', 4), +] + +def test_find_next_indent(): + for code, exp in indentation_samples: + res = isp.find_next_indent(code) + msg = "{!r} != {!r} (expected)\n Code: {!r}".format(res, exp, code) + assert res == exp, msg diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py new file mode 100644 index 0000000..bfc936d --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py @@ -0,0 +1,469 @@ +import tokenize + +from IPython.testing import tools as tt + +from IPython.core import inputtransformer as ipt + +def transform_and_reset(transformer): + transformer = transformer() + def transform(inp): + try: + return transformer.push(inp) + finally: + transformer.reset() + + return transform + +# Transformer tests +def transform_checker(tests, transformer, **kwargs): + """Utility to loop over test inputs""" + transformer = transformer(**kwargs) + try: + for inp, tr in tests: + if inp is None: + out = transformer.reset() + else: + out = transformer.push(inp) + assert out == tr + finally: + transformer.reset() + +# Data for all the syntax tests in the form of lists of pairs of +# raw/transformed input. We store it here as a global dict so that we can use +# it both within single-function tests and also to validate the behavior of the +# larger objects + +syntax = \ + dict(assign_system = + [('a =! ls', "a = get_ipython().getoutput('ls')"), + ('b = !ls', "b = get_ipython().getoutput('ls')"), + ('c= !ls', "c = get_ipython().getoutput('ls')"), + ('d == !ls', 'd == !ls'), # Invalid syntax, but we leave == alone. + ('x=1', 'x=1'), # normal input is unmodified + (' ',' '), # blank lines are kept intact + # Tuple unpacking + ("a, b = !echo 'a\\nb'", "a, b = get_ipython().getoutput(\"echo 'a\\\\nb'\")"), + ("a,= !echo 'a'", "a, = get_ipython().getoutput(\"echo 'a'\")"), + ("a, *bc = !echo 'a\\nb\\nc'", "a, *bc = get_ipython().getoutput(\"echo 'a\\\\nb\\\\nc'\")"), + # Tuple unpacking with regular Python expressions, not our syntax. + ("a, b = range(2)", "a, b = range(2)"), + ("a, = range(1)", "a, = range(1)"), + ("a, *bc = range(3)", "a, *bc = range(3)"), + ], + + assign_magic = + [('a =% who', "a = get_ipython().run_line_magic('who', '')"), + ('b = %who', "b = get_ipython().run_line_magic('who', '')"), + ('c= %ls', "c = get_ipython().run_line_magic('ls', '')"), + ('d == %ls', 'd == %ls'), # Invalid syntax, but we leave == alone. + ('x=1', 'x=1'), # normal input is unmodified + (' ',' '), # blank lines are kept intact + ("a, b = %foo", "a, b = get_ipython().run_line_magic('foo', '')"), + ], + classic_prompt=[ + (">>> x=1", "x=1"), + ("x=1", "x=1"), # normal input is unmodified + (" ", " "), # blank lines are kept intact + ], + ipy_prompt=[ + ("In [1]: x=1", "x=1"), + ("x=1", "x=1"), # normal input is unmodified + (" ", " "), # blank lines are kept intact + ], + # Tests for the escape transformer to leave normal code alone + escaped_noesc=[ + (" ", " "), + ("x=1", "x=1"), + ], + # System calls + escaped_shell=[ + ("!ls", "get_ipython().system('ls')"), + # Double-escape shell, this means to capture the output of the + # subprocess and return it + ("!!ls", "get_ipython().getoutput('ls')"), + ], + # Help/object info + escaped_help=[ + ("?", "get_ipython().show_usage()"), + ("?x1", "get_ipython().run_line_magic('pinfo', 'x1')"), + ("??x2", "get_ipython().run_line_magic('pinfo2', 'x2')"), + ("?a.*s", "get_ipython().run_line_magic('psearch', 'a.*s')"), + ("?%hist1", "get_ipython().run_line_magic('pinfo', '%hist1')"), + ("?%%hist2", "get_ipython().run_line_magic('pinfo', '%%hist2')"), + ("?abc = qwe", "get_ipython().run_line_magic('pinfo', 'abc')"), + ], + end_help=[ + ("x3?", "get_ipython().run_line_magic('pinfo', 'x3')"), + ("x4??", "get_ipython().run_line_magic('pinfo2', 'x4')"), + ("%hist1?", "get_ipython().run_line_magic('pinfo', '%hist1')"), + ("%hist2??", "get_ipython().run_line_magic('pinfo2', '%hist2')"), + ("%%hist3?", "get_ipython().run_line_magic('pinfo', '%%hist3')"), + ("%%hist4??", "get_ipython().run_line_magic('pinfo2', '%%hist4')"), + ("π.foo?", "get_ipython().run_line_magic('pinfo', 'π.foo')"), + ("f*?", "get_ipython().run_line_magic('psearch', 'f*')"), + ("ax.*aspe*?", "get_ipython().run_line_magic('psearch', 'ax.*aspe*')"), + ("a = abc?", "get_ipython().run_line_magic('pinfo', 'abc')"), + ("a = abc.qe??", "get_ipython().run_line_magic('pinfo2', 'abc.qe')"), + ("a = *.items?", "get_ipython().run_line_magic('psearch', '*.items')"), + ("plot(a?", "get_ipython().run_line_magic('pinfo', 'a')"), + ("a*2 #comment?", "a*2 #comment?"), + ], + # Explicit magic calls + escaped_magic=[ + ("%cd", "get_ipython().run_line_magic('cd', '')"), + ("%cd /home", "get_ipython().run_line_magic('cd', '/home')"), + # Backslashes need to be escaped. + ("%cd C:\\User", "get_ipython().run_line_magic('cd', 'C:\\\\User')"), + (" %magic", " get_ipython().run_line_magic('magic', '')"), + ], + # Quoting with separate arguments + escaped_quote=[ + (",f", 'f("")'), + (",f x", 'f("x")'), + (" ,f y", ' f("y")'), + (",f a b", 'f("a", "b")'), + ], + # Quoting with single argument + escaped_quote2=[ + (";f", 'f("")'), + (";f x", 'f("x")'), + (" ;f y", ' f("y")'), + (";f a b", 'f("a b")'), + ], + # Simply apply parens + escaped_paren=[ + ("/f", "f()"), + ("/f x", "f(x)"), + (" /f y", " f(y)"), + ("/f a b", "f(a, b)"), + ], + # Check that we transform prompts before other transforms + mixed=[ + ("In [1]: %lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), + (">>> %lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), + ("In [2]: !ls", "get_ipython().system('ls')"), + ("In [3]: abs?", "get_ipython().run_line_magic('pinfo', 'abs')"), + ("In [4]: b = %who", "b = get_ipython().run_line_magic('who', '')"), + ], +) + +# multiline syntax examples. Each of these should be a list of lists, with +# each entry itself having pairs of raw/transformed input. The union (with +# '\n'.join() of the transformed inputs is what the splitter should produce +# when fed the raw lines one at a time via push. +syntax_ml = \ + dict(classic_prompt = + [ [('>>> for i in range(10):','for i in range(10):'), + ('... print i',' print i'), + ('... ', ''), + ], + [('>>> a="""','a="""'), + ('... 123"""','123"""'), + ], + [('a="""','a="""'), + ('... 123','123'), + ('... 456"""','456"""'), + ], + [('a="""','a="""'), + ('>>> 123','123'), + ('... 456"""','456"""'), + ], + [('a="""','a="""'), + ('123','123'), + ('... 456"""','... 456"""'), + ], + [('....__class__','....__class__'), + ], + [('a=5', 'a=5'), + ('...', ''), + ], + [('>>> def f(x):', 'def f(x):'), + ('...', ''), + ('... return x', ' return x'), + ], + [('board = """....', 'board = """....'), + ('....', '....'), + ('...."""', '...."""'), + ], + ], + + ipy_prompt = + [ [('In [24]: for i in range(10):','for i in range(10):'), + (' ....: print i',' print i'), + (' ....: ', ''), + ], + [('In [24]: for i in range(10):','for i in range(10):'), + # Qt console prompts expand with spaces, not dots + (' ...: print i',' print i'), + (' ...: ', ''), + ], + [('In [24]: for i in range(10):','for i in range(10):'), + # Sometimes whitespace preceding '...' has been removed + ('...: print i',' print i'), + ('...: ', ''), + ], + [('In [24]: for i in range(10):','for i in range(10):'), + # Space after last continuation prompt has been removed (issue #6674) + ('...: print i',' print i'), + ('...:', ''), + ], + [('In [2]: a="""','a="""'), + (' ...: 123"""','123"""'), + ], + [('a="""','a="""'), + (' ...: 123','123'), + (' ...: 456"""','456"""'), + ], + [('a="""','a="""'), + ('In [1]: 123','123'), + (' ...: 456"""','456"""'), + ], + [('a="""','a="""'), + ('123','123'), + (' ...: 456"""',' ...: 456"""'), + ], + ], + + multiline_datastructure_prompt = + [ [('>>> a = [1,','a = [1,'), + ('... 2]','2]'), + ], + ], + + multiline_datastructure = + [ [('b = ("%s"', None), + ('# comment', None), + ('%foo )', 'b = ("%s"\n# comment\n%foo )'), + ], + ], + + multiline_string = + [ [("'''foo?", None), + ("bar'''", "'''foo?\nbar'''"), + ], + ], + + leading_indent = + [ [(' print "hi"','print "hi"'), + ], + [(' for a in range(5):','for a in range(5):'), + (' a*2',' a*2'), + ], + [(' a="""','a="""'), + (' 123"""','123"""'), + ], + [('a="""','a="""'), + (' 123"""',' 123"""'), + ], + ], + + cellmagic = + [ [('%%foo a', None), + (None, "get_ipython().run_cell_magic('foo', 'a', '')"), + ], + [('%%bar 123', None), + ('hello', None), + (None , "get_ipython().run_cell_magic('bar', '123', 'hello')"), + ], + [('a=5', 'a=5'), + ('%%cellmagic', '%%cellmagic'), + ], + ], + + escaped = + [ [('%abc def \\', None), + ('ghi', "get_ipython().run_line_magic('abc', 'def ghi')"), + ], + [('%abc def \\', None), + ('ghi\\', None), + (None, "get_ipython().run_line_magic('abc', 'def ghi')"), + ], + ], + + assign_magic = + [ [('a = %bc de \\', None), + ('fg', "a = get_ipython().run_line_magic('bc', 'de fg')"), + ], + [('a = %bc de \\', None), + ('fg\\', None), + (None, "a = get_ipython().run_line_magic('bc', 'de fg')"), + ], + ], + + assign_system = + [ [('a = !bc de \\', None), + ('fg', "a = get_ipython().getoutput('bc de fg')"), + ], + [('a = !bc de \\', None), + ('fg\\', None), + (None, "a = get_ipython().getoutput('bc de fg')"), + ], + ], + ) + + +def test_assign_system(): + tt.check_pairs(transform_and_reset(ipt.assign_from_system), syntax['assign_system']) + +def test_assign_magic(): + tt.check_pairs(transform_and_reset(ipt.assign_from_magic), syntax['assign_magic']) + +def test_classic_prompt(): + tt.check_pairs(transform_and_reset(ipt.classic_prompt), syntax['classic_prompt']) + for example in syntax_ml['classic_prompt']: + transform_checker(example, ipt.classic_prompt) + for example in syntax_ml['multiline_datastructure_prompt']: + transform_checker(example, ipt.classic_prompt) + + # Check that we don't transform the second line if the first is obviously + # IPython syntax + transform_checker([ + ('%foo', '%foo'), + ('>>> bar', '>>> bar'), + ], ipt.classic_prompt) + + +def test_ipy_prompt(): + tt.check_pairs(transform_and_reset(ipt.ipy_prompt), syntax['ipy_prompt']) + for example in syntax_ml['ipy_prompt']: + transform_checker(example, ipt.ipy_prompt) + + # Check that we don't transform the second line if we're inside a cell magic + transform_checker([ + ('%%foo', '%%foo'), + ('In [1]: bar', 'In [1]: bar'), + ], ipt.ipy_prompt) + +def test_assemble_logical_lines(): + tests = \ + [ [("a = \\", None), + ("123", "a = 123"), + ], + [("a = \\", None), # Test resetting when within a multi-line string + ("12 *\\", None), + (None, "a = 12 *"), + ], + [("# foo\\", "# foo\\"), # Comments can't be continued like this + ], + ] + for example in tests: + transform_checker(example, ipt.assemble_logical_lines) + +def test_assemble_python_lines(): + tests = \ + [ [("a = '''", None), + ("abc'''", "a = '''\nabc'''"), + ], + [("a = '''", None), # Test resetting when within a multi-line string + ("def", None), + (None, "a = '''\ndef"), + ], + [("a = [1,", None), + ("2]", "a = [1,\n2]"), + ], + [("a = [1,", None), # Test resetting when within a multi-line string + ("2,", None), + (None, "a = [1,\n2,"), + ], + [("a = '''", None), # Test line continuation within a multi-line string + ("abc\\", None), + ("def", None), + ("'''", "a = '''\nabc\\\ndef\n'''"), + ], + ] + syntax_ml['multiline_datastructure'] + for example in tests: + transform_checker(example, ipt.assemble_python_lines) + + +def test_help_end(): + tt.check_pairs(transform_and_reset(ipt.help_end), syntax['end_help']) + +def test_escaped_noesc(): + tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_noesc']) + + +def test_escaped_shell(): + tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_shell']) + + +def test_escaped_help(): + tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_help']) + + +def test_escaped_magic(): + tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_magic']) + + +def test_escaped_quote(): + tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_quote']) + + +def test_escaped_quote2(): + tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_quote2']) + + +def test_escaped_paren(): + tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_paren']) + + +def test_cellmagic(): + for example in syntax_ml['cellmagic']: + transform_checker(example, ipt.cellmagic) + + line_example = [('%%bar 123', None), + ('hello', None), + ('' , "get_ipython().run_cell_magic('bar', '123', 'hello')"), + ] + transform_checker(line_example, ipt.cellmagic, end_on_blank_line=True) + +def test_has_comment(): + tests = [('text', False), + ('text #comment', True), + ('text #comment\n', True), + ('#comment', True), + ('#comment\n', True), + ('a = "#string"', False), + ('a = "#string" # comment', True), + ('a #comment not "string"', True), + ] + tt.check_pairs(ipt.has_comment, tests) + +@ipt.TokenInputTransformer.wrap +def decistmt(tokens): + """Substitute Decimals for floats in a string of statements. + + Based on an example from the tokenize module docs. + """ + result = [] + for toknum, tokval, _, _, _ in tokens: + if toknum == tokenize.NUMBER and '.' in tokval: # replace NUMBER tokens + yield from [ + (tokenize.NAME, 'Decimal'), + (tokenize.OP, '('), + (tokenize.STRING, repr(tokval)), + (tokenize.OP, ')') + ] + else: + yield (toknum, tokval) + + + +def test_token_input_transformer(): + tests = [('1.2', "Decimal ('1.2')"), + ('"1.2"', '"1.2"'), + ] + tt.check_pairs(transform_and_reset(decistmt), tests) + ml_tests = \ + [ [("a = 1.2; b = '''x", None), + ("y'''", "a =Decimal ('1.2');b ='''x\ny'''"), + ], + [("a = [1.2,", None), + ("3]", "a =[Decimal ('1.2'),\n3 ]"), + ], + [("a = '''foo", None), # Test resetting when within a multi-line string + ("bar", None), + (None, "a = '''foo\nbar"), + ], + ] + for example in ml_tests: + transform_checker(example, decistmt) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py new file mode 100644 index 0000000..0f563b7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py @@ -0,0 +1,448 @@ +"""Tests for the token-based transformers in IPython.core.inputtransformer2 + +Line-based transformers are the simpler ones; token-based transformers are +more complex. See test_inputtransformer2_line for tests for line-based +transformations. +""" + +import platform +import string +import sys +from textwrap import dedent + +import pytest + +from IPython.core import inputtransformer2 as ipt2 +from IPython.core.inputtransformer2 import _find_assign_op, make_tokens_by_line + +MULTILINE_MAGIC = ( + """\ +a = f() +%foo \\ +bar +g() +""".splitlines( + keepends=True + ), + (2, 0), + """\ +a = f() +get_ipython().run_line_magic('foo', ' bar') +g() +""".splitlines( + keepends=True + ), +) + +INDENTED_MAGIC = ( + """\ +for a in range(5): + %ls +""".splitlines( + keepends=True + ), + (2, 4), + """\ +for a in range(5): + get_ipython().run_line_magic('ls', '') +""".splitlines( + keepends=True + ), +) + +CRLF_MAGIC = ( + ["a = f()\n", "%ls\r\n", "g()\n"], + (2, 0), + ["a = f()\n", "get_ipython().run_line_magic('ls', '')\n", "g()\n"], +) + +MULTILINE_MAGIC_ASSIGN = ( + """\ +a = f() +b = %foo \\ + bar +g() +""".splitlines( + keepends=True + ), + (2, 4), + """\ +a = f() +b = get_ipython().run_line_magic('foo', ' bar') +g() +""".splitlines( + keepends=True + ), +) + +MULTILINE_SYSTEM_ASSIGN = ("""\ +a = f() +b = !foo \\ + bar +g() +""".splitlines(keepends=True), (2, 4), """\ +a = f() +b = get_ipython().getoutput('foo bar') +g() +""".splitlines(keepends=True)) + +##### + +MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT = ( + """\ +def test(): + for i in range(1): + print(i) + res =! ls +""".splitlines( + keepends=True + ), + (4, 7), + """\ +def test(): + for i in range(1): + print(i) + res =get_ipython().getoutput(\' ls\') +""".splitlines( + keepends=True + ), +) + +###### + +AUTOCALL_QUOTE = ([",f 1 2 3\n"], (1, 0), ['f("1", "2", "3")\n']) + +AUTOCALL_QUOTE2 = ([";f 1 2 3\n"], (1, 0), ['f("1 2 3")\n']) + +AUTOCALL_PAREN = (["/f 1 2 3\n"], (1, 0), ["f(1, 2, 3)\n"]) + +SIMPLE_HELP = (["foo?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', 'foo')\n"]) + +DETAILED_HELP = ( + ["foo??\n"], + (1, 0), + ["get_ipython().run_line_magic('pinfo2', 'foo')\n"], +) + +MAGIC_HELP = (["%foo?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', '%foo')\n"]) + +HELP_IN_EXPR = ( + ["a = b + c?\n"], + (1, 0), + ["get_ipython().run_line_magic('pinfo', 'c')\n"], +) + +HELP_CONTINUED_LINE = ( + """\ +a = \\ +zip? +""".splitlines( + keepends=True + ), + (1, 0), + [r"get_ipython().run_line_magic('pinfo', 'zip')" + "\n"], +) + +HELP_MULTILINE = ( + """\ +(a, +b) = zip? +""".splitlines( + keepends=True + ), + (1, 0), + [r"get_ipython().run_line_magic('pinfo', 'zip')" + "\n"], +) + +HELP_UNICODE = ( + ["π.foo?\n"], + (1, 0), + ["get_ipython().run_line_magic('pinfo', 'π.foo')\n"], +) + + +def null_cleanup_transformer(lines): + """ + A cleanup transform that returns an empty list. + """ + return [] + + +def test_check_make_token_by_line_never_ends_empty(): + """ + Check that not sequence of single or double characters ends up leading to en empty list of tokens + """ + from string import printable + + for c in printable: + assert make_tokens_by_line(c)[-1] != [] + for k in printable: + assert make_tokens_by_line(c + k)[-1] != [] + + +def check_find(transformer, case, match=True): + sample, expected_start, _ = case + tbl = make_tokens_by_line(sample) + res = transformer.find(tbl) + if match: + # start_line is stored 0-indexed, expected values are 1-indexed + assert (res.start_line + 1, res.start_col) == expected_start + return res + else: + assert res is None + + +def check_transform(transformer_cls, case): + lines, start, expected = case + transformer = transformer_cls(start) + assert transformer.transform(lines) == expected + + +def test_continued_line(): + lines = MULTILINE_MAGIC_ASSIGN[0] + assert ipt2.find_end_of_continued_line(lines, 1) == 2 + + assert ipt2.assemble_continued_line(lines, (1, 5), 2) == "foo bar" + + +def test_find_assign_magic(): + check_find(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN) + check_find(ipt2.MagicAssign, MULTILINE_SYSTEM_ASSIGN, match=False) + check_find(ipt2.MagicAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT, match=False) + + +def test_transform_assign_magic(): + check_transform(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN) + + +def test_find_assign_system(): + check_find(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN) + check_find(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT) + check_find(ipt2.SystemAssign, (["a = !ls\n"], (1, 5), None)) + check_find(ipt2.SystemAssign, (["a=!ls\n"], (1, 2), None)) + check_find(ipt2.SystemAssign, MULTILINE_MAGIC_ASSIGN, match=False) + + +def test_transform_assign_system(): + check_transform(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN) + check_transform(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT) + + +def test_find_magic_escape(): + check_find(ipt2.EscapedCommand, MULTILINE_MAGIC) + check_find(ipt2.EscapedCommand, INDENTED_MAGIC) + check_find(ipt2.EscapedCommand, MULTILINE_MAGIC_ASSIGN, match=False) + + +def test_transform_magic_escape(): + check_transform(ipt2.EscapedCommand, MULTILINE_MAGIC) + check_transform(ipt2.EscapedCommand, INDENTED_MAGIC) + check_transform(ipt2.EscapedCommand, CRLF_MAGIC) + + +def test_find_autocalls(): + for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]: + print("Testing %r" % case[0]) + check_find(ipt2.EscapedCommand, case) + + +def test_transform_autocall(): + for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]: + print("Testing %r" % case[0]) + check_transform(ipt2.EscapedCommand, case) + + +def test_find_help(): + for case in [SIMPLE_HELP, DETAILED_HELP, MAGIC_HELP, HELP_IN_EXPR]: + check_find(ipt2.HelpEnd, case) + + tf = check_find(ipt2.HelpEnd, HELP_CONTINUED_LINE) + assert tf.q_line == 1 + assert tf.q_col == 3 + + tf = check_find(ipt2.HelpEnd, HELP_MULTILINE) + assert tf.q_line == 1 + assert tf.q_col == 8 + + # ? in a comment does not trigger help + check_find(ipt2.HelpEnd, (["foo # bar?\n"], None, None), match=False) + # Nor in a string + check_find(ipt2.HelpEnd, (["foo = '''bar?\n"], None, None), match=False) + + +def test_transform_help(): + tf = ipt2.HelpEnd((1, 0), (1, 9)) + assert tf.transform(HELP_IN_EXPR[0]) == HELP_IN_EXPR[2] + + tf = ipt2.HelpEnd((1, 0), (2, 3)) + assert tf.transform(HELP_CONTINUED_LINE[0]) == HELP_CONTINUED_LINE[2] + + tf = ipt2.HelpEnd((1, 0), (2, 8)) + assert tf.transform(HELP_MULTILINE[0]) == HELP_MULTILINE[2] + + tf = ipt2.HelpEnd((1, 0), (1, 0)) + assert tf.transform(HELP_UNICODE[0]) == HELP_UNICODE[2] + + +def test_find_assign_op_dedent(): + """ + be careful that empty token like dedent are not counted as parens + """ + + class Tk: + def __init__(self, s): + self.string = s + + assert _find_assign_op([Tk(s) for s in ("", "a", "=", "b")]) == 2 + assert ( + _find_assign_op([Tk(s) for s in ("", "(", "a", "=", "b", ")", "=", "5")]) == 6 + ) + + +extra_closing_paren_param = ( + pytest.param("(\n))", "invalid", None) + if sys.version_info >= (3, 12) + else pytest.param("(\n))", "incomplete", 0) +) +examples = [ + pytest.param("a = 1", "complete", None), + pytest.param("for a in range(5):", "incomplete", 4), + pytest.param("for a in range(5):\n if a > 0:", "incomplete", 8), + pytest.param("raise = 2", "invalid", None), + pytest.param("a = [1,\n2,", "incomplete", 0), + extra_closing_paren_param, + pytest.param("\\\r\n", "incomplete", 0), + pytest.param("a = '''\n hi", "incomplete", 3), + pytest.param("def a():\n x=1\n global x", "invalid", None), + pytest.param( + "a \\ ", + "invalid", + None, + marks=pytest.mark.xfail( + reason="Bug in python 3.9.8 – bpo 45738", + condition=sys.version_info in [(3, 11, 0, "alpha", 2)], + raises=SystemError, + strict=True, + ), + ), # Nothing allowed after backslash, + pytest.param("1\\\n+2", "complete", None), +] + + +@pytest.mark.parametrize("code, expected, number", examples) +def test_check_complete_param(code, expected, number): + cc = ipt2.TransformerManager().check_complete + assert cc(code) == (expected, number) + + +@pytest.mark.xfail(platform.python_implementation() == "PyPy", reason="fail on pypy") +@pytest.mark.xfail( + reason="Bug in python 3.9.8 – bpo 45738", + condition=sys.version_info in [(3, 11, 0, "alpha", 2)], + raises=SystemError, + strict=True, +) +def test_check_complete(): + cc = ipt2.TransformerManager().check_complete + + example = dedent( + """ + if True: + a=1""" + ) + + assert cc(example) == ("incomplete", 4) + assert cc(example + "\n") == ("complete", None) + assert cc(example + "\n ") == ("complete", None) + + # no need to loop on all the letters/numbers. + short = "12abAB" + string.printable[62:] + for c in short: + # test does not raise: + cc(c) + for k in short: + cc(c + k) + + assert cc("def f():\n x=0\n \\\n ") == ("incomplete", 2) + + +@pytest.mark.xfail(platform.python_implementation() == "PyPy", reason="fail on pypy") +@pytest.mark.parametrize( + "value, expected", + [ + ('''def foo():\n """''', ("incomplete", 4)), + ("""async with example:\n pass""", ("incomplete", 4)), + ("""async with example:\n pass\n """, ("complete", None)), + ], +) +def test_check_complete_II(value, expected): + """ + Test that multiple line strings are properly handled. + + Separate test function for convenience + + """ + cc = ipt2.TransformerManager().check_complete + assert cc(value) == expected + + +@pytest.mark.parametrize( + "value, expected", + [ + (")", ("invalid", None)), + ("]", ("invalid", None)), + ("}", ("invalid", None)), + (")(", ("invalid", None)), + ("][", ("invalid", None)), + ("}{", ("invalid", None)), + ("]()(", ("invalid", None)), + ("())(", ("invalid", None)), + (")[](", ("invalid", None)), + ("()](", ("invalid", None)), + ], +) +def test_check_complete_invalidates_sunken_brackets(value, expected): + """ + Test that a single line with more closing brackets than the opening ones is + interpreted as invalid + """ + cc = ipt2.TransformerManager().check_complete + assert cc(value) == expected + + +def test_null_cleanup_transformer(): + manager = ipt2.TransformerManager() + manager.cleanup_transforms.insert(0, null_cleanup_transformer) + assert manager.transform_cell("") == "" + + +def test_side_effects_I(): + count = 0 + + def counter(lines): + nonlocal count + count += 1 + return lines + + counter.has_side_effects = True + + manager = ipt2.TransformerManager() + manager.cleanup_transforms.insert(0, counter) + assert manager.check_complete("a=1\n") == ("complete", None) + assert count == 0 + + +def test_side_effects_II(): + count = 0 + + def counter(lines): + nonlocal count + count += 1 + return lines + + counter.has_side_effects = True + + manager = ipt2.TransformerManager() + manager.line_transforms.insert(0, counter) + assert manager.check_complete("b=1\n") == ("complete", None) + assert count == 0 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py new file mode 100644 index 0000000..ec7a873 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py @@ -0,0 +1,167 @@ +"""Tests for the line-based transformers in IPython.core.inputtransformer2 + +Line-based transformers are the simpler ones; token-based transformers are +more complex. See test_inputtransformer2 for tests for token-based transformers. +""" + +from IPython.core import inputtransformer2 as ipt2 + +CELL_MAGIC = ("""\ +%%foo arg +body 1 +body 2 +""", """\ +get_ipython().run_cell_magic('foo', 'arg', 'body 1\\nbody 2\\n') +""") + +def test_cell_magic(): + for sample, expected in [CELL_MAGIC]: + assert ipt2.cell_magic(sample.splitlines(keepends=True)) == expected.splitlines( + keepends=True + ) + +CLASSIC_PROMPT = ("""\ +>>> for a in range(5): +... print(a) +""", """\ +for a in range(5): + print(a) +""") + +CLASSIC_PROMPT_L2 = ("""\ +for a in range(5): +... print(a) +... print(a ** 2) +""", """\ +for a in range(5): + print(a) + print(a ** 2) +""") + +def test_classic_prompt(): + for sample, expected in [CLASSIC_PROMPT, CLASSIC_PROMPT_L2]: + assert ipt2.classic_prompt( + sample.splitlines(keepends=True) + ) == expected.splitlines(keepends=True) + +IPYTHON_PROMPT = ("""\ +In [1]: for a in range(5): + ...: print(a) +""", """\ +for a in range(5): + print(a) +""") + +IPYTHON_PROMPT_L2 = ("""\ +for a in range(5): + ...: print(a) + ...: print(a ** 2) +""", """\ +for a in range(5): + print(a) + print(a ** 2) +""") + + +IPYTHON_PROMPT_VI_INS = ( + """\ +[ins] In [11]: def a(): + ...: 123 + ...: + ...: 123 +""", + """\ +def a(): + 123 + +123 +""", +) + +IPYTHON_PROMPT_VI_NAV = ( + """\ +[nav] In [11]: def a(): + ...: 123 + ...: + ...: 123 +""", + """\ +def a(): + 123 + +123 +""", +) + + +def test_ipython_prompt(): + for sample, expected in [ + IPYTHON_PROMPT, + IPYTHON_PROMPT_L2, + IPYTHON_PROMPT_VI_INS, + IPYTHON_PROMPT_VI_NAV, + ]: + assert ipt2.ipython_prompt( + sample.splitlines(keepends=True) + ) == expected.splitlines(keepends=True) + + +INDENT_SPACES = ("""\ + if True: + a = 3 +""", """\ +if True: + a = 3 +""") + +INDENT_TABS = ("""\ +\tif True: +\t\tb = 4 +""", """\ +if True: +\tb = 4 +""") + +def test_leading_indent(): + for sample, expected in [INDENT_SPACES, INDENT_TABS]: + assert ipt2.leading_indent( + sample.splitlines(keepends=True) + ) == expected.splitlines(keepends=True) + +LEADING_EMPTY_LINES = ("""\ + \t + +if True: + a = 3 + +b = 4 +""", """\ +if True: + a = 3 + +b = 4 +""") + +ONLY_EMPTY_LINES = ("""\ + \t + +""", """\ + \t + +""") + +def test_leading_empty_lines(): + for sample, expected in [LEADING_EMPTY_LINES, ONLY_EMPTY_LINES]: + assert ipt2.leading_empty_lines( + sample.splitlines(keepends=True) + ) == expected.splitlines(keepends=True) + +CRLF_MAGIC = ([ + "%%ls\r\n" +], [ + "get_ipython().run_cell_magic('ls', '', '')\n" +]) + +def test_crlf_magic(): + for sample, expected in [CRLF_MAGIC]: + assert ipt2.cell_magic(sample) == expected diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py new file mode 100644 index 0000000..f87d96f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py @@ -0,0 +1,1221 @@ +# -*- coding: utf-8 -*- +"""Tests for the key interactiveshell module. + +Historically the main classes in interactiveshell have been under-tested. This +module should grow as many single-method tests as possible to trap many of the +recurring bugs we seem to encounter with high-level interaction. +""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +import asyncio +import ast +import os +import signal +import shutil +import sys +import tempfile +import unittest +import pytest +from unittest import mock + +from os.path import join + +from IPython.core.error import InputRejected +from IPython.core.inputtransformer import InputTransformer +from IPython.core import interactiveshell +from IPython.core.oinspect import OInfo +from IPython.testing.decorators import ( + skipif, + skip_win32, + onlyif_unicode_paths, + onlyif_cmds_exist, + skip_if_not_osx, +) +from IPython.testing import tools as tt +from IPython.utils.process import find_cmd + +#----------------------------------------------------------------------------- +# Globals +#----------------------------------------------------------------------------- +# This is used by every single test, no point repeating it ad nauseam + +#----------------------------------------------------------------------------- +# Tests +#----------------------------------------------------------------------------- + +class DerivedInterrupt(KeyboardInterrupt): + pass + +class InteractiveShellTestCase(unittest.TestCase): + def test_naked_string_cells(self): + """Test that cells with only naked strings are fully executed""" + # First, single-line inputs + ip.run_cell('"a"\n') + self.assertEqual(ip.user_ns['_'], 'a') + # And also multi-line cells + ip.run_cell('"""a\nb"""\n') + self.assertEqual(ip.user_ns['_'], 'a\nb') + + def test_run_empty_cell(self): + """Just make sure we don't get a horrible error with a blank + cell of input. Yes, I did overlook that.""" + old_xc = ip.execution_count + res = ip.run_cell('') + self.assertEqual(ip.execution_count, old_xc) + self.assertEqual(res.execution_count, None) + + def test_run_cell_multiline(self): + """Multi-block, multi-line cells must execute correctly. + """ + src = '\n'.join(["x=1", + "y=2", + "if 1:", + " x += 1", + " y += 1",]) + res = ip.run_cell(src) + self.assertEqual(ip.user_ns['x'], 2) + self.assertEqual(ip.user_ns['y'], 3) + self.assertEqual(res.success, True) + self.assertEqual(res.result, None) + + def test_multiline_string_cells(self): + "Code sprinkled with multiline strings should execute (GH-306)" + ip.run_cell('tmp=0') + self.assertEqual(ip.user_ns['tmp'], 0) + res = ip.run_cell('tmp=1;"""a\nb"""\n') + self.assertEqual(ip.user_ns['tmp'], 1) + self.assertEqual(res.success, True) + self.assertEqual(res.result, "a\nb") + + def test_dont_cache_with_semicolon(self): + "Ending a line with semicolon should not cache the returned object (GH-307)" + oldlen = len(ip.user_ns['Out']) + for cell in ['1;', '1;1;']: + res = ip.run_cell(cell, store_history=True) + newlen = len(ip.user_ns['Out']) + self.assertEqual(oldlen, newlen) + self.assertIsNone(res.result) + i = 0 + #also test the default caching behavior + for cell in ['1', '1;1']: + ip.run_cell(cell, store_history=True) + newlen = len(ip.user_ns['Out']) + i += 1 + self.assertEqual(oldlen+i, newlen) + + def test_syntax_error(self): + res = ip.run_cell("raise = 3") + self.assertIsInstance(res.error_before_exec, SyntaxError) + + def test_open_standard_input_stream(self): + res = ip.run_cell("open(0)") + self.assertIsInstance(res.error_in_exec, ValueError) + + def test_open_standard_output_stream(self): + res = ip.run_cell("open(1)") + self.assertIsInstance(res.error_in_exec, ValueError) + + def test_open_standard_error_stream(self): + res = ip.run_cell("open(2)") + self.assertIsInstance(res.error_in_exec, ValueError) + + def test_In_variable(self): + "Verify that In variable grows with user input (GH-284)" + oldlen = len(ip.user_ns['In']) + ip.run_cell('1;', store_history=True) + newlen = len(ip.user_ns['In']) + self.assertEqual(oldlen+1, newlen) + self.assertEqual(ip.user_ns['In'][-1],'1;') + + def test_magic_names_in_string(self): + ip.run_cell('a = """\n%exit\n"""') + self.assertEqual(ip.user_ns['a'], '\n%exit\n') + + def test_trailing_newline(self): + """test that running !(command) does not raise a SyntaxError""" + ip.run_cell('!(true)\n', False) + ip.run_cell('!(true)\n\n\n', False) + + def test_gh_597(self): + """Pretty-printing lists of objects with non-ascii reprs may cause + problems.""" + class Spam(object): + def __repr__(self): + return "\xe9"*50 + import IPython.core.formatters + f = IPython.core.formatters.PlainTextFormatter() + f([Spam(), Spam()]) + + def test_future_flags(self): + """Check that future flags are used for parsing code (gh-777)""" + ip.run_cell('from __future__ import barry_as_FLUFL') + try: + ip.run_cell('prfunc_return_val = 1 <> 2') + assert 'prfunc_return_val' in ip.user_ns + finally: + # Reset compiler flags so we don't mess up other tests. + ip.compile.reset_compiler_flags() + + def test_can_pickle(self): + "Can we pickle objects defined interactively (GH-29)" + ip = get_ipython() + ip.reset() + ip.run_cell(("class Mylist(list):\n" + " def __init__(self,x=[]):\n" + " list.__init__(self,x)")) + ip.run_cell("w=Mylist([1,2,3])") + + from pickle import dumps + + # We need to swap in our main module - this is only necessary + # inside the test framework, because IPython puts the interactive module + # in place (but the test framework undoes this). + _main = sys.modules['__main__'] + sys.modules['__main__'] = ip.user_module + try: + res = dumps(ip.user_ns["w"]) + finally: + sys.modules['__main__'] = _main + self.assertTrue(isinstance(res, bytes)) + + def test_global_ns(self): + "Code in functions must be able to access variables outside them." + ip = get_ipython() + ip.run_cell("a = 10") + ip.run_cell(("def f(x):\n" + " return x + a")) + ip.run_cell("b = f(12)") + self.assertEqual(ip.user_ns["b"], 22) + + def test_bad_custom_tb(self): + """Check that InteractiveShell is protected from bad custom exception handlers""" + ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0) + self.assertEqual(ip.custom_exceptions, (IOError,)) + with tt.AssertPrints("Custom TB Handler failed", channel='stderr'): + ip.run_cell(u'raise IOError("foo")') + self.assertEqual(ip.custom_exceptions, ()) + + def test_bad_custom_tb_return(self): + """Check that InteractiveShell is protected from bad return types in custom exception handlers""" + ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1) + self.assertEqual(ip.custom_exceptions, (NameError,)) + with tt.AssertPrints("Custom TB Handler failed", channel='stderr'): + ip.run_cell(u'a=abracadabra') + self.assertEqual(ip.custom_exceptions, ()) + + def test_drop_by_id(self): + myvars = {"a":object(), "b":object(), "c": object()} + ip.push(myvars, interactive=False) + for name in myvars: + assert name in ip.user_ns, name + assert name in ip.user_ns_hidden, name + ip.user_ns['b'] = 12 + ip.drop_by_id(myvars) + for name in ["a", "c"]: + assert name not in ip.user_ns, name + assert name not in ip.user_ns_hidden, name + assert ip.user_ns['b'] == 12 + ip.reset() + + def test_var_expand(self): + ip.user_ns['f'] = u'Ca\xf1o' + self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o') + self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o') + self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1') + self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2') + + self.assertEqual(ip.var_expand(u"grep x | awk '{print $1}'"), u"grep x | awk '{print $1}'") + + ip.user_ns['f'] = b'Ca\xc3\xb1o' + # This should not raise any exception: + ip.var_expand(u'echo $f') + + def test_var_expand_local(self): + """Test local variable expansion in !system and %magic calls""" + # !system + ip.run_cell( + "def test():\n" + ' lvar = "ttt"\n' + " ret = !echo {lvar}\n" + " return ret[0]\n" + ) + res = ip.user_ns["test"]() + self.assertIn("ttt", res) + + # %magic + ip.run_cell( + "def makemacro():\n" + ' macroname = "macro_var_expand_locals"\n' + " %macro {macroname} codestr\n" + ) + ip.user_ns["codestr"] = "str(12)" + ip.run_cell("makemacro()") + self.assertIn("macro_var_expand_locals", ip.user_ns) + + def test_var_expand_self(self): + """Test variable expansion with the name 'self', which was failing. + + See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218 + """ + ip.run_cell( + "class cTest:\n" + ' classvar="see me"\n' + " def test(self):\n" + " res = !echo Variable: {self.classvar}\n" + " return res[0]\n" + ) + self.assertIn("see me", ip.user_ns["cTest"]().test()) + + def test_bad_var_expand(self): + """var_expand on invalid formats shouldn't raise""" + # SyntaxError + self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}") + # NameError + self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}") + # ZeroDivisionError + self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}") + + def test_silent_postexec(self): + """run_cell(silent=True) doesn't invoke pre/post_run_cell callbacks""" + pre_explicit = mock.Mock() + pre_always = mock.Mock() + post_explicit = mock.Mock() + post_always = mock.Mock() + all_mocks = [pre_explicit, pre_always, post_explicit, post_always] + + ip.events.register('pre_run_cell', pre_explicit) + ip.events.register('pre_execute', pre_always) + ip.events.register('post_run_cell', post_explicit) + ip.events.register('post_execute', post_always) + + try: + ip.run_cell("1", silent=True) + assert pre_always.called + assert not pre_explicit.called + assert post_always.called + assert not post_explicit.called + # double-check that non-silent exec did what we expected + # silent to avoid + ip.run_cell("1") + assert pre_explicit.called + assert post_explicit.called + info, = pre_explicit.call_args[0] + result, = post_explicit.call_args[0] + self.assertEqual(info, result.info) + # check that post hooks are always called + [m.reset_mock() for m in all_mocks] + ip.run_cell("syntax error") + assert pre_always.called + assert pre_explicit.called + assert post_always.called + assert post_explicit.called + info, = pre_explicit.call_args[0] + result, = post_explicit.call_args[0] + self.assertEqual(info, result.info) + finally: + # remove post-exec + ip.events.unregister('pre_run_cell', pre_explicit) + ip.events.unregister('pre_execute', pre_always) + ip.events.unregister('post_run_cell', post_explicit) + ip.events.unregister('post_execute', post_always) + + def test_silent_noadvance(self): + """run_cell(silent=True) doesn't advance execution_count""" + ec = ip.execution_count + # silent should force store_history=False + ip.run_cell("1", store_history=True, silent=True) + + self.assertEqual(ec, ip.execution_count) + # double-check that non-silent exec did what we expected + # silent to avoid + ip.run_cell("1", store_history=True) + self.assertEqual(ec+1, ip.execution_count) + + def test_silent_nodisplayhook(self): + """run_cell(silent=True) doesn't trigger displayhook""" + d = dict(called=False) + + trap = ip.display_trap + save_hook = trap.hook + + def failing_hook(*args, **kwargs): + d['called'] = True + + try: + trap.hook = failing_hook + res = ip.run_cell("1", silent=True) + self.assertFalse(d['called']) + self.assertIsNone(res.result) + # double-check that non-silent exec did what we expected + # silent to avoid + ip.run_cell("1") + self.assertTrue(d['called']) + finally: + trap.hook = save_hook + + def test_ofind_line_magic(self): + from IPython.core.magic import register_line_magic + + @register_line_magic + def lmagic(line): + "A line magic" + + # Get info on line magic + lfind = ip._ofind("lmagic") + info = OInfo( + found=True, + isalias=False, + ismagic=True, + namespace="IPython internal", + obj=lmagic, + parent=None, + ) + self.assertEqual(lfind, info) + + def test_ofind_cell_magic(self): + from IPython.core.magic import register_cell_magic + + @register_cell_magic + def cmagic(line, cell): + "A cell magic" + + # Get info on cell magic + find = ip._ofind("cmagic") + info = OInfo( + found=True, + isalias=False, + ismagic=True, + namespace="IPython internal", + obj=cmagic, + parent=None, + ) + self.assertEqual(find, info) + + def test_ofind_property_with_error(self): + class A(object): + @property + def foo(self): + raise NotImplementedError() # pragma: no cover + + a = A() + + found = ip._ofind("a.foo", [("locals", locals())]) + info = OInfo( + found=True, + isalias=False, + ismagic=False, + namespace="locals", + obj=A.foo, + parent=a, + ) + self.assertEqual(found, info) + + def test_ofind_multiple_attribute_lookups(self): + class A(object): + @property + def foo(self): + raise NotImplementedError() # pragma: no cover + + a = A() + a.a = A() + a.a.a = A() + + found = ip._ofind("a.a.a.foo", [("locals", locals())]) + info = OInfo( + found=True, + isalias=False, + ismagic=False, + namespace="locals", + obj=A.foo, + parent=a.a.a, + ) + self.assertEqual(found, info) + + def test_ofind_slotted_attributes(self): + class A(object): + __slots__ = ['foo'] + def __init__(self): + self.foo = 'bar' + + a = A() + found = ip._ofind("a.foo", [("locals", locals())]) + info = OInfo( + found=True, + isalias=False, + ismagic=False, + namespace="locals", + obj=a.foo, + parent=a, + ) + self.assertEqual(found, info) + + found = ip._ofind("a.bar", [("locals", locals())]) + expected = OInfo( + found=False, + isalias=False, + ismagic=False, + namespace=None, + obj=None, + parent=a, + ) + assert found == expected + + def test_ofind_prefers_property_to_instance_level_attribute(self): + class A(object): + @property + def foo(self): + return 'bar' + a = A() + a.__dict__["foo"] = "baz" + self.assertEqual(a.foo, "bar") + found = ip._ofind("a.foo", [("locals", locals())]) + self.assertIs(found.obj, A.foo) + + def test_custom_syntaxerror_exception(self): + called = [] + def my_handler(shell, etype, value, tb, tb_offset=None): + called.append(etype) + shell.showtraceback((etype, value, tb), tb_offset=tb_offset) + + ip.set_custom_exc((SyntaxError,), my_handler) + try: + ip.run_cell("1f") + # Check that this was called, and only once. + self.assertEqual(called, [SyntaxError]) + finally: + # Reset the custom exception hook + ip.set_custom_exc((), None) + + def test_custom_exception(self): + called = [] + def my_handler(shell, etype, value, tb, tb_offset=None): + called.append(etype) + shell.showtraceback((etype, value, tb), tb_offset=tb_offset) + + ip.set_custom_exc((ValueError,), my_handler) + try: + res = ip.run_cell("raise ValueError('test')") + # Check that this was called, and only once. + self.assertEqual(called, [ValueError]) + # Check that the error is on the result object + self.assertIsInstance(res.error_in_exec, ValueError) + finally: + # Reset the custom exception hook + ip.set_custom_exc((), None) + + @mock.patch("builtins.print") + def test_showtraceback_with_surrogates(self, mocked_print): + values = [] + + def mock_print_func(value, sep=" ", end="\n", file=sys.stdout, flush=False): + values.append(value) + if value == chr(0xD8FF): + raise UnicodeEncodeError("utf-8", chr(0xD8FF), 0, 1, "") + + # mock builtins.print + mocked_print.side_effect = mock_print_func + + # ip._showtraceback() is replaced in globalipapp.py. + # Call original method to test. + interactiveshell.InteractiveShell._showtraceback(ip, None, None, chr(0xD8FF)) + + self.assertEqual(mocked_print.call_count, 2) + self.assertEqual(values, [chr(0xD8FF), "\\ud8ff"]) + + def test_mktempfile(self): + filename = ip.mktempfile() + # Check that we can open the file again on Windows + with open(filename, "w", encoding="utf-8") as f: + f.write("abc") + + filename = ip.mktempfile(data="blah") + with open(filename, "r", encoding="utf-8") as f: + self.assertEqual(f.read(), "blah") + + def test_new_main_mod(self): + # Smoketest to check that this accepts a unicode module name + name = u'jiefmw' + mod = ip.new_main_mod(u'%s.py' % name, name) + self.assertEqual(mod.__name__, name) + + def test_get_exception_only(self): + try: + raise KeyboardInterrupt + except KeyboardInterrupt: + msg = ip.get_exception_only() + self.assertEqual(msg, 'KeyboardInterrupt\n') + + try: + raise DerivedInterrupt("foo") + except KeyboardInterrupt: + msg = ip.get_exception_only() + self.assertEqual(msg, 'IPython.core.tests.test_interactiveshell.DerivedInterrupt: foo\n') + + def test_inspect_text(self): + ip.run_cell('a = 5') + text = ip.object_inspect_text('a') + self.assertIsInstance(text, str) + + def test_last_execution_result(self): + """ Check that last execution result gets set correctly (GH-10702) """ + result = ip.run_cell('a = 5; a') + self.assertTrue(ip.last_execution_succeeded) + self.assertEqual(ip.last_execution_result.result, 5) + + result = ip.run_cell('a = x_invalid_id_x') + self.assertFalse(ip.last_execution_succeeded) + self.assertFalse(ip.last_execution_result.success) + self.assertIsInstance(ip.last_execution_result.error_in_exec, NameError) + + def test_reset_aliasing(self): + """ Check that standard posix aliases work after %reset. """ + if os.name != 'posix': + return + + ip.reset() + for cmd in ('clear', 'more', 'less', 'man'): + res = ip.run_cell('%' + cmd) + self.assertEqual(res.success, True) + + +@pytest.mark.skipif( + sys.implementation.name == "pypy" + and ((7, 3, 13) < sys.implementation.version < (7, 3, 16)), + reason="Unicode issues with scandir on PyPy, see https://github.com/pypy/pypy/issues/4860", +) +class TestSafeExecfileNonAsciiPath(unittest.TestCase): + @onlyif_unicode_paths + def setUp(self): + self.BASETESTDIR = tempfile.mkdtemp() + self.TESTDIR = join(self.BASETESTDIR, u"åäö") + os.mkdir(self.TESTDIR) + with open( + join(self.TESTDIR, "åäötestscript.py"), "w", encoding="utf-8" + ) as sfile: + sfile.write("pass\n") + self.oldpath = os.getcwd() + os.chdir(self.TESTDIR) + self.fname = u"åäötestscript.py" + + def tearDown(self): + os.chdir(self.oldpath) + shutil.rmtree(self.BASETESTDIR) + + @onlyif_unicode_paths + def test_1(self): + """Test safe_execfile with non-ascii path + """ + ip.safe_execfile(self.fname, {}, raise_exceptions=True) + +class ExitCodeChecks(tt.TempFileMixin): + + def setUp(self): + self.system = ip.system_raw + + def test_exit_code_ok(self): + self.system('exit 0') + self.assertEqual(ip.user_ns['_exit_code'], 0) + + def test_exit_code_error(self): + self.system('exit 1') + self.assertEqual(ip.user_ns['_exit_code'], 1) + + @skipif(not hasattr(signal, 'SIGALRM')) + def test_exit_code_signal(self): + self.mktmp("import signal, time\n" + "signal.setitimer(signal.ITIMER_REAL, 0.1)\n" + "time.sleep(1)\n") + self.system("%s %s" % (sys.executable, self.fname)) + self.assertEqual(ip.user_ns['_exit_code'], -signal.SIGALRM) + + @onlyif_cmds_exist("csh") + def test_exit_code_signal_csh(self): # pragma: no cover + SHELL = os.environ.get("SHELL", None) + os.environ["SHELL"] = find_cmd("csh") + try: + self.test_exit_code_signal() + finally: + if SHELL is not None: + os.environ['SHELL'] = SHELL + else: + del os.environ['SHELL'] + + +class TestSystemRaw(ExitCodeChecks): + + def setUp(self): + super().setUp() + self.system = ip.system_raw + + @onlyif_unicode_paths + def test_1(self): + """Test system_raw with non-ascii cmd + """ + cmd = u'''python -c "'åäö'" ''' + ip.system_raw(cmd) + + @mock.patch('subprocess.call', side_effect=KeyboardInterrupt) + @mock.patch('os.system', side_effect=KeyboardInterrupt) + def test_control_c(self, *mocks): + try: + self.system("sleep 1 # won't happen") + except KeyboardInterrupt: # pragma: no cove + self.fail( + "system call should intercept " + "keyboard interrupt from subprocess.call" + ) + self.assertEqual(ip.user_ns["_exit_code"], -signal.SIGINT) + + +@pytest.mark.parametrize("magic_cmd", ["pip", "conda", "cd"]) +def test_magic_warnings(magic_cmd): + if sys.platform == "win32": + to_mock = "os.system" + expected_arg, expected_kwargs = magic_cmd, dict() + else: + to_mock = "subprocess.call" + expected_arg, expected_kwargs = magic_cmd, dict( + shell=True, executable=os.environ.get("SHELL", None) + ) + + with mock.patch(to_mock, return_value=0) as mock_sub: + with pytest.warns(Warning, match=r"You executed the system command"): + ip.system_raw(magic_cmd) + mock_sub.assert_called_once_with(expected_arg, **expected_kwargs) + + +# TODO: Exit codes are currently ignored on Windows. +class TestSystemPipedExitCode(ExitCodeChecks): + + def setUp(self): + super().setUp() + self.system = ip.system_piped + + @skip_win32 + def test_exit_code_ok(self): + ExitCodeChecks.test_exit_code_ok(self) + + @skip_win32 + def test_exit_code_error(self): + ExitCodeChecks.test_exit_code_error(self) + + @skip_win32 + def test_exit_code_signal(self): + ExitCodeChecks.test_exit_code_signal(self) + +class TestModules(tt.TempFileMixin): + def test_extraneous_loads(self): + """Test we're not loading modules on startup that we shouldn't. + """ + self.mktmp("import sys\n" + "print('numpy' in sys.modules)\n" + "print('ipyparallel' in sys.modules)\n" + "print('ipykernel' in sys.modules)\n" + ) + out = "False\nFalse\nFalse\n" + tt.ipexec_validate(self.fname, out) + +class Negator(ast.NodeTransformer): + """Negates all number literals in an AST.""" + + def visit_Num(self, node): + node.value = -node.value + return node + + def visit_Constant(self, node): + if isinstance(node.value, int): + return self.visit_Num(node) + return node + +class TestAstTransform(unittest.TestCase): + def setUp(self): + self.negator = Negator() + ip.ast_transformers.append(self.negator) + + def tearDown(self): + ip.ast_transformers.remove(self.negator) + + def test_non_int_const(self): + with tt.AssertPrints("hello"): + ip.run_cell('print("hello")') + + def test_run_cell(self): + with tt.AssertPrints("-34"): + ip.run_cell("print(12 + 22)") + + # A named reference to a number shouldn't be transformed. + ip.user_ns["n"] = 55 + with tt.AssertNotPrints("-55"): + ip.run_cell("print(n)") + + def test_timeit(self): + called = set() + def f(x): + called.add(x) + ip.push({'f':f}) + + with tt.AssertPrints("std. dev. of"): + ip.run_line_magic("timeit", "-n1 f(1)") + self.assertEqual(called, {-1}) + called.clear() + + with tt.AssertPrints("std. dev. of"): + ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)") + self.assertEqual(called, {-2, -3}) + + def test_time(self): + called = [] + def f(x): + called.append(x) + ip.push({'f':f}) + + # Test with an expression + with tt.AssertPrints("Wall time: "): + ip.run_line_magic("time", "f(5+9)") + self.assertEqual(called, [-14]) + called[:] = [] + + # Test with a statement (different code path) + with tt.AssertPrints("Wall time: "): + ip.run_line_magic("time", "a = f(-3 + -2)") + self.assertEqual(called, [5]) + + def test_macro(self): + ip.push({'a':10}) + # The AST transformation makes this do a+=-1 + ip.define_macro("amacro", "a+=1\nprint(a)") + + with tt.AssertPrints("9"): + ip.run_cell("amacro") + with tt.AssertPrints("8"): + ip.run_cell("amacro") + +class TestMiscTransform(unittest.TestCase): + + + def test_transform_only_once(self): + cleanup = 0 + line_t = 0 + def count_cleanup(lines): + nonlocal cleanup + cleanup += 1 + return lines + + def count_line_t(lines): + nonlocal line_t + line_t += 1 + return lines + + ip.input_transformer_manager.cleanup_transforms.append(count_cleanup) + ip.input_transformer_manager.line_transforms.append(count_line_t) + + ip.run_cell('1') + + assert cleanup == 1 + assert line_t == 1 + +class IntegerWrapper(ast.NodeTransformer): + """Wraps all integers in a call to Integer()""" + + # for Python 3.7 and earlier + + # for Python 3.7 and earlier + def visit_Num(self, node): + if isinstance(node.n, int): + return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()), + args=[node], keywords=[]) + return node + + # For Python 3.8+ + def visit_Constant(self, node): + if isinstance(node.value, int): + return self.visit_Num(node) + return node + + +class TestAstTransform2(unittest.TestCase): + def setUp(self): + self.intwrapper = IntegerWrapper() + ip.ast_transformers.append(self.intwrapper) + + self.calls = [] + def Integer(*args): + self.calls.append(args) + return args + ip.push({"Integer": Integer}) + + def tearDown(self): + ip.ast_transformers.remove(self.intwrapper) + del ip.user_ns['Integer'] + + def test_run_cell(self): + ip.run_cell("n = 2") + self.assertEqual(self.calls, [(2,)]) + + # This shouldn't throw an error + ip.run_cell("o = 2.0") + self.assertEqual(ip.user_ns['o'], 2.0) + + def test_run_cell_non_int(self): + ip.run_cell("n = 'a'") + assert self.calls == [] + + def test_timeit(self): + called = set() + def f(x): + called.add(x) + ip.push({'f':f}) + + with tt.AssertPrints("std. dev. of"): + ip.run_line_magic("timeit", "-n1 f(1)") + self.assertEqual(called, {(1,)}) + called.clear() + + with tt.AssertPrints("std. dev. of"): + ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)") + self.assertEqual(called, {(2,), (3,)}) + +class ErrorTransformer(ast.NodeTransformer): + """Throws an error when it sees a number.""" + + def visit_Constant(self, node): + if isinstance(node.value, int): + raise ValueError("test") + return node + + +class TestAstTransformError(unittest.TestCase): + def test_unregistering(self): + err_transformer = ErrorTransformer() + ip.ast_transformers.append(err_transformer) + + with self.assertWarnsRegex(UserWarning, "It will be unregistered"): + ip.run_cell("1 + 2") + + # This should have been removed. + self.assertNotIn(err_transformer, ip.ast_transformers) + + +class StringRejector(ast.NodeTransformer): + """Throws an InputRejected when it sees a string literal. + + Used to verify that NodeTransformers can signal that a piece of code should + not be executed by throwing an InputRejected. + """ + + def visit_Constant(self, node): + if isinstance(node.value, str): + raise InputRejected("test") + return node + + +class TestAstTransformInputRejection(unittest.TestCase): + + def setUp(self): + self.transformer = StringRejector() + ip.ast_transformers.append(self.transformer) + + def tearDown(self): + ip.ast_transformers.remove(self.transformer) + + def test_input_rejection(self): + """Check that NodeTransformers can reject input.""" + + expect_exception_tb = tt.AssertPrints("InputRejected: test") + expect_no_cell_output = tt.AssertNotPrints("'unsafe'", suppress=False) + + # Run the same check twice to verify that the transformer is not + # disabled after raising. + with expect_exception_tb, expect_no_cell_output: + ip.run_cell("'unsafe'") + + with expect_exception_tb, expect_no_cell_output: + res = ip.run_cell("'unsafe'") + + self.assertIsInstance(res.error_before_exec, InputRejected) + +def test__IPYTHON__(): + # This shouldn't raise a NameError, that's all + __IPYTHON__ + + +class DummyRepr(object): + def __repr__(self): + return "DummyRepr" + + def _repr_html_(self): + return "dummy" + + def _repr_javascript_(self): + return "console.log('hi');", {'key': 'value'} + + +def test_user_variables(): + # enable all formatters + ip.display_formatter.active_types = ip.display_formatter.format_types + + ip.user_ns['dummy'] = d = DummyRepr() + keys = {'dummy', 'doesnotexist'} + r = ip.user_expressions({ key:key for key in keys}) + + assert keys == set(r.keys()) + dummy = r["dummy"] + assert {"status", "data", "metadata"} == set(dummy.keys()) + assert dummy["status"] == "ok" + data = dummy["data"] + metadata = dummy["metadata"] + assert data.get("text/html") == d._repr_html_() + js, jsmd = d._repr_javascript_() + assert data.get("application/javascript") == js + assert metadata.get("application/javascript") == jsmd + + dne = r["doesnotexist"] + assert dne["status"] == "error" + assert dne["ename"] == "NameError" + + # back to text only + ip.display_formatter.active_types = ['text/plain'] + +def test_user_expression(): + # enable all formatters + ip.display_formatter.active_types = ip.display_formatter.format_types + query = { + 'a' : '1 + 2', + 'b' : '1/0', + } + r = ip.user_expressions(query) + import pprint + pprint.pprint(r) + assert set(r.keys()) == set(query.keys()) + a = r["a"] + assert {"status", "data", "metadata"} == set(a.keys()) + assert a["status"] == "ok" + data = a["data"] + metadata = a["metadata"] + assert data.get("text/plain") == "3" + + b = r["b"] + assert b["status"] == "error" + assert b["ename"] == "ZeroDivisionError" + + # back to text only + ip.display_formatter.active_types = ['text/plain'] + + +class TestSyntaxErrorTransformer(unittest.TestCase): + """Check that SyntaxError raised by an input transformer is handled by run_cell()""" + + @staticmethod + def transformer(lines): + for line in lines: + pos = line.find('syntaxerror') + if pos >= 0: + e = SyntaxError('input contains "syntaxerror"') + e.text = line + e.offset = pos + 1 + raise e + return lines + + def setUp(self): + ip.input_transformers_post.append(self.transformer) + + def tearDown(self): + ip.input_transformers_post.remove(self.transformer) + + def test_syntaxerror_input_transformer(self): + with tt.AssertPrints('1234'): + ip.run_cell('1234') + with tt.AssertPrints('SyntaxError: invalid syntax'): + ip.run_cell('1 2 3') # plain python syntax error + with tt.AssertPrints('SyntaxError: input contains "syntaxerror"'): + ip.run_cell('2345 # syntaxerror') # input transformer syntax error + with tt.AssertPrints('3456'): + ip.run_cell('3456') + + +class TestWarningSuppression(unittest.TestCase): + def test_warning_suppression(self): + ip.run_cell("import warnings") + try: + with self.assertWarnsRegex(UserWarning, "asdf"): + ip.run_cell("warnings.warn('asdf')") + # Here's the real test -- if we run that again, we should get the + # warning again. Traditionally, each warning was only issued once per + # IPython session (approximately), even if the user typed in new and + # different code that should have also triggered the warning, leading + # to much confusion. + with self.assertWarnsRegex(UserWarning, "asdf"): + ip.run_cell("warnings.warn('asdf')") + finally: + ip.run_cell("del warnings") + + + def test_deprecation_warning(self): + ip.run_cell(""" +import warnings +def wrn(): + warnings.warn( + "I AM A WARNING", + DeprecationWarning + ) + """) + try: + with self.assertWarnsRegex(DeprecationWarning, "I AM A WARNING"): + ip.run_cell("wrn()") + finally: + ip.run_cell("del warnings") + ip.run_cell("del wrn") + + +class TestImportNoDeprecate(tt.TempFileMixin): + + def setUp(self): + """Make a valid python temp file.""" + self.mktmp(""" +import warnings +def wrn(): + warnings.warn( + "I AM A WARNING", + DeprecationWarning + ) +""") + super().setUp() + + def test_no_dep(self): + """ + No deprecation warning should be raised from imported functions + """ + ip.run_cell("from {} import wrn".format(self.fname)) + + with tt.AssertNotPrints("I AM A WARNING"): + ip.run_cell("wrn()") + ip.run_cell("del wrn") + + +def test_custom_exc_count(): + hook = mock.Mock(return_value=None) + ip.set_custom_exc((SyntaxError,), hook) + before = ip.execution_count + ip.run_cell("def foo()", store_history=True) + # restore default excepthook + ip.set_custom_exc((), None) + assert hook.call_count == 1 + assert ip.execution_count == before + 1 + + +def test_run_cell_async(): + ip.run_cell("import asyncio") + coro = ip.run_cell_async("await asyncio.sleep(0.01)\n5") + assert asyncio.iscoroutine(coro) + loop = asyncio.new_event_loop() + result = loop.run_until_complete(coro) + assert isinstance(result, interactiveshell.ExecutionResult) + assert result.result == 5 + + +def test_run_cell_await(): + ip.run_cell("import asyncio") + result = ip.run_cell("await asyncio.sleep(0.01); 10") + assert ip.user_ns["_"] == 10 + + +def test_run_cell_asyncio_run(): + ip.run_cell("import asyncio") + result = ip.run_cell("await asyncio.sleep(0.01); 1") + assert ip.user_ns["_"] == 1 + result = ip.run_cell("asyncio.run(asyncio.sleep(0.01)); 2") + assert ip.user_ns["_"] == 2 + result = ip.run_cell("await asyncio.sleep(0.01); 3") + assert ip.user_ns["_"] == 3 + + +def test_should_run_async(): + assert not ip.should_run_async("a = 5", transformed_cell="a = 5") + assert ip.should_run_async("await x", transformed_cell="await x") + assert ip.should_run_async( + "import asyncio; await asyncio.sleep(1)", + transformed_cell="import asyncio; await asyncio.sleep(1)", + ) + + +def test_set_custom_completer(): + num_completers = len(ip.Completer.matchers) + + def foo(*args, **kwargs): + return "I'm a completer!" + + ip.set_custom_completer(foo, 0) + + # check that we've really added a new completer + assert len(ip.Completer.matchers) == num_completers + 1 + + # check that the first completer is the function we defined + assert ip.Completer.matchers[0]() == "I'm a completer!" + + # clean up + ip.Completer.custom_matchers.pop() + + +class TestShowTracebackAttack(unittest.TestCase): + """Test that the interactive shell is resilient against the client attack of + manipulating the showtracebacks method. These attacks shouldn't result in an + unhandled exception in the kernel.""" + + def setUp(self): + self.orig_showtraceback = interactiveshell.InteractiveShell.showtraceback + + def tearDown(self): + interactiveshell.InteractiveShell.showtraceback = self.orig_showtraceback + + def test_set_show_tracebacks_none(self): + """Test the case of the client setting showtracebacks to None""" + + result = ip.run_cell( + """ + import IPython.core.interactiveshell + IPython.core.interactiveshell.InteractiveShell.showtraceback = None + + assert False, "This should not raise an exception" + """ + ) + print(result) + + assert result.result is None + assert isinstance(result.error_in_exec, TypeError) + assert str(result.error_in_exec) == "'NoneType' object is not callable" + + def test_set_show_tracebacks_noop(self): + """Test the case of the client setting showtracebacks to a no op lambda""" + + result = ip.run_cell( + """ + import IPython.core.interactiveshell + IPython.core.interactiveshell.InteractiveShell.showtraceback = lambda *args, **kwargs: None + + assert False, "This should not raise an exception" + """ + ) + print(result) + + assert result.result is None + assert isinstance(result.error_in_exec, AssertionError) + assert str(result.error_in_exec) == "This should not raise an exception" + + +@skip_if_not_osx +def test_enable_gui_osx(): + simple_prompt = ip.simple_prompt + ip.simple_prompt = False + + ip.enable_gui("osx") + assert ip.active_eventloop == "osx" + ip.enable_gui() + + # The following line fails for IPython <= 8.25.0 + ip.enable_gui("macosx") + assert ip.active_eventloop == "osx" + ip.enable_gui() + + ip.simple_prompt = simple_prompt diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py new file mode 100644 index 0000000..a5e51fb --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py @@ -0,0 +1,246 @@ +"""Tests for the key interactiveshell module, where the main ipython class is defined. +""" + +import stack_data +import sys + +SV_VERSION = tuple([int(x) for x in stack_data.__version__.split(".")[0:2]]) + + +def test_reset(): + """reset must clear most namespaces.""" + + # Check that reset runs without error + ip.reset() + + # Once we've reset it (to clear of any junk that might have been there from + # other tests, we can count how many variables are in the user's namespace + nvars_user_ns = len(ip.user_ns) + nvars_hidden = len(ip.user_ns_hidden) + + # Now add a few variables to user_ns, and check that reset clears them + ip.user_ns['x'] = 1 + ip.user_ns['y'] = 1 + ip.reset() + + # Finally, check that all namespaces have only as many variables as we + # expect to find in them: + assert len(ip.user_ns) == nvars_user_ns + assert len(ip.user_ns_hidden) == nvars_hidden + + +# Tests for reporting of exceptions in various modes, handling of SystemExit, +# and %tb functionality. This is really a mix of testing ultraTB and interactiveshell. + +def doctest_tb_plain(): + """ + In [18]: xmode plain + Exception reporting mode: Plain + + In [19]: run simpleerr.py + Traceback (most recent call last): + File ...:... + bar(mode) + File ...:... in bar + div0() + File ...:... in div0 + x/y + ZeroDivisionError: ... + """ + + +def doctest_tb_context(): + """ + In [3]: xmode context + Exception reporting mode: Context + + In [4]: run simpleerr.py + --------------------------------------------------------------------------- + ZeroDivisionError Traceback (most recent call last) + + ... + 30 except IndexError: + 31 mode = 'div' + ---> 33 bar(mode) + + ... in bar(mode) + 15 "bar" + 16 if mode=='div': + ---> 17 div0() + 18 elif mode=='exit': + 19 try: + + ... in div0() + 6 x = 1 + 7 y = 0 + ----> 8 x/y + + ZeroDivisionError: ...""" + + +def doctest_tb_verbose(): + """ + In [5]: xmode verbose + Exception reporting mode: Verbose + + In [6]: run simpleerr.py + --------------------------------------------------------------------------- + ZeroDivisionError Traceback (most recent call last) + + ... + 30 except IndexError: + 31 mode = 'div' + ---> 33 bar(mode) + mode = 'div' + + ... in bar(mode='div') + 15 "bar" + 16 if mode=='div': + ---> 17 div0() + 18 elif mode=='exit': + 19 try: + + ... in div0() + 6 x = 1 + 7 y = 0 + ----> 8 x/y + x = 1 + y = 0 + + ZeroDivisionError: ... + """ + + +def doctest_tb_sysexit(): + """ + In [17]: %xmode plain + Exception reporting mode: Plain + + In [18]: %run simpleerr.py exit + An exception has occurred, use %tb to see the full traceback. + SystemExit: (1, 'Mode = exit') + + In [19]: %run simpleerr.py exit 2 + An exception has occurred, use %tb to see the full traceback. + SystemExit: (2, 'Mode = exit') + + In [20]: %tb + Traceback (most recent call last): + File ...:... in execfile + exec(compiler(f.read(), fname, "exec"), glob, loc) + File ...:... + bar(mode) + File ...:... in bar + sysexit(stat, mode) + File ...:... in sysexit + raise SystemExit(stat, f"Mode = {mode}") + SystemExit: (2, 'Mode = exit') + + In [21]: %xmode context + Exception reporting mode: Context + + In [22]: %tb + --------------------------------------------------------------------------- + SystemExit Traceback (most recent call last) + File ..., in execfile(fname, glob, loc, compiler) + ... with open(fname, "rb") as f: + ... compiler = compiler or compile + ---> ... exec(compiler(f.read(), fname, "exec"), glob, loc) + ... + 30 except IndexError: + 31 mode = 'div' + ---> 33 bar(mode) + + ...bar(mode) + 21 except: + 22 stat = 1 + ---> 23 sysexit(stat, mode) + 24 else: + 25 raise ValueError('Unknown mode') + + ...sysexit(stat, mode) + 10 def sysexit(stat, mode): + ---> 11 raise SystemExit(stat, f"Mode = {mode}") + + SystemExit: (2, 'Mode = exit') + """ + + +if SV_VERSION < (0, 6): + + def doctest_tb_sysexit_verbose_stack_data_05(): + """ + In [18]: %run simpleerr.py exit + An exception has occurred, use %tb to see the full traceback. + SystemExit: (1, 'Mode = exit') + + In [19]: %run simpleerr.py exit 2 + An exception has occurred, use %tb to see the full traceback. + SystemExit: (2, 'Mode = exit') + + In [23]: %xmode verbose + Exception reporting mode: Verbose + + In [24]: %tb + --------------------------------------------------------------------------- + SystemExit Traceback (most recent call last) + + ... + 30 except IndexError: + 31 mode = 'div' + ---> 33 bar(mode) + mode = 'exit' + + ... in bar(mode='exit') + ... except: + ... stat = 1 + ---> ... sysexit(stat, mode) + mode = 'exit' + stat = 2 + ... else: + ... raise ValueError('Unknown mode') + + ... in sysexit(stat=2, mode='exit') + 10 def sysexit(stat, mode): + ---> 11 raise SystemExit(stat, f"Mode = {mode}") + stat = 2 + + SystemExit: (2, 'Mode = exit') + """ + + +def test_run_cell(): + import textwrap + + ip.run_cell("a = 10\na+=1") + ip.run_cell("assert a == 11\nassert 1") + + assert ip.user_ns["a"] == 11 + complex = textwrap.dedent( + """ + if 1: + print "hello" + if 1: + print "world" + + if 2: + print "foo" + + if 3: + print "bar" + + if 4: + print "bar" + + """ + ) + # Simply verifies that this kind of input is run + ip.run_cell(complex) + + +def test_db(): + """Test the internal database used for variable persistence.""" + ip.db["__unittest_"] = 12 + assert ip.db["__unittest_"] == 12 + del ip.db["__unittest_"] + assert "__unittest_" not in ip.db diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py new file mode 100644 index 0000000..003f603 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +"""Test IPython.core.logger""" + +import os.path + +import pytest +from tempfile import TemporaryDirectory + + +def test_logstart_inaccessible_file(): + with pytest.raises(IOError): + _ip.logger.logstart(logfname="/") # Opening that filename will fail. + + try: + _ip.run_cell("a=1") # Check it doesn't try to log this + finally: + _ip.logger.log_active = False # If this fails, don't let later tests fail + +def test_logstart_unicode(): + with TemporaryDirectory() as tdir: + logfname = os.path.join(tdir, "test_unicode.log") + _ip.run_cell("'abc€'") + try: + _ip.run_line_magic("logstart", "-to %s" % logfname) + _ip.run_cell("'abc€'") + finally: + _ip.logger.logstop() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py new file mode 100644 index 0000000..4e16700 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py @@ -0,0 +1,1623 @@ +# -*- coding: utf-8 -*- +"""Tests for various magic functions.""" + +import gc +import io +import os +import re +import shlex +import signal +import sys +import warnings +from importlib import invalidate_caches +from io import StringIO +from pathlib import Path +from time import sleep +from threading import Thread +from subprocess import CalledProcessError +from textwrap import dedent +from time import sleep +from threading import Thread +from unittest import TestCase, mock + +import pytest + +from IPython import get_ipython +from IPython.core import magic +from IPython.core.error import UsageError +from IPython.core.magic import ( + Magics, + cell_magic, + line_magic, + magics_class, + register_cell_magic, + register_line_magic, +) +from IPython.core.magics import code, execution, logging, osm, script +from IPython.testing import decorators as dec +from IPython.testing import tools as tt +from IPython.utils.io import capture_output +from IPython.utils.process import find_cmd +from IPython.utils.tempdir import TemporaryDirectory, TemporaryWorkingDirectory +from IPython.utils.syspathcontext import prepended_to_syspath + +from .test_debugger import PdbTestInput + +from tempfile import NamedTemporaryFile + +@magic.magics_class +class DummyMagics(magic.Magics): pass + +def test_extract_code_ranges(): + instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :" + expected = [ + (0, 1), + (2, 3), + (4, 6), + (6, 9), + (9, 14), + (16, None), + (None, 9), + (9, None), + (None, 13), + (None, None), + ] + actual = list(code.extract_code_ranges(instr)) + assert actual == expected + +def test_extract_symbols(): + source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n""" + symbols_args = ["a", "b", "A", "A,b", "A,a", "z"] + expected = [([], ['a']), + (["def b():\n return 42\n"], []), + (["class A: pass\n"], []), + (["class A: pass\n", "def b():\n return 42\n"], []), + (["class A: pass\n"], ['a']), + ([], ['z'])] + for symbols, exp in zip(symbols_args, expected): + assert code.extract_symbols(source, symbols) == exp + + +def test_extract_symbols_raises_exception_with_non_python_code(): + source = ("=begin A Ruby program :)=end\n" + "def hello\n" + "puts 'Hello world'\n" + "end") + with pytest.raises(SyntaxError): + code.extract_symbols(source, "hello") + + +def test_magic_not_found(): + # magic not found raises UsageError + with pytest.raises(UsageError): + _ip.run_line_magic("doesntexist", "") + + # ensure result isn't success when a magic isn't found + result = _ip.run_cell('%doesntexist') + assert isinstance(result.error_in_exec, UsageError) + + +def test_cell_magic_not_found(): + # magic not found raises UsageError + with pytest.raises(UsageError): + _ip.run_cell_magic('doesntexist', 'line', 'cell') + + # ensure result isn't success when a magic isn't found + result = _ip.run_cell('%%doesntexist') + assert isinstance(result.error_in_exec, UsageError) + + +def test_magic_error_status(): + def fail(shell): + 1/0 + _ip.register_magic_function(fail) + result = _ip.run_cell('%fail') + assert isinstance(result.error_in_exec, ZeroDivisionError) + + +def test_config(): + """ test that config magic does not raise + can happen if Configurable init is moved too early into + Magics.__init__ as then a Config object will be registered as a + magic. + """ + ## should not raise. + _ip.run_line_magic("config", "") + + +def test_config_available_configs(): + """ test that config magic prints available configs in unique and + sorted order. """ + with capture_output() as captured: + _ip.run_line_magic("config", "") + + stdout = captured.stdout + config_classes = stdout.strip().split('\n')[1:] + assert config_classes == sorted(set(config_classes)) + +def test_config_print_class(): + """ test that config with a classname prints the class's options. """ + with capture_output() as captured: + _ip.run_line_magic("config", "TerminalInteractiveShell") + + stdout = captured.stdout + assert re.match( + "TerminalInteractiveShell.* options", stdout.splitlines()[0] + ), f"{stdout}\n\n1st line of stdout not like 'TerminalInteractiveShell.* options'" + + +def test_rehashx(): + # clear up everything + _ip.alias_manager.clear_aliases() + del _ip.db['syscmdlist'] + + _ip.run_line_magic("rehashx", "") + # Practically ALL ipython development systems will have more than 10 aliases + + assert len(_ip.alias_manager.aliases) > 10 + for name, cmd in _ip.alias_manager.aliases: + # we must strip dots from alias names + assert "." not in name + + # rehashx must fill up syscmdlist + scoms = _ip.db['syscmdlist'] + assert len(scoms) > 10 + + +def test_magic_parse_options(): + """Test that we don't mangle paths when parsing magic options.""" + ip = get_ipython() + path = 'c:\\x' + m = DummyMagics(ip) + opts = m.parse_options('-f %s' % path,'f:')[0] + # argv splitting is os-dependent + if os.name == 'posix': + expected = 'c:x' + else: + expected = path + assert opts["f"] == expected + + +def test_magic_parse_long_options(): + """Magic.parse_options can handle --foo=bar long options""" + ip = get_ipython() + m = DummyMagics(ip) + opts, _ = m.parse_options("--foo --bar=bubble", "a", "foo", "bar=") + assert "foo" in opts + assert "bar" in opts + assert opts["bar"] == "bubble" + + +def doctest_hist_f(): + """Test %hist -f with temporary filename. + + In [9]: import tempfile + + In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-') + + In [11]: %hist -nl -f $tfile 3 + + In [13]: import os; os.unlink(tfile) + """ + + +def doctest_hist_op(): + """Test %hist -op + + In [1]: class b(float): + ...: pass + ...: + + In [2]: class s(object): + ...: def __str__(self): + ...: return 's' + ...: + + In [3]: + + In [4]: class r(b): + ...: def __repr__(self): + ...: return 'r' + ...: + + In [5]: class sr(s,r): pass + ...: + + In [6]: + + In [7]: bb=b() + + In [8]: ss=s() + + In [9]: rr=r() + + In [10]: ssrr=sr() + + In [11]: 4.5 + Out[11]: 4.5 + + In [12]: str(ss) + Out[12]: 's' + + In [13]: + + In [14]: %hist -op + >>> class b: + ... pass + ... + >>> class s(b): + ... def __str__(self): + ... return 's' + ... + >>> + >>> class r(b): + ... def __repr__(self): + ... return 'r' + ... + >>> class sr(s,r): pass + >>> + >>> bb=b() + >>> ss=s() + >>> rr=r() + >>> ssrr=sr() + >>> 4.5 + 4.5 + >>> str(ss) + 's' + >>> + """ + +def test_hist_pof(): + ip = get_ipython() + ip.run_cell("1+2", store_history=True) + #raise Exception(ip.history_manager.session_number) + #raise Exception(list(ip.history_manager._get_range_session())) + with TemporaryDirectory() as td: + tf = os.path.join(td, 'hist.py') + ip.run_line_magic('history', '-pof %s' % tf) + assert os.path.isfile(tf) + + +def test_macro(): + ip = get_ipython() + ip.history_manager.reset() # Clear any existing history. + cmds = ["a=1", "def b():\n return a**2", "print(a,b())"] + for i, cmd in enumerate(cmds, start=1): + ip.history_manager.store_inputs(i, cmd) + ip.run_line_magic("macro", "test 1-3") + assert ip.user_ns["test"].value == "\n".join(cmds) + "\n" + + # List macros + assert "test" in ip.run_line_magic("macro", "") + + +def test_macro_run(): + """Test that we can run a multi-line macro successfully.""" + ip = get_ipython() + ip.history_manager.reset() + cmds = ["a=10", "a+=1", "print(a)", "%macro test 2-3"] + for cmd in cmds: + ip.run_cell(cmd, store_history=True) + assert ip.user_ns["test"].value == "a+=1\nprint(a)\n" + with tt.AssertPrints("12"): + ip.run_cell("test") + with tt.AssertPrints("13"): + ip.run_cell("test") + + +def test_magic_magic(): + """Test %magic""" + ip = get_ipython() + with capture_output() as captured: + ip.run_line_magic("magic", "") + + stdout = captured.stdout + assert "%magic" in stdout + assert "IPython" in stdout + assert "Available" in stdout + + +@dec.skipif_not_numpy +def test_numpy_reset_array_undec(): + "Test '%reset array' functionality" + _ip.ex("import numpy as np") + _ip.ex("a = np.empty(2)") + assert "a" in _ip.user_ns + _ip.run_line_magic("reset", "-f array") + assert "a" not in _ip.user_ns + + +def test_reset_out(): + "Test '%reset out' magic" + _ip.run_cell("parrot = 'dead'", store_history=True) + # test '%reset -f out', make an Out prompt + _ip.run_cell("parrot", store_history=True) + assert "dead" in [_ip.user_ns[x] for x in ("_", "__", "___")] + _ip.run_line_magic("reset", "-f out") + assert "dead" not in [_ip.user_ns[x] for x in ("_", "__", "___")] + assert len(_ip.user_ns["Out"]) == 0 + + +def test_reset_in(): + "Test '%reset in' magic" + # test '%reset -f in' + _ip.run_cell("parrot", store_history=True) + assert "parrot" in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] + _ip.run_line_magic("reset", "-f in") + assert "parrot" not in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] + assert len(set(_ip.user_ns["In"])) == 1 + + +def test_reset_dhist(): + "Test '%reset dhist' magic" + _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing + _ip.run_line_magic("cd", os.path.dirname(pytest.__file__)) + _ip.run_line_magic("cd", "-") + assert len(_ip.user_ns["_dh"]) > 0 + _ip.run_line_magic("reset", "-f dhist") + assert len(_ip.user_ns["_dh"]) == 0 + _ip.run_cell("_dh = [d for d in tmp]") # restore + + +def test_reset_in_length(): + "Test that '%reset in' preserves In[] length" + _ip.run_cell("print 'foo'") + _ip.run_cell("reset -f in") + assert len(_ip.user_ns["In"]) == _ip.displayhook.prompt_count + 1 + + +class TestResetErrors(TestCase): + + def test_reset_redefine(self): + + @magics_class + class KernelMagics(Magics): + @line_magic + def less(self, shell): pass + + _ip.register_magics(KernelMagics) + + with self.assertLogs() as cm: + # hack, we want to just capture logs, but assertLogs fails if not + # logs get produce. + # so log one things we ignore. + import logging as log_mod + log = log_mod.getLogger() + log.info('Nothing') + # end hack. + _ip.run_cell("reset -f") + + assert len(cm.output) == 1 + for out in cm.output: + assert "Invalid alias" not in out + +def test_tb_syntaxerror(): + """test %tb after a SyntaxError""" + ip = get_ipython() + ip.run_cell("for") + + # trap and validate stdout + save_stdout = sys.stdout + try: + sys.stdout = StringIO() + ip.run_cell("%tb") + out = sys.stdout.getvalue() + finally: + sys.stdout = save_stdout + # trim output, and only check the last line + last_line = out.rstrip().splitlines()[-1].strip() + assert last_line == "SyntaxError: invalid syntax" + + +def test_time(): + ip = get_ipython() + + with tt.AssertPrints("Wall time: "): + ip.run_cell("%time None") + + ip.run_cell("def f(kmjy):\n" + " %time print (2*kmjy)") + + with tt.AssertPrints("Wall time: "): + with tt.AssertPrints("hihi", suppress=False): + ip.run_cell("f('hi')") + + +# ';' at the end of %time prevents instruction value to be printed. +# This tests fix for #13837. +def test_time_no_output_with_semicolon(): + ip = get_ipython() + + # Test %time cases + with tt.AssertPrints(" 123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%time 123000+456") + + with tt.AssertNotPrints(" 123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%time 123000+456;") + + with tt.AssertPrints(" 123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%time 123000+456 # Comment") + + with tt.AssertNotPrints(" 123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%time 123000+456; # Comment") + + with tt.AssertPrints(" 123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%time 123000+456 # ;Comment") + + # Test %%time cases + with tt.AssertPrints("123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%%time\n123000+456\n\n\n") + + with tt.AssertNotPrints("123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%%time\n123000+456;\n\n\n") + + with tt.AssertPrints("123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%%time\n123000+456 # Comment\n\n\n") + + with tt.AssertNotPrints("123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%%time\n123000+456; # Comment\n\n\n") + + with tt.AssertPrints("123456"): + with tt.AssertPrints("Wall time: ", suppress=False): + with tt.AssertPrints("CPU times: ", suppress=False): + ip.run_cell("%%time\n123000+456 # ;Comment\n\n\n") + + +def test_time_last_not_expression(): + ip.run_cell("%%time\n" + "var_1 = 1\n" + "var_2 = 2\n") + assert ip.user_ns['var_1'] == 1 + del ip.user_ns['var_1'] + assert ip.user_ns['var_2'] == 2 + del ip.user_ns['var_2'] + + +@dec.skip_win32 +def test_time2(): + ip = get_ipython() + + with tt.AssertPrints("CPU times: user "): + ip.run_cell("%time None") + +def test_time3(): + """Erroneous magic function calls, issue gh-3334""" + ip = get_ipython() + ip.user_ns.pop('run', None) + + with tt.AssertNotPrints("not found", channel='stderr'): + ip.run_cell("%%time\n" + "run = 0\n" + "run += 1") + +def test_multiline_time(): + """Make sure last statement from time return a value.""" + ip = get_ipython() + ip.user_ns.pop('run', None) + + ip.run_cell( + dedent( + """\ + %%time + a = "ho" + b = "hey" + a+b + """ + ) + ) + assert ip.user_ns_hidden["_"] == "hohey" + + +def test_time_local_ns(): + """ + Test that local_ns is actually global_ns when running a cell magic + """ + ip = get_ipython() + ip.run_cell("%%time\n" "myvar = 1") + assert ip.user_ns["myvar"] == 1 + del ip.user_ns["myvar"] + + +def test_time_microseconds_display(): + """Ensure ASCII is used when necessary""" + with mock.patch("sys.stdout", io.TextIOWrapper(StringIO(), encoding="utf-8")): + assert execution._format_time(0.000001) == "1 \u03bcs" + with mock.patch("sys.stdout", io.TextIOWrapper(StringIO(), encoding="ascii")): + assert execution._format_time(0.000001) == "1 us" + + +# Test %%capture magic. Added to test issue #13926 +def test_capture(): + ip = get_ipython() + + # Test %%capture nominal case + ip.run_cell("%%capture abc\n1+2") + with tt.AssertPrints("True", suppress=False): + ip.run_cell("'abc' in locals()") + with tt.AssertPrints("True", suppress=False): + ip.run_cell("'outputs' in dir(abc)") + with tt.AssertPrints("3", suppress=False): + ip.run_cell("abc.outputs[0]") + + # Test %%capture with ';' at end of expression + ip.run_cell("%%capture abc\n7+8;") + with tt.AssertPrints("False", suppress=False): + ip.run_cell("'abc' in locals()") + + +def test_doctest_mode(): + "Toggle doctest_mode twice, it should be a no-op and run without error" + _ip.run_line_magic("doctest_mode", "") + _ip.run_line_magic("doctest_mode", "") + + +def test_parse_options(): + """Tests for basic options parsing in magics.""" + # These are only the most minimal of tests, more should be added later. At + # the very least we check that basic text/unicode calls work OK. + m = DummyMagics(_ip) + assert m.parse_options("foo", "")[1] == "foo" + assert m.parse_options("foo", "")[1] == "foo" + + +def test_parse_options_preserve_non_option_string(): + """Test to assert preservation of non-option part of magic-block, while parsing magic options.""" + m = DummyMagics(_ip) + opts, stmt = m.parse_options( + " -n1 -r 13 _ = 314 + foo", "n:r:", preserve_non_opts=True + ) + assert opts == {"n": "1", "r": "13"} + assert stmt == "_ = 314 + foo" + + +def test_run_magic_preserve_code_block(): + """Test to assert preservation of non-option part of magic-block, while running magic.""" + _ip.user_ns["spaces"] = [] + _ip.run_line_magic( + "timeit", "-n1 -r1 spaces.append([s.count(' ') for s in ['document']])" + ) + assert _ip.user_ns["spaces"] == [[0]] + + +def test_dirops(): + """Test various directory handling operations.""" + # curpath = lambda :os.path.splitdrive(os.getcwd())[1].replace('\\','/') + curpath = os.getcwd + startdir = os.getcwd() + ipdir = os.path.realpath(_ip.ipython_dir) + try: + _ip.run_line_magic("cd", '"%s"' % ipdir) + assert curpath() == ipdir + _ip.run_line_magic("cd", "-") + assert curpath() == startdir + _ip.run_line_magic("pushd", '"%s"' % ipdir) + assert curpath() == ipdir + _ip.run_line_magic("popd", "") + assert curpath() == startdir + finally: + os.chdir(startdir) + + +def test_cd_force_quiet(): + """Test OSMagics.cd_force_quiet option""" + _ip.config.OSMagics.cd_force_quiet = True + osmagics = osm.OSMagics(shell=_ip) + + startdir = os.getcwd() + ipdir = os.path.realpath(_ip.ipython_dir) + + try: + with tt.AssertNotPrints(ipdir): + osmagics.cd('"%s"' % ipdir) + with tt.AssertNotPrints(startdir): + osmagics.cd('-') + finally: + os.chdir(startdir) + + +def test_xmode(): + # Calling xmode three times should be a no-op + xmode = _ip.InteractiveTB.mode + for i in range(4): + _ip.run_line_magic("xmode", "") + assert _ip.InteractiveTB.mode == xmode + +def test_reset_hard(): + monitor = [] + class A(object): + def __del__(self): + monitor.append(1) + def __repr__(self): + return "
    " + + _ip.user_ns["a"] = A() + _ip.run_cell("a") + + assert monitor == [] + _ip.run_line_magic("reset", "-f") + assert monitor == [1] + +class TestXdel(tt.TempFileMixin): + def test_xdel(self): + """Test that references from %run are cleared by xdel.""" + src = ("class A(object):\n" + " monitor = []\n" + " def __del__(self):\n" + " self.monitor.append(1)\n" + "a = A()\n") + self.mktmp(src) + # %run creates some hidden references... + _ip.run_line_magic("run", "%s" % self.fname) + # ... as does the displayhook. + _ip.run_cell("a") + + monitor = _ip.user_ns["A"].monitor + assert monitor == [] + + _ip.run_line_magic("xdel", "a") + + # Check that a's __del__ method has been called. + gc.collect(0) + assert monitor == [1] + +def doctest_who(): + """doctest for %who + + In [1]: %reset -sf + + In [2]: alpha = 123 + + In [3]: beta = 'beta' + + In [4]: %who int + alpha + + In [5]: %who str + beta + + In [6]: %whos + Variable Type Data/Info + ---------------------------- + alpha int 123 + beta str beta + + In [7]: %who_ls + Out[7]: ['alpha', 'beta'] + """ + +def test_whos(): + """Check that whos is protected against objects where repr() fails.""" + class A(object): + def __repr__(self): + raise Exception() + _ip.user_ns['a'] = A() + _ip.run_line_magic("whos", "") + +def doctest_precision(): + """doctest for %precision + + In [1]: f = get_ipython().display_formatter.formatters['text/plain'] + + In [2]: %precision 5 + Out[2]: '%.5f' + + In [3]: f.float_format + Out[3]: '%.5f' + + In [4]: %precision %e + Out[4]: '%e' + + In [5]: f(3.1415927) + Out[5]: '3.141593e+00' + """ + + +def test_debug_magic(): + """Test debugging a small code with %debug + + In [1]: with PdbTestInput(['c']): + ...: %debug print("a b") #doctest: +ELLIPSIS + ...: + ... + ipdb> c + a b + In [2]: + """ + + +def test_debug_magic_locals(): + """Test debugging a small code with %debug with locals + + In [1]: with PdbTestInput(['c']): + ...: def fun(): + ...: res = 1 + ...: %debug print(res) + ...: fun() + ...: + ... + ipdb> c + 1 + In [2]: + """ + +def test_psearch(): + with tt.AssertPrints("dict.fromkeys"): + _ip.run_cell("dict.fr*?") + with tt.AssertPrints("Ï€.is_integer"): + _ip.run_cell("Ï€ = 3.14;\nÏ€.is_integ*?") + +def test_timeit_shlex(): + """test shlex issues with timeit (#1109)""" + _ip.ex("def f(*a,**kw): pass") + _ip.run_line_magic("timeit", '-n1 "this is a bug".count(" ")') + _ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1)') + _ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1, " ", 2, " ")') + _ip.run_line_magic("timeit", '-r1 -n1 ("a " + "b")') + _ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b")') + _ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b ")') + + +def test_timeit_special_syntax(): + "Test %%timeit with IPython special syntax" + @register_line_magic + def lmagic(line): + ip = get_ipython() + ip.user_ns['lmagic_out'] = line + + # line mode test + _ip.run_line_magic("timeit", "-n1 -r1 %lmagic my line") + assert _ip.user_ns["lmagic_out"] == "my line" + # cell mode test + _ip.run_cell_magic("timeit", "-n1 -r1", "%lmagic my line2") + assert _ip.user_ns["lmagic_out"] == "my line2" + + +def test_timeit_return(): + """ + test whether timeit -o return object + """ + + res = _ip.run_line_magic('timeit','-n10 -r10 -o 1') + assert(res is not None) + +def test_timeit_quiet(): + """ + test quiet option of timeit magic + """ + with tt.AssertNotPrints("loops"): + _ip.run_cell("%timeit -n1 -r1 -q 1") + +def test_timeit_return_quiet(): + with tt.AssertNotPrints("loops"): + res = _ip.run_line_magic('timeit', '-n1 -r1 -q -o 1') + assert (res is not None) + +def test_timeit_invalid_return(): + with pytest.raises(SyntaxError): + _ip.run_line_magic('timeit', 'return') + +@dec.skipif(execution.profile is None) +def test_prun_special_syntax(): + "Test %%prun with IPython special syntax" + @register_line_magic + def lmagic(line): + ip = get_ipython() + ip.user_ns['lmagic_out'] = line + + # line mode test + _ip.run_line_magic("prun", "-q %lmagic my line") + assert _ip.user_ns["lmagic_out"] == "my line" + # cell mode test + _ip.run_cell_magic("prun", "-q", "%lmagic my line2") + assert _ip.user_ns["lmagic_out"] == "my line2" + + +@dec.skipif(execution.profile is None) +def test_prun_quotes(): + "Test that prun does not clobber string escapes (GH #1302)" + _ip.run_line_magic("prun", r"-q x = '\t'") + assert _ip.user_ns["x"] == "\t" + + +def test_extension(): + # Debugging information for failures of this test + print('sys.path:') + for p in sys.path: + print(' ', p) + print('CWD', os.getcwd()) + + pytest.raises(ImportError, _ip.run_line_magic, "load_ext", "daft_extension") + daft_path = os.path.join(os.path.dirname(__file__), "daft_extension") + sys.path.insert(0, daft_path) + try: + _ip.user_ns.pop('arq', None) + invalidate_caches() # Clear import caches + _ip.run_line_magic("load_ext", "daft_extension") + assert _ip.user_ns["arq"] == 185 + _ip.run_line_magic("unload_ext", "daft_extension") + assert 'arq' not in _ip.user_ns + finally: + sys.path.remove(daft_path) + + +def test_notebook_export_json(): + pytest.importorskip("nbformat") + _ip = get_ipython() + _ip.history_manager.reset() # Clear any existing history. + cmds = ["a=1", "def b():\n return a**2", "print('noël, été', b())"] + for i, cmd in enumerate(cmds, start=1): + _ip.history_manager.store_inputs(i, cmd) + with TemporaryDirectory() as td: + outfile = os.path.join(td, "nb.ipynb") + _ip.run_line_magic("notebook", "%s" % outfile) + + +class TestEnv(TestCase): + + def test_env(self): + env = _ip.run_line_magic("env", "") + self.assertTrue(isinstance(env, dict)) + + def test_env_secret(self): + env = _ip.run_line_magic("env", "") + hidden = "" + with mock.patch.dict( + os.environ, + { + "API_KEY": "abc123", + "SECRET_THING": "ssshhh", + "JUPYTER_TOKEN": "", + "VAR": "abc" + } + ): + env = _ip.run_line_magic("env", "") + assert env["API_KEY"] == hidden + assert env["SECRET_THING"] == hidden + assert env["JUPYTER_TOKEN"] == hidden + assert env["VAR"] == "abc" + + def test_env_get_set_simple(self): + env = _ip.run_line_magic("env", "var val1") + self.assertEqual(env, None) + self.assertEqual(os.environ["var"], "val1") + self.assertEqual(_ip.run_line_magic("env", "var"), "val1") + env = _ip.run_line_magic("env", "var=val2") + self.assertEqual(env, None) + self.assertEqual(os.environ['var'], 'val2') + + def test_env_get_set_complex(self): + env = _ip.run_line_magic("env", "var 'val1 '' 'val2") + self.assertEqual(env, None) + self.assertEqual(os.environ['var'], "'val1 '' 'val2") + self.assertEqual(_ip.run_line_magic("env", "var"), "'val1 '' 'val2") + env = _ip.run_line_magic("env", 'var=val2 val3="val4') + self.assertEqual(env, None) + self.assertEqual(os.environ['var'], 'val2 val3="val4') + + def test_env_set_bad_input(self): + self.assertRaises(UsageError, lambda: _ip.run_line_magic("set_env", "var")) + + def test_env_set_whitespace(self): + self.assertRaises(UsageError, lambda: _ip.run_line_magic("env", "var A=B")) + + +class CellMagicTestCase(TestCase): + + def check_ident(self, magic): + # Manually called, we get the result + out = _ip.run_cell_magic(magic, "a", "b") + assert out == ("a", "b") + # Via run_cell, it goes into the user's namespace via displayhook + _ip.run_cell("%%" + magic + " c\nd\n") + assert _ip.user_ns["_"] == ("c", "d\n") + + def test_cell_magic_func_deco(self): + "Cell magic using simple decorator" + @register_cell_magic + def cellm(line, cell): + return line, cell + + self.check_ident('cellm') + + def test_cell_magic_reg(self): + "Cell magic manually registered" + def cellm(line, cell): + return line, cell + + _ip.register_magic_function(cellm, 'cell', 'cellm2') + self.check_ident('cellm2') + + def test_cell_magic_class(self): + "Cell magics declared via a class" + @magics_class + class MyMagics(Magics): + + @cell_magic + def cellm3(self, line, cell): + return line, cell + + _ip.register_magics(MyMagics) + self.check_ident('cellm3') + + def test_cell_magic_class2(self): + "Cell magics declared via a class, #2" + @magics_class + class MyMagics2(Magics): + + @cell_magic('cellm4') + def cellm33(self, line, cell): + return line, cell + + _ip.register_magics(MyMagics2) + self.check_ident('cellm4') + # Check that nothing is registered as 'cellm33' + c33 = _ip.find_cell_magic('cellm33') + assert c33 == None + +def test_file(): + """Basic %%writefile""" + ip = get_ipython() + with TemporaryDirectory() as td: + fname = os.path.join(td, "file1") + ip.run_cell_magic( + "writefile", + fname, + "\n".join( + [ + "line1", + "line2", + ] + ), + ) + s = Path(fname).read_text(encoding="utf-8") + assert "line1\n" in s + assert "line2" in s + + +@dec.skip_win32 +def test_file_single_quote(): + """Basic %%writefile with embedded single quotes""" + ip = get_ipython() + with TemporaryDirectory() as td: + fname = os.path.join(td, "'file1'") + ip.run_cell_magic( + "writefile", + fname, + "\n".join( + [ + "line1", + "line2", + ] + ), + ) + s = Path(fname).read_text(encoding="utf-8") + assert "line1\n" in s + assert "line2" in s + + +@dec.skip_win32 +def test_file_double_quote(): + """Basic %%writefile with embedded double quotes""" + ip = get_ipython() + with TemporaryDirectory() as td: + fname = os.path.join(td, '"file1"') + ip.run_cell_magic( + "writefile", + fname, + "\n".join( + [ + "line1", + "line2", + ] + ), + ) + s = Path(fname).read_text(encoding="utf-8") + assert "line1\n" in s + assert "line2" in s + + +def test_file_var_expand(): + """%%writefile $filename""" + ip = get_ipython() + with TemporaryDirectory() as td: + fname = os.path.join(td, "file1") + ip.user_ns["filename"] = fname + ip.run_cell_magic( + "writefile", + "$filename", + "\n".join( + [ + "line1", + "line2", + ] + ), + ) + s = Path(fname).read_text(encoding="utf-8") + assert "line1\n" in s + assert "line2" in s + + +def test_file_unicode(): + """%%writefile with unicode cell""" + ip = get_ipython() + with TemporaryDirectory() as td: + fname = os.path.join(td, 'file1') + ip.run_cell_magic("writefile", fname, u'\n'.join([ + u'liné1', + u'liné2', + ])) + with io.open(fname, encoding='utf-8') as f: + s = f.read() + assert "liné1\n" in s + assert "liné2" in s + + +def test_file_amend(): + """%%writefile -a amends files""" + ip = get_ipython() + with TemporaryDirectory() as td: + fname = os.path.join(td, "file2") + ip.run_cell_magic( + "writefile", + fname, + "\n".join( + [ + "line1", + "line2", + ] + ), + ) + ip.run_cell_magic( + "writefile", + "-a %s" % fname, + "\n".join( + [ + "line3", + "line4", + ] + ), + ) + s = Path(fname).read_text(encoding="utf-8") + assert "line1\n" in s + assert "line3\n" in s + + +def test_file_spaces(): + """%%file with spaces in filename""" + ip = get_ipython() + with TemporaryWorkingDirectory() as td: + fname = "file name" + ip.run_cell_magic( + "file", + '"%s"' % fname, + "\n".join( + [ + "line1", + "line2", + ] + ), + ) + s = Path(fname).read_text(encoding="utf-8") + assert "line1\n" in s + assert "line2" in s + + +def test_script_config(): + ip = get_ipython() + ip.config.ScriptMagics.script_magics = ['whoda'] + sm = script.ScriptMagics(shell=ip) + assert "whoda" in sm.magics["cell"] + + +def _interrupt_after_1s(): + sleep(1) + signal.raise_signal(signal.SIGINT) + + +def test_script_raise_on_interrupt(): + ip = get_ipython() + + with pytest.raises(CalledProcessError): + thread = Thread(target=_interrupt_after_1s) + thread.start() + ip.run_cell_magic( + "script", f"{sys.executable}", "from time import sleep; sleep(2)" + ) + thread.join() + + +def test_script_do_not_raise_on_interrupt(): + ip = get_ipython() + + thread = Thread(target=_interrupt_after_1s) + thread.start() + ip.run_cell_magic( + "script", + f"--no-raise-error {sys.executable}", + "from time import sleep; sleep(2)", + ) + thread.join() + + +def test_script_out(): + ip = get_ipython() + ip.run_cell_magic("script", f"--out output {sys.executable}", "print('hi')") + assert ip.user_ns["output"].strip() == "hi" + + +def test_script_err(): + ip = get_ipython() + ip.run_cell_magic( + "script", + f"--err error {sys.executable}", + "import sys; print('hello', file=sys.stderr)", + ) + assert ip.user_ns["error"].strip() == "hello" + + +def test_script_out_err(): + ip = get_ipython() + ip.run_cell_magic( + "script", + f"--out output --err error {sys.executable}", + "\n".join( + [ + "import sys", + "print('hi')", + "print('hello', file=sys.stderr)", + ] + ), + ) + assert ip.user_ns["output"].strip() == "hi" + assert ip.user_ns["error"].strip() == "hello" + + +async def test_script_bg_out(): + ip = get_ipython() + ip.run_cell_magic("script", f"--bg --out output {sys.executable}", "print('hi')") + assert (await ip.user_ns["output"].read()).strip() == b"hi" + assert ip.user_ns["output"].at_eof() + + +async def test_script_bg_err(): + ip = get_ipython() + ip.run_cell_magic( + "script", + f"--bg --err error {sys.executable}", + "import sys; print('hello', file=sys.stderr)", + ) + assert (await ip.user_ns["error"].read()).strip() == b"hello" + assert ip.user_ns["error"].at_eof() + + +async def test_script_bg_out_err(): + ip = get_ipython() + ip.run_cell_magic( + "script", + f"--bg --out output --err error {sys.executable}", + "\n".join( + [ + "import sys", + "print('hi')", + "print('hello', file=sys.stderr)", + ] + ), + ) + assert (await ip.user_ns["output"].read()).strip() == b"hi" + assert (await ip.user_ns["error"].read()).strip() == b"hello" + assert ip.user_ns["output"].at_eof() + assert ip.user_ns["error"].at_eof() + + +async def test_script_bg_proc(): + ip = get_ipython() + ip.run_cell_magic( + "script", + f"--bg --out output --proc p {sys.executable}", + "\n".join( + [ + "import sys", + "print('hi')", + "print('hello', file=sys.stderr)", + ] + ), + ) + p = ip.user_ns["p"] + await p.wait() + assert p.returncode == 0 + assert (await p.stdout.read()).strip() == b"hi" + # not captured, so empty + assert (await p.stderr.read()) == b"" + assert p.stdout.at_eof() + assert p.stderr.at_eof() + + +def test_script_defaults(): + ip = get_ipython() + for cmd in ['sh', 'bash', 'perl', 'ruby']: + try: + find_cmd(cmd) + except Exception: + pass + else: + assert cmd in ip.magics_manager.magics["cell"] + + +async def test_script_streams_continiously(capsys): + ip = get_ipython() + # Windows is slow to start up a thread on CI + is_windows = os.name == "nt" + step = 3 if is_windows else 1 + code = dedent( + f"""\ + import time + for _ in range(3): + time.sleep({step}) + print(".", flush=True, end="") + """ + ) + + def print_numbers(): + for i in range(3): + sleep(step) + print(i, flush=True, end="") + + thread = Thread(target=print_numbers) + thread.start() + sleep(step / 2) + ip.run_cell_magic("script", f"{sys.executable}", code) + thread.join() + + captured = capsys.readouterr() + # If the streaming was line-wise or broken + # we would get `012...` + assert captured.out == "0.1.2." + + +@magics_class +class FooFoo(Magics): + """class with both %foo and %%foo magics""" + @line_magic('foo') + def line_foo(self, line): + "I am line foo" + pass + + @cell_magic("foo") + def cell_foo(self, line, cell): + "I am cell foo, not line foo" + pass + +def test_line_cell_info(): + """%%foo and %foo magics are distinguishable to inspect""" + ip = get_ipython() + ip.magics_manager.register(FooFoo) + oinfo = ip.object_inspect("foo") + assert oinfo["found"] is True + assert oinfo["ismagic"] is True + + oinfo = ip.object_inspect("%%foo") + assert oinfo["found"] is True + assert oinfo["ismagic"] is True + assert oinfo["docstring"] == FooFoo.cell_foo.__doc__ + + oinfo = ip.object_inspect("%foo") + assert oinfo["found"] is True + assert oinfo["ismagic"] is True + assert oinfo["docstring"] == FooFoo.line_foo.__doc__ + + +def test_multiple_magics(): + ip = get_ipython() + foo1 = FooFoo(ip) + foo2 = FooFoo(ip) + mm = ip.magics_manager + mm.register(foo1) + assert mm.magics["line"]["foo"].__self__ is foo1 + mm.register(foo2) + assert mm.magics["line"]["foo"].__self__ is foo2 + + +def test_alias_magic(): + """Test %alias_magic.""" + ip = get_ipython() + mm = ip.magics_manager + + # Basic operation: both cell and line magics are created, if possible. + ip.run_line_magic("alias_magic", "timeit_alias timeit") + assert "timeit_alias" in mm.magics["line"] + assert "timeit_alias" in mm.magics["cell"] + + # --cell is specified, line magic not created. + ip.run_line_magic("alias_magic", "--cell timeit_cell_alias timeit") + assert "timeit_cell_alias" not in mm.magics["line"] + assert "timeit_cell_alias" in mm.magics["cell"] + + # Test that line alias is created successfully. + ip.run_line_magic("alias_magic", "--line env_alias env") + assert ip.run_line_magic("env", "") == ip.run_line_magic("env_alias", "") + + # Test that line alias with parameters passed in is created successfully. + ip.run_line_magic( + "alias_magic", "--line history_alias history --params " + shlex.quote("3") + ) + assert "history_alias" in mm.magics["line"] + + +def test_save(): + """Test %save.""" + ip = get_ipython() + ip.history_manager.reset() # Clear any existing history. + cmds = ["a=1", "def b():\n return a**2", "print(a, b())"] + for i, cmd in enumerate(cmds, start=1): + ip.history_manager.store_inputs(i, cmd) + with TemporaryDirectory() as tmpdir: + file = os.path.join(tmpdir, "testsave.py") + ip.run_line_magic("save", "%s 1-10" % file) + content = Path(file).read_text(encoding="utf-8") + assert content.count(cmds[0]) == 1 + assert "coding: utf-8" in content + ip.run_line_magic("save", "-a %s 1-10" % file) + content = Path(file).read_text(encoding="utf-8") + assert content.count(cmds[0]) == 2 + assert "coding: utf-8" in content + + +def test_save_with_no_args(): + ip = get_ipython() + ip.history_manager.reset() # Clear any existing history. + cmds = ["a=1", "def b():\n return a**2", "print(a, b())", "%save"] + for i, cmd in enumerate(cmds, start=1): + ip.history_manager.store_inputs(i, cmd) + + with TemporaryDirectory() as tmpdir: + path = os.path.join(tmpdir, "testsave.py") + ip.run_line_magic("save", path) + content = Path(path).read_text(encoding="utf-8") + expected_content = dedent( + """\ + # coding: utf-8 + a=1 + def b(): + return a**2 + print(a, b()) + """ + ) + assert content == expected_content + + +def test_store(): + """Test %store.""" + ip = get_ipython() + ip.run_line_magic('load_ext', 'storemagic') + + # make sure the storage is empty + ip.run_line_magic("store", "-z") + ip.user_ns["var"] = 42 + ip.run_line_magic("store", "var") + ip.user_ns["var"] = 39 + ip.run_line_magic("store", "-r") + assert ip.user_ns["var"] == 42 + + ip.run_line_magic("store", "-d var") + ip.user_ns["var"] = 39 + ip.run_line_magic("store", "-r") + assert ip.user_ns["var"] == 39 + + +def _run_edit_test(arg_s, exp_filename=None, + exp_lineno=-1, + exp_contents=None, + exp_is_temp=None): + ip = get_ipython() + M = code.CodeMagics(ip) + last_call = ['',''] + opts,args = M.parse_options(arg_s,'prxn:') + filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call) + + if exp_filename is not None: + assert exp_filename == filename + if exp_contents is not None: + with io.open(filename, 'r', encoding='utf-8') as f: + contents = f.read() + assert exp_contents == contents + if exp_lineno != -1: + assert exp_lineno == lineno + if exp_is_temp is not None: + assert exp_is_temp == is_temp + + +def test_edit_interactive(): + """%edit on interactively defined objects""" + ip = get_ipython() + n = ip.execution_count + ip.run_cell("def foo(): return 1", store_history=True) + + with pytest.raises(code.InteractivelyDefined) as e: + _run_edit_test("foo") + assert e.value.index == n + + +def test_edit_cell(): + """%edit [cell id]""" + ip = get_ipython() + + ip.run_cell("def foo(): return 1", store_history=True) + + # test + _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True) + +def test_edit_fname(): + """%edit file""" + # test + _run_edit_test("test file.py", exp_filename="test file.py") + +def test_bookmark(): + ip = get_ipython() + ip.run_line_magic('bookmark', 'bmname') + with tt.AssertPrints('bmname'): + ip.run_line_magic('bookmark', '-l') + ip.run_line_magic('bookmark', '-d bmname') + +def test_ls_magic(): + ip = get_ipython() + json_formatter = ip.display_formatter.formatters['application/json'] + json_formatter.enabled = True + lsmagic = ip.run_line_magic("lsmagic", "") + with warnings.catch_warnings(record=True) as w: + j = json_formatter(lsmagic) + assert sorted(j) == ["cell", "line"] + assert w == [] # no warnings + + +def test_strip_initial_indent(): + def sii(s): + lines = s.splitlines() + return '\n'.join(code.strip_initial_indent(lines)) + + assert sii(" a = 1\nb = 2") == "a = 1\nb = 2" + assert sii(" a\n b\nc") == "a\n b\nc" + assert sii("a\n b") == "a\n b" + +def test_logging_magic_quiet_from_arg(): + _ip.config.LoggingMagics.quiet = False + lm = logging.LoggingMagics(shell=_ip) + with TemporaryDirectory() as td: + try: + with tt.AssertNotPrints(re.compile("Activating.*")): + lm.logstart('-q {}'.format( + os.path.join(td, "quiet_from_arg.log"))) + finally: + _ip.logger.logstop() + +def test_logging_magic_quiet_from_config(): + _ip.config.LoggingMagics.quiet = True + lm = logging.LoggingMagics(shell=_ip) + with TemporaryDirectory() as td: + try: + with tt.AssertNotPrints(re.compile("Activating.*")): + lm.logstart(os.path.join(td, "quiet_from_config.log")) + finally: + _ip.logger.logstop() + + +def test_logging_magic_not_quiet(): + _ip.config.LoggingMagics.quiet = False + lm = logging.LoggingMagics(shell=_ip) + with TemporaryDirectory() as td: + try: + with tt.AssertPrints(re.compile("Activating.*")): + lm.logstart(os.path.join(td, "not_quiet.log")) + finally: + _ip.logger.logstop() + + +def test_time_no_var_expand(): + _ip.user_ns["a"] = 5 + _ip.user_ns["b"] = [] + _ip.run_line_magic("time", 'b.append("{a}")') + assert _ip.user_ns["b"] == ["{a}"] + + +# this is slow, put at the end for local testing. +def test_timeit_arguments(): + "Test valid timeit arguments, should not cause SyntaxError (GH #1269)" + _ip.run_line_magic("timeit", "-n1 -r1 a=('#')") + + +MINIMAL_LAZY_MAGIC = """ +from IPython.core.magic import ( + Magics, + magics_class, + line_magic, + cell_magic, +) + + +@magics_class +class LazyMagics(Magics): + @line_magic + def lazy_line(self, line): + print("Lazy Line") + + @cell_magic + def lazy_cell(self, line, cell): + print("Lazy Cell") + + +def load_ipython_extension(ipython): + ipython.register_magics(LazyMagics) +""" + + +def test_lazy_magics(): + with pytest.raises(UsageError): + ip.run_line_magic("lazy_line", "") + + startdir = os.getcwd() + + with TemporaryDirectory() as tmpdir: + with prepended_to_syspath(tmpdir): + ptempdir = Path(tmpdir) + tf = ptempdir / "lazy_magic_module.py" + tf.write_text(MINIMAL_LAZY_MAGIC) + ip.magics_manager.register_lazy("lazy_line", Path(tf.name).name[:-3]) + with tt.AssertPrints("Lazy Line"): + ip.run_line_magic("lazy_line", "") + + +TEST_MODULE = """ +print('Loaded my_tmp') +if __name__ == "__main__": + print('I just ran a script') +""" + +def test_run_module_from_import_hook(): + "Test that a module can be loaded via an import hook" + with TemporaryDirectory() as tmpdir: + fullpath = os.path.join(tmpdir, "my_tmp.py") + Path(fullpath).write_text(TEST_MODULE, encoding="utf-8") + + import importlib.abc + import importlib.util + + class MyTempImporter(importlib.abc.MetaPathFinder, importlib.abc.SourceLoader): + def find_spec(self, fullname, path, target=None): + if fullname == "my_tmp": + return importlib.util.spec_from_loader(fullname, self) + + def get_filename(self, fullname): + assert fullname == "my_tmp" + return fullpath + + def get_data(self, path): + assert Path(path).samefile(fullpath) + return Path(fullpath).read_text(encoding="utf-8") + + sys.meta_path.insert(0, MyTempImporter()) + + with capture_output() as captured: + _ip.run_line_magic("run", "-m my_tmp") + _ip.run_cell("import my_tmp") + + output = "Loaded my_tmp\nI just ran a script\nLoaded my_tmp\n" + assert output == captured.stdout + + sys.meta_path.pop(0) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py new file mode 100644 index 0000000..0044163 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py @@ -0,0 +1,142 @@ +#----------------------------------------------------------------------------- +# Copyright (C) 2010-2011, IPython Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- + +import argparse +import sys + +from IPython.core.magic_arguments import (argument, argument_group, kwds, + magic_arguments, parse_argstring, real_name) + +LEADING_SPACE = "" if sys.version_info > (3, 13) else " " + + +@magic_arguments() +@argument('-f', '--foo', help="an argument") +def magic_foo1(self, args): + """ A docstring. + """ + return parse_argstring(magic_foo1, args) + + +@magic_arguments() +def magic_foo2(self, args): + """ A docstring. + """ + return parse_argstring(magic_foo2, args) + + +@magic_arguments() +@argument('-f', '--foo', help="an argument") +@argument_group('Group') +@argument('-b', '--bar', help="a grouped argument") +@argument_group('Second Group') +@argument('-z', '--baz', help="another grouped argument") +def magic_foo3(self, args): + """ A docstring. + """ + return parse_argstring(magic_foo3, args) + + +@magic_arguments() +@kwds(argument_default=argparse.SUPPRESS) +@argument('-f', '--foo', help="an argument") +def magic_foo4(self, args): + """ A docstring. + """ + return parse_argstring(magic_foo4, args) + + +@magic_arguments('frobnicate') +@argument('-f', '--foo', help="an argument") +def magic_foo5(self, args): + """ A docstring. + """ + return parse_argstring(magic_foo5, args) + + +@magic_arguments() +@argument('-f', '--foo', help="an argument") +def magic_magic_foo(self, args): + """ A docstring. + """ + return parse_argstring(magic_magic_foo, args) + + +@magic_arguments() +@argument('-f', '--foo', help="an argument") +def foo(self, args): + """ A docstring. + """ + return parse_argstring(foo, args) + + +def test_magic_arguments(): + # “optional arguments†was replaced with “options†in argparse help + # https://docs.python.org/3/whatsnew/3.10.html#argparse + # https://bugs.python.org/issue9694 + options = "optional arguments" if sys.version_info < (3, 10) else "options" + + assert ( + magic_foo1.__doc__ + == f"::\n\n %foo1 [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" + ) + assert getattr(magic_foo1, "argcmd_name", None) == None + assert real_name(magic_foo1) == "foo1" + assert magic_foo1(None, "") == argparse.Namespace(foo=None) + assert hasattr(magic_foo1, "has_arguments") + + assert magic_foo2.__doc__ == f"::\n\n %foo2\n\n{LEADING_SPACE}A docstring.\n" + assert getattr(magic_foo2, "argcmd_name", None) == None + assert real_name(magic_foo2) == "foo2" + assert magic_foo2(None, "") == argparse.Namespace() + assert hasattr(magic_foo2, "has_arguments") + + assert ( + magic_foo3.__doc__ + == f"::\n\n %foo3 [-f FOO] [-b BAR] [-z BAZ]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n\nGroup:\n -b BAR, --bar BAR a grouped argument\n\nSecond Group:\n -z BAZ, --baz BAZ another grouped argument\n" + ) + assert getattr(magic_foo3, "argcmd_name", None) == None + assert real_name(magic_foo3) == "foo3" + assert magic_foo3(None, "") == argparse.Namespace(bar=None, baz=None, foo=None) + assert hasattr(magic_foo3, "has_arguments") + + assert ( + magic_foo4.__doc__ + == f"::\n\n %foo4 [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" + ) + assert getattr(magic_foo4, "argcmd_name", None) == None + assert real_name(magic_foo4) == "foo4" + assert magic_foo4(None, "") == argparse.Namespace() + assert hasattr(magic_foo4, "has_arguments") + + assert ( + magic_foo5.__doc__ + == f"::\n\n %frobnicate [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" + ) + assert getattr(magic_foo5, "argcmd_name", None) == "frobnicate" + assert real_name(magic_foo5) == "frobnicate" + assert magic_foo5(None, "") == argparse.Namespace(foo=None) + assert hasattr(magic_foo5, "has_arguments") + + assert ( + magic_magic_foo.__doc__ + == f"::\n\n %magic_foo [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" + ) + assert getattr(magic_magic_foo, "argcmd_name", None) == None + assert real_name(magic_magic_foo) == "magic_foo" + assert magic_magic_foo(None, "") == argparse.Namespace(foo=None) + assert hasattr(magic_magic_foo, "has_arguments") + + assert ( + foo.__doc__ + == f"::\n\n %foo [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" + ) + assert getattr(foo, "argcmd_name", None) == None + assert real_name(foo) == "foo" + assert foo(None, "") == argparse.Namespace(foo=None) + assert hasattr(foo, "has_arguments") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py new file mode 100644 index 0000000..5dfa0f0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py @@ -0,0 +1,216 @@ +"""Tests for various magic functions specific to the terminal frontend.""" + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +import sys +from io import StringIO +from unittest import TestCase + +from IPython.testing import tools as tt +#----------------------------------------------------------------------------- +# Test functions begin +#----------------------------------------------------------------------------- + + +MINIMAL_LAZY_MAGIC = """ +from IPython.core.magic import ( + Magics, + magics_class, + line_magic, + cell_magic, +) + + +@magics_class +class LazyMagics(Magics): + @line_magic + def lazy_line(self, line): + print("Lazy Line") + + @cell_magic + def lazy_cell(self, line, cell): + print("Lazy Cell") + + +def load_ipython_extension(ipython): + ipython.register_magics(LazyMagics) +""" + +def check_cpaste(code, should_fail=False): + """Execute code via 'cpaste' and ensure it was executed, unless + should_fail is set. + """ + ip.user_ns['code_ran'] = False + + src = StringIO() + src.write(code) + src.write('\n--\n') + src.seek(0) + + stdin_save = sys.stdin + sys.stdin = src + + try: + context = tt.AssertPrints if should_fail else tt.AssertNotPrints + with context("Traceback (most recent call last)"): + ip.run_line_magic("cpaste", "") + + if not should_fail: + assert ip.user_ns['code_ran'], "%r failed" % code + finally: + sys.stdin = stdin_save + +def test_cpaste(): + """Test cpaste magic""" + + def runf(): + """Marker function: sets a flag when executed. + """ + ip.user_ns['code_ran'] = True + return 'runf' # return string so '+ runf()' doesn't result in success + + tests = {'pass': ["runf()", + "In [1]: runf()", + "In [1]: if 1:\n ...: runf()", + "> > > runf()", + ">>> runf()", + " >>> runf()", + ], + + 'fail': ["1 + runf()", + "++ runf()", + ]} + + ip.user_ns['runf'] = runf + + for code in tests['pass']: + check_cpaste(code) + + for code in tests['fail']: + check_cpaste(code, should_fail=True) + + + +class PasteTestCase(TestCase): + """Multiple tests for clipboard pasting""" + + def paste(self, txt, flags='-q'): + """Paste input text, by default in quiet mode""" + ip.hooks.clipboard_get = lambda: txt + ip.run_line_magic("paste", flags) + + def setUp(self): + # Inject fake clipboard hook but save original so we can restore it later + self.original_clip = ip.hooks.clipboard_get + + def tearDown(self): + # Restore original hook + ip.hooks.clipboard_get = self.original_clip + + def test_paste(self): + ip.user_ns.pop("x", None) + self.paste("x = 1") + self.assertEqual(ip.user_ns["x"], 1) + ip.user_ns.pop("x") + + def test_paste_pyprompt(self): + ip.user_ns.pop("x", None) + self.paste(">>> x=2") + self.assertEqual(ip.user_ns["x"], 2) + ip.user_ns.pop("x") + + def test_paste_py_multi(self): + self.paste( + """ + >>> x = [1,2,3] + >>> y = [] + >>> for i in x: + ... y.append(i**2) + ... + """ + ) + self.assertEqual(ip.user_ns["x"], [1, 2, 3]) + self.assertEqual(ip.user_ns["y"], [1, 4, 9]) + + def test_paste_py_multi_r(self): + "Now, test that self.paste -r works" + self.test_paste_py_multi() + self.assertEqual(ip.user_ns.pop("x"), [1, 2, 3]) + self.assertEqual(ip.user_ns.pop("y"), [1, 4, 9]) + self.assertFalse("x" in ip.user_ns) + ip.run_line_magic("paste", "-r") + self.assertEqual(ip.user_ns["x"], [1, 2, 3]) + self.assertEqual(ip.user_ns["y"], [1, 4, 9]) + + def test_paste_email(self): + "Test pasting of email-quoted contents" + self.paste( + """\ + >> def foo(x): + >> return x + 1 + >> xx = foo(1.1)""" + ) + self.assertEqual(ip.user_ns["xx"], 2.1) + + def test_paste_email2(self): + "Email again; some programs add a space also at each quoting level" + self.paste( + """\ + > > def foo(x): + > > return x + 1 + > > yy = foo(2.1) """ + ) + self.assertEqual(ip.user_ns["yy"], 3.1) + + def test_paste_email_py(self): + "Email quoting of interactive input" + self.paste( + """\ + >> >>> def f(x): + >> ... return x+1 + >> ... + >> >>> zz = f(2.5) """ + ) + self.assertEqual(ip.user_ns["zz"], 3.5) + + def test_paste_echo(self): + "Also test self.paste echoing, by temporarily faking the writer" + w = StringIO() + old_write = sys.stdout.write + sys.stdout.write = w.write + code = """ + a = 100 + b = 200""" + try: + self.paste(code,'') + out = w.getvalue() + finally: + sys.stdout.write = old_write + self.assertEqual(ip.user_ns["a"], 100) + self.assertEqual(ip.user_ns["b"], 200) + assert out == code + "\n## -- End pasted text --\n" + + def test_paste_leading_commas(self): + "Test multiline strings with leading commas" + tm = ip.magics_manager.registry['TerminalMagics'] + s = '''\ +a = """ +,1,2,3 +"""''' + ip.user_ns.pop("foo", None) + tm.store_or_execute(s, "foo") + self.assertIn("foo", ip.user_ns) + + def test_paste_trailing_question(self): + "Test pasting sources with trailing question marks" + tm = ip.magics_manager.registry['TerminalMagics'] + s = '''\ +def funcfoo(): + if True: #am i true? + return 'fooresult' +''' + ip.user_ns.pop('funcfoo', None) + self.paste(s) + self.assertEqual(ip.user_ns["funcfoo"](), "fooresult") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py new file mode 100644 index 0000000..ac7c365 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py @@ -0,0 +1,589 @@ +"""Tests for the object inspection functionality. +""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + + +from contextlib import contextmanager +from inspect import signature, Signature, Parameter +import inspect +import os +import pytest +import re +import sys + +from .. import oinspect + +from decorator import decorator + +from IPython.testing.tools import AssertPrints, AssertNotPrints +from IPython.utils.path import compress_user + + +#----------------------------------------------------------------------------- +# Globals and constants +#----------------------------------------------------------------------------- + +inspector = None + +def setup_module(): + global inspector + inspector = oinspect.Inspector() + + +class SourceModuleMainTest: + __module__ = "__main__" + + +#----------------------------------------------------------------------------- +# Local utilities +#----------------------------------------------------------------------------- + +# WARNING: since this test checks the line number where a function is +# defined, if any code is inserted above, the following line will need to be +# updated. Do NOT insert any whitespace between the next line and the function +# definition below. +THIS_LINE_NUMBER = 47 # Put here the actual number of this line + + +def test_find_source_lines(): + assert oinspect.find_source_lines(test_find_source_lines) == THIS_LINE_NUMBER + 3 + assert oinspect.find_source_lines(type) is None + assert oinspect.find_source_lines(SourceModuleMainTest) is None + assert oinspect.find_source_lines(SourceModuleMainTest()) is None + + +def test_getsource(): + assert oinspect.getsource(type) is None + assert oinspect.getsource(SourceModuleMainTest) is None + assert oinspect.getsource(SourceModuleMainTest()) is None + + +def test_inspect_getfile_raises_exception(): + """Check oinspect.find_file/getsource/find_source_lines expectations""" + with pytest.raises(TypeError): + inspect.getfile(type) + with pytest.raises(OSError): + inspect.getfile(SourceModuleMainTest) + + +# A couple of utilities to ensure these tests work the same from a source or a +# binary install +def pyfile(fname): + return os.path.normcase(re.sub('.py[co]$', '.py', fname)) + + +def match_pyfiles(f1, f2): + assert pyfile(f1) == pyfile(f2) + + +def test_find_file(): + match_pyfiles(oinspect.find_file(test_find_file), os.path.abspath(__file__)) + assert oinspect.find_file(type) is None + assert oinspect.find_file(SourceModuleMainTest) is None + assert oinspect.find_file(SourceModuleMainTest()) is None + + +def test_find_file_decorated1(): + + @decorator + def noop1(f): + def wrapper(*a, **kw): + return f(*a, **kw) + return wrapper + + @noop1 + def f(x): + "My docstring" + + match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__)) + assert f.__doc__ == "My docstring" + + +def test_find_file_decorated2(): + + @decorator + def noop2(f, *a, **kw): + return f(*a, **kw) + + @noop2 + @noop2 + @noop2 + def f(x): + "My docstring 2" + + match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__)) + assert f.__doc__ == "My docstring 2" + + +def test_find_file_magic(): + run = ip.find_line_magic('run') + assert oinspect.find_file(run) is not None + + +# A few generic objects we can then inspect in the tests below + +class Call(object): + """This is the class docstring.""" + + def __init__(self, x, y=1): + """This is the constructor docstring.""" + + def __call__(self, *a, **kw): + """This is the call docstring.""" + + def method(self, x, z=2): + """Some method's docstring""" + +class HasSignature(object): + """This is the class docstring.""" + __signature__ = Signature([Parameter('test', Parameter.POSITIONAL_OR_KEYWORD)]) + + def __init__(self, *args): + """This is the init docstring""" + + +class SimpleClass(object): + def method(self, x, z=2): + """Some method's docstring""" + + +class Awkward(object): + def __getattr__(self, name): + raise Exception(name) + +class NoBoolCall: + """ + callable with `__bool__` raising should still be inspect-able. + """ + + def __call__(self): + """does nothing""" + pass + + def __bool__(self): + """just raise NotImplemented""" + raise NotImplementedError('Must be implemented') + + +class SerialLiar(object): + """Attribute accesses always get another copy of the same class. + + unittest.mock.call does something similar, but it's not ideal for testing + as the failure mode is to eat all your RAM. This gives up after 10k levels. + """ + def __init__(self, max_fibbing_twig, lies_told=0): + if lies_told > 10000: + raise RuntimeError('Nose too long, honesty is the best policy') + self.max_fibbing_twig = max_fibbing_twig + self.lies_told = lies_told + max_fibbing_twig[0] = max(max_fibbing_twig[0], lies_told) + + def __getattr__(self, item): + return SerialLiar(self.max_fibbing_twig, self.lies_told + 1) + +#----------------------------------------------------------------------------- +# Tests +#----------------------------------------------------------------------------- + +def test_info(): + "Check that Inspector.info fills out various fields as expected." + i = inspector.info(Call, oname="Call") + assert i["type_name"] == "type" + expected_class = str(type(type)) # (Python 3) or + assert i["base_class"] == expected_class + assert re.search( + "", + i["string_form"], + ) + fname = __file__ + if fname.endswith(".pyc"): + fname = fname[:-1] + # case-insensitive comparison needed on some filesystems + # e.g. Windows: + assert i["file"].lower() == compress_user(fname).lower() + assert i["definition"] == None + assert i["docstring"] == Call.__doc__ + assert i["source"] == None + assert i["isclass"] is True + assert i["init_definition"] == "Call(x, y=1)" + assert i["init_docstring"] == Call.__init__.__doc__ + + i = inspector.info(Call, detail_level=1) + assert i["source"] is not None + assert i["docstring"] == None + + c = Call(1) + c.__doc__ = "Modified instance docstring" + i = inspector.info(c) + assert i["type_name"] == "Call" + assert i["docstring"] == "Modified instance docstring" + assert i["class_docstring"] == Call.__doc__ + assert i["init_docstring"] == Call.__init__.__doc__ + assert i["call_docstring"] == Call.__call__.__doc__ + + +def test_class_signature(): + info = inspector.info(HasSignature, "HasSignature") + assert info["init_definition"] == "HasSignature(test)" + assert info["init_docstring"] == HasSignature.__init__.__doc__ + + +def test_info_awkward(): + # Just test that this doesn't throw an error. + inspector.info(Awkward()) + +def test_bool_raise(): + inspector.info(NoBoolCall()) + +def test_info_serialliar(): + fib_tracker = [0] + inspector.info(SerialLiar(fib_tracker)) + + # Nested attribute access should be cut off at 100 levels deep to avoid + # infinite loops: https://github.com/ipython/ipython/issues/9122 + assert fib_tracker[0] < 9000 + +def support_function_one(x, y=2, *a, **kw): + """A simple function.""" + +def test_calldef_none(): + # We should ignore __call__ for all of these. + for obj in [support_function_one, SimpleClass().method, any, str.upper]: + i = inspector.info(obj) + assert i["call_def"] is None + + +def f_kwarg(pos, *, kwonly): + pass + +def test_definition_kwonlyargs(): + i = inspector.info(f_kwarg, oname="f_kwarg") # analysis:ignore + assert i["definition"] == "f_kwarg(pos, *, kwonly)" + + +def test_getdoc(): + class A(object): + """standard docstring""" + pass + + class B(object): + """standard docstring""" + def getdoc(self): + return "custom docstring" + + class C(object): + """standard docstring""" + def getdoc(self): + return None + + a = A() + b = B() + c = C() + + assert oinspect.getdoc(a) == "standard docstring" + assert oinspect.getdoc(b) == "custom docstring" + assert oinspect.getdoc(c) == "standard docstring" + + +def test_empty_property_has_no_source(): + i = inspector.info(property(), detail_level=1) + assert i["source"] is None + + +def test_property_sources(): + # A simple adder whose source and signature stays + # the same across Python distributions + def simple_add(a, b): + "Adds two numbers" + return a + b + + class A(object): + @property + def foo(self): + return 'bar' + + foo = foo.setter(lambda self, v: setattr(self, 'bar', v)) + + dname = property(oinspect.getdoc) + adder = property(simple_add) + + i = inspector.info(A.foo, detail_level=1) + assert "def foo(self):" in i["source"] + assert "lambda self, v:" in i["source"] + + i = inspector.info(A.dname, detail_level=1) + assert "def getdoc(obj)" in i["source"] + + i = inspector.info(A.adder, detail_level=1) + assert "def simple_add(a, b)" in i["source"] + + +def test_property_docstring_is_in_info_for_detail_level_0(): + class A(object): + @property + def foobar(self): + """This is `foobar` property.""" + pass + + ip.user_ns["a_obj"] = A() + assert ( + "This is `foobar` property." + == ip.object_inspect("a_obj.foobar", detail_level=0)["docstring"] + ) + + ip.user_ns["a_cls"] = A + assert ( + "This is `foobar` property." + == ip.object_inspect("a_cls.foobar", detail_level=0)["docstring"] + ) + + +def test_pdef(): + # See gh-1914 + def foo(): pass + inspector.pdef(foo, 'foo') + + +@contextmanager +def cleanup_user_ns(**kwargs): + """ + On exit delete all the keys that were not in user_ns before entering. + + It does not restore old values ! + + Parameters + ---------- + + **kwargs + used to update ip.user_ns + + """ + try: + known = set(ip.user_ns.keys()) + ip.user_ns.update(kwargs) + yield + finally: + added = set(ip.user_ns.keys()) - known + for k in added: + del ip.user_ns[k] + + +def test_pinfo_bool_raise(): + """ + Test that bool method is not called on parent. + """ + + class RaiseBool: + attr = None + + def __bool__(self): + raise ValueError("pinfo should not access this method") + + raise_bool = RaiseBool() + + with cleanup_user_ns(raise_bool=raise_bool): + ip._inspect("pinfo", "raise_bool.attr", detail_level=0) + + +def test_pinfo_getindex(): + def dummy(): + """ + MARKER + """ + + container = [dummy] + with cleanup_user_ns(container=container): + with AssertPrints("MARKER"): + ip._inspect("pinfo", "container[0]", detail_level=0) + assert "container" not in ip.user_ns.keys() + + +def test_qmark_getindex(): + def dummy(): + """ + MARKER 2 + """ + + container = [dummy] + with cleanup_user_ns(container=container): + with AssertPrints("MARKER 2"): + ip.run_cell("container[0]?") + assert "container" not in ip.user_ns.keys() + + +def test_qmark_getindex_negatif(): + def dummy(): + """ + MARKER 3 + """ + + container = [dummy] + with cleanup_user_ns(container=container): + with AssertPrints("MARKER 3"): + ip.run_cell("container[-1]?") + assert "container" not in ip.user_ns.keys() + + + +def test_pinfo_nonascii(): + # See gh-1177 + from . import nonascii2 + ip.user_ns['nonascii2'] = nonascii2 + ip._inspect('pinfo', 'nonascii2', detail_level=1) + +def test_pinfo_type(): + """ + type can fail in various edge case, for example `type.__subclass__()` + """ + ip._inspect('pinfo', 'type') + + +def test_pinfo_docstring_no_source(): + """Docstring should be included with detail_level=1 if there is no source""" + with AssertPrints('Docstring:'): + ip._inspect('pinfo', 'str.format', detail_level=0) + with AssertPrints('Docstring:'): + ip._inspect('pinfo', 'str.format', detail_level=1) + + +def test_pinfo_no_docstring_if_source(): + """Docstring should not be included with detail_level=1 if source is found""" + def foo(): + """foo has a docstring""" + + ip.user_ns['foo'] = foo + + with AssertPrints('Docstring:'): + ip._inspect('pinfo', 'foo', detail_level=0) + with AssertPrints('Source:'): + ip._inspect('pinfo', 'foo', detail_level=1) + with AssertNotPrints('Docstring:'): + ip._inspect('pinfo', 'foo', detail_level=1) + + +def test_pinfo_docstring_if_detail_and_no_source(): + """ Docstring should be displayed if source info not available """ + obj_def = '''class Foo(object): + """ This is a docstring for Foo """ + def bar(self): + """ This is a docstring for Foo.bar """ + pass + ''' + + ip.run_cell(obj_def) + ip.run_cell('foo = Foo()') + + with AssertNotPrints("Source:"): + with AssertPrints('Docstring:'): + ip._inspect('pinfo', 'foo', detail_level=0) + with AssertPrints('Docstring:'): + ip._inspect('pinfo', 'foo', detail_level=1) + with AssertPrints('Docstring:'): + ip._inspect('pinfo', 'foo.bar', detail_level=0) + + with AssertNotPrints('Docstring:'): + with AssertPrints('Source:'): + ip._inspect('pinfo', 'foo.bar', detail_level=1) + + +@pytest.mark.xfail( + sys.version_info.releaselevel not in ("final", "candidate"), + reason="fails on 3.13.dev", + strict=True, +) +def test_pinfo_docstring_dynamic(capsys): + obj_def = """class Bar: + __custom_documentations__ = { + "prop" : "cdoc for prop", + "non_exist" : "cdoc for non_exist", + } + @property + def prop(self): + ''' + Docstring for prop + ''' + return self._prop + + @prop.setter + def prop(self, v): + self._prop = v + """ + ip.run_cell(obj_def) + + ip.run_cell("b = Bar()") + + ip.run_line_magic("pinfo", "b.prop") + captured = capsys.readouterr() + assert re.search(r"Docstring:\s+cdoc for prop", captured.out) + + ip.run_line_magic("pinfo", "b.non_exist") + captured = capsys.readouterr() + assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) + + ip.run_cell("b.prop?") + captured = capsys.readouterr() + assert re.search(r"Docstring:\s+cdoc for prop", captured.out) + + ip.run_cell("b.non_exist?") + captured = capsys.readouterr() + assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) + + ip.run_cell("b.undefined?") + captured = capsys.readouterr() + assert re.search(r"Type:\s+NoneType", captured.out) + + +def test_pinfo_magic(): + with AssertPrints("Docstring:"): + ip._inspect("pinfo", "lsmagic", detail_level=0) + + with AssertPrints("Source:"): + ip._inspect("pinfo", "lsmagic", detail_level=1) + + +def test_init_colors(): + # ensure colors are not present in signature info + info = inspector.info(HasSignature) + init_def = info["init_definition"] + assert "[0m" not in init_def + + +def test_builtin_init(): + info = inspector.info(list) + init_def = info['init_definition'] + assert init_def is not None + + +def test_render_signature_short(): + def short_fun(a=1): pass + sig = oinspect._render_signature( + signature(short_fun), + short_fun.__name__, + ) + assert sig == "short_fun(a=1)" + + +def test_render_signature_long(): + from typing import Optional + + def long_function( + a_really_long_parameter: int, + and_another_long_one: bool = False, + let_us_make_sure_this_is_looong: Optional[str] = None, + ) -> bool: pass + + sig = oinspect._render_signature( + signature(long_function), + long_function.__name__, + ) + expected = """\ +long_function( + a_really_long_parameter: int, + and_another_long_one: bool = False, + let_us_make_sure_this_is_looong: Optional[str] = None, +) -> bool\ +""" + + assert sig == expected diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py new file mode 100644 index 0000000..9f6a374 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py @@ -0,0 +1,20 @@ +#----------------------------------------------------------------------------- +# Copyright (C) 2010-2011 The IPython Development Team. +# +# Distributed under the terms of the BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- +import io + +# N.B. For the test suite, page.page is overridden (see IPython.testing.globalipapp) +from IPython.core import page + +def test_detect_screen_size(): + """Simple smoketest for page._detect_screen_size.""" + try: + page._detect_screen_size(True, 25) + except (TypeError, io.UnsupportedOperation): + # This can happen in the test suite, because stdout may not have a + # fileno. + pass diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py new file mode 100644 index 0000000..8e4a63f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py @@ -0,0 +1,202 @@ +import errno +import os +import shutil +import tempfile +import warnings +from unittest.mock import patch + +from tempfile import TemporaryDirectory +from testpath import assert_isdir, assert_isfile, modified_env + +from IPython import paths +from IPython.testing.decorators import skip_win32 + +TMP_TEST_DIR = os.path.realpath(tempfile.mkdtemp()) +HOME_TEST_DIR = os.path.join(TMP_TEST_DIR, "home_test_dir") +XDG_TEST_DIR = os.path.join(HOME_TEST_DIR, "xdg_test_dir") +XDG_CACHE_DIR = os.path.join(HOME_TEST_DIR, "xdg_cache_dir") +IP_TEST_DIR = os.path.join(HOME_TEST_DIR,'.ipython') + +def setup_module(): + """Setup testenvironment for the module: + + - Adds dummy home dir tree + """ + # Do not mask exceptions here. In particular, catching WindowsError is a + # problem because that exception is only defined on Windows... + os.makedirs(IP_TEST_DIR) + os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython')) + os.makedirs(os.path.join(XDG_CACHE_DIR, 'ipython')) + + +def teardown_module(): + """Teardown testenvironment for the module: + + - Remove dummy home dir tree + """ + # Note: we remove the parent test dir, which is the root of all test + # subdirs we may have created. Use shutil instead of os.removedirs, so + # that non-empty directories are all recursively removed. + shutil.rmtree(TMP_TEST_DIR) + +def patch_get_home_dir(dirpath): + return patch.object(paths, 'get_home_dir', return_value=dirpath) + + +def test_get_ipython_dir_1(): + """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions.""" + env_ipdir = os.path.join("someplace", ".ipython") + with patch.object(paths, '_writable_dir', return_value=True), \ + modified_env({'IPYTHONDIR': env_ipdir}): + ipdir = paths.get_ipython_dir() + + assert ipdir == env_ipdir + +def test_get_ipython_dir_2(): + """test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions.""" + with patch_get_home_dir('someplace'), \ + patch.object(paths, 'get_xdg_dir', return_value=None), \ + patch.object(paths, '_writable_dir', return_value=True), \ + patch('os.name', "posix"), \ + modified_env({'IPYTHON_DIR': None, + 'IPYTHONDIR': None, + 'XDG_CONFIG_HOME': None + }): + ipdir = paths.get_ipython_dir() + + assert ipdir == os.path.join("someplace", ".ipython") + +def test_get_ipython_dir_3(): + """test_get_ipython_dir_3, use XDG if defined and exists, and .ipython doesn't exist.""" + tmphome = TemporaryDirectory() + try: + with patch_get_home_dir(tmphome.name), \ + patch('os.name', 'posix'), \ + modified_env({ + 'IPYTHON_DIR': None, + 'IPYTHONDIR': None, + 'XDG_CONFIG_HOME': XDG_TEST_DIR, + }), warnings.catch_warnings(record=True) as w: + ipdir = paths.get_ipython_dir() + + assert ipdir == os.path.join(tmphome.name, XDG_TEST_DIR, "ipython") + assert len(w) == 0 + finally: + tmphome.cleanup() + +def test_get_ipython_dir_4(): + """test_get_ipython_dir_4, warn if XDG and home both exist.""" + with patch_get_home_dir(HOME_TEST_DIR), \ + patch('os.name', 'posix'): + try: + os.mkdir(os.path.join(XDG_TEST_DIR, 'ipython')) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + + with modified_env({ + 'IPYTHON_DIR': None, + 'IPYTHONDIR': None, + 'XDG_CONFIG_HOME': XDG_TEST_DIR, + }), warnings.catch_warnings(record=True) as w: + ipdir = paths.get_ipython_dir() + + assert len(w) == 1 + assert "Ignoring" in str(w[0]) + + +def test_get_ipython_dir_5(): + """test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist.""" + with patch_get_home_dir(HOME_TEST_DIR), \ + patch('os.name', 'posix'): + try: + os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython')) + except OSError as e: + if e.errno != errno.ENOENT: + raise + + with modified_env({ + 'IPYTHON_DIR': None, + 'IPYTHONDIR': None, + 'XDG_CONFIG_HOME': XDG_TEST_DIR, + }): + ipdir = paths.get_ipython_dir() + + assert ipdir == IP_TEST_DIR + +def test_get_ipython_dir_6(): + """test_get_ipython_dir_6, use home over XDG if defined and neither exist.""" + xdg = os.path.join(HOME_TEST_DIR, 'somexdg') + os.mkdir(xdg) + shutil.rmtree(os.path.join(HOME_TEST_DIR, '.ipython')) + print(paths._writable_dir) + with patch_get_home_dir(HOME_TEST_DIR), \ + patch.object(paths, 'get_xdg_dir', return_value=xdg), \ + patch('os.name', 'posix'), \ + modified_env({ + 'IPYTHON_DIR': None, + 'IPYTHONDIR': None, + 'XDG_CONFIG_HOME': None, + }), warnings.catch_warnings(record=True) as w: + ipdir = paths.get_ipython_dir() + + assert ipdir == os.path.join(HOME_TEST_DIR, ".ipython") + assert len(w) == 0 + +def test_get_ipython_dir_7(): + """test_get_ipython_dir_7, test home directory expansion on IPYTHONDIR""" + home_dir = os.path.normpath(os.path.expanduser('~')) + with modified_env({'IPYTHONDIR': os.path.join('~', 'somewhere')}), \ + patch.object(paths, '_writable_dir', return_value=True): + ipdir = paths.get_ipython_dir() + assert ipdir == os.path.join(home_dir, "somewhere") + + +@skip_win32 +def test_get_ipython_dir_8(): + """test_get_ipython_dir_8, test / home directory""" + if not os.access("/", os.W_OK): + # test only when HOME directory actually writable + return + + with ( + patch.object(paths, "_writable_dir", lambda path: bool(path)), + patch.object(paths, "get_xdg_dir", return_value=None), + modified_env( + { + "IPYTHON_DIR": None, + "IPYTHONDIR": None, + "HOME": "/", + } + ), + ): + assert paths.get_ipython_dir() == "/.ipython" + + +def test_get_ipython_cache_dir(): + with modified_env({'HOME': HOME_TEST_DIR}): + if os.name == "posix": + # test default + os.makedirs(os.path.join(HOME_TEST_DIR, ".cache")) + with modified_env({'XDG_CACHE_HOME': None}): + ipdir = paths.get_ipython_cache_dir() + assert os.path.join(HOME_TEST_DIR, ".cache", "ipython") == ipdir + assert_isdir(ipdir) + + # test env override + with modified_env({"XDG_CACHE_HOME": XDG_CACHE_DIR}): + ipdir = paths.get_ipython_cache_dir() + assert_isdir(ipdir) + assert ipdir == os.path.join(XDG_CACHE_DIR, "ipython") + else: + assert paths.get_ipython_cache_dir() == paths.get_ipython_dir() + +def test_get_ipython_package_dir(): + ipdir = paths.get_ipython_package_dir() + assert_isdir(ipdir) + + +def test_get_ipython_module_path(): + ipapp_path = paths.get_ipython_module_path('IPython.terminal.ipapp') + assert_isfile(ipapp_path) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py new file mode 100644 index 0000000..379a530 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py @@ -0,0 +1,149 @@ +"""Tests for input manipulation machinery.""" + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- +import pytest + +from IPython.core.prefilter import AutocallChecker + +#----------------------------------------------------------------------------- +# Tests +#----------------------------------------------------------------------------- + +def test_prefilter(): + """Test user input conversions""" + + # pairs of (raw, expected correct) input + pairs = [ ('2+2','2+2'), + ] + + for raw, correct in pairs: + assert ip.prefilter(raw) == correct + +def test_prefilter_shadowed(): + def dummy_magic(line): pass + + prev_automagic_state = ip.automagic + ip.automagic = True + ip.autocall = 0 + + try: + # These should not be transformed - they are shadowed by other names + for name in ['if', 'zip', 'get_ipython']: # keyword, builtin, global + ip.register_magic_function(dummy_magic, magic_name=name) + res = ip.prefilter(name + " foo") + assert res == name + " foo" + del ip.magics_manager.magics["line"][name] + + # These should be transformed + for name in ['fi', 'piz', 'nohtypi_teg']: + ip.register_magic_function(dummy_magic, magic_name=name) + res = ip.prefilter(name + " foo") + assert res != name + " foo" + del ip.magics_manager.magics["line"][name] + + finally: + ip.automagic = prev_automagic_state + +def test_autocall_binops(): + """See https://github.com/ipython/ipython/issues/81""" + ip.run_line_magic("autocall", "2") + f = lambda x: x + ip.user_ns['f'] = f + try: + assert ip.prefilter("f 1") == "f(1)" + for t in ["f +1", "f -1"]: + assert ip.prefilter(t) == t + + # Run tests again with a more permissive exclude_regexp, which will + # allow transformation of binary operations ('f -1' -> 'f(-1)'). + pm = ip.prefilter_manager + ac = AutocallChecker(shell=pm.shell, prefilter_manager=pm, + config=pm.config) + try: + ac.priority = 1 + ac.exclude_regexp = r'^[,&^\|\*/]|^is |^not |^in |^and |^or ' + pm.sort_checkers() + + assert ip.prefilter("f -1") == "f(-1)" + assert ip.prefilter("f +1") == "f(+1)" + finally: + pm.unregister_checker(ac) + finally: + ip.run_line_magic("autocall", "0") + del ip.user_ns["f"] + + +def test_issue_114(): + """Check that multiline string literals don't expand as magic + see http://github.com/ipython/ipython/issues/114""" + + template = '"""\n%s\n"""' + # Store the current value of multi_line_specials and turn it off before + # running test, since it could be true (case in which the test doesn't make + # sense, as multiline string literals *will* expand as magic in that case). + msp = ip.prefilter_manager.multi_line_specials + ip.prefilter_manager.multi_line_specials = False + try: + for mgk in ip.magics_manager.lsmagic()['line']: + raw = template % mgk + assert ip.prefilter(raw) == raw + finally: + ip.prefilter_manager.multi_line_specials = msp + + +def test_prefilter_attribute_errors(): + """Capture exceptions thrown by user objects on attribute access. + + See http://github.com/ipython/ipython/issues/988.""" + + class X(object): + def __getattr__(self, k): + raise ValueError('broken object') + def __call__(self, x): + return x + + # Create a callable broken object + ip.user_ns["x"] = X() + ip.run_line_magic("autocall", "2") + try: + # Even if x throws an attribute error when looking at its rewrite + # attribute, we should not crash. So the test here is simply making + # the prefilter call and not having an exception. + ip.prefilter('x 1') + finally: + del ip.user_ns["x"] + ip.run_line_magic("autocall", "0") + + +def test_autocall_type_ann(): + ip.run_cell("import collections.abc") + ip.run_line_magic("autocall", "1") + try: + assert ( + ip.prefilter("collections.abc.Callable[[int], None]") + == "collections.abc.Callable[[int], None]" + ) + finally: + ip.run_line_magic("autocall", "0") + + +def test_autocall_should_support_unicode(): + ip.run_line_magic("autocall", "2") + ip.user_ns["Ï€"] = lambda x: x + try: + assert ip.prefilter("Ï€ 3") == "Ï€(3)" + finally: + ip.run_line_magic("autocall", "0") + del ip.user_ns["Ï€"] + + +def test_autocall_regression_gh_14513(): + ip.run_line_magic("autocall", "2") + ip.user_ns["foo"] = dict() + try: + assert ip.prefilter("foo") == "foo" + finally: + ip.run_line_magic("autocall", "0") + del ip.user_ns["foo"] diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py new file mode 100644 index 0000000..8e03b5a --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py @@ -0,0 +1,161 @@ +# coding: utf-8 +"""Tests for profile-related functions. + +Currently only the startup-dir functionality is tested, but more tests should +be added for: + + * ipython profile create + * ipython profile list + * ipython profile create --parallel + * security dir permissions + +Authors +------- + +* MinRK + +""" + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +import shutil +import sys +import tempfile +from pathlib import Path +from tempfile import TemporaryDirectory +from unittest import TestCase + +import pytest + +from IPython.core.profileapp import list_bundled_profiles, list_profiles_in +from IPython.core.profiledir import ProfileDir +from IPython.testing import decorators as dec +from IPython.testing import tools as tt +from IPython.utils.process import getoutput + +#----------------------------------------------------------------------------- +# Globals +#----------------------------------------------------------------------------- +TMP_TEST_DIR = Path(tempfile.mkdtemp()) +HOME_TEST_DIR = TMP_TEST_DIR / "home_test_dir" +IP_TEST_DIR = HOME_TEST_DIR / ".ipython" + +# +# Setup/teardown functions/decorators +# + +def setup_module(): + """Setup test environment for the module: + + - Adds dummy home dir tree + """ + # Do not mask exceptions here. In particular, catching WindowsError is a + # problem because that exception is only defined on Windows... + (Path.cwd() / IP_TEST_DIR).mkdir(parents=True) + + +def teardown_module(): + """Teardown test environment for the module: + + - Remove dummy home dir tree + """ + # Note: we remove the parent test dir, which is the root of all test + # subdirs we may have created. Use shutil instead of os.removedirs, so + # that non-empty directories are all recursively removed. + shutil.rmtree(TMP_TEST_DIR) + + +#----------------------------------------------------------------------------- +# Test functions +#----------------------------------------------------------------------------- +class ProfileStartupTest(TestCase): + def setUp(self): + # create profile dir + self.pd = ProfileDir.create_profile_dir_by_name(IP_TEST_DIR, "test") + self.options = ["--ipython-dir", IP_TEST_DIR, "--profile", "test"] + self.fname = TMP_TEST_DIR / "test.py" + + def tearDown(self): + # We must remove this profile right away so its presence doesn't + # confuse other tests. + shutil.rmtree(self.pd.location) + + def init(self, startup_file, startup, test): + # write startup python file + with open(Path(self.pd.startup_dir) / startup_file, "w", encoding="utf-8") as f: + f.write(startup) + # write simple test file, to check that the startup file was run + with open(self.fname, "w", encoding="utf-8") as f: + f.write(test) + + def validate(self, output): + tt.ipexec_validate(self.fname, output, "", options=self.options) + + def test_startup_py(self): + self.init('00-start.py', 'zzz=123\n', 'print(zzz)\n') + self.validate('123') + + def test_startup_ipy(self): + self.init('00-start.ipy', '%xmode plain\n', '') + self.validate('Exception reporting mode: Plain') + + +@pytest.mark.skipif( + sys.implementation.name == "pypy" + and ((7, 3, 13) < sys.implementation.version < (7, 3, 16)), + reason="Unicode issues with scandir on PyPy, see https://github.com/pypy/pypy/issues/4860", +) +def test_list_profiles_in(): + # No need to remove these directories and files, as they will get nuked in + # the module-level teardown. + td = Path(tempfile.mkdtemp(dir=TMP_TEST_DIR)) + for name in ("profile_foo", "profile_hello", "not_a_profile"): + Path(td / name).mkdir(parents=True) + if dec.unicode_paths: + Path(td / "profile_ünicode").mkdir(parents=True) + + with open(td / "profile_file", "w", encoding="utf-8") as f: + f.write("I am not a profile directory") + profiles = list_profiles_in(td) + + # unicode normalization can turn u'ünicode' into u'u\0308nicode', + # so only check for *nicode, and that creating a ProfileDir from the + # name remains valid + found_unicode = False + for p in list(profiles): + if p.endswith('nicode'): + pd = ProfileDir.find_profile_dir_by_name(td, p) + profiles.remove(p) + found_unicode = True + break + if dec.unicode_paths: + assert found_unicode is True + assert set(profiles) == {"foo", "hello"} + + +def test_list_bundled_profiles(): + # This variable will need to be updated when a new profile gets bundled + bundled = sorted(list_bundled_profiles()) + assert bundled == [] + + +def test_profile_create_ipython_dir(): + """ipython profile create respects --ipython-dir""" + with TemporaryDirectory() as td: + getoutput( + [ + sys.executable, + "-m", + "IPython", + "profile", + "create", + "foo", + "--ipython-dir=%s" % td, + ] + ) + profile_dir = Path(td) / "profile_foo" + assert Path(profile_dir).exists() + ipython_config = profile_dir / "ipython_config.py" + assert Path(ipython_config).exists() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py new file mode 100644 index 0000000..95e6163 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 +"""Tests for prompt generation.""" + +import unittest + +from IPython.core.prompts import LazyEvaluate + +class PromptTests(unittest.TestCase): + def test_lazy_eval_unicode(self): + u = u'ünicødé' + lz = LazyEvaluate(lambda : u) + self.assertEqual(str(lz), u) + self.assertEqual(format(lz), u) + + def test_lazy_eval_nonascii_bytes(self): + u = u'ünicødé' + b = u.encode('utf8') + lz = LazyEvaluate(lambda : b) + # unicode(lz) would fail + self.assertEqual(str(lz), str(b)) + self.assertEqual(format(lz), str(b)) + + def test_lazy_eval_float(self): + f = 0.503 + lz = LazyEvaluate(lambda : f) + + self.assertEqual(str(lz), str(f)) + self.assertEqual(format(lz), str(f)) + self.assertEqual(format(lz, '.1'), '0.5') + diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py new file mode 100644 index 0000000..31d3dbe --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py @@ -0,0 +1,375 @@ +"""Tests for pylab tools module. +""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + + +from binascii import a2b_base64 +from io import BytesIO + +import pytest + +matplotlib = pytest.importorskip("matplotlib") +matplotlib.use('Agg') +from matplotlib.figure import Figure + +from matplotlib import pyplot as plt +from matplotlib_inline import backend_inline +import numpy as np + +from IPython.core.getipython import get_ipython +from IPython.core.interactiveshell import InteractiveShell +from IPython.core.display import _PNG, _JPEG +from .. import pylabtools as pt + +from IPython.testing import decorators as dec + + +def test_figure_to_svg(): + # simple empty-figure test + fig = plt.figure() + assert pt.print_figure(fig, "svg") is None + + plt.close('all') + + # simple check for at least svg-looking output + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.plot([1,2,3]) + plt.draw() + svg = pt.print_figure(fig, "svg")[:100].lower() + assert "doctype svg" in svg + + +def _check_pil_jpeg_bytes(): + """Skip if PIL can't write JPEGs to BytesIO objects""" + # PIL's JPEG plugin can't write to BytesIO objects + # Pillow fixes this + from PIL import Image + buf = BytesIO() + img = Image.new("RGB", (4,4)) + try: + img.save(buf, 'jpeg') + except Exception as e: + ename = e.__class__.__name__ + raise pytest.skip("PIL can't write JPEG to BytesIO: %s: %s" % (ename, e)) from e + +@dec.skip_without("PIL.Image") +def test_figure_to_jpeg(): + _check_pil_jpeg_bytes() + # simple check for at least jpeg-looking output + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.plot([1,2,3]) + plt.draw() + jpeg = pt.print_figure(fig, 'jpeg', pil_kwargs={'optimize': 50})[:100].lower() + assert jpeg.startswith(_JPEG) + +def test_retina_figure(): + # simple empty-figure test + fig = plt.figure() + assert pt.retina_figure(fig) == None + plt.close('all') + + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.plot([1,2,3]) + plt.draw() + png, md = pt.retina_figure(fig) + assert png.startswith(_PNG) + assert "width" in md + assert "height" in md + + +_fmt_mime_map = { + 'png': 'image/png', + 'jpeg': 'image/jpeg', + 'pdf': 'application/pdf', + 'retina': 'image/png', + 'svg': 'image/svg+xml', +} + +def test_select_figure_formats_str(): + ip = get_ipython() + for fmt, active_mime in _fmt_mime_map.items(): + pt.select_figure_formats(ip, fmt) + for mime, f in ip.display_formatter.formatters.items(): + if mime == active_mime: + assert Figure in f + else: + assert Figure not in f + +def test_select_figure_formats_kwargs(): + ip = get_ipython() + kwargs = dict(bbox_inches="tight") + pt.select_figure_formats(ip, "png", **kwargs) + formatter = ip.display_formatter.formatters["image/png"] + f = formatter.lookup_by_type(Figure) + cell = f.keywords + expected = kwargs + expected["base64"] = True + expected["fmt"] = "png" + assert cell == expected + + # check that the formatter doesn't raise + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.plot([1,2,3]) + plt.draw() + formatter.enabled = True + png = formatter(fig) + assert isinstance(png, str) + png_bytes = a2b_base64(png) + assert png_bytes.startswith(_PNG) + +def test_select_figure_formats_set(): + ip = get_ipython() + for fmts in [ + {'png', 'svg'}, + ['png'], + ('jpeg', 'pdf', 'retina'), + {'svg'}, + ]: + active_mimes = {_fmt_mime_map[fmt] for fmt in fmts} + pt.select_figure_formats(ip, fmts) + for mime, f in ip.display_formatter.formatters.items(): + if mime in active_mimes: + assert Figure in f + else: + assert Figure not in f + +def test_select_figure_formats_bad(): + ip = get_ipython() + with pytest.raises(ValueError): + pt.select_figure_formats(ip, 'foo') + with pytest.raises(ValueError): + pt.select_figure_formats(ip, {'png', 'foo'}) + with pytest.raises(ValueError): + pt.select_figure_formats(ip, ['retina', 'pdf', 'bar', 'bad']) + +def test_import_pylab(): + ns = {} + pt.import_pylab(ns, import_all=False) + assert "plt" in ns + assert ns["np"] == np + + +class TestPylabSwitch(object): + class Shell(InteractiveShell): + def init_history(self): + """Sets up the command history, and starts regular autosaves.""" + self.config.HistoryManager.hist_file = ":memory:" + super().init_history() + + def enable_gui(self, gui): + pass + + def setup_method(self): + import matplotlib + def act_mpl(backend): + matplotlib.rcParams['backend'] = backend + + # Save rcParams since they get modified + self._saved_rcParams = matplotlib.rcParams + self._saved_rcParamsOrig = matplotlib.rcParamsOrig + matplotlib.rcParams = dict(backend="QtAgg") + matplotlib.rcParamsOrig = dict(backend="QtAgg") + + # Mock out functions + self._save_am = pt.activate_matplotlib + pt.activate_matplotlib = act_mpl + self._save_ip = pt.import_pylab + pt.import_pylab = lambda *a,**kw:None + self._save_cis = backend_inline.configure_inline_support + backend_inline.configure_inline_support = lambda *a, **kw: None + + def teardown_method(self): + pt.activate_matplotlib = self._save_am + pt.import_pylab = self._save_ip + backend_inline.configure_inline_support = self._save_cis + import matplotlib + matplotlib.rcParams = self._saved_rcParams + matplotlib.rcParamsOrig = self._saved_rcParamsOrig + + def test_qt(self): + s = self.Shell() + gui, backend = s.enable_matplotlib(None) + assert gui == "qt" + assert s.pylab_gui_select == "qt" + + gui, backend = s.enable_matplotlib("inline") + assert gui is None + assert s.pylab_gui_select == "qt" + + gui, backend = s.enable_matplotlib("qt") + assert gui == "qt" + assert s.pylab_gui_select == "qt" + + gui, backend = s.enable_matplotlib("inline") + assert gui is None + assert s.pylab_gui_select == "qt" + + gui, backend = s.enable_matplotlib() + assert gui == "qt" + assert s.pylab_gui_select == "qt" + + def test_inline(self): + s = self.Shell() + gui, backend = s.enable_matplotlib("inline") + assert gui is None + assert s.pylab_gui_select == None + + gui, backend = s.enable_matplotlib("inline") + assert gui is None + assert s.pylab_gui_select == None + + gui, backend = s.enable_matplotlib("qt") + assert gui == "qt" + assert s.pylab_gui_select == "qt" + + def test_inline_twice(self): + "Using '%matplotlib inline' twice should not reset formatters" + + ip = self.Shell() + gui, backend = ip.enable_matplotlib("inline") + assert gui is None + + fmts = {'png'} + active_mimes = {_fmt_mime_map[fmt] for fmt in fmts} + pt.select_figure_formats(ip, fmts) + + gui, backend = ip.enable_matplotlib("inline") + assert gui is None + + for mime, f in ip.display_formatter.formatters.items(): + if mime in active_mimes: + assert Figure in f + else: + assert Figure not in f + + def test_qt_gtk(self): + s = self.Shell() + gui, backend = s.enable_matplotlib("qt") + assert gui == "qt" + assert s.pylab_gui_select == "qt" + + gui, backend = s.enable_matplotlib("gtk3") + assert gui == "qt" + assert s.pylab_gui_select == "qt" + + @dec.skipif(not pt._matplotlib_manages_backends()) + def test_backend_module_name_case_sensitive(self): + # Matplotlib backend names are case insensitive unless explicitly specified using + # "module://some_module.some_name" syntax which are case sensitive for mpl >= 3.9.1 + all_lowercase = "module://matplotlib_inline.backend_inline" + some_uppercase = "module://matplotlib_inline.Backend_inline" + mpl3_9_1 = matplotlib.__version_info__ >= (3, 9, 1) + + s = self.Shell() + s.enable_matplotlib(all_lowercase) + if mpl3_9_1: + with pytest.raises(RuntimeError): + s.enable_matplotlib(some_uppercase) + else: + s.enable_matplotlib(some_uppercase) + + s.run_line_magic("matplotlib", all_lowercase) + if mpl3_9_1: + with pytest.raises(RuntimeError): + s.run_line_magic("matplotlib", some_uppercase) + else: + s.run_line_magic("matplotlib", some_uppercase) + + +def test_no_gui_backends(): + for k in ['agg', 'svg', 'pdf', 'ps']: + assert k not in pt.backend2gui + + +def test_figure_no_canvas(): + fig = Figure() + fig.canvas = None + pt.print_figure(fig) + + +@pytest.mark.parametrize( + "name, expected_gui, expected_backend", + [ + # name is gui + ("gtk3", "gtk3", "gtk3agg"), + ("gtk4", "gtk4", "gtk4agg"), + ("headless", None, "agg"), + ("osx", "osx", "macosx"), + ("qt", "qt", "qtagg"), + ("qt5", "qt5", "qt5agg"), + ("qt6", "qt6", "qtagg"), + ("tk", "tk", "tkagg"), + ("wx", "wx", "wxagg"), + # name is backend + ("agg", None, "agg"), + ("cairo", None, "cairo"), + ("pdf", None, "pdf"), + ("ps", None, "ps"), + ("svg", None, "svg"), + ("template", None, "template"), + ("gtk3agg", "gtk3", "gtk3agg"), + ("gtk3cairo", "gtk3", "gtk3cairo"), + ("gtk4agg", "gtk4", "gtk4agg"), + ("gtk4cairo", "gtk4", "gtk4cairo"), + ("macosx", "osx", "macosx"), + ("nbagg", "nbagg", "nbagg"), + ("notebook", "nbagg", "notebook"), + ("qtagg", "qt", "qtagg"), + ("qtcairo", "qt", "qtcairo"), + ("qt5agg", "qt5", "qt5agg"), + ("qt5cairo", "qt5", "qt5cairo"), + ("tkagg", "tk", "tkagg"), + ("tkcairo", "tk", "tkcairo"), + ("webagg", "webagg", "webagg"), + ("wxagg", "wx", "wxagg"), + ("wxcairo", "wx", "wxcairo"), + ], +) +def test_backend_builtin(name, expected_gui, expected_backend): + # Test correct identification of Matplotlib built-in backends without importing and using them, + # otherwise we would need to ensure all the complex dependencies such as windowing toolkits are + # installed. + + mpl_manages_backends = pt._matplotlib_manages_backends() + if not mpl_manages_backends: + # Backends not supported before _matplotlib_manages_backends or supported + # but with different expected_gui or expected_backend. + if ( + name.endswith("agg") + or name.endswith("cairo") + or name in ("headless", "macosx", "pdf", "ps", "svg", "template") + ): + pytest.skip() + elif name == "qt6": + expected_backend = "qtagg" + elif name == "notebook": + expected_backend, expected_gui = expected_gui, expected_backend + + gui, backend = pt.find_gui_and_backend(name) + if not mpl_manages_backends: + gui = gui.lower() if gui else None + backend = backend.lower() if backend else None + assert gui == expected_gui + assert backend == expected_backend + + +def test_backend_entry_point(): + gui, backend = pt.find_gui_and_backend("inline") + assert gui is None + expected_backend = ( + "inline" + if pt._matplotlib_manages_backends() + else "module://matplotlib_inline.backend_inline" + ) + assert backend == expected_backend + + +def test_backend_unknown(): + with pytest.raises(RuntimeError if pt._matplotlib_manages_backends() else KeyError): + pt.find_gui_and_backend("name-does-not-exist") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py new file mode 100644 index 0000000..971f8e3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py @@ -0,0 +1,626 @@ +# encoding: utf-8 +"""Tests for code execution (%run and related), which is particularly tricky. + +Because of how %run manages namespaces, and the fact that we are trying here to +verify subtle object deletion and reference counting issues, the %run tests +will be kept in this separate file. This makes it easier to aggregate in one +place the tricks needed to handle it; most other magics are much easier to test +and we do so in a common test_magic file. + +Note that any test using `run -i` should make sure to do a `reset` afterwards, +as otherwise it may influence later tests. +""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + + + +import functools +import os +import platform +import random +import string +import sys +import textwrap +import unittest +from os.path import join as pjoin +from unittest.mock import patch + +import pytest +from tempfile import TemporaryDirectory + +from IPython.core import debugger +from IPython.testing import decorators as dec +from IPython.testing import tools as tt +from IPython.utils.io import capture_output + + +def doctest_refbug(): + """Very nasty problem with references held by multiple runs of a script. + See: https://github.com/ipython/ipython/issues/141 + + In [1]: _ip.clear_main_mod_cache() + # random + + In [2]: %run refbug + + In [3]: call_f() + lowercased: hello + + In [4]: %run refbug + + In [5]: call_f() + lowercased: hello + lowercased: hello + """ + + +def doctest_run_builtins(): + r"""Check that %run doesn't damage __builtins__. + + In [1]: import tempfile + + In [2]: bid1 = id(__builtins__) + + In [3]: fname = tempfile.mkstemp('.py')[1] + + In [3]: f = open(fname, 'w', encoding='utf-8') + + In [4]: dummy= f.write('pass\n') + + In [5]: f.flush() + + In [6]: t1 = type(__builtins__) + + In [7]: %run $fname + + In [7]: f.close() + + In [8]: bid2 = id(__builtins__) + + In [9]: t2 = type(__builtins__) + + In [10]: t1 == t2 + Out[10]: True + + In [10]: bid1 == bid2 + Out[10]: True + + In [12]: try: + ....: os.unlink(fname) + ....: except: + ....: pass + ....: + """ + + +def doctest_run_option_parser(): + r"""Test option parser in %run. + + In [1]: %run print_argv.py + [] + + In [2]: %run print_argv.py print*.py + ['print_argv.py'] + + In [3]: %run -G print_argv.py print*.py + ['print*.py'] + + """ + + +@dec.skip_win32 +def doctest_run_option_parser_for_posix(): + r"""Test option parser in %run (Linux/OSX specific). + + You need double quote to escape glob in POSIX systems: + + In [1]: %run print_argv.py print\\*.py + ['print*.py'] + + You can't use quote to escape glob in POSIX systems: + + In [2]: %run print_argv.py 'print*.py' + ['print_argv.py'] + + """ + + +doctest_run_option_parser_for_posix.__skip_doctest__ = sys.platform == "win32" + + +@dec.skip_if_not_win32 +def doctest_run_option_parser_for_windows(): + r"""Test option parser in %run (Windows specific). + + In Windows, you can't escape ``*` `by backslash: + + In [1]: %run print_argv.py print\\*.py + ['print\\\\*.py'] + + You can use quote to escape glob: + + In [2]: %run print_argv.py 'print*.py' + ["'print*.py'"] + + """ + + +doctest_run_option_parser_for_windows.__skip_doctest__ = sys.platform != "win32" + + +def doctest_reset_del(): + """Test that resetting doesn't cause errors in __del__ methods. + + In [2]: class A(object): + ...: def __del__(self): + ...: print(str("Hi")) + ...: + + In [3]: a = A() + + In [4]: get_ipython().reset(); import gc; x = gc.collect(0) + Hi + + In [5]: 1+1 + Out[5]: 2 + """ + +# For some tests, it will be handy to organize them in a class with a common +# setup that makes a temp file + +class TestMagicRunPass(tt.TempFileMixin): + + def setUp(self): + content = "a = [1,2,3]\nb = 1" + self.mktmp(content) + + def run_tmpfile(self): + _ip = get_ipython() + # This fails on Windows if self.tmpfile.name has spaces or "~" in it. + # See below and ticket https://bugs.launchpad.net/bugs/366353 + _ip.run_line_magic("run", self.fname) + + def run_tmpfile_p(self): + _ip = get_ipython() + # This fails on Windows if self.tmpfile.name has spaces or "~" in it. + # See below and ticket https://bugs.launchpad.net/bugs/366353 + _ip.run_line_magic("run", "-p %s" % self.fname) + + def test_builtins_id(self): + """Check that %run doesn't damage __builtins__ """ + _ip = get_ipython() + # Test that the id of __builtins__ is not modified by %run + bid1 = id(_ip.user_ns['__builtins__']) + self.run_tmpfile() + bid2 = id(_ip.user_ns['__builtins__']) + assert bid1 == bid2 + + def test_builtins_type(self): + """Check that the type of __builtins__ doesn't change with %run. + + However, the above could pass if __builtins__ was already modified to + be a dict (it should be a module) by a previous use of %run. So we + also check explicitly that it really is a module: + """ + _ip = get_ipython() + self.run_tmpfile() + assert type(_ip.user_ns["__builtins__"]) == type(sys) + + def test_run_profile(self): + """Test that the option -p, which invokes the profiler, do not + crash by invoking execfile""" + self.run_tmpfile_p() + + def test_run_debug_twice(self): + # https://github.com/ipython/ipython/issues/10028 + _ip = get_ipython() + with tt.fake_input(["c"]): + _ip.run_line_magic("run", "-d %s" % self.fname) + with tt.fake_input(["c"]): + _ip.run_line_magic("run", "-d %s" % self.fname) + + def test_run_debug_twice_with_breakpoint(self): + """Make a valid python temp file.""" + _ip = get_ipython() + with tt.fake_input(["b 2", "c", "c"]): + _ip.run_line_magic("run", "-d %s" % self.fname) + + with tt.fake_input(["c"]): + with tt.AssertNotPrints("KeyError"): + _ip.run_line_magic("run", "-d %s" % self.fname) + + +class TestMagicRunSimple(tt.TempFileMixin): + + def test_simpledef(self): + """Test that simple class definitions work.""" + src = ("class foo: pass\n" + "def f(): return foo()") + self.mktmp(src) + _ip.run_line_magic("run", str(self.fname)) + _ip.run_cell("t = isinstance(f(), foo)") + assert _ip.user_ns["t"] is True + + @pytest.mark.xfail( + platform.python_implementation() == "PyPy", + reason="expecting __del__ call on exit is unreliable and doesn't happen on PyPy", + ) + def test_obj_del(self): + """Test that object's __del__ methods are called on exit.""" + src = ("class A(object):\n" + " def __del__(self):\n" + " print('object A deleted')\n" + "a = A()\n") + self.mktmp(src) + err = None + tt.ipexec_validate(self.fname, 'object A deleted', err) + + def test_aggressive_namespace_cleanup(self): + """Test that namespace cleanup is not too aggressive GH-238 + + Returning from another run magic deletes the namespace""" + # see ticket https://github.com/ipython/ipython/issues/238 + + with tt.TempFileMixin() as empty: + empty.mktmp("") + # On Windows, the filename will have \users in it, so we need to use the + # repr so that the \u becomes \\u. + src = ( + "ip = get_ipython()\n" + "for i in range(5):\n" + " try:\n" + " ip.run_line_magic(%r, %r)\n" + " except NameError as e:\n" + " print(i)\n" + " break\n" % ("run", empty.fname) + ) + self.mktmp(src) + _ip.run_line_magic("run", str(self.fname)) + _ip.run_cell("ip == get_ipython()") + assert _ip.user_ns["i"] == 4 + + def test_run_second(self): + """Test that running a second file doesn't clobber the first, gh-3547""" + self.mktmp("avar = 1\n" "def afunc():\n" " return avar\n") + + with tt.TempFileMixin() as empty: + empty.mktmp("") + + _ip.run_line_magic("run", self.fname) + _ip.run_line_magic("run", empty.fname) + assert _ip.user_ns["afunc"]() == 1 + + def test_tclass(self): + mydir = os.path.dirname(__file__) + tc = os.path.join(mydir, "tclass") + src = f"""\ +import gc +%run "{tc}" C-first +gc.collect(0) +%run "{tc}" C-second +gc.collect(0) +%run "{tc}" C-third +gc.collect(0) +%reset -f +""" + self.mktmp(src, ".ipy") + out = """\ +ARGV 1-: ['C-first'] +ARGV 1-: ['C-second'] +tclass.py: deleting object: C-first +ARGV 1-: ['C-third'] +tclass.py: deleting object: C-second +tclass.py: deleting object: C-third +""" + err = None + tt.ipexec_validate(self.fname, out, err) + + def test_run_i_after_reset(self): + """Check that %run -i still works after %reset (gh-693)""" + src = "yy = zz\n" + self.mktmp(src) + _ip.run_cell("zz = 23") + try: + _ip.run_line_magic("run", "-i %s" % self.fname) + assert _ip.user_ns["yy"] == 23 + finally: + _ip.run_line_magic("reset", "-f") + + _ip.run_cell("zz = 23") + try: + _ip.run_line_magic("run", "-i %s" % self.fname) + assert _ip.user_ns["yy"] == 23 + finally: + _ip.run_line_magic("reset", "-f") + + def test_unicode(self): + """Check that files in odd encodings are accepted.""" + mydir = os.path.dirname(__file__) + na = os.path.join(mydir, "nonascii.py") + _ip.run_line_magic("run", na) + assert _ip.user_ns["u"] == "Ўт№Ф" + + def test_run_py_file_attribute(self): + """Test handling of `__file__` attribute in `%run .py`.""" + src = "t = __file__\n" + self.mktmp(src) + _missing = object() + file1 = _ip.user_ns.get("__file__", _missing) + _ip.run_line_magic("run", self.fname) + file2 = _ip.user_ns.get("__file__", _missing) + + # Check that __file__ was equal to the filename in the script's + # namespace. + assert _ip.user_ns["t"] == self.fname + + # Check that __file__ was not leaked back into user_ns. + assert file1 == file2 + + def test_run_ipy_file_attribute(self): + """Test handling of `__file__` attribute in `%run `.""" + src = "t = __file__\n" + self.mktmp(src, ext='.ipy') + _missing = object() + file1 = _ip.user_ns.get("__file__", _missing) + _ip.run_line_magic("run", self.fname) + file2 = _ip.user_ns.get("__file__", _missing) + + # Check that __file__ was equal to the filename in the script's + # namespace. + assert _ip.user_ns["t"] == self.fname + + # Check that __file__ was not leaked back into user_ns. + assert file1 == file2 + + def test_run_formatting(self): + """ Test that %run -t -N does not raise a TypeError for N > 1.""" + src = "pass" + self.mktmp(src) + _ip.run_line_magic("run", "-t -N 1 %s" % self.fname) + _ip.run_line_magic("run", "-t -N 10 %s" % self.fname) + + def test_ignore_sys_exit(self): + """Test the -e option to ignore sys.exit()""" + src = "import sys; sys.exit(1)" + self.mktmp(src) + with tt.AssertPrints("SystemExit"): + _ip.run_line_magic("run", self.fname) + + with tt.AssertNotPrints("SystemExit"): + _ip.run_line_magic("run", "-e %s" % self.fname) + + def test_run_nb(self): + """Test %run notebook.ipynb""" + pytest.importorskip("nbformat") + from nbformat import v4, writes + nb = v4.new_notebook( + cells=[ + v4.new_markdown_cell("The Ultimate Question of Everything"), + v4.new_code_cell("answer=42") + ] + ) + src = writes(nb, version=4) + self.mktmp(src, ext='.ipynb') + + _ip.run_line_magic("run", self.fname) + + assert _ip.user_ns["answer"] == 42 + + def test_run_nb_error(self): + """Test %run notebook.ipynb error""" + pytest.importorskip("nbformat") + from nbformat import v4, writes + + # %run when a file name isn't provided + pytest.raises(Exception, _ip.magic, "run") + + # %run when a file doesn't exist + pytest.raises(Exception, _ip.magic, "run foobar.ipynb") + + # %run on a notebook with an error + nb = v4.new_notebook( + cells=[ + v4.new_code_cell("0/0") + ] + ) + src = writes(nb, version=4) + self.mktmp(src, ext='.ipynb') + pytest.raises(Exception, _ip.magic, "run %s" % self.fname) + + def test_file_options(self): + src = ('import sys\n' + 'a = " ".join(sys.argv[1:])\n') + self.mktmp(src) + test_opts = "-x 3 --verbose" + _ip.run_line_magic("run", "{0} {1}".format(self.fname, test_opts)) + assert _ip.user_ns["a"] == test_opts + + +class TestMagicRunWithPackage(unittest.TestCase): + + def writefile(self, name, content): + path = os.path.join(self.tempdir.name, name) + d = os.path.dirname(path) + if not os.path.isdir(d): + os.makedirs(d) + with open(path, "w", encoding="utf-8") as f: + f.write(textwrap.dedent(content)) + + def setUp(self): + self.package = package = 'tmp{0}'.format(''.join([random.choice(string.ascii_letters) for i in range(10)])) + """Temporary (probably) valid python package name.""" + + self.value = int(random.random() * 10000) + + self.tempdir = TemporaryDirectory() + self.__orig_cwd = os.getcwd() + sys.path.insert(0, self.tempdir.name) + + self.writefile(os.path.join(package, '__init__.py'), '') + self.writefile(os.path.join(package, 'sub.py'), """ + x = {0!r} + """.format(self.value)) + self.writefile(os.path.join(package, 'relative.py'), """ + from .sub import x + """) + self.writefile(os.path.join(package, 'absolute.py'), """ + from {0}.sub import x + """.format(package)) + self.writefile(os.path.join(package, 'args.py'), """ + import sys + a = " ".join(sys.argv[1:]) + """.format(package)) + + def tearDown(self): + os.chdir(self.__orig_cwd) + sys.path[:] = [p for p in sys.path if p != self.tempdir.name] + self.tempdir.cleanup() + + def check_run_submodule(self, submodule, opts=""): + _ip.user_ns.pop("x", None) + _ip.run_line_magic( + "run", "{2} -m {0}.{1}".format(self.package, submodule, opts) + ) + self.assertEqual( + _ip.user_ns["x"], + self.value, + "Variable `x` is not loaded from module `{0}`.".format(submodule), + ) + + def test_run_submodule_with_absolute_import(self): + self.check_run_submodule('absolute') + + def test_run_submodule_with_relative_import(self): + """Run submodule that has a relative import statement (#2727).""" + self.check_run_submodule('relative') + + def test_prun_submodule_with_absolute_import(self): + self.check_run_submodule('absolute', '-p') + + def test_prun_submodule_with_relative_import(self): + self.check_run_submodule('relative', '-p') + + def with_fake_debugger(func): + @functools.wraps(func) + def wrapper(*args, **kwds): + with patch.object(debugger.Pdb, 'run', staticmethod(eval)): + return func(*args, **kwds) + return wrapper + + @with_fake_debugger + def test_debug_run_submodule_with_absolute_import(self): + self.check_run_submodule('absolute', '-d') + + @with_fake_debugger + def test_debug_run_submodule_with_relative_import(self): + self.check_run_submodule('relative', '-d') + + def test_module_options(self): + _ip.user_ns.pop("a", None) + test_opts = "-x abc -m test" + _ip.run_line_magic("run", "-m {0}.args {1}".format(self.package, test_opts)) + assert _ip.user_ns["a"] == test_opts + + def test_module_options_with_separator(self): + _ip.user_ns.pop("a", None) + test_opts = "-x abc -m test" + _ip.run_line_magic("run", "-m {0}.args -- {1}".format(self.package, test_opts)) + assert _ip.user_ns["a"] == test_opts + + +def test_run__name__(): + with TemporaryDirectory() as td: + path = pjoin(td, "foo.py") + with open(path, "w", encoding="utf-8") as f: + f.write("q = __name__") + + _ip.user_ns.pop("q", None) + _ip.run_line_magic("run", "{}".format(path)) + assert _ip.user_ns.pop("q") == "__main__" + + _ip.run_line_magic("run", "-n {}".format(path)) + assert _ip.user_ns.pop("q") == "foo" + + try: + _ip.run_line_magic("run", "-i -n {}".format(path)) + assert _ip.user_ns.pop("q") == "foo" + finally: + _ip.run_line_magic("reset", "-f") + + +def test_run_tb(): + """Test traceback offset in %run""" + with TemporaryDirectory() as td: + path = pjoin(td, "foo.py") + with open(path, "w", encoding="utf-8") as f: + f.write( + "\n".join( + [ + "def foo():", + " return bar()", + "def bar():", + " raise RuntimeError('hello!')", + "foo()", + ] + ) + ) + with capture_output() as io: + _ip.run_line_magic("run", "{}".format(path)) + out = io.stdout + assert "execfile" not in out + assert "RuntimeError" in out + assert out.count("---->") == 3 + del ip.user_ns['bar'] + del ip.user_ns['foo'] + + +def test_multiprocessing_run(): + """Set we can run mutiprocesgin without messing up up main namespace + + Note that import `nose.tools as nt` modify the values + sys.module['__mp_main__'] so we need to temporarily set it to None to test + the issue. + """ + with TemporaryDirectory() as td: + mpm = sys.modules.get('__mp_main__') + sys.modules['__mp_main__'] = None + try: + path = pjoin(td, "test.py") + with open(path, "w", encoding="utf-8") as f: + f.write("import multiprocessing\nprint('hoy')") + with capture_output() as io: + _ip.run_line_magic('run', path) + _ip.run_cell("i_m_undefined") + out = io.stdout + assert "hoy" in out + assert "AttributeError" not in out + assert "NameError" in out + assert out.count("---->") == 1 + except: + raise + finally: + sys.modules['__mp_main__'] = mpm + + +def test_script_tb(): + """Test traceback offset in `ipython script.py`""" + with TemporaryDirectory() as td: + path = pjoin(td, "foo.py") + with open(path, "w", encoding="utf-8") as f: + f.write( + "\n".join( + [ + "def foo():", + " return bar()", + "def bar():", + " raise RuntimeError('hello!')", + "foo()", + ] + ) + ) + out, err = tt.ipexec(path) + assert "execfile" not in out + assert "RuntimeError" in out + assert out.count("---->") == 3 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py new file mode 100644 index 0000000..9f4f87b --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +"""Tests for shellapp module. + +Authors +------- +* Bradley Froehle +""" +#----------------------------------------------------------------------------- +# Copyright (C) 2012 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- +import unittest + +from IPython.testing import decorators as dec +from IPython.testing import tools as tt + + +class TestFileToRun(tt.TempFileMixin, unittest.TestCase): + """Test the behavior of the file_to_run parameter.""" + + def test_py_script_file_attribute(self): + """Test that `__file__` is set when running `ipython file.py`""" + src = "print(__file__)\n" + self.mktmp(src) + + err = None + tt.ipexec_validate(self.fname, self.fname, err) + + def test_ipy_script_file_attribute(self): + """Test that `__file__` is set when running `ipython file.ipy`""" + src = "print(__file__)\n" + self.mktmp(src, ext='.ipy') + + err = None + tt.ipexec_validate(self.fname, self.fname, err) + + # The commands option to ipexec_validate doesn't work on Windows, and it + # doesn't seem worth fixing + @dec.skip_win32 + def test_py_script_file_attribute_interactively(self): + """Test that `__file__` is not set after `ipython -i file.py`""" + src = "True\n" + self.mktmp(src) + + out, err = tt.ipexec( + self.fname, + options=["-i"], + commands=['"__file__" in globals()', "print(123)", "exit()"], + ) + assert "False" in out, f"Subprocess stderr:\n{err}\n-----" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py new file mode 100644 index 0000000..f5fc53f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py @@ -0,0 +1,41 @@ +# coding: utf-8 + +from IPython.core.splitinput import split_user_input, LineInfo + +import pytest + +tests = [ + ("x=1", ("", "", "x", "=1")), + ("?", ("", "?", "", "")), + ("??", ("", "??", "", "")), + (" ?", (" ", "?", "", "")), + (" ??", (" ", "??", "", "")), + ("??x", ("", "??", "x", "")), + ("?x=1", ("", "?", "x", "=1")), + ("!ls", ("", "!", "ls", "")), + (" !ls", (" ", "!", "ls", "")), + ("!!ls", ("", "!!", "ls", "")), + (" !!ls", (" ", "!!", "ls", "")), + (",ls", ("", ",", "ls", "")), + (";ls", ("", ";", "ls", "")), + (" ;ls", (" ", ";", "ls", "")), + ("f.g(x)", ("", "", "f.g", "(x)")), + ("f.g (x)", ("", "", "f.g", " (x)")), + ("?%hist1", ("", "?", "%hist1", "")), + ("?%%hist2", ("", "?", "%%hist2", "")), + ("??%hist3", ("", "??", "%hist3", "")), + ("??%%hist4", ("", "??", "%%hist4", "")), + ("?x*", ("", "?", "x*", "")), + ("Pérez Fernando", ("", "", "Pérez", " Fernando")), +] + + +@pytest.mark.parametrize("input, output", tests) +def test_split_user_input(input, output): + assert split_user_input(input) == output + + +def test_LineInfo(): + """Simple test for LineInfo construction and str()""" + linfo = LineInfo(" %cd /home") + assert str(linfo) == "LineInfo [ |%|cd|/home]" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py new file mode 100644 index 0000000..c8f5271 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py @@ -0,0 +1,457 @@ +# encoding: utf-8 +"""Tests for IPython.core.ultratb +""" +import io +import os.path +import platform +import re +import sys +import traceback +import unittest +from textwrap import dedent + +from tempfile import TemporaryDirectory + +from IPython.core.ultratb import ColorTB, VerboseTB +from IPython.testing import tools as tt +from IPython.testing.decorators import onlyif_unicode_paths, skip_without +from IPython.utils.syspathcontext import prepended_to_syspath + +file_1 = """1 +2 +3 +def f(): + 1/0 +""" + +file_2 = """def f(): + 1/0 +""" + + +def recursionlimit(frames): + """ + decorator to set the recursion limit temporarily + """ + + def inner(test_function): + def wrapper(*args, **kwargs): + rl = sys.getrecursionlimit() + sys.setrecursionlimit(frames) + try: + return test_function(*args, **kwargs) + finally: + sys.setrecursionlimit(rl) + + return wrapper + + return inner + + +class ChangedPyFileTest(unittest.TestCase): + def test_changing_py_file(self): + """Traceback produced if the line where the error occurred is missing? + + https://github.com/ipython/ipython/issues/1456 + """ + with TemporaryDirectory() as td: + fname = os.path.join(td, "foo.py") + with open(fname, "w", encoding="utf-8") as f: + f.write(file_1) + + with prepended_to_syspath(td): + ip.run_cell("import foo") + + with tt.AssertPrints("ZeroDivisionError"): + ip.run_cell("foo.f()") + + # Make the file shorter, so the line of the error is missing. + with open(fname, "w", encoding="utf-8") as f: + f.write(file_2) + + # For some reason, this was failing on the *second* call after + # changing the file, so we call f() twice. + with tt.AssertNotPrints("Internal Python error", channel='stderr'): + with tt.AssertPrints("ZeroDivisionError"): + ip.run_cell("foo.f()") + with tt.AssertPrints("ZeroDivisionError"): + ip.run_cell("foo.f()") + +iso_8859_5_file = u'''# coding: iso-8859-5 + +def fail(): + """дбИЖ""" + 1/0 # дбИЖ +''' + +class NonAsciiTest(unittest.TestCase): + @onlyif_unicode_paths + def test_nonascii_path(self): + # Non-ascii directory name as well. + with TemporaryDirectory(suffix=u'é') as td: + fname = os.path.join(td, u"fooé.py") + with open(fname, "w", encoding="utf-8") as f: + f.write(file_1) + + with prepended_to_syspath(td): + ip.run_cell("import foo") + + with tt.AssertPrints("ZeroDivisionError"): + ip.run_cell("foo.f()") + + def test_iso8859_5(self): + with TemporaryDirectory() as td: + fname = os.path.join(td, 'dfghjkl.py') + + with io.open(fname, 'w', encoding='iso-8859-5') as f: + f.write(iso_8859_5_file) + + with prepended_to_syspath(td): + ip.run_cell("from dfghjkl import fail") + + with tt.AssertPrints("ZeroDivisionError"): + with tt.AssertPrints(u'дбИЖ', suppress=False): + ip.run_cell('fail()') + + def test_nonascii_msg(self): + cell = u"raise Exception('é')" + expected = u"Exception('é')" + ip.run_cell("%xmode plain") + with tt.AssertPrints(expected): + ip.run_cell(cell) + + ip.run_cell("%xmode verbose") + with tt.AssertPrints(expected): + ip.run_cell(cell) + + ip.run_cell("%xmode context") + with tt.AssertPrints(expected): + ip.run_cell(cell) + + ip.run_cell("%xmode minimal") + with tt.AssertPrints(u"Exception: é"): + ip.run_cell(cell) + + # Put this back into Context mode for later tests. + ip.run_cell("%xmode context") + +class NestedGenExprTestCase(unittest.TestCase): + """ + Regression test for the following issues: + https://github.com/ipython/ipython/issues/8293 + https://github.com/ipython/ipython/issues/8205 + """ + def test_nested_genexpr(self): + code = dedent( + """\ + class SpecificException(Exception): + pass + + def foo(x): + raise SpecificException("Success!") + + sum(sum(foo(x) for _ in [0]) for x in [0]) + """ + ) + with tt.AssertPrints('SpecificException: Success!', suppress=False): + ip.run_cell(code) + + +indentationerror_file = """if True: +zoom() +""" + +class IndentationErrorTest(unittest.TestCase): + def test_indentationerror_shows_line(self): + # See issue gh-2398 + with tt.AssertPrints("IndentationError"): + with tt.AssertPrints("zoom()", suppress=False): + ip.run_cell(indentationerror_file) + + with TemporaryDirectory() as td: + fname = os.path.join(td, "foo.py") + with open(fname, "w", encoding="utf-8") as f: + f.write(indentationerror_file) + + with tt.AssertPrints("IndentationError"): + with tt.AssertPrints("zoom()", suppress=False): + ip.run_line_magic("run", fname) + + +@skip_without("pandas") +def test_dynamic_code(): + code = """ + import pandas + df = pandas.DataFrame([]) + + # Important: only fails inside of an "exec" call: + exec("df.foobarbaz()") + """ + + with tt.AssertPrints("Could not get source"): + ip.run_cell(code) + + +se_file_1 = """1 +2 +7/ +""" + +se_file_2 = """7/ +""" + +class SyntaxErrorTest(unittest.TestCase): + + def test_syntaxerror_no_stacktrace_at_compile_time(self): + syntax_error_at_compile_time = """ +def foo(): + .. +""" + with tt.AssertPrints("SyntaxError"): + ip.run_cell(syntax_error_at_compile_time) + + with tt.AssertNotPrints("foo()"): + ip.run_cell(syntax_error_at_compile_time) + + def test_syntaxerror_stacktrace_when_running_compiled_code(self): + syntax_error_at_runtime = """ +def foo(): + eval("..") + +def bar(): + foo() + +bar() +""" + with tt.AssertPrints("SyntaxError"): + ip.run_cell(syntax_error_at_runtime) + # Assert syntax error during runtime generate stacktrace + with tt.AssertPrints(["foo()", "bar()"]): + ip.run_cell(syntax_error_at_runtime) + del ip.user_ns['bar'] + del ip.user_ns['foo'] + + def test_changing_py_file(self): + with TemporaryDirectory() as td: + fname = os.path.join(td, "foo.py") + with open(fname, "w", encoding="utf-8") as f: + f.write(se_file_1) + + with tt.AssertPrints(["7/", "SyntaxError"]): + ip.run_line_magic("run", fname) + + # Modify the file + with open(fname, "w", encoding="utf-8") as f: + f.write(se_file_2) + + # The SyntaxError should point to the correct line + with tt.AssertPrints(["7/", "SyntaxError"]): + ip.run_line_magic("run", fname) + + def test_non_syntaxerror(self): + # SyntaxTB may be called with an error other than a SyntaxError + # See e.g. gh-4361 + try: + raise ValueError('QWERTY') + except ValueError: + with tt.AssertPrints('QWERTY'): + ip.showsyntaxerror() + +import sys + +if platform.python_implementation() != "PyPy": + """ + New 3.9 Pgen Parser does not raise Memory error, except on failed malloc. + """ + class MemoryErrorTest(unittest.TestCase): + def test_memoryerror(self): + memoryerror_code = "(" * 200 + ")" * 200 + ip.run_cell(memoryerror_code) + + +class Python3ChainedExceptionsTest(unittest.TestCase): + DIRECT_CAUSE_ERROR_CODE = """ +try: + x = 1 + 2 + print(not_defined_here) +except Exception as e: + x += 55 + x - 1 + y = {} + raise KeyError('uh') from e + """ + + EXCEPTION_DURING_HANDLING_CODE = """ +try: + x = 1 + 2 + print(not_defined_here) +except Exception as e: + x += 55 + x - 1 + y = {} + raise KeyError('uh') + """ + + SUPPRESS_CHAINING_CODE = """ +try: + 1/0 +except Exception: + raise ValueError("Yikes") from None + """ + + SYS_EXIT_WITH_CONTEXT_CODE = """ +try: + 1/0 +except Exception as e: + raise SystemExit(1) + """ + + def test_direct_cause_error(self): + with tt.AssertPrints(["KeyError", "NameError", "direct cause"]): + ip.run_cell(self.DIRECT_CAUSE_ERROR_CODE) + + def test_exception_during_handling_error(self): + with tt.AssertPrints(["KeyError", "NameError", "During handling"]): + ip.run_cell(self.EXCEPTION_DURING_HANDLING_CODE) + + def test_sysexit_while_handling_error(self): + with tt.AssertPrints(["SystemExit", "to see the full traceback"]): + with tt.AssertNotPrints(["another exception"], suppress=False): + ip.run_cell(self.SYS_EXIT_WITH_CONTEXT_CODE) + + def test_suppress_exception_chaining(self): + with tt.AssertNotPrints("ZeroDivisionError"), \ + tt.AssertPrints("ValueError", suppress=False): + ip.run_cell(self.SUPPRESS_CHAINING_CODE) + + def test_plain_direct_cause_error(self): + with tt.AssertPrints(["KeyError", "NameError", "direct cause"]): + ip.run_cell("%xmode Plain") + ip.run_cell(self.DIRECT_CAUSE_ERROR_CODE) + ip.run_cell("%xmode Verbose") + + def test_plain_exception_during_handling_error(self): + with tt.AssertPrints(["KeyError", "NameError", "During handling"]): + ip.run_cell("%xmode Plain") + ip.run_cell(self.EXCEPTION_DURING_HANDLING_CODE) + ip.run_cell("%xmode Verbose") + + def test_plain_suppress_exception_chaining(self): + with tt.AssertNotPrints("ZeroDivisionError"), \ + tt.AssertPrints("ValueError", suppress=False): + ip.run_cell("%xmode Plain") + ip.run_cell(self.SUPPRESS_CHAINING_CODE) + ip.run_cell("%xmode Verbose") + + +class RecursionTest(unittest.TestCase): + DEFINITIONS = """ +def non_recurs(): + 1/0 + +def r1(): + r1() + +def r3a(): + r3b() + +def r3b(): + r3c() + +def r3c(): + r3a() + +def r3o1(): + r3a() + +def r3o2(): + r3o1() +""" + def setUp(self): + ip.run_cell(self.DEFINITIONS) + + def test_no_recursion(self): + with tt.AssertNotPrints("skipping similar frames"): + ip.run_cell("non_recurs()") + + @recursionlimit(200) + def test_recursion_one_frame(self): + with tt.AssertPrints(re.compile( + r"\[\.\.\. skipping similar frames: r1 at line 5 \(\d{2,3} times\)\]") + ): + ip.run_cell("r1()") + + @recursionlimit(160) + def test_recursion_three_frames(self): + with tt.AssertPrints("[... skipping similar frames: "), \ + tt.AssertPrints(re.compile(r"r3a at line 8 \(\d{2} times\)"), suppress=False), \ + tt.AssertPrints(re.compile(r"r3b at line 11 \(\d{2} times\)"), suppress=False), \ + tt.AssertPrints(re.compile(r"r3c at line 14 \(\d{2} times\)"), suppress=False): + ip.run_cell("r3o2()") + + +class PEP678NotesReportingTest(unittest.TestCase): + ERROR_WITH_NOTE = """ +try: + raise AssertionError("Message") +except Exception as e: + try: + e.add_note("This is a PEP-678 note.") + except AttributeError: # Python <= 3.10 + e.__notes__ = ("This is a PEP-678 note.",) + raise + """ + + def test_verbose_reports_notes(self): + with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): + ip.run_cell(self.ERROR_WITH_NOTE) + + def test_plain_reports_notes(self): + with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): + ip.run_cell("%xmode Plain") + ip.run_cell(self.ERROR_WITH_NOTE) + ip.run_cell("%xmode Verbose") + + +#---------------------------------------------------------------------------- + +# module testing (minimal) +def test_handlers(): + def spam(c, d_e): + (d, e) = d_e + x = c + d + y = c * d + foo(x, y) + + def foo(a, b, bar=1): + eggs(a, b + bar) + + def eggs(f, g, z=globals()): + h = f + g + i = f - g + return h / i + + buff = io.StringIO() + + buff.write('') + buff.write('*** Before ***') + try: + buff.write(spam(1, (2, 3))) + except: + traceback.print_exc(file=buff) + + handler = ColorTB(ostream=buff) + buff.write('*** ColorTB ***') + try: + buff.write(spam(1, (2, 3))) + except: + handler(*sys.exc_info()) + buff.write('') + + handler = VerboseTB(ostream=buff) + buff.write('*** VerboseTB ***') + try: + buff.write(spam(1, (2, 3))) + except: + handler(*sys.exc_info()) + buff.write('') diff --git a/.venv/lib/python3.12/site-packages/IPython/core/ultratb.py b/.venv/lib/python3.12/site-packages/IPython/core/ultratb.py new file mode 100644 index 0000000..a8a38f1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/ultratb.py @@ -0,0 +1,1547 @@ +# -*- coding: utf-8 -*- +""" +Verbose and colourful traceback formatting. + +**ColorTB** + +I've always found it a bit hard to visually parse tracebacks in Python. The +ColorTB class is a solution to that problem. It colors the different parts of a +traceback in a manner similar to what you would expect from a syntax-highlighting +text editor. + +Installation instructions for ColorTB:: + + import sys,ultratb + sys.excepthook = ultratb.ColorTB() + +**VerboseTB** + +I've also included a port of Ka-Ping Yee's "cgitb.py" that produces all kinds +of useful info when a traceback occurs. Ping originally had it spit out HTML +and intended it for CGI programmers, but why should they have all the fun? I +altered it to spit out colored text to the terminal. It's a bit overwhelming, +but kind of neat, and maybe useful for long-running programs that you believe +are bug-free. If a crash *does* occur in that type of program you want details. +Give it a shot--you'll love it or you'll hate it. + +.. note:: + + The Verbose mode prints the variables currently visible where the exception + happened (shortening their strings if too long). This can potentially be + very slow, if you happen to have a huge data structure whose string + representation is complex to compute. Your computer may appear to freeze for + a while with cpu usage at 100%. If this occurs, you can cancel the traceback + with Ctrl-C (maybe hitting it more than once). + + If you encounter this kind of situation often, you may want to use the + Verbose_novars mode instead of the regular Verbose, which avoids formatting + variables (but otherwise includes the information and context given by + Verbose). + +.. note:: + + The verbose mode print all variables in the stack, which means it can + potentially leak sensitive information like access keys, or unencrypted + password. + +Installation instructions for VerboseTB:: + + import sys,ultratb + sys.excepthook = ultratb.VerboseTB() + +Note: Much of the code in this module was lifted verbatim from the standard +library module 'traceback.py' and Ka-Ping Yee's 'cgitb.py'. + +Color schemes +------------- + +The colors are defined in the class TBTools through the use of the +ColorSchemeTable class. Currently the following exist: + + - NoColor: allows all of this module to be used in any terminal (the color + escapes are just dummy blank strings). + + - Linux: is meant to look good in a terminal like the Linux console (black + or very dark background). + + - LightBG: similar to Linux but swaps dark/light colors to be more readable + in light background terminals. + + - Neutral: a neutral color scheme that should be readable on both light and + dark background + +You can implement other color schemes easily, the syntax is fairly +self-explanatory. Please send back new schemes you develop to the author for +possible inclusion in future releases. + +Inheritance diagram: + +.. inheritance-diagram:: IPython.core.ultratb + :parts: 3 +""" + +#***************************************************************************** +# Copyright (C) 2001 Nathaniel Gray +# Copyright (C) 2001-2004 Fernando Perez +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** + + +from collections.abc import Sequence +import functools +import inspect +import linecache +import pydoc +import sys +import time +import traceback +import types +from types import TracebackType +from typing import Any, List, Optional, Tuple + +import stack_data +from pygments.formatters.terminal256 import Terminal256Formatter +from pygments.styles import get_style_by_name + +import IPython.utils.colorable as colorable +# IPython's own modules +from IPython import get_ipython +from IPython.core import debugger +from IPython.core.display_trap import DisplayTrap +from IPython.core.excolors import exception_colors +from IPython.utils import PyColorize +from IPython.utils import path as util_path +from IPython.utils import py3compat +from IPython.utils.terminal import get_terminal_size + +# Globals +# amount of space to put line numbers before verbose tracebacks +INDENT_SIZE = 8 + +# Default color scheme. This is used, for example, by the traceback +# formatter. When running in an actual IPython instance, the user's rc.colors +# value is used, but having a module global makes this functionality available +# to users of ultratb who are NOT running inside ipython. +DEFAULT_SCHEME = 'NoColor' +FAST_THRESHOLD = 10_000 + +# --------------------------------------------------------------------------- +# Code begins + +# Helper function -- largely belongs to VerboseTB, but we need the same +# functionality to produce a pseudo verbose TB for SyntaxErrors, so that they +# can be recognized properly by ipython.el's py-traceback-line-re +# (SyntaxErrors have to be treated specially because they have no traceback) + + +@functools.lru_cache() +def count_lines_in_py_file(filename: str) -> int: + """ + Given a filename, returns the number of lines in the file + if it ends with the extension ".py". Otherwise, returns 0. + """ + if not filename.endswith(".py"): + return 0 + else: + try: + with open(filename, "r") as file: + s = sum(1 for line in file) + except UnicodeError: + return 0 + return s + + """ + Given a frame object, returns the total number of lines in the file + if the filename ends with the extension ".py". Otherwise, returns 0. + """ + + +def get_line_number_of_frame(frame: types.FrameType) -> int: + """ + Given a frame object, returns the total number of lines in the file + containing the frame's code object, or the number of lines in the + frame's source code if the file is not available. + + Parameters + ---------- + frame : FrameType + The frame object whose line number is to be determined. + + Returns + ------- + int + The total number of lines in the file containing the frame's + code object, or the number of lines in the frame's source code + if the file is not available. + """ + filename = frame.f_code.co_filename + if filename is None: + print("No file....") + lines, first = inspect.getsourcelines(frame) + return first + len(lines) + return count_lines_in_py_file(filename) + + +def _safe_string(value, what, func=str): + # Copied from cpython/Lib/traceback.py + try: + return func(value) + except: + return f"<{what} {func.__name__}() failed>" + + +def _format_traceback_lines(lines, Colors, has_colors: bool, lvals): + """ + Format tracebacks lines with pointing arrow, leading numbers... + + Parameters + ---------- + lines : list[Line] + Colors + ColorScheme used. + lvals : str + Values of local variables, already colored, to inject just after the error line. + """ + numbers_width = INDENT_SIZE - 1 + res = [] + + for stack_line in lines: + if stack_line is stack_data.LINE_GAP: + res.append('%s (...)%s\n' % (Colors.linenoEm, Colors.Normal)) + continue + + line = stack_line.render(pygmented=has_colors).rstrip('\n') + '\n' + lineno = stack_line.lineno + if stack_line.is_current: + # This is the line with the error + pad = numbers_width - len(str(lineno)) + num = '%s%s' % (debugger.make_arrow(pad), str(lineno)) + start_color = Colors.linenoEm + else: + num = '%*s' % (numbers_width, lineno) + start_color = Colors.lineno + + line = '%s%s%s %s' % (start_color, num, Colors.Normal, line) + + res.append(line) + if lvals and stack_line.is_current: + res.append(lvals + '\n') + return res + +def _simple_format_traceback_lines(lnum, index, lines, Colors, lvals, _line_format): + """ + Format tracebacks lines with pointing arrow, leading numbers... + + Parameters + ========== + + lnum: int + number of the target line of code. + index: int + which line in the list should be highlighted. + lines: list[string] + Colors: + ColorScheme used. + lvals: bytes + Values of local variables, already colored, to inject just after the error line. + _line_format: f (str) -> (str, bool) + return (colorized version of str, failure to do so) + """ + numbers_width = INDENT_SIZE - 1 + res = [] + for i, line in enumerate(lines, lnum - index): + # assert isinstance(line, str) + line = py3compat.cast_unicode(line) + + new_line, err = _line_format(line, "str") + if not err: + line = new_line + + if i == lnum: + # This is the line with the error + pad = numbers_width - len(str(i)) + num = "%s%s" % (debugger.make_arrow(pad), str(lnum)) + line = "%s%s%s %s%s" % ( + Colors.linenoEm, + num, + Colors.line, + line, + Colors.Normal, + ) + else: + num = "%*s" % (numbers_width, i) + line = "%s%s%s %s" % (Colors.lineno, num, Colors.Normal, line) + + res.append(line) + if lvals and i == lnum: + res.append(lvals + "\n") + return res + + +def _format_filename(file, ColorFilename, ColorNormal, *, lineno=None): + """ + Format filename lines with custom formatting from caching compiler or `File *.py` by default + + Parameters + ---------- + file : str + ColorFilename + ColorScheme's filename coloring to be used. + ColorNormal + ColorScheme's normal coloring to be used. + """ + ipinst = get_ipython() + if ( + ipinst is not None + and (data := ipinst.compile.format_code_name(file)) is not None + ): + label, name = data + if lineno is None: + tpl_link = f"{{label}} {ColorFilename}{{name}}{ColorNormal}" + else: + tpl_link = ( + f"{{label}} {ColorFilename}{{name}}, line {{lineno}}{ColorNormal}" + ) + else: + label = "File" + name = util_path.compress_user( + py3compat.cast_unicode(file, util_path.fs_encoding) + ) + if lineno is None: + tpl_link = f"{{label}} {ColorFilename}{{name}}{ColorNormal}" + else: + # can we make this the more friendly ", line {{lineno}}", or do we need to preserve the formatting with the colon? + tpl_link = f"{{label}} {ColorFilename}{{name}}:{{lineno}}{ColorNormal}" + + return tpl_link.format(label=label, name=name, lineno=lineno) + +#--------------------------------------------------------------------------- +# Module classes +class TBTools(colorable.Colorable): + """Basic tools used by all traceback printer classes.""" + + # Number of frames to skip when reporting tracebacks + tb_offset = 0 + + def __init__( + self, + color_scheme="NoColor", + call_pdb=False, + ostream=None, + parent=None, + config=None, + *, + debugger_cls=None, + ): + # Whether to call the interactive pdb debugger after printing + # tracebacks or not + super(TBTools, self).__init__(parent=parent, config=config) + self.call_pdb = call_pdb + + # Output stream to write to. Note that we store the original value in + # a private attribute and then make the public ostream a property, so + # that we can delay accessing sys.stdout until runtime. The way + # things are written now, the sys.stdout object is dynamically managed + # so a reference to it should NEVER be stored statically. This + # property approach confines this detail to a single location, and all + # subclasses can simply access self.ostream for writing. + self._ostream = ostream + + # Create color table + self.color_scheme_table = exception_colors() + + self.set_colors(color_scheme) + self.old_scheme = color_scheme # save initial value for toggles + self.debugger_cls = debugger_cls or debugger.Pdb + + if call_pdb: + self.pdb = self.debugger_cls() + else: + self.pdb = None + + def _get_ostream(self): + """Output stream that exceptions are written to. + + Valid values are: + + - None: the default, which means that IPython will dynamically resolve + to sys.stdout. This ensures compatibility with most tools, including + Windows (where plain stdout doesn't recognize ANSI escapes). + + - Any object with 'write' and 'flush' attributes. + """ + return sys.stdout if self._ostream is None else self._ostream + + def _set_ostream(self, val): + assert val is None or (hasattr(val, 'write') and hasattr(val, 'flush')) + self._ostream = val + + ostream = property(_get_ostream, _set_ostream) + + @staticmethod + def _get_chained_exception(exception_value): + cause = getattr(exception_value, "__cause__", None) + if cause: + return cause + if getattr(exception_value, "__suppress_context__", False): + return None + return getattr(exception_value, "__context__", None) + + def get_parts_of_chained_exception( + self, evalue + ) -> Optional[Tuple[type, BaseException, TracebackType]]: + chained_evalue = self._get_chained_exception(evalue) + + if chained_evalue: + return chained_evalue.__class__, chained_evalue, chained_evalue.__traceback__ + return None + + def prepare_chained_exception_message(self, cause) -> List[Any]: + direct_cause = "\nThe above exception was the direct cause of the following exception:\n" + exception_during_handling = "\nDuring handling of the above exception, another exception occurred:\n" + + if cause: + message = [[direct_cause]] + else: + message = [[exception_during_handling]] + return message + + @property + def has_colors(self) -> bool: + return self.color_scheme_table.active_scheme_name.lower() != "nocolor" + + def set_colors(self, *args, **kw): + """Shorthand access to the color table scheme selector method.""" + + # Set own color table + self.color_scheme_table.set_active_scheme(*args, **kw) + # for convenience, set Colors to the active scheme + self.Colors = self.color_scheme_table.active_colors + # Also set colors of debugger + if hasattr(self, 'pdb') and self.pdb is not None: + self.pdb.set_colors(*args, **kw) + + def color_toggle(self): + """Toggle between the currently active color scheme and NoColor.""" + + if self.color_scheme_table.active_scheme_name == 'NoColor': + self.color_scheme_table.set_active_scheme(self.old_scheme) + self.Colors = self.color_scheme_table.active_colors + else: + self.old_scheme = self.color_scheme_table.active_scheme_name + self.color_scheme_table.set_active_scheme('NoColor') + self.Colors = self.color_scheme_table.active_colors + + def stb2text(self, stb): + """Convert a structured traceback (a list) to a string.""" + return '\n'.join(stb) + + def text(self, etype, value, tb, tb_offset: Optional[int] = None, context=5): + """Return formatted traceback. + + Subclasses may override this if they add extra arguments. + """ + tb_list = self.structured_traceback(etype, value, tb, + tb_offset, context) + return self.stb2text(tb_list) + + def structured_traceback( + self, + etype: type, + evalue: Optional[BaseException], + etb: Optional[TracebackType] = None, + tb_offset: Optional[int] = None, + number_of_lines_of_context: int = 5, + ): + """Return a list of traceback frames. + + Must be implemented by each class. + """ + raise NotImplementedError() + + +#--------------------------------------------------------------------------- +class ListTB(TBTools): + """Print traceback information from a traceback list, with optional color. + + Calling requires 3 arguments: (etype, evalue, elist) + as would be obtained by:: + + etype, evalue, tb = sys.exc_info() + if tb: + elist = traceback.extract_tb(tb) + else: + elist = None + + It can thus be used by programs which need to process the traceback before + printing (such as console replacements based on the code module from the + standard library). + + Because they are meant to be called without a full traceback (only a + list), instances of this class can't call the interactive pdb debugger.""" + + + def __call__(self, etype, value, elist): + self.ostream.flush() + self.ostream.write(self.text(etype, value, elist)) + self.ostream.write('\n') + + def _extract_tb(self, tb): + if tb: + return traceback.extract_tb(tb) + else: + return None + + def structured_traceback( + self, + etype: type, + evalue: Optional[BaseException], + etb: Optional[TracebackType] = None, + tb_offset: Optional[int] = None, + context=5, + ): + """Return a color formatted string with the traceback info. + + Parameters + ---------- + etype : exception type + Type of the exception raised. + evalue : object + Data stored in the exception + etb : list | TracebackType | None + If list: List of frames, see class docstring for details. + If Traceback: Traceback of the exception. + tb_offset : int, optional + Number of frames in the traceback to skip. If not given, the + instance evalue is used (set in constructor). + context : int, optional + Number of lines of context information to print. + + Returns + ------- + String with formatted exception. + """ + # This is a workaround to get chained_exc_ids in recursive calls + # etb should not be a tuple if structured_traceback is not recursive + if isinstance(etb, tuple): + etb, chained_exc_ids = etb + else: + chained_exc_ids = set() + + if isinstance(etb, list): + elist = etb + elif etb is not None: + elist = self._extract_tb(etb) + else: + elist = [] + tb_offset = self.tb_offset if tb_offset is None else tb_offset + assert isinstance(tb_offset, int) + Colors = self.Colors + out_list = [] + if elist: + + if tb_offset and len(elist) > tb_offset: + elist = elist[tb_offset:] + + out_list.append('Traceback %s(most recent call last)%s:' % + (Colors.normalEm, Colors.Normal) + '\n') + out_list.extend(self._format_list(elist)) + # The exception info should be a single entry in the list. + lines = ''.join(self._format_exception_only(etype, evalue)) + out_list.append(lines) + + # Find chained exceptions if we have a traceback (not for exception-only mode) + if etb is not None: + exception = self.get_parts_of_chained_exception(evalue) + + if exception and (id(exception[1]) not in chained_exc_ids): + chained_exception_message = ( + self.prepare_chained_exception_message(evalue.__cause__)[0] + if evalue is not None + else "" + ) + etype, evalue, etb = exception + # Trace exception to avoid infinite 'cause' loop + chained_exc_ids.add(id(exception[1])) + chained_exceptions_tb_offset = 0 + out_list = ( + self.structured_traceback( + etype, + evalue, + (etb, chained_exc_ids), # type: ignore + chained_exceptions_tb_offset, + context, + ) + + chained_exception_message + + out_list + ) + + return out_list + + def _format_list(self, extracted_list): + """Format a list of traceback entry tuples for printing. + + Given a list of tuples as returned by extract_tb() or + extract_stack(), return a list of strings ready for printing. + Each string in the resulting list corresponds to the item with the + same index in the argument list. Each string ends in a newline; + the strings may contain internal newlines as well, for those items + whose source text line is not None. + + Lifted almost verbatim from traceback.py + """ + + Colors = self.Colors + output_list = [] + for ind, (filename, lineno, name, line) in enumerate(extracted_list): + normalCol, nameCol, fileCol, lineCol = ( + # Emphasize the last entry + (Colors.normalEm, Colors.nameEm, Colors.filenameEm, Colors.line) + if ind == len(extracted_list) - 1 + else (Colors.Normal, Colors.name, Colors.filename, "") + ) + + fns = _format_filename(filename, fileCol, normalCol, lineno=lineno) + item = f"{normalCol} {fns}" + + if name != "": + item += f" in {nameCol}{name}{normalCol}\n" + else: + item += "\n" + if line: + item += f"{lineCol} {line.strip()}{normalCol}\n" + output_list.append(item) + + return output_list + + def _format_exception_only(self, etype, value): + """Format the exception part of a traceback. + + The arguments are the exception type and value such as given by + sys.exc_info()[:2]. The return value is a list of strings, each ending + in a newline. Normally, the list contains a single string; however, + for SyntaxError exceptions, it contains several lines that (when + printed) display detailed information about where the syntax error + occurred. The message indicating which exception occurred is the + always last string in the list. + + Also lifted nearly verbatim from traceback.py + """ + have_filedata = False + Colors = self.Colors + output_list = [] + stype = py3compat.cast_unicode(Colors.excName + etype.__name__ + Colors.Normal) + if value is None: + # Not sure if this can still happen in Python 2.6 and above + output_list.append(stype + "\n") + else: + if issubclass(etype, SyntaxError): + have_filedata = True + if not value.filename: value.filename = "" + if value.lineno: + lineno = value.lineno + textline = linecache.getline(value.filename, value.lineno) + else: + lineno = "unknown" + textline = "" + output_list.append( + "%s %s%s\n" + % ( + Colors.normalEm, + _format_filename( + value.filename, + Colors.filenameEm, + Colors.normalEm, + lineno=(None if lineno == "unknown" else lineno), + ), + Colors.Normal, + ) + ) + if textline == "": + textline = py3compat.cast_unicode(value.text, "utf-8") + + if textline is not None: + i = 0 + while i < len(textline) and textline[i].isspace(): + i += 1 + output_list.append( + "%s %s%s\n" % (Colors.line, textline.strip(), Colors.Normal) + ) + if value.offset is not None: + s = ' ' + for c in textline[i:value.offset - 1]: + if c.isspace(): + s += c + else: + s += " " + output_list.append( + "%s%s^%s\n" % (Colors.caret, s, Colors.Normal) + ) + + try: + s = value.msg + except Exception: + s = self._some_str(value) + if s: + output_list.append( + "%s%s:%s %s\n" % (stype, Colors.excName, Colors.Normal, s) + ) + else: + output_list.append("%s\n" % stype) + + # PEP-678 notes + output_list.extend(f"{x}\n" for x in getattr(value, "__notes__", [])) + + # sync with user hooks + if have_filedata: + ipinst = get_ipython() + if ipinst is not None: + ipinst.hooks.synchronize_with_editor(value.filename, value.lineno, 0) + + return output_list + + def get_exception_only(self, etype, value): + """Only print the exception type and message, without a traceback. + + Parameters + ---------- + etype : exception type + value : exception value + """ + return ListTB.structured_traceback(self, etype, value) + + def show_exception_only(self, etype, evalue): + """Only print the exception type and message, without a traceback. + + Parameters + ---------- + etype : exception type + evalue : exception value + """ + # This method needs to use __call__ from *this* class, not the one from + # a subclass whose signature or behavior may be different + ostream = self.ostream + ostream.flush() + ostream.write('\n'.join(self.get_exception_only(etype, evalue))) + ostream.flush() + + def _some_str(self, value): + # Lifted from traceback.py + try: + return py3compat.cast_unicode(str(value)) + except: + return u'' % type(value).__name__ + + +class FrameInfo: + """ + Mirror of stack data's FrameInfo, but so that we can bypass highlighting on + really long frames. + """ + + description: Optional[str] + filename: Optional[str] + lineno: Tuple[int] + # number of context lines to use + context: Optional[int] + raw_lines: List[str] + + @classmethod + def _from_stack_data_FrameInfo(cls, frame_info): + return cls( + getattr(frame_info, "description", None), + getattr(frame_info, "filename", None), # type: ignore[arg-type] + getattr(frame_info, "lineno", None), # type: ignore[arg-type] + getattr(frame_info, "frame", None), + getattr(frame_info, "code", None), + sd=frame_info, + context=None, + ) + + def __init__( + self, + description: Optional[str], + filename: str, + lineno: Tuple[int], + frame, + code, + *, + sd=None, + context=None, + ): + self.description = description + self.filename = filename + self.lineno = lineno + self.frame = frame + self.code = code + self._sd = sd + self.context = context + + # self.lines = [] + if sd is None: + try: + # return a list of source lines and a starting line number + self.raw_lines = inspect.getsourcelines(frame)[0] + except OSError: + self.raw_lines = [ + "'Could not get source, probably due dynamically evaluated source code.'" + ] + + @property + def variables_in_executing_piece(self): + if self._sd: + return self._sd.variables_in_executing_piece + else: + return [] + + @property + def lines(self): + from executing.executing import NotOneValueFound + + try: + return self._sd.lines + except NotOneValueFound: + + class Dummy: + lineno = 0 + is_current = False + + def render(self, *, pygmented): + return "" + + return [Dummy()] + + @property + def executing(self): + if self._sd: + return self._sd.executing + else: + return None + + +# ---------------------------------------------------------------------------- +class VerboseTB(TBTools): + """A port of Ka-Ping Yee's cgitb.py module that outputs color text instead + of HTML. Requires inspect and pydoc. Crazy, man. + + Modified version which optionally strips the topmost entries from the + traceback, to be used with alternate interpreters (because their own code + would appear in the traceback).""" + + tb_highlight = "bg:ansiyellow" + tb_highlight_style = "default" + + def __init__( + self, + color_scheme: str = "Linux", + call_pdb: bool = False, + ostream=None, + tb_offset: int = 0, + long_header: bool = False, + include_vars: bool = True, + check_cache=None, + debugger_cls=None, + parent=None, + config=None, + ): + """Specify traceback offset, headers and color scheme. + + Define how many frames to drop from the tracebacks. Calling it with + tb_offset=1 allows use of this handler in interpreters which will have + their own code at the top of the traceback (VerboseTB will first + remove that frame before printing the traceback info).""" + TBTools.__init__( + self, + color_scheme=color_scheme, + call_pdb=call_pdb, + ostream=ostream, + parent=parent, + config=config, + debugger_cls=debugger_cls, + ) + self.tb_offset = tb_offset + self.long_header = long_header + self.include_vars = include_vars + # By default we use linecache.checkcache, but the user can provide a + # different check_cache implementation. This was formerly used by the + # IPython kernel for interactive code, but is no longer necessary. + if check_cache is None: + check_cache = linecache.checkcache + self.check_cache = check_cache + + self.skip_hidden = True + + def format_record(self, frame_info: FrameInfo): + """Format a single stack frame""" + assert isinstance(frame_info, FrameInfo) + Colors = self.Colors # just a shorthand + quicker name lookup + ColorsNormal = Colors.Normal # used a lot + + if isinstance(frame_info._sd, stack_data.RepeatedFrames): + return ' %s[... skipping similar frames: %s]%s\n' % ( + Colors.excName, frame_info.description, ColorsNormal) + + indent = " " * INDENT_SIZE + em_normal = "%s\n%s%s" % (Colors.valEm, indent, ColorsNormal) + tpl_call = f"in {Colors.vName}{{file}}{Colors.valEm}{{scope}}{ColorsNormal}" + tpl_call_fail = "in %s%%s%s(***failed resolving arguments***)%s" % ( + Colors.vName, + Colors.valEm, + ColorsNormal, + ) + tpl_name_val = "%%s %s= %%s%s" % (Colors.valEm, ColorsNormal) + + link = _format_filename( + frame_info.filename, + Colors.filenameEm, + ColorsNormal, + lineno=frame_info.lineno, + ) + args, varargs, varkw, locals_ = inspect.getargvalues(frame_info.frame) + if frame_info.executing is not None: + func = frame_info.executing.code_qualname() + else: + func = "?" + if func == "": + call = "" + else: + # Decide whether to include variable details or not + var_repr = eqrepr if self.include_vars else nullrepr + try: + scope = inspect.formatargvalues( + args, varargs, varkw, locals_, formatvalue=var_repr + ) + call = tpl_call.format(file=func, scope=scope) + except KeyError: + # This happens in situations like errors inside generator + # expressions, where local variables are listed in the + # line, but can't be extracted from the frame. I'm not + # 100% sure this isn't actually a bug in inspect itself, + # but since there's no info for us to compute with, the + # best we can do is report the failure and move on. Here + # we must *not* call any traceback construction again, + # because that would mess up use of %debug later on. So we + # simply report the failure and move on. The only + # limitation will be that this frame won't have locals + # listed in the call signature. Quite subtle problem... + # I can't think of a good way to validate this in a unit + # test, but running a script consisting of: + # dict( (k,v.strip()) for (k,v) in range(10) ) + # will illustrate the error, if this exception catch is + # disabled. + call = tpl_call_fail % func + + lvals = '' + lvals_list = [] + if self.include_vars: + try: + # we likely want to fix stackdata at some point, but + # still need a workaround. + fibp = frame_info.variables_in_executing_piece + for var in fibp: + lvals_list.append(tpl_name_val % (var.name, repr(var.value))) + except Exception: + lvals_list.append( + "Exception trying to inspect frame. No more locals available." + ) + if lvals_list: + lvals = '%s%s' % (indent, em_normal.join(lvals_list)) + + result = f'{link}{", " if call else ""}{call}\n' + if frame_info._sd is None: + # fast fallback if file is too long + tpl_link = "%s%%s%s" % (Colors.filenameEm, ColorsNormal) + link = tpl_link % util_path.compress_user(frame_info.filename) + level = "%s %s\n" % (link, call) + _line_format = PyColorize.Parser( + style=self.color_scheme_table.active_scheme_name, parent=self + ).format2 + first_line = frame_info.code.co_firstlineno + current_line = frame_info.lineno[0] + raw_lines = frame_info.raw_lines + index = current_line - first_line + + if index >= frame_info.context: + start = max(index - frame_info.context, 0) + stop = index + frame_info.context + index = frame_info.context + else: + start = 0 + stop = index + frame_info.context + raw_lines = raw_lines[start:stop] + + return "%s%s" % ( + level, + "".join( + _simple_format_traceback_lines( + current_line, + index, + raw_lines, + Colors, + lvals, + _line_format, + ) + ), + ) + # result += "\n".join(frame_info.raw_lines) + else: + result += "".join( + _format_traceback_lines( + frame_info.lines, Colors, self.has_colors, lvals + ) + ) + return result + + def prepare_header(self, etype: str, long_version: bool = False): + colors = self.Colors # just a shorthand + quicker name lookup + colorsnormal = colors.Normal # used a lot + exc = '%s%s%s' % (colors.excName, etype, colorsnormal) + width = min(75, get_terminal_size()[0]) + if long_version: + # Header with the exception type, python version, and date + pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable + date = time.ctime(time.time()) + + head = "%s%s%s\n%s%s%s\n%s" % ( + colors.topline, + "-" * width, + colorsnormal, + exc, + " " * (width - len(etype) - len(pyver)), + pyver, + date.rjust(width), + ) + head += ( + "\nA problem occurred executing Python code. Here is the sequence of function" + "\ncalls leading up to the error, with the most recent (innermost) call last." + ) + else: + # Simplified header + head = "%s%s" % ( + exc, + "Traceback (most recent call last)".rjust(width - len(etype)), + ) + + return head + + def format_exception(self, etype, evalue): + colors = self.Colors # just a shorthand + quicker name lookup + colorsnormal = colors.Normal # used a lot + # Get (safely) a string form of the exception info + try: + etype_str, evalue_str = map(str, (etype, evalue)) + except: + # User exception is improperly defined. + etype, evalue = str, sys.exc_info()[:2] + etype_str, evalue_str = map(str, (etype, evalue)) + + # PEP-678 notes + notes = getattr(evalue, "__notes__", []) + if not isinstance(notes, Sequence) or isinstance(notes, (str, bytes)): + notes = [_safe_string(notes, "__notes__", func=repr)] + + # ... and format it + return [ + "{}{}{}: {}".format( + colors.excName, + etype_str, + colorsnormal, + py3compat.cast_unicode(evalue_str), + ), + *( + "{}{}".format( + colorsnormal, _safe_string(py3compat.cast_unicode(n), "note") + ) + for n in notes + ), + ] + + def format_exception_as_a_whole( + self, + etype: type, + evalue: Optional[BaseException], + etb: Optional[TracebackType], + number_of_lines_of_context, + tb_offset: Optional[int], + ): + """Formats the header, traceback and exception message for a single exception. + + This may be called multiple times by Python 3 exception chaining + (PEP 3134). + """ + # some locals + orig_etype = etype + try: + etype = etype.__name__ # type: ignore + except AttributeError: + pass + + tb_offset = self.tb_offset if tb_offset is None else tb_offset + assert isinstance(tb_offset, int) + head = self.prepare_header(str(etype), self.long_header) + records = ( + self.get_records(etb, number_of_lines_of_context, tb_offset) if etb else [] + ) + + frames = [] + skipped = 0 + lastrecord = len(records) - 1 + for i, record in enumerate(records): + if ( + not isinstance(record._sd, stack_data.RepeatedFrames) + and self.skip_hidden + ): + if ( + record.frame.f_locals.get("__tracebackhide__", 0) + and i != lastrecord + ): + skipped += 1 + continue + if skipped: + Colors = self.Colors # just a shorthand + quicker name lookup + ColorsNormal = Colors.Normal # used a lot + frames.append( + " %s[... skipping hidden %s frame]%s\n" + % (Colors.excName, skipped, ColorsNormal) + ) + skipped = 0 + frames.append(self.format_record(record)) + if skipped: + Colors = self.Colors # just a shorthand + quicker name lookup + ColorsNormal = Colors.Normal # used a lot + frames.append( + " %s[... skipping hidden %s frame]%s\n" + % (Colors.excName, skipped, ColorsNormal) + ) + + formatted_exception = self.format_exception(etype, evalue) + if records: + frame_info = records[-1] + ipinst = get_ipython() + if ipinst is not None: + ipinst.hooks.synchronize_with_editor(frame_info.filename, frame_info.lineno, 0) + + return [[head] + frames + formatted_exception] + + def get_records( + self, etb: TracebackType, number_of_lines_of_context: int, tb_offset: int + ): + assert etb is not None + context = number_of_lines_of_context - 1 + after = context // 2 + before = context - after + if self.has_colors: + style = get_style_by_name(self.tb_highlight_style) + style = stack_data.style_with_executing_node(style, self.tb_highlight) + formatter = Terminal256Formatter(style=style) + else: + formatter = None + options = stack_data.Options( + before=before, + after=after, + pygments_formatter=formatter, + ) + + # Let's estimate the amount of code we will have to parse/highlight. + cf: Optional[TracebackType] = etb + max_len = 0 + tbs = [] + while cf is not None: + try: + mod = inspect.getmodule(cf.tb_frame) + if mod is not None: + mod_name = mod.__name__ + root_name, *_ = mod_name.split(".") + if root_name == "IPython": + cf = cf.tb_next + continue + max_len = get_line_number_of_frame(cf.tb_frame) + + except OSError: + max_len = 0 + max_len = max(max_len, max_len) + tbs.append(cf) + cf = getattr(cf, "tb_next", None) + + if max_len > FAST_THRESHOLD: + FIs = [] + for tb in tbs: + frame = tb.tb_frame # type: ignore + lineno = (frame.f_lineno,) + code = frame.f_code + filename = code.co_filename + # TODO: Here we need to use before/after/ + FIs.append( + FrameInfo( + "Raw frame", filename, lineno, frame, code, context=context + ) + ) + return FIs + res = list(stack_data.FrameInfo.stack_data(etb, options=options))[tb_offset:] + res = [FrameInfo._from_stack_data_FrameInfo(r) for r in res] + return res + + def structured_traceback( + self, + etype: type, + evalue: Optional[BaseException], + etb: Optional[TracebackType] = None, + tb_offset: Optional[int] = None, + number_of_lines_of_context: int = 5, + ): + """Return a nice text document describing the traceback.""" + formatted_exception = self.format_exception_as_a_whole(etype, evalue, etb, number_of_lines_of_context, + tb_offset) + + colors = self.Colors # just a shorthand + quicker name lookup + colorsnormal = colors.Normal # used a lot + head = '%s%s%s' % (colors.topline, '-' * min(75, get_terminal_size()[0]), colorsnormal) + structured_traceback_parts = [head] + chained_exceptions_tb_offset = 0 + lines_of_context = 3 + formatted_exceptions = formatted_exception + exception = self.get_parts_of_chained_exception(evalue) + if exception: + assert evalue is not None + formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__) + etype, evalue, etb = exception + else: + evalue = None + chained_exc_ids = set() + while evalue: + formatted_exceptions += self.format_exception_as_a_whole(etype, evalue, etb, lines_of_context, + chained_exceptions_tb_offset) + exception = self.get_parts_of_chained_exception(evalue) + + if exception and not id(exception[1]) in chained_exc_ids: + chained_exc_ids.add(id(exception[1])) # trace exception to avoid infinite 'cause' loop + formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__) + etype, evalue, etb = exception + else: + evalue = None + + # we want to see exceptions in a reversed order: + # the first exception should be on top + for formatted_exception in reversed(formatted_exceptions): + structured_traceback_parts += formatted_exception + + return structured_traceback_parts + + def debugger(self, force: bool = False): + """Call up the pdb debugger if desired, always clean up the tb + reference. + + Keywords: + + - force(False): by default, this routine checks the instance call_pdb + flag and does not actually invoke the debugger if the flag is false. + The 'force' option forces the debugger to activate even if the flag + is false. + + If the call_pdb flag is set, the pdb interactive debugger is + invoked. In all cases, the self.tb reference to the current traceback + is deleted to prevent lingering references which hamper memory + management. + + Note that each call to pdb() does an 'import readline', so if your app + requires a special setup for the readline completers, you'll have to + fix that by hand after invoking the exception handler.""" + + if force or self.call_pdb: + if self.pdb is None: + self.pdb = self.debugger_cls() + # the system displayhook may have changed, restore the original + # for pdb + display_trap = DisplayTrap(hook=sys.__displayhook__) + with display_trap: + self.pdb.reset() + # Find the right frame so we don't pop up inside ipython itself + if hasattr(self, "tb") and self.tb is not None: # type: ignore[has-type] + etb = self.tb # type: ignore[has-type] + else: + etb = self.tb = sys.last_traceback + while self.tb is not None and self.tb.tb_next is not None: + assert self.tb.tb_next is not None + self.tb = self.tb.tb_next + if etb and etb.tb_next: + etb = etb.tb_next + self.pdb.botframe = etb.tb_frame + # last_value should be deprecated, but last-exc sometimme not set + # please check why later and remove the getattr. + exc = sys.last_value if sys.version_info < (3, 12) else getattr(sys, "last_exc", sys.last_value) # type: ignore[attr-defined] + if exc: + self.pdb.interaction(None, exc) + else: + self.pdb.interaction(None, etb) + + if hasattr(self, 'tb'): + del self.tb + + def handler(self, info=None): + (etype, evalue, etb) = info or sys.exc_info() + self.tb = etb + ostream = self.ostream + ostream.flush() + ostream.write(self.text(etype, evalue, etb)) + ostream.write('\n') + ostream.flush() + + # Changed so an instance can just be called as VerboseTB_inst() and print + # out the right info on its own. + def __call__(self, etype=None, evalue=None, etb=None): + """This hook can replace sys.excepthook (for Python 2.1 or higher).""" + if etb is None: + self.handler() + else: + self.handler((etype, evalue, etb)) + try: + self.debugger() + except KeyboardInterrupt: + print("\nKeyboardInterrupt") + + +#---------------------------------------------------------------------------- +class FormattedTB(VerboseTB, ListTB): + """Subclass ListTB but allow calling with a traceback. + + It can thus be used as a sys.excepthook for Python > 2.1. + + Also adds 'Context' and 'Verbose' modes, not available in ListTB. + + Allows a tb_offset to be specified. This is useful for situations where + one needs to remove a number of topmost frames from the traceback (such as + occurs with python programs that themselves execute other python code, + like Python shells). """ + + mode: str + + def __init__(self, mode='Plain', color_scheme='Linux', call_pdb=False, + ostream=None, + tb_offset=0, long_header=False, include_vars=False, + check_cache=None, debugger_cls=None, + parent=None, config=None): + + # NEVER change the order of this list. Put new modes at the end: + self.valid_modes = ['Plain', 'Context', 'Verbose', 'Minimal'] + self.verbose_modes = self.valid_modes[1:3] + + VerboseTB.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb, + ostream=ostream, tb_offset=tb_offset, + long_header=long_header, include_vars=include_vars, + check_cache=check_cache, debugger_cls=debugger_cls, + parent=parent, config=config) + + # Different types of tracebacks are joined with different separators to + # form a single string. They are taken from this dict + self._join_chars = dict(Plain='', Context='\n', Verbose='\n', + Minimal='') + # set_mode also sets the tb_join_char attribute + self.set_mode(mode) + + def structured_traceback(self, etype, value, tb, tb_offset=None, number_of_lines_of_context=5): + tb_offset = self.tb_offset if tb_offset is None else tb_offset + mode = self.mode + if mode in self.verbose_modes: + # Verbose modes need a full traceback + return VerboseTB.structured_traceback( + self, etype, value, tb, tb_offset, number_of_lines_of_context + ) + elif mode == 'Minimal': + return ListTB.get_exception_only(self, etype, value) + else: + # We must check the source cache because otherwise we can print + # out-of-date source code. + self.check_cache() + # Now we can extract and format the exception + return ListTB.structured_traceback( + self, etype, value, tb, tb_offset, number_of_lines_of_context + ) + + def stb2text(self, stb): + """Convert a structured traceback (a list) to a string.""" + return self.tb_join_char.join(stb) + + def set_mode(self, mode: Optional[str] = None): + """Switch to the desired mode. + + If mode is not specified, cycles through the available modes.""" + + if not mode: + new_idx = (self.valid_modes.index(self.mode) + 1 ) % \ + len(self.valid_modes) + self.mode = self.valid_modes[new_idx] + elif mode not in self.valid_modes: + raise ValueError( + "Unrecognized mode in FormattedTB: <" + mode + ">\n" + "Valid modes: " + str(self.valid_modes) + ) + else: + assert isinstance(mode, str) + self.mode = mode + # include variable details only in 'Verbose' mode + self.include_vars = (self.mode == self.valid_modes[2]) + # Set the join character for generating text tracebacks + self.tb_join_char = self._join_chars[self.mode] + + # some convenient shortcuts + def plain(self): + self.set_mode(self.valid_modes[0]) + + def context(self): + self.set_mode(self.valid_modes[1]) + + def verbose(self): + self.set_mode(self.valid_modes[2]) + + def minimal(self): + self.set_mode(self.valid_modes[3]) + + +#---------------------------------------------------------------------------- +class AutoFormattedTB(FormattedTB): + """A traceback printer which can be called on the fly. + + It will find out about exceptions by itself. + + A brief example:: + + AutoTB = AutoFormattedTB(mode = 'Verbose',color_scheme='Linux') + try: + ... + except: + AutoTB() # or AutoTB(out=logfile) where logfile is an open file object + """ + + def __call__(self, etype=None, evalue=None, etb=None, + out=None, tb_offset=None): + """Print out a formatted exception traceback. + + Optional arguments: + - out: an open file-like object to direct output to. + + - tb_offset: the number of frames to skip over in the stack, on a + per-call basis (this overrides temporarily the instance's tb_offset + given at initialization time.""" + + if out is None: + out = self.ostream + out.flush() + out.write(self.text(etype, evalue, etb, tb_offset)) + out.write('\n') + out.flush() + # FIXME: we should remove the auto pdb behavior from here and leave + # that to the clients. + try: + self.debugger() + except KeyboardInterrupt: + print("\nKeyboardInterrupt") + + def structured_traceback( + self, + etype: type, + evalue: Optional[BaseException], + etb: Optional[TracebackType] = None, + tb_offset: Optional[int] = None, + number_of_lines_of_context: int = 5, + ): + # tb: TracebackType or tupleof tb types ? + if etype is None: + etype, evalue, etb = sys.exc_info() + if isinstance(etb, tuple): + # tb is a tuple if this is a chained exception. + self.tb = etb[0] + else: + self.tb = etb + return FormattedTB.structured_traceback( + self, etype, evalue, etb, tb_offset, number_of_lines_of_context + ) + + +#--------------------------------------------------------------------------- + +# A simple class to preserve Nathan's original functionality. +class ColorTB(FormattedTB): + """Shorthand to initialize a FormattedTB in Linux colors mode.""" + + def __init__(self, color_scheme='Linux', call_pdb=0, **kwargs): + FormattedTB.__init__(self, color_scheme=color_scheme, + call_pdb=call_pdb, **kwargs) + + +class SyntaxTB(ListTB): + """Extension which holds some state: the last exception value""" + + def __init__(self, color_scheme='NoColor', parent=None, config=None): + ListTB.__init__(self, color_scheme, parent=parent, config=config) + self.last_syntax_error = None + + def __call__(self, etype, value, elist): + self.last_syntax_error = value + + ListTB.__call__(self, etype, value, elist) + + def structured_traceback(self, etype, value, elist, tb_offset=None, + context=5): + # If the source file has been edited, the line in the syntax error can + # be wrong (retrieved from an outdated cache). This replaces it with + # the current value. + if isinstance(value, SyntaxError) \ + and isinstance(value.filename, str) \ + and isinstance(value.lineno, int): + linecache.checkcache(value.filename) + newtext = linecache.getline(value.filename, value.lineno) + if newtext: + value.text = newtext + self.last_syntax_error = value + return super(SyntaxTB, self).structured_traceback(etype, value, elist, + tb_offset=tb_offset, context=context) + + def clear_err_state(self): + """Return the current error state and clear it""" + e = self.last_syntax_error + self.last_syntax_error = None + return e + + def stb2text(self, stb): + """Convert a structured traceback (a list) to a string.""" + return ''.join(stb) + + +# some internal-use functions +def text_repr(value): + """Hopefully pretty robust repr equivalent.""" + # this is pretty horrible but should always return *something* + try: + return pydoc.text.repr(value) # type: ignore[call-arg] + except KeyboardInterrupt: + raise + except: + try: + return repr(value) + except KeyboardInterrupt: + raise + except: + try: + # all still in an except block so we catch + # getattr raising + name = getattr(value, '__name__', None) + if name: + # ick, recursion + return text_repr(name) + klass = getattr(value, '__class__', None) + if klass: + return '%s instance' % text_repr(klass) + except KeyboardInterrupt: + raise + except: + return 'UNRECOVERABLE REPR FAILURE' + + +def eqrepr(value, repr=text_repr): + return '=%s' % repr(value) + + +def nullrepr(value, repr=text_repr): + return '' diff --git a/.venv/lib/python3.12/site-packages/IPython/core/usage.py b/.venv/lib/python3.12/site-packages/IPython/core/usage.py new file mode 100644 index 0000000..53219bc --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/core/usage.py @@ -0,0 +1,341 @@ +# -*- coding: utf-8 -*- +"""Usage information for the main IPython applications. +""" +#----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# Copyright (C) 2001-2007 Fernando Perez. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +import sys +from IPython.core import release + +cl_usage = """\ +========= + IPython +========= + +Tools for Interactive Computing in Python +========================================= + + A Python shell with automatic history (input and output), dynamic object + introspection, easier configuration, command completion, access to the + system shell and more. IPython can also be embedded in running programs. + + +Usage + + ipython [subcommand] [options] [-c cmd | -m mod | file] [--] [arg] ... + + If invoked with no options, it executes the file and exits, passing the + remaining arguments to the script, just as if you had specified the same + command with python. You may need to specify `--` before args to be passed + to the script, to prevent IPython from attempting to parse them. If you + specify the option `-i` before the filename, it will enter an interactive + IPython session after running the script, rather than exiting. Files ending + in .py will be treated as normal Python, but files ending in .ipy can + contain special IPython syntax (magic commands, shell expansions, etc.). + + Almost all configuration in IPython is available via the command-line. Do + `ipython --help-all` to see all available options. For persistent + configuration, look into your `ipython_config.py` configuration file for + details. + + This file is typically installed in the `IPYTHONDIR` directory, and there + is a separate configuration directory for each profile. The default profile + directory will be located in $IPYTHONDIR/profile_default. IPYTHONDIR + defaults to to `$HOME/.ipython`. For Windows users, $HOME resolves to + C:\\Users\\YourUserName in most instances. + + To initialize a profile with the default configuration file, do:: + + $> ipython profile create + + and start editing `IPYTHONDIR/profile_default/ipython_config.py` + + In IPython's documentation, we will refer to this directory as + `IPYTHONDIR`, you can change its default location by creating an + environment variable with this name and setting it to the desired path. + + For more information, see the manual available in HTML and PDF in your + installation, or online at https://ipython.org/documentation.html. +""" + +interactive_usage = """ +IPython -- An enhanced Interactive Python +========================================= + +IPython offers a fully compatible replacement for the standard Python +interpreter, with convenient shell features, special commands, command +history mechanism and output results caching. + +At your system command line, type 'ipython -h' to see the command line +options available. This document only describes interactive features. + +GETTING HELP +------------ + +Within IPython you have various way to access help: + + ? -> Introduction and overview of IPython's features (this screen). + object? -> Details about 'object'. + object?? -> More detailed, verbose information about 'object'. + %quickref -> Quick reference of all IPython specific syntax and magics. + help -> Access Python's own help system. + +If you are in terminal IPython you can quit this screen by pressing `q`. + + +MAIN FEATURES +------------- + +* Access to the standard Python help with object docstrings and the Python + manuals. Simply type 'help' (no quotes) to invoke it. + +* Magic commands: type %magic for information on the magic subsystem. + +* System command aliases, via the %alias command or the configuration file(s). + +* Dynamic object information: + + Typing ?word or word? prints detailed information about an object. Certain + long strings (code, etc.) get snipped in the center for brevity. + + Typing ??word or word?? gives access to the full information without + snipping long strings. Strings that are longer than the screen are printed + through the less pager. + + The ?/?? system gives access to the full source code for any object (if + available), shows function prototypes and other useful information. + + If you just want to see an object's docstring, type '%pdoc object' (without + quotes, and without % if you have automagic on). + +* Tab completion in the local namespace: + + At any time, hitting tab will complete any available python commands or + variable names, and show you a list of the possible completions if there's + no unambiguous one. It will also complete filenames in the current directory. + +* Search previous command history in multiple ways: + + - Start typing, and then use arrow keys up/down or (Ctrl-p/Ctrl-n) to search + through the history items that match what you've typed so far. + + - Hit Ctrl-r: opens a search prompt. Begin typing and the system searches + your history for lines that match what you've typed so far, completing as + much as it can. + + - %hist: search history by index. + +* Persistent command history across sessions. + +* Logging of input with the ability to save and restore a working session. + +* System shell with !. Typing !ls will run 'ls' in the current directory. + +* The reload command does a 'deep' reload of a module: changes made to the + module since you imported will actually be available without having to exit. + +* Verbose and colored exception traceback printouts. See the magic xmode and + xcolor functions for details (just type %magic). + +* Input caching system: + + IPython offers numbered prompts (In/Out) with input and output caching. All + input is saved and can be retrieved as variables (besides the usual arrow + key recall). + + The following GLOBAL variables always exist (so don't overwrite them!): + _i: stores previous input. + _ii: next previous. + _iii: next-next previous. + _ih : a list of all input _ih[n] is the input from line n. + + Additionally, global variables named _i are dynamically created ( + being the prompt counter), such that _i == _ih[] + + For example, what you typed at prompt 14 is available as _i14 and _ih[14]. + + You can create macros which contain multiple input lines from this history, + for later re-execution, with the %macro function. + + The history function %hist allows you to see any part of your input history + by printing a range of the _i variables. Note that inputs which contain + magic functions (%) appear in the history with a prepended comment. This is + because they aren't really valid Python code, so you can't exec them. + +* Output caching system: + + For output that is returned from actions, a system similar to the input + cache exists but using _ instead of _i. Only actions that produce a result + (NOT assignments, for example) are cached. If you are familiar with + Mathematica, IPython's _ variables behave exactly like Mathematica's % + variables. + + The following GLOBAL variables always exist (so don't overwrite them!): + _ (one underscore): previous output. + __ (two underscores): next previous. + ___ (three underscores): next-next previous. + + Global variables named _ are dynamically created ( being the prompt + counter), such that the result of output is always available as _. + + Finally, a global dictionary named _oh exists with entries for all lines + which generated output. + +* Directory history: + + Your history of visited directories is kept in the global list _dh, and the + magic %cd command can be used to go to any entry in that list. + +* Auto-parentheses and auto-quotes (adapted from Nathan Gray's LazyPython) + + 1. Auto-parentheses + + Callable objects (i.e. functions, methods, etc) can be invoked like + this (notice the commas between the arguments):: + + In [1]: callable_ob arg1, arg2, arg3 + + and the input will be translated to this:: + + callable_ob(arg1, arg2, arg3) + + This feature is off by default (in rare cases it can produce + undesirable side-effects), but you can activate it at the command-line + by starting IPython with `--autocall 1`, set it permanently in your + configuration file, or turn on at runtime with `%autocall 1`. + + You can force auto-parentheses by using '/' as the first character + of a line. For example:: + + In [1]: /globals # becomes 'globals()' + + Note that the '/' MUST be the first character on the line! This + won't work:: + + In [2]: print /globals # syntax error + + In most cases the automatic algorithm should work, so you should + rarely need to explicitly invoke /. One notable exception is if you + are trying to call a function with a list of tuples as arguments (the + parenthesis will confuse IPython):: + + In [1]: zip (1,2,3),(4,5,6) # won't work + + but this will work:: + + In [2]: /zip (1,2,3),(4,5,6) + ------> zip ((1,2,3),(4,5,6)) + Out[2]= [(1, 4), (2, 5), (3, 6)] + + IPython tells you that it has altered your command line by + displaying the new command line preceded by -->. e.g.:: + + In [18]: callable list + -------> callable (list) + + 2. Auto-Quoting + + You can force auto-quoting of a function's arguments by using ',' as + the first character of a line. For example:: + + In [1]: ,my_function /home/me # becomes my_function("/home/me") + + If you use ';' instead, the whole argument is quoted as a single + string (while ',' splits on whitespace):: + + In [2]: ,my_function a b c # becomes my_function("a","b","c") + In [3]: ;my_function a b c # becomes my_function("a b c") + + Note that the ',' MUST be the first character on the line! This + won't work:: + + In [4]: x = ,my_function /home/me # syntax error +""" + +interactive_usage_min = """\ +An enhanced console for Python. +Some of its features are: +- Tab completion in the local namespace. +- Logging of input, see command-line options. +- System shell escape via ! , eg !ls. +- Magic commands, starting with a % (like %ls, %pwd, %cd, etc.) +- Keeps track of locally defined variables via %who, %whos. +- Show object information with a ? eg ?x or x? (use ?? for more info). +""" + +quick_reference = r""" +IPython -- An enhanced Interactive Python - Quick Reference Card +================================================================ + +obj?, obj?? : Get help, or more help for object (also works as + ?obj, ??obj). +?foo.*abc* : List names in 'foo' containing 'abc' in them. +%magic : Information about IPython's 'magic' % functions. + +Magic functions are prefixed by % or %%, and typically take their arguments +without parentheses, quotes or even commas for convenience. Line magics take a +single % and cell magics are prefixed with two %%. + +Example magic function calls: + +%alias d ls -F : 'd' is now an alias for 'ls -F' +alias d ls -F : Works if 'alias' not a python name +alist = %alias : Get list of aliases to 'alist' +cd /usr/share : Obvious. cd - to choose from visited dirs. +%cd?? : See help AND source for magic %cd +%timeit x=10 : time the 'x=10' statement with high precision. +%%timeit x=2**100 +x**100 : time 'x**100' with a setup of 'x=2**100'; setup code is not + counted. This is an example of a cell magic. + +System commands: + +!cp a.txt b/ : System command escape, calls os.system() +cp a.txt b/ : after %rehashx, most system commands work without ! +cp ${f}.txt $bar : Variable expansion in magics and system commands +files = !ls /usr : Capture system command output +files.s, files.l, files.n: "a b c", ['a','b','c'], 'a\nb\nc' + +History: + +_i, _ii, _iii : Previous, next previous, next next previous input +_i4, _ih[2:5] : Input history line 4, lines 2-4 +exec(_i81) : Execute input history line #81 again +%rep 81 : Edit input history line #81 +_, __, ___ : previous, next previous, next next previous output +_dh : Directory history +_oh : Output history +%hist : Command history of current session. +%hist -g foo : Search command history of (almost) all sessions for 'foo'. +%hist -g : Command history of (almost) all sessions. +%hist 1/2-8 : Command history containing lines 2-8 of session 1. +%hist 1/ ~2/ : Command history of session 1 and 2 sessions before current. +%hist ~8/1-~6/5 : Command history from line 1 of 8 sessions ago to + line 5 of 6 sessions ago. +%edit 0/ : Open editor to execute code with history of current session. + +Autocall: + +f 1,2 : f(1,2) # Off by default, enable with %autocall magic. +/f 1,2 : f(1,2) (forced autoparen) +,f 1 2 : f("1","2") +;f 1 2 : f("1 2") + +Remember: TAB completion works in many contexts, not just file names +or python names. + +The following magic functions are currently available: + +""" + +default_banner_parts = ["Python %s\n"%sys.version.split("\n")[0], + "Type 'copyright', 'credits' or 'license' for more information\n" , + "IPython {version} -- An enhanced Interactive Python. Type '?' for help.\n".format(version=release.version), +] + +default_banner = ''.join(default_banner_parts) diff --git a/.venv/lib/python3.12/site-packages/IPython/display.py b/.venv/lib/python3.12/site-packages/IPython/display.py new file mode 100644 index 0000000..3ccbc48 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/display.py @@ -0,0 +1,44 @@ +"""Public API for display tools in IPython. +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2012 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +from IPython.core.display_functions import * +from IPython.core.display import ( + display_pretty as display_pretty, + display_html as display_html, + display_markdown as display_markdown, + display_svg as display_svg, + display_png as display_png, + display_jpeg as display_jpeg, + display_latex as display_latex, + display_json as display_json, + display_javascript as display_javascript, + display_pdf as display_pdf, + DisplayObject as DisplayObject, + TextDisplayObject as TextDisplayObject, + Pretty as Pretty, + HTML as HTML, + Markdown as Markdown, + Math as Math, + Latex as Latex, + SVG as SVG, + ProgressBar as ProgressBar, + JSON as JSON, + GeoJSON as GeoJSON, + Javascript as Javascript, + Image as Image, + set_matplotlib_formats as set_matplotlib_formats, + set_matplotlib_close as set_matplotlib_close, + Video as Video, +) +from IPython.lib.display import * diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/__init__.py b/.venv/lib/python3.12/site-packages/IPython/extensions/__init__.py new file mode 100644 index 0000000..db7f79f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/extensions/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +"""This directory is meant for IPython extensions.""" diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fd7effcee00ba1e199bf9154ec2f112dfee53f8 GIT binary patch literal 256 zcmYLEJ8l9o6tn>WLgEf?DcGk3(M9QL5Ct?8Sj+kaEWlp*nH9@L=;%2MB^@QXKqNXU zyb+%%=F`k*j?HF+1x!x+SwHA+5uV@=bFBxnV~UMg&ReA|4Ck7J(hd`ET`odcVQjqk zu}<^`xu07jaO2UCwuYj9i=S&!Dw{}oVArDc7Q=|p5v&7)!VEl;PZ#vkC_|IMQcofM zFYH7gpFrAUJB^b?JVS!V6uhTEN^P{4GD`DX{cB~_dWqkz8WxK)R2=y$bIvcU>nb7K E0b`*|i~s-t literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/autoreload.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/autoreload.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61b2c14187a52a83eebce2326836cf29e2f5aa87 GIT binary patch literal 26819 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/storemagic.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/storemagic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..706a635dd20f28eb87b1341a7b5657b8b862e70b GIT binary patch literal 10147 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/autoreload.py b/.venv/lib/python3.12/site-packages/IPython/extensions/autoreload.py new file mode 100644 index 0000000..98c9a0d --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/extensions/autoreload.py @@ -0,0 +1,727 @@ +"""IPython extension to reload modules before executing user code. + +``autoreload`` reloads modules automatically before entering the execution of +code typed at the IPython prompt. + +This makes for example the following workflow possible: + +.. sourcecode:: ipython + + In [1]: %load_ext autoreload + + In [2]: %autoreload 2 + + In [3]: from foo import some_function + + In [4]: some_function() + Out[4]: 42 + + In [5]: # open foo.py in an editor and change some_function to return 43 + + In [6]: some_function() + Out[6]: 43 + +The module was reloaded without reloading it explicitly, and the object +imported with ``from foo import ...`` was also updated. + +Usage +===== + +The following magic commands are provided: + +``%autoreload``, ``%autoreload now`` + + Reload all modules (except those excluded by ``%aimport``) + automatically now. + +``%autoreload 0``, ``%autoreload off`` + + Disable automatic reloading. + +``%autoreload 1``, ``%autoreload explicit`` + + Reload all modules imported with ``%aimport`` every time before + executing the Python code typed. + +``%autoreload 2``, ``%autoreload all`` + + Reload all modules (except those excluded by ``%aimport``) every + time before executing the Python code typed. + +``%autoreload 3``, ``%autoreload complete`` + + Same as 2/all, but also adds any new objects in the module. See + unit test at IPython/extensions/tests/test_autoreload.py::test_autoload_newly_added_objects + + Adding ``--print`` or ``-p`` to the ``%autoreload`` line will print autoreload activity to + standard out. ``--log`` or ``-l`` will do it to the log at INFO level; both can be used + simultaneously. + +``%aimport`` + + List modules which are to be automatically imported or not to be imported. + +``%aimport foo`` + + Import module 'foo' and mark it to be autoreloaded for ``%autoreload 1`` + +``%aimport foo, bar`` + + Import modules 'foo', 'bar' and mark them to be autoreloaded for ``%autoreload 1`` + +``%aimport -foo`` + + Mark module 'foo' to not be autoreloaded. + +Caveats +======= + +Reloading Python modules in a reliable way is in general difficult, +and unexpected things may occur. ``%autoreload`` tries to work around +common pitfalls by replacing function code objects and parts of +classes previously in the module with new versions. This makes the +following things to work: + +- Functions and classes imported via 'from xxx import foo' are upgraded + to new versions when 'xxx' is reloaded. + +- Methods and properties of classes are upgraded on reload, so that + calling 'c.foo()' on an object 'c' created before the reload causes + the new code for 'foo' to be executed. + +Some of the known remaining caveats are: + +- Replacing code objects does not always succeed: changing a @property + in a class to an ordinary method or a method to a member variable + can cause problems (but in old objects only). + +- Functions that are removed (eg. via monkey-patching) from a module + before it is reloaded are not upgraded. + +- C extension modules cannot be reloaded, and so cannot be autoreloaded. + +- While comparing Enum and Flag, the 'is' Identity Operator is used (even in the case '==' has been used (Similar to the 'None' keyword)). + +- Reloading a module, or importing the same module by a different name, creates new Enums. These may look the same, but are not. +""" + +from IPython.core import magic_arguments +from IPython.core.magic import Magics, magics_class, line_magic + +__skip_doctest__ = True + +# ----------------------------------------------------------------------------- +# Copyright (C) 2000 Thomas Heller +# Copyright (C) 2008 Pauli Virtanen +# Copyright (C) 2012 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- +# +# This IPython module is written by Pauli Virtanen, based on the autoreload +# code by Thomas Heller. + +# ----------------------------------------------------------------------------- +# Imports +# ----------------------------------------------------------------------------- + +import os +import sys +import traceback +import types +import weakref +import gc +import logging +from importlib import import_module, reload +from importlib.util import source_from_cache + +# ------------------------------------------------------------------------------ +# Autoreload functionality +# ------------------------------------------------------------------------------ + + +class ModuleReloader: + enabled = False + """Whether this reloader is enabled""" + + check_all = True + """Autoreload all modules, not just those listed in 'modules'""" + + autoload_obj = False + """Autoreload all modules AND autoload all new objects""" + + def __init__(self, shell=None): + # Modules that failed to reload: {module: mtime-on-failed-reload, ...} + self.failed = {} + # Modules specially marked as autoreloadable. + self.modules = {} + # Modules specially marked as not autoreloadable. + self.skip_modules = {} + # (module-name, name) -> weakref, for replacing old code objects + self.old_objects = {} + # Module modification timestamps + self.modules_mtimes = {} + self.shell = shell + + # Reporting callable for verbosity + self._report = lambda msg: None # by default, be quiet. + + # Cache module modification times + self.check(check_all=True, do_reload=False) + + # To hide autoreload errors + self.hide_errors = False + + def mark_module_skipped(self, module_name): + """Skip reloading the named module in the future""" + try: + del self.modules[module_name] + except KeyError: + pass + self.skip_modules[module_name] = True + + def mark_module_reloadable(self, module_name): + """Reload the named module in the future (if it is imported)""" + try: + del self.skip_modules[module_name] + except KeyError: + pass + self.modules[module_name] = True + + def aimport_module(self, module_name): + """Import a module, and mark it reloadable + + Returns + ------- + top_module : module + The imported module if it is top-level, or the top-level + top_name : module + Name of top_module + + """ + self.mark_module_reloadable(module_name) + + import_module(module_name) + top_name = module_name.split(".")[0] + top_module = sys.modules[top_name] + return top_module, top_name + + def filename_and_mtime(self, module): + if not hasattr(module, "__file__") or module.__file__ is None: + return None, None + + if getattr(module, "__name__", None) in [None, "__mp_main__", "__main__"]: + # we cannot reload(__main__) or reload(__mp_main__) + return None, None + + filename = module.__file__ + path, ext = os.path.splitext(filename) + + if ext.lower() == ".py": + py_filename = filename + else: + try: + py_filename = source_from_cache(filename) + except ValueError: + return None, None + + try: + pymtime = os.stat(py_filename).st_mtime + except OSError: + return None, None + + return py_filename, pymtime + + def check(self, check_all=False, do_reload=True): + """Check whether some modules need to be reloaded.""" + + if not self.enabled and not check_all: + return + + if check_all or self.check_all: + modules = list(sys.modules.keys()) + else: + modules = list(self.modules.keys()) + + for modname in modules: + m = sys.modules.get(modname, None) + + if modname in self.skip_modules: + continue + + py_filename, pymtime = self.filename_and_mtime(m) + if py_filename is None: + continue + + try: + if pymtime <= self.modules_mtimes[modname]: + continue + except KeyError: + self.modules_mtimes[modname] = pymtime + continue + else: + if self.failed.get(py_filename, None) == pymtime: + continue + + self.modules_mtimes[modname] = pymtime + + # If we've reached this point, we should try to reload the module + if do_reload: + self._report(f"Reloading '{modname}'.") + try: + if self.autoload_obj: + superreload(m, reload, self.old_objects, self.shell) + else: + superreload(m, reload, self.old_objects) + if py_filename in self.failed: + del self.failed[py_filename] + except: + if not self.hide_errors: + print( + "[autoreload of {} failed: {}]".format( + modname, traceback.format_exc(10) + ), + file=sys.stderr, + ) + self.failed[py_filename] = pymtime + + +# ------------------------------------------------------------------------------ +# superreload +# ------------------------------------------------------------------------------ + + +func_attrs = [ + "__code__", + "__defaults__", + "__doc__", + "__closure__", + "__globals__", + "__dict__", +] + + +def update_function(old, new): + """Upgrade the code object of a function""" + for name in func_attrs: + try: + setattr(old, name, getattr(new, name)) + except (AttributeError, TypeError): + pass + + +def update_instances(old, new): + """Use garbage collector to find all instances that refer to the old + class definition and update their __class__ to point to the new class + definition""" + + refs = gc.get_referrers(old) + + for ref in refs: + if type(ref) is old: + object.__setattr__(ref, "__class__", new) + + +def update_class(old, new): + """Replace stuff in the __dict__ of a class, and upgrade + method code objects, and add new methods, if any""" + for key in list(old.__dict__.keys()): + old_obj = getattr(old, key) + try: + new_obj = getattr(new, key) + # explicitly checking that comparison returns True to handle + # cases where `==` doesn't return a boolean. + if (old_obj == new_obj) is True: + continue + except AttributeError: + # obsolete attribute: remove it + try: + delattr(old, key) + except (AttributeError, TypeError): + pass + continue + except ValueError: + # can't compare nested structures containing + # numpy arrays using `==` + pass + + if update_generic(old_obj, new_obj): + continue + + try: + setattr(old, key, getattr(new, key)) + except (AttributeError, TypeError): + pass # skip non-writable attributes + + for key in list(new.__dict__.keys()): + if key not in list(old.__dict__.keys()): + try: + setattr(old, key, getattr(new, key)) + except (AttributeError, TypeError): + pass # skip non-writable attributes + + # update all instances of class + update_instances(old, new) + + +def update_property(old, new): + """Replace get/set/del functions of a property""" + update_generic(old.fdel, new.fdel) + update_generic(old.fget, new.fget) + update_generic(old.fset, new.fset) + + +def isinstance2(a, b, typ): + return isinstance(a, typ) and isinstance(b, typ) + + +UPDATE_RULES = [ + (lambda a, b: isinstance2(a, b, type), update_class), + (lambda a, b: isinstance2(a, b, types.FunctionType), update_function), + (lambda a, b: isinstance2(a, b, property), update_property), +] +UPDATE_RULES.extend( + [ + ( + lambda a, b: isinstance2(a, b, types.MethodType), + lambda a, b: update_function(a.__func__, b.__func__), + ), + ] +) + + +def update_generic(a, b): + for type_check, update in UPDATE_RULES: + if type_check(a, b): + update(a, b) + return True + return False + + +class StrongRef: + def __init__(self, obj): + self.obj = obj + + def __call__(self): + return self.obj + + +mod_attrs = [ + "__name__", + "__doc__", + "__package__", + "__loader__", + "__spec__", + "__file__", + "__cached__", + "__builtins__", +] + + +def append_obj(module, d, name, obj, autoload=False): + in_module = hasattr(obj, "__module__") and obj.__module__ == module.__name__ + if autoload: + # check needed for module global built-ins + if not in_module and name in mod_attrs: + return False + else: + if not in_module: + return False + + key = (module.__name__, name) + try: + d.setdefault(key, []).append(weakref.ref(obj)) + except TypeError: + pass + return True + + +def superreload(module, reload=reload, old_objects=None, shell=None): + """Enhanced version of the builtin reload function. + + superreload remembers objects previously in the module, and + + - upgrades the class dictionary of every old class in the module + - upgrades the code object of every old function and method + - clears the module's namespace before reloading + + """ + if old_objects is None: + old_objects = {} + + # collect old objects in the module + for name, obj in list(module.__dict__.items()): + if not append_obj(module, old_objects, name, obj): + continue + key = (module.__name__, name) + try: + old_objects.setdefault(key, []).append(weakref.ref(obj)) + except TypeError: + pass + + # reload module + try: + # clear namespace first from old cruft + old_dict = module.__dict__.copy() + old_name = module.__name__ + module.__dict__.clear() + module.__dict__["__name__"] = old_name + module.__dict__["__loader__"] = old_dict["__loader__"] + except (TypeError, AttributeError, KeyError): + pass + + try: + module = reload(module) + except: + # restore module dictionary on failed reload + module.__dict__.update(old_dict) + raise + + # iterate over all objects and update functions & classes + for name, new_obj in list(module.__dict__.items()): + key = (module.__name__, name) + if key not in old_objects: + # here 'shell' acts both as a flag and as an output var + if ( + shell is None + or name == "Enum" + or not append_obj(module, old_objects, name, new_obj, True) + ): + continue + shell.user_ns[name] = new_obj + + new_refs = [] + for old_ref in old_objects[key]: + old_obj = old_ref() + if old_obj is None: + continue + new_refs.append(old_ref) + update_generic(old_obj, new_obj) + + if new_refs: + old_objects[key] = new_refs + else: + del old_objects[key] + + return module + + +# ------------------------------------------------------------------------------ +# IPython connectivity +# ------------------------------------------------------------------------------ + + +@magics_class +class AutoreloadMagics(Magics): + def __init__(self, *a, **kw): + super().__init__(*a, **kw) + self._reloader = ModuleReloader(self.shell) + self._reloader.check_all = False + self._reloader.autoload_obj = False + self.loaded_modules = set(sys.modules) + + @line_magic + @magic_arguments.magic_arguments() + @magic_arguments.argument( + "mode", + type=str, + default="now", + nargs="?", + help="""blank or 'now' - Reload all modules (except those excluded by %%aimport) + automatically now. + + '0' or 'off' - Disable automatic reloading. + + '1' or 'explicit' - Reload only modules imported with %%aimport every + time before executing the Python code typed. + + '2' or 'all' - Reload all modules (except those excluded by %%aimport) + every time before executing the Python code typed. + + '3' or 'complete' - Same as 2/all, but also but also adds any new + objects in the module. + """, + ) + @magic_arguments.argument( + "-p", + "--print", + action="store_true", + default=False, + help="Show autoreload activity using `print` statements", + ) + @magic_arguments.argument( + "-l", + "--log", + action="store_true", + default=False, + help="Show autoreload activity using the logger", + ) + @magic_arguments.argument( + "--hide-errors", + action="store_true", + default=False, + help="Hide autoreload errors", + ) + def autoreload(self, line=""): + r"""%autoreload => Reload modules automatically + + %autoreload or %autoreload now + Reload all modules (except those excluded by %aimport) automatically + now. + + %autoreload 0 or %autoreload off + Disable automatic reloading. + + %autoreload 1 or %autoreload explicit + Reload only modules imported with %aimport every time before executing + the Python code typed. + + %autoreload 2 or %autoreload all + Reload all modules (except those excluded by %aimport) every time + before executing the Python code typed. + + %autoreload 3 or %autoreload complete + Same as 2/all, but also but also adds any new objects in the module. See + unit test at IPython/extensions/tests/test_autoreload.py::test_autoload_newly_added_objects + + The optional arguments --print and --log control display of autoreload activity. The default + is to act silently; --print (or -p) will print out the names of modules that are being + reloaded, and --log (or -l) outputs them to the log at INFO level. + + The optional argument --hide-errors hides any errors that can happen when trying to + reload code. + + Reloading Python modules in a reliable way is in general + difficult, and unexpected things may occur. %autoreload tries to + work around common pitfalls by replacing function code objects and + parts of classes previously in the module with new versions. This + makes the following things to work: + + - Functions and classes imported via 'from xxx import foo' are upgraded + to new versions when 'xxx' is reloaded. + + - Methods and properties of classes are upgraded on reload, so that + calling 'c.foo()' on an object 'c' created before the reload causes + the new code for 'foo' to be executed. + + Some of the known remaining caveats are: + + - Replacing code objects does not always succeed: changing a @property + in a class to an ordinary method or a method to a member variable + can cause problems (but in old objects only). + + - Functions that are removed (eg. via monkey-patching) from a module + before it is reloaded are not upgraded. + + - C extension modules cannot be reloaded, and so cannot be + autoreloaded. + + """ + args = magic_arguments.parse_argstring(self.autoreload, line) + mode = args.mode.lower() + + p = print + + logger = logging.getLogger("autoreload") + + l = logger.info + + def pl(msg): + p(msg) + l(msg) + + if args.print is False and args.log is False: + self._reloader._report = lambda msg: None + elif args.print is True: + if args.log is True: + self._reloader._report = pl + else: + self._reloader._report = p + elif args.log is True: + self._reloader._report = l + + self._reloader.hide_errors = args.hide_errors + + if mode == "" or mode == "now": + self._reloader.check(True) + elif mode == "0" or mode == "off": + self._reloader.enabled = False + elif mode == "1" or mode == "explicit": + self._reloader.enabled = True + self._reloader.check_all = False + self._reloader.autoload_obj = False + elif mode == "2" or mode == "all": + self._reloader.enabled = True + self._reloader.check_all = True + self._reloader.autoload_obj = False + elif mode == "3" or mode == "complete": + self._reloader.enabled = True + self._reloader.check_all = True + self._reloader.autoload_obj = True + else: + raise ValueError(f'Unrecognized autoreload mode "{mode}".') + + @line_magic + def aimport(self, parameter_s="", stream=None): + """%aimport => Import modules for automatic reloading. + + %aimport + List modules to automatically import and not to import. + + %aimport foo + Import module 'foo' and mark it to be autoreloaded for %autoreload explicit + + %aimport foo, bar + Import modules 'foo', 'bar' and mark them to be autoreloaded for %autoreload explicit + + %aimport -foo, bar + Mark module 'foo' to not be autoreloaded for %autoreload explicit, all, or complete, and 'bar' + to be autoreloaded for mode explicit. + """ + modname = parameter_s + if not modname: + to_reload = sorted(self._reloader.modules.keys()) + to_skip = sorted(self._reloader.skip_modules.keys()) + if stream is None: + stream = sys.stdout + if self._reloader.check_all: + stream.write("Modules to reload:\nall-except-skipped\n") + else: + stream.write("Modules to reload:\n%s\n" % " ".join(to_reload)) + stream.write("\nModules to skip:\n%s\n" % " ".join(to_skip)) + else: + for _module in [_.strip() for _ in modname.split(",")]: + if _module.startswith("-"): + _module = _module[1:].strip() + self._reloader.mark_module_skipped(_module) + else: + top_module, top_name = self._reloader.aimport_module(_module) + + # Inject module to user namespace + self.shell.push({top_name: top_module}) + + def pre_run_cell(self, info): + if self._reloader.enabled: + try: + self._reloader.check() + except: + pass + + def post_execute_hook(self): + """Cache the modification times of any modules imported in this execution""" + newly_loaded_modules = set(sys.modules) - self.loaded_modules + for modname in newly_loaded_modules: + _, pymtime = self._reloader.filename_and_mtime(sys.modules[modname]) + if pymtime is not None: + self._reloader.modules_mtimes[modname] = pymtime + + self.loaded_modules.update(newly_loaded_modules) + + +def load_ipython_extension(ip): + """Load the extension in IPython.""" + auto_reload = AutoreloadMagics(ip) + ip.register_magics(auto_reload) + ip.events.register("pre_run_cell", auto_reload.pre_run_cell) + ip.events.register("post_execute", auto_reload.post_execute_hook) diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py b/.venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py new file mode 100644 index 0000000..1ab56f7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py @@ -0,0 +1,236 @@ +# -*- coding: utf-8 -*- +""" +%store magic for lightweight persistence. + +Stores variables, aliases and macros in IPython's database. + +To automatically restore stored variables at startup, add this to your +:file:`ipython_config.py` file:: + + c.StoreMagics.autorestore = True +""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +import inspect, os, sys, textwrap + +from IPython.core.error import UsageError +from IPython.core.magic import Magics, magics_class, line_magic +from IPython.testing.skipdoctest import skip_doctest +from traitlets import Bool + + +def restore_aliases(ip, alias=None): + staliases = ip.db.get('stored_aliases', {}) + if alias is None: + for k,v in staliases.items(): + # print("restore alias",k,v) # dbg + #self.alias_table[k] = v + ip.alias_manager.define_alias(k,v) + else: + ip.alias_manager.define_alias(alias, staliases[alias]) + + +def refresh_variables(ip): + db = ip.db + for key in db.keys('autorestore/*'): + # strip autorestore + justkey = os.path.basename(key) + try: + obj = db[key] + except KeyError: + print("Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % justkey) + print("The error was:", sys.exc_info()[0]) + else: + # print("restored",justkey,"=",obj) # dbg + ip.user_ns[justkey] = obj + + +def restore_dhist(ip): + ip.user_ns['_dh'] = ip.db.get('dhist',[]) + + +def restore_data(ip): + refresh_variables(ip) + restore_aliases(ip) + restore_dhist(ip) + + +@magics_class +class StoreMagics(Magics): + """Lightweight persistence for python variables. + + Provides the %store magic.""" + + autorestore = Bool(False, help= + """If True, any %store-d variables will be automatically restored + when IPython starts. + """ + ).tag(config=True) + + def __init__(self, shell): + super(StoreMagics, self).__init__(shell=shell) + self.shell.configurables.append(self) + if self.autorestore: + restore_data(self.shell) + + @skip_doctest + @line_magic + def store(self, parameter_s=''): + """Lightweight persistence for python variables. + + Example:: + + In [1]: l = ['hello',10,'world'] + In [2]: %store l + Stored 'l' (list) + In [3]: exit + + (IPython session is closed and started again...) + + ville@badger:~$ ipython + In [1]: l + NameError: name 'l' is not defined + In [2]: %store -r + In [3]: l + Out[3]: ['hello', 10, 'world'] + + Usage: + + * ``%store`` - Show list of all variables and their current + values + * ``%store spam bar`` - Store the *current* value of the variables spam + and bar to disk + * ``%store -d spam`` - Remove the variable and its value from storage + * ``%store -z`` - Remove all variables from storage + * ``%store -r`` - Refresh all variables, aliases and directory history + from store (overwrite current vals) + * ``%store -r spam bar`` - Refresh specified variables and aliases from store + (delete current val) + * ``%store foo >a.txt`` - Store value of foo to new file a.txt + * ``%store foo >>a.txt`` - Append value of foo to file a.txt + + It should be noted that if you change the value of a variable, you + need to %store it again if you want to persist the new value. + + Note also that the variables will need to be pickleable; most basic + python types can be safely %store'd. + + Also aliases can be %store'd across sessions. + To remove an alias from the storage, use the %unalias magic. + """ + + opts,argsl = self.parse_options(parameter_s,'drz',mode='string') + args = argsl.split() + ip = self.shell + db = ip.db + # delete + if 'd' in opts: + try: + todel = args[0] + except IndexError as e: + raise UsageError('You must provide the variable to forget') from e + else: + try: + del db['autorestore/' + todel] + except BaseException as e: + raise UsageError("Can't delete variable '%s'" % todel) from e + # reset + elif 'z' in opts: + for k in db.keys('autorestore/*'): + del db[k] + + elif 'r' in opts: + if args: + for arg in args: + try: + obj = db["autorestore/" + arg] + except KeyError: + try: + restore_aliases(ip, alias=arg) + except KeyError: + print("no stored variable or alias %s" % arg) + else: + ip.user_ns[arg] = obj + else: + restore_data(ip) + + # run without arguments -> list variables & values + elif not args: + vars = db.keys('autorestore/*') + vars.sort() + if vars: + size = max(map(len, vars)) + else: + size = 0 + + print('Stored variables and their in-db values:') + fmt = '%-'+str(size)+'s -> %s' + get = db.get + for var in vars: + justkey = os.path.basename(var) + # print 30 first characters from every var + print(fmt % (justkey, repr(get(var, ''))[:50])) + + # default action - store the variable + else: + # %store foo >file.txt or >>file.txt + if len(args) > 1 and args[1].startswith(">"): + fnam = os.path.expanduser(args[1].lstrip(">").lstrip()) + if args[1].startswith(">>"): + fil = open(fnam, "a", encoding="utf-8") + else: + fil = open(fnam, "w", encoding="utf-8") + with fil: + obj = ip.ev(args[0]) + print("Writing '%s' (%s) to file '%s'." % (args[0], + obj.__class__.__name__, fnam)) + + if not isinstance (obj, str): + from pprint import pprint + pprint(obj, fil) + else: + fil.write(obj) + if not obj.endswith('\n'): + fil.write('\n') + + return + + # %store foo + for arg in args: + try: + obj = ip.user_ns[arg] + except KeyError: + # it might be an alias + name = arg + try: + cmd = ip.alias_manager.retrieve_alias(name) + except ValueError as e: + raise UsageError("Unknown variable '%s'" % name) from e + + staliases = db.get('stored_aliases',{}) + staliases[name] = cmd + db['stored_aliases'] = staliases + print("Alias stored: %s (%s)" % (name, cmd)) + return + + else: + modname = getattr(inspect.getmodule(obj), '__name__', '') + if modname == '__main__': + print(textwrap.dedent("""\ + Warning:%s is %s + Proper storage of interactively declared classes (or instances + of those classes) is not possible! Only instances + of classes in real modules on file system can be %%store'd. + """ % (arg, obj) )) + return + #pickled = pickle.dumps(obj) + db[ 'autorestore/' + arg ] = obj + print("Stored '%s' (%s)" % (arg, obj.__class__.__name__)) + + +def load_ipython_extension(ip): + """Load the extension in IPython.""" + ip.register_magics(StoreMagics) + diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__init__.py b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..290c6864833855fc5dc0216472c0983862ab4747 GIT binary patch literal 200 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_storemagic.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_storemagic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c4cea96585317d6d86e6dca143e94a36134ce30 GIT binary patch literal 4477 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 PwmFOLJFlp1svr0PU5Rra literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_for_kernel.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_for_kernel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..312035775f4201f9693f800ce21e224824f4741f GIT binary patch literal 3683 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py b/.venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py new file mode 100644 index 0000000..11e8862 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py @@ -0,0 +1,124 @@ +""" Import Qt in a manner suitable for an IPython kernel. + +This is the import used for the `gui=qt` or `matplotlib=qt` initialization. + +Import Priority: + +if Qt has been imported anywhere else: + use that + +if matplotlib has been imported and doesn't support v2 (<= 1.0.1): + use PyQt4 @v1 + +Next, ask QT_API env variable + +if QT_API not set: + ask matplotlib what it's using. If Qt4Agg or Qt5Agg, then use the + version matplotlib is configured with + + else: (matplotlib said nothing) + # this is the default path - nobody told us anything + try in this order: + PyQt default version, PySide, PyQt5 +else: + use what QT_API says + + Note that %gui's implementation will always set a `QT_API`, see + `IPython.terminal.pt_inputhooks.get_inputhook_name_and_func` + +""" +# NOTE: This is no longer an external, third-party module, and should be +# considered part of IPython. For compatibility however, it is being kept in +# IPython/external. + +import os +import sys + +from IPython.external.qt_loaders import ( + load_qt, + loaded_api, + enum_factory, + # QT6 + QT_API_PYQT6, + QT_API_PYSIDE6, + # QT5 + QT_API_PYQT5, + QT_API_PYSIDE2, + # QT4 + QT_API_PYQT, + QT_API_PYSIDE, + # default + QT_API_PYQT_DEFAULT, +) + +_qt_apis = ( + # QT6 + QT_API_PYQT6, + QT_API_PYSIDE6, + # QT5 + QT_API_PYQT5, + QT_API_PYSIDE2, + # default + QT_API_PYQT_DEFAULT, +) + + +def matplotlib_options(mpl): + """Constraints placed on an imported matplotlib.""" + if mpl is None: + return + backend = mpl.rcParams.get('backend', None) + if backend == 'Qt4Agg': + mpqt = mpl.rcParams.get('backend.qt4', None) + if mpqt is None: + return None + if mpqt.lower() == 'pyside': + return [QT_API_PYSIDE] + elif mpqt.lower() == 'pyqt4': + return [QT_API_PYQT_DEFAULT] + elif mpqt.lower() == 'pyqt4v2': + return [QT_API_PYQT] + raise ImportError("unhandled value for backend.qt4 from matplotlib: %r" % + mpqt) + elif backend == 'Qt5Agg': + mpqt = mpl.rcParams.get('backend.qt5', None) + if mpqt is None: + return None + if mpqt.lower() == 'pyqt5': + return [QT_API_PYQT5] + raise ImportError("unhandled value for backend.qt5 from matplotlib: %r" % + mpqt) + +def get_options(): + """Return a list of acceptable QT APIs, in decreasing order of preference.""" + #already imported Qt somewhere. Use that + loaded = loaded_api() + if loaded is not None: + return [loaded] + + mpl = sys.modules.get("matplotlib", None) + + if mpl is not None and tuple(mpl.__version__.split(".")) < ("1", "0", "2"): + # 1.0.1 only supports PyQt4 v1 + return [QT_API_PYQT_DEFAULT] + + qt_api = os.environ.get('QT_API', None) + if qt_api is None: + #no ETS variable. Ask mpl, then use default fallback path + return matplotlib_options(mpl) or [ + QT_API_PYQT_DEFAULT, + QT_API_PYQT6, + QT_API_PYSIDE6, + QT_API_PYQT5, + QT_API_PYSIDE2, + ] + elif qt_api not in _qt_apis: + raise RuntimeError("Invalid Qt API %r, valid values are: %r" % + (qt_api, ', '.join(_qt_apis))) + else: + return [qt_api] + + +api_opts = get_options() +QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) +enum_helper = enum_factory(QT_API, QtCore) diff --git a/.venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py b/.venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py new file mode 100644 index 0000000..87b7165 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py @@ -0,0 +1,423 @@ +""" +This module contains factory functions that attempt +to return Qt submodules from the various python Qt bindings. + +It also protects against double-importing Qt with different +bindings, which is unstable and likely to crash + +This is used primarily by qt and qt_for_kernel, and shouldn't +be accessed directly from the outside +""" + +import importlib.abc +import sys +import os +import types +from functools import partial, lru_cache +import operator + +# ### Available APIs. +# Qt6 +QT_API_PYQT6 = "pyqt6" +QT_API_PYSIDE6 = "pyside6" + +# Qt5 +QT_API_PYQT5 = 'pyqt5' +QT_API_PYSIDE2 = 'pyside2' + +# Qt4 +# NOTE: Here for legacy matplotlib compatibility, but not really supported on the IPython side. +QT_API_PYQT = "pyqt" # Force version 2 +QT_API_PYQTv1 = "pyqtv1" # Force version 2 +QT_API_PYSIDE = "pyside" + +QT_API_PYQT_DEFAULT = "pyqtdefault" # use system default for version 1 vs. 2 + +api_to_module = { + # Qt6 + QT_API_PYQT6: "PyQt6", + QT_API_PYSIDE6: "PySide6", + # Qt5 + QT_API_PYQT5: "PyQt5", + QT_API_PYSIDE2: "PySide2", + # Qt4 + QT_API_PYSIDE: "PySide", + QT_API_PYQT: "PyQt4", + QT_API_PYQTv1: "PyQt4", + # default + QT_API_PYQT_DEFAULT: "PyQt6", +} + + +class ImportDenier(importlib.abc.MetaPathFinder): + """Import Hook that will guard against bad Qt imports + once IPython commits to a specific binding + """ + + def __init__(self): + self.__forbidden = set() + + def forbid(self, module_name): + sys.modules.pop(module_name, None) + self.__forbidden.add(module_name) + + def find_spec(self, fullname, path, target=None): + if path: + return + if fullname in self.__forbidden: + raise ImportError( + """ + Importing %s disabled by IPython, which has + already imported an Incompatible QT Binding: %s + """ + % (fullname, loaded_api()) + ) + + +ID = ImportDenier() +sys.meta_path.insert(0, ID) + + +def commit_api(api): + """Commit to a particular API, and trigger ImportErrors on subsequent + dangerous imports""" + modules = set(api_to_module.values()) + + modules.remove(api_to_module[api]) + for mod in modules: + ID.forbid(mod) + + +def loaded_api(): + """Return which API is loaded, if any + + If this returns anything besides None, + importing any other Qt binding is unsafe. + + Returns + ------- + None, 'pyside6', 'pyqt6', 'pyside2', 'pyside', 'pyqt', 'pyqt5', 'pyqtv1' + """ + if sys.modules.get("PyQt6.QtCore"): + return QT_API_PYQT6 + elif sys.modules.get("PySide6.QtCore"): + return QT_API_PYSIDE6 + elif sys.modules.get("PyQt5.QtCore"): + return QT_API_PYQT5 + elif sys.modules.get("PySide2.QtCore"): + return QT_API_PYSIDE2 + elif sys.modules.get("PyQt4.QtCore"): + if qtapi_version() == 2: + return QT_API_PYQT + else: + return QT_API_PYQTv1 + elif sys.modules.get("PySide.QtCore"): + return QT_API_PYSIDE + + return None + + +def has_binding(api): + """Safely check for PyQt4/5, PySide or PySide2, without importing submodules + + Parameters + ---------- + api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyside2' | 'pyqtdefault'] + Which module to check for + + Returns + ------- + True if the relevant module appears to be importable + """ + module_name = api_to_module[api] + from importlib.util import find_spec + + required = ['QtCore', 'QtGui', 'QtSvg'] + if api in (QT_API_PYQT5, QT_API_PYSIDE2, QT_API_PYQT6, QT_API_PYSIDE6): + # QT5 requires QtWidgets too + required.append('QtWidgets') + + for submod in required: + try: + spec = find_spec('%s.%s' % (module_name, submod)) + except ImportError: + # Package (e.g. PyQt5) not found + return False + else: + if spec is None: + # Submodule (e.g. PyQt5.QtCore) not found + return False + + if api == QT_API_PYSIDE: + # We can also safely check PySide version + import PySide + + return PySide.__version_info__ >= (1, 0, 3) + + return True + + +def qtapi_version(): + """Return which QString API has been set, if any + + Returns + ------- + The QString API version (1 or 2), or None if not set + """ + try: + import sip + except ImportError: + # as of PyQt5 5.11, sip is no longer available as a top-level + # module and needs to be imported from the PyQt5 namespace + try: + from PyQt5 import sip + except ImportError: + return + try: + return sip.getapi('QString') + except ValueError: + return + + +def can_import(api): + """Safely query whether an API is importable, without importing it""" + if not has_binding(api): + return False + + current = loaded_api() + if api == QT_API_PYQT_DEFAULT: + return current in [QT_API_PYQT6, None] + else: + return current in [api, None] + + +def import_pyqt4(version=2): + """ + Import PyQt4 + + Parameters + ---------- + version : 1, 2, or None + Which QString/QVariant API to use. Set to None to use the system + default + ImportErrors raised within this function are non-recoverable + """ + # The new-style string API (version=2) automatically + # converts QStrings to Unicode Python strings. Also, automatically unpacks + # QVariants to their underlying objects. + import sip + + if version is not None: + sip.setapi('QString', version) + sip.setapi('QVariant', version) + + from PyQt4 import QtGui, QtCore, QtSvg + + if QtCore.PYQT_VERSION < 0x040700: + raise ImportError("IPython requires PyQt4 >= 4.7, found %s" % + QtCore.PYQT_VERSION_STR) + + # Alias PyQt-specific functions for PySide compatibility. + QtCore.Signal = QtCore.pyqtSignal + QtCore.Slot = QtCore.pyqtSlot + + # query for the API version (in case version == None) + version = sip.getapi('QString') + api = QT_API_PYQTv1 if version == 1 else QT_API_PYQT + return QtCore, QtGui, QtSvg, api + + +def import_pyqt5(): + """ + Import PyQt5 + + ImportErrors raised within this function are non-recoverable + """ + + from PyQt5 import QtCore, QtSvg, QtWidgets, QtGui + + # Alias PyQt-specific functions for PySide compatibility. + QtCore.Signal = QtCore.pyqtSignal + QtCore.Slot = QtCore.pyqtSlot + + # Join QtGui and QtWidgets for Qt4 compatibility. + QtGuiCompat = types.ModuleType('QtGuiCompat') + QtGuiCompat.__dict__.update(QtGui.__dict__) + QtGuiCompat.__dict__.update(QtWidgets.__dict__) + + api = QT_API_PYQT5 + return QtCore, QtGuiCompat, QtSvg, api + + +def import_pyqt6(): + """ + Import PyQt6 + + ImportErrors raised within this function are non-recoverable + """ + + from PyQt6 import QtCore, QtSvg, QtWidgets, QtGui + + # Alias PyQt-specific functions for PySide compatibility. + QtCore.Signal = QtCore.pyqtSignal + QtCore.Slot = QtCore.pyqtSlot + + # Join QtGui and QtWidgets for Qt4 compatibility. + QtGuiCompat = types.ModuleType("QtGuiCompat") + QtGuiCompat.__dict__.update(QtGui.__dict__) + QtGuiCompat.__dict__.update(QtWidgets.__dict__) + + api = QT_API_PYQT6 + return QtCore, QtGuiCompat, QtSvg, api + + +def import_pyside(): + """ + Import PySide + + ImportErrors raised within this function are non-recoverable + """ + from PySide import QtGui, QtCore, QtSvg + return QtCore, QtGui, QtSvg, QT_API_PYSIDE + +def import_pyside2(): + """ + Import PySide2 + + ImportErrors raised within this function are non-recoverable + """ + from PySide2 import QtGui, QtCore, QtSvg, QtWidgets, QtPrintSupport + + # Join QtGui and QtWidgets for Qt4 compatibility. + QtGuiCompat = types.ModuleType('QtGuiCompat') + QtGuiCompat.__dict__.update(QtGui.__dict__) + QtGuiCompat.__dict__.update(QtWidgets.__dict__) + QtGuiCompat.__dict__.update(QtPrintSupport.__dict__) + + return QtCore, QtGuiCompat, QtSvg, QT_API_PYSIDE2 + + +def import_pyside6(): + """ + Import PySide6 + + ImportErrors raised within this function are non-recoverable + """ + + def get_attrs(module): + return { + name: getattr(module, name) + for name in dir(module) + if not name.startswith("_") + } + + from PySide6 import QtGui, QtCore, QtSvg, QtWidgets, QtPrintSupport + + # Join QtGui and QtWidgets for Qt4 compatibility. + QtGuiCompat = types.ModuleType("QtGuiCompat") + QtGuiCompat.__dict__.update(QtGui.__dict__) + if QtCore.__version_info__ < (6, 7): + QtGuiCompat.__dict__.update(QtWidgets.__dict__) + QtGuiCompat.__dict__.update(QtPrintSupport.__dict__) + else: + QtGuiCompat.__dict__.update(get_attrs(QtWidgets)) + QtGuiCompat.__dict__.update(get_attrs(QtPrintSupport)) + + return QtCore, QtGuiCompat, QtSvg, QT_API_PYSIDE6 + + +def load_qt(api_options): + """ + Attempt to import Qt, given a preference list + of permissible bindings + + It is safe to call this function multiple times. + + Parameters + ---------- + api_options : List of strings + The order of APIs to try. Valid items are 'pyside', 'pyside2', + 'pyqt', 'pyqt5', 'pyqtv1' and 'pyqtdefault' + + Returns + ------- + A tuple of QtCore, QtGui, QtSvg, QT_API + The first three are the Qt modules. The last is the + string indicating which module was loaded. + + Raises + ------ + ImportError, if it isn't possible to import any requested + bindings (either because they aren't installed, or because + an incompatible library has already been installed) + """ + loaders = { + # Qt6 + QT_API_PYQT6: import_pyqt6, + QT_API_PYSIDE6: import_pyside6, + # Qt5 + QT_API_PYQT5: import_pyqt5, + QT_API_PYSIDE2: import_pyside2, + # Qt4 + QT_API_PYSIDE: import_pyside, + QT_API_PYQT: import_pyqt4, + QT_API_PYQTv1: partial(import_pyqt4, version=1), + # default + QT_API_PYQT_DEFAULT: import_pyqt6, + } + + for api in api_options: + + if api not in loaders: + raise RuntimeError( + "Invalid Qt API %r, valid values are: %s" % + (api, ", ".join(["%r" % k for k in loaders.keys()]))) + + if not can_import(api): + continue + + #cannot safely recover from an ImportError during this + result = loaders[api]() + api = result[-1] # changed if api = QT_API_PYQT_DEFAULT + commit_api(api) + return result + else: + # Clear the environment variable since it doesn't work. + if "QT_API" in os.environ: + del os.environ["QT_API"] + + raise ImportError( + """ + Could not load requested Qt binding. Please ensure that + PyQt4 >= 4.7, PyQt5, PyQt6, PySide >= 1.0.3, PySide2, or + PySide6 is available, and only one is imported per session. + + Currently-imported Qt library: %r + PyQt5 available (requires QtCore, QtGui, QtSvg, QtWidgets): %s + PyQt6 available (requires QtCore, QtGui, QtSvg, QtWidgets): %s + PySide2 installed: %s + PySide6 installed: %s + Tried to load: %r + """ + % ( + loaded_api(), + has_binding(QT_API_PYQT5), + has_binding(QT_API_PYQT6), + has_binding(QT_API_PYSIDE2), + has_binding(QT_API_PYSIDE6), + api_options, + ) + ) + + +def enum_factory(QT_API, QtCore): + """Construct an enum helper to account for PyQt5 <-> PyQt6 changes.""" + + @lru_cache(None) + def _enum(name): + # foo.bar.Enum.Entry (PyQt6) <=> foo.bar.Entry (non-PyQt6). + return operator.attrgetter( + name if QT_API == QT_API_PYQT6 else name.rpartition(".")[0] + )(sys.modules[QtCore.__package__]) + + return _enum diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/__init__.py b/.venv/lib/python3.12/site-packages/IPython/external/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b26388de0edbaf93dab242c9a895d87bff46176 GIT binary patch literal 198 zcmX@j%ge<81aX(=rGx0lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdm8u_FoLW?@UkW7k zQ&P+HOHzwV3bKpgv|d?iUYUMQW|DqEWl2VUp0S>xk$!PzNvdu^Vsdt3dTO!0X8>46 zKeeJHwJ0w!2duYPKR!M)FS8^*Uaz3?7l%!5eoARhs$CH)&{jquE(S3^GBYwV7BK@^ E0E=8UHvj+t literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/test_qt_loaders.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/test_qt_loaders.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..307738697cdbd440a6e1937c36c84293cd28dbc7 GIT binary patch literal 950 zcmbVK&1(}u6n~Tb=*E(2TU10!1De7X%u+>6K>Ub$$fbDk&>Re#&e(3c$;O#&+9-m8 zAcEjU=*_#-i+@7BdWjeiHu0nvZ4bORh~md?GRJ_DU()B5~Rwv*JFTC=*SiP zhgqz%2R`zM>Pel%fRd8^*iXRM5=UKPOptFR2AX=W?8jJ_0eey@xY`rhFMf&V|MC1x zQmHUuWC68Tmqn3L$$xSenZ zoXf?_M{1f4%T>;mzaj^7UTíRu5X+lDJXyZ>nje7 z*{{apXJfIOz0xxZGOl=tNyU+d8B)uQM`~gmi_=*0gLbo^9Gp2-Qk8>(Rw7d$Rjrhn zGBrMpUM}Baa5f$>pNyD4nk&4RaEf;@#9-j^QH_nO(dAy_b9j`?7W2ps6+%cKPV^!3 O4VH(xMv8nE?Y{xs;nQ^h literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py b/.venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py new file mode 100644 index 0000000..7bc9ccf --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py @@ -0,0 +1,11 @@ +import importlib +import pytest +from IPython.external.qt_loaders import ID + + +def test_import_denier(): + ID.forbid("ipython_denied_module") + with pytest.raises(ImportError, match="disabled by IPython"): + import ipython_denied_module + with pytest.raises(ImportError, match="disabled by IPython"): + importlib.import_module("ipython_denied_module") diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__init__.py b/.venv/lib/python3.12/site-packages/IPython/lib/__init__.py new file mode 100644 index 0000000..cf8ccb0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/__init__.py @@ -0,0 +1,11 @@ +# encoding: utf-8 +""" +Extra capabilities for IPython +""" + +# ----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# ----------------------------------------------------------------------------- diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c4a3a864c3499b6fb4fb743d28a2fddc4ca69cc GIT binary patch literal 236 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 O388l1*~NCyP5&Q~>ih%% literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/demo.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/demo.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d37c469ed9cc1363dcc49a95ecc496cd6621c2e7 GIT binary patch literal 29149 zcmb__dvH|OndiOzkoqO`KoXLW&=p8X4SE=xhmCmzBVoWG+c9=xhKZ)t_eyHf>Xz?q zA=Hr)cGgoXvi2YnXAqNQ5wqDcl$|oE*_y&zTjeA(lS$2NZ6OO=a))e@T2IybkKJM{ zW+&sFt?cjn&ONsuv>hk4*Veta&pprYeCKD_lYV~p z#sg!)lRuxXfyY&H@&&x z4b|>TlhHJ~H}|V}*PC@sZ_zitxk)|)I{Kh)B>YaL* z-u*dp_UI3x^=+S{^@sIG^ag$V=csdszEj`z=A&|UdF1;agwY#z(n$@Ft~a#NCmzhB ztMy34x84W8A@xwv)Wbznj}}cmRy4K$!PGY&d!tmOs>+mW$`yV*@`tsGay+R|#0_mI zX=<@V$}l6*RP2nQ>Bd;n(k84}Vpu!!%v5S5ndlA#PK?AXZA_Gijg7~RF(Z+(w1_rj zOlr}1#Ig*Ft1>4N2`VZ|YF5;YjU!`D3-PHyEFr7rGSpw6TbJdSYDb5bdQR!&GA+njGV9ggdpVxhk*y4F_ULvx}nQa2D%C^0*)cS zY7w;8VHw4hOlLVbuVtgW{p{s)^WG15qWk+^0}B~p>I1aGQuEHZ`qfi)4GKy)S+ zu{$UAmfdqi6CDDG%l-2~m9gR<< z07Zb~NQ%0k8(3^6)*5i#7#mMb(Kuh40KU=iBj|%M5FOJ2O+Y3}jam}@fdaq-EO&r1 z5*?x12II--X@RcKO$_ofrbRJm#FLY`9jAHe)OZX>o)NRigXl66k-<1kyqHHTZz8Ej zIp|9b+LQvbawLIu5KBc8QGhrW88#zhSPb3Wz#r#Bm;A6>*3%u24R-734OO;#JYuG- z-P$98Ku+&-*Ju9HWLgjbV#g8ys}7Jc^%^rk<8)9rBa+}1#nTd<0I3*@rI{vST?MQh z0F4n4K`zc1i5TdhK-T=#&M*{f!%B`Bpq(gUFMC?`SP~<#;gLB0QXS#lL6{ zF)swa;z0osB*BqxSP9NseyE=UA70xm-& zAB!OnF^4B?Rw?Ll0-tIAXmXi|7>P46Gnt@Ff`*}n$r!LyFp(r^V8jYoQ&uoE%yfTmMSN-}|AGl93kC_6O#B2NaAc#$UnIh+@DG13!oZE=V?NO+YaED!*| zb9m9dXbW691d1pI7oj$&-vUpJvykk7DHiy-Bni}xv%Jwba7@?Qsa!kyp43K+__)mi z0e4IW32PHEi?LS>mu466O`&?t&||5j$z;`m5u`MRlZF>8b|>A!;!dOpddG?VMr`2O zyd453eMX}l)W;FVj>rU90VoBLjwxD!C#J^556H=wB8Z}3Z4sh7Lf~}plS%(z5_Ov6 zv_Lc#wqq$sQj)dsauCQt#S#WfICgg+xnZ&ENeDEc3O0X�T2Iq=_boPy$op43K*J zsl&?~N+;J2*n-*&8bq<|HHjfUZy7@qabimtn=OUsbX8Acu%c6@N&T`H45%rH2N*06 z2W$0AG6v2{y<{vvRUmvU*N9ci6iIp;)qv`8M4g z(uSeH5WUutV527Z8n=zAVhKG4K1VGR1jM4E6-X#RwM~vBLGuZe8itMOcL1ezK$x@{ zvUQr|K+>3Os>A&!j5q>miwH^_1Q2}`9U&3SG&m2-s9Fa~QfrYE7zAe4Ky8+h(g-!o zFd@F|I64$bwKI;3!Nv`M=}RNTnFb)04@gacmn}7oR*7Gc&@N=k7*r|}uR2K&KqWRw z!f0rn1(>d6htBmd-?6zKxEL@3&55xS6hN(pPz^~*EM8)skR>2yqHTOCiUHHAL9Gd` z4fXI^!Fb1FiP#umPZR=bTo&-en*^fa4QPu+0?a|v018-zBqY}33^t*ONP-Bui+K_Q zLyd71p#?+~u`4x^Fak6+^?ni}GuI;tGtML9ktFf#>37SLe57|03jU^mk$pb`kGWZ8~v zt3l@l?dMqpfH0JVi%3r13E1X9gxPQJeb>tgg&*^jn&45H}P^|K}RTfka1Z8lVXG|gJIzdmd?OrLCh8n zWVJ+U?JAkdIfRNSsF1-34QcjryJd@DV%Z9riUrMR3d{|rH5%e3M{VTF02U~cL@aq} z+m?k0rV;hCjR2o41KKnJlIa2oGMHVvHd<$d8H`B`Qi#yq_QwK|RMXCaT5aQxQ+Rt= z0`7r)o4CFlSQ0ZP0tJ{!ev8RxX-$kuRw2^32^Ls7+9hcxrbPur1#%LG4QOzA5*0}< zQr5}Nt*oEeV_u6aQc+4_b6E0HHna(PC{Y)e$cca#{ zU90_RaLQ=0N0qxk?RTxOzxQ`s<$;gLD%~GeGoEK6sgdhyrWDvf#w;Y2B*%@!_!Qp! z<5Q1djgCiBVQ{MfdOIo#(QXB;3cdx@#VU*O0|CSLeKLSEG0cyXJ(IX zoaup;B{hE9a-Q9gO3(Dbbk!rwyN`5ld$`8}@9Kgb;dEr!uzKvCb0(%Z<5S!fzWoHP zST5ZDNHN#q!HH2h3M44xF>>Q?^%>kQDJkdMC>1NXbah%umncfgNguU6PEG<|-mptP zr-WVo>2+T@Wo_AX%GxRr4KHmLQd-0AjLS4Kr8GfUc^Uul=Z~E@a_mTdA5AMQZj1V& znbo*wN@1O(G_wJ}{tACq6K>~}JHfIGyU*{wRr}D5?TfX${2iY$e(t~&}(?htgfk&wfdCT!!gJ*?aj?_whyT&LF}wN8hB?_|ARhkL`6H{4|UFs$^Nt}Umm{lppY=-QGg5p*r%A$pVX z(Vf(!{wU>^mxBcl14g-6FbyxNoKLe+cTFn;4u(v-bT|1AO&_N__>$1~D=HB}?)kUqVcfKDZxUQa8daF!Kb=2Kq}j1m?XTqwClCQS!M zH^}$w6FDm6FXY%L-?LBTsFJ^sW3znEK9Pgg6JOH-{BlN->XhlD-SRE_9Nm_Emv7T0 z)1_~gNbEpe^ZXE&CkZm3^0QdZ}DbsHah;PJ8i-7CK+kUbFRgsM(iOvjbJk z&1ZOL;qCNqQc`uY8W^G&f7bXY8O2*HS5+-$E;*HP>>|SV3+YSu$w@80du~Zy7 z7{oSVF-I*JG0CYC%B)fY_)iZ3ijZXJGmLD)21N7Yv_vfu*hn0PC`keqiS}^3l9CNr zijkpam?=ohg++sgO&w+!z)XVjdG)c$4Mij5%1n@WtQ!!egh@x3C8N+|sR8P+tS)E# z4{fy2NHjE)T{_R@ww9R@t8-^0>)!+1WJgtaij9(9T5q!>@+ zB0fz#1bo-fr&U9XmVoW=?+CwsS1MuU2X*ZgjNU-l9+KCTGj(qUe^>M8<=O($nk2Vt;_1 zWt0<#Adz~xmW&%JMaB)-^@p`gDQE#A{(jWTN=T*@pfm>(R>m6}r$+!b(_}np z!jhB;BFXttM&2qIHlhX@&oX{|A(8yp$P7MsC%ZLMZ%b))hnXOZh zXU{43kE%*&?c5{tCAWjkck3UX?S19wN_q9X>l&9)HK3%EoUs%|5ZRar12N?NIYQpAxEA4sLiixZz$v(KcR5Urux5 z%`I1EF3(V&#+Bxl<>sEn<{o_L$B!#tz5G@Af%1M>-?Ciaxme%1T>r#k{S!ZWY~@J* zJ-5{s`@l#2R~71iIdvax-(_kDEUjUS&_B$57P zZRH`i@>6%kp<4G(YgF8eE1?P|BTxN6V5Sr>&CL+n9Hj!4+Sk8oD4sqFiLCIFqPm)+ z=%TcvhGg^WZl~R<;yEA;I;zl=E9IyLMU@O?l*|JK*Bf^E{F=g^bmcJ^u$dA`88YJ; z0xRk_HB=EUHQVqopTaHUjmF{V7t4l*k@1lE!z9uFx@z{~k*h{~hsZRZ4)8MI_ZIZQ zI)Q9h10}Qsw$Inz4r&W0UVriGi?`Z#uLR34Ja+!E3;WOSza4D66Reuse(BMRkIuhv zJJ@=+uJMZRvTwHc)gvfd-+U!_Ik?dK`q8ULm+F9xuO1O9xC14$Lh6(of2+MvIsXmj z`n)ol`yHR?%FdInj#B=DE9J~>vAIK?j@p(jD4{K%=am7c7L+J5KcnT@(((;Ciztz@ z&R*q$8g&gTQP=N7v6@k*RZD%PWLh1ql;yKeImU~wSJruy85eT9a>`={XVerKZTLdF zj^ZZM6lHW>_FcYZRb<&Kw9w%}pJr5y*%{|=Xsw8f`a87dsI=(6qkPGp0_nQ)MyO@K z$hV?x!tg-4rW~JqVsy@oB^vT-F4A_fQp3uOdsZ1jF!;;98Bc1H?8UTW4(e5YA6$ry z4_<=jsH3dPyf7Sisdr}Gw0o2mYQg0q!-8YRkiAfqSGtPl&*nv*{T^B|T0xcgIZ8aU z;DWi%Z9~eYoAi4Ra;3sDYu5Y$=sCuKX*Yg3#*0*s%$;(~0O-ZTGBx`|s$)jTrb_Ukm<^Z`iDC{`uQWkcYbWz|aoCe;;1N=lw*e$s+NqbIN?`%Jk)F!S!#rZfsj> z-f>PCc*Bk6)5w$Yj3SKLWQI^f8uIu6;!zMZlo*Dnm^>Xbn0qkW;9iow(A+{LA?PA| z#zV>m1T|y8wjY+lU8O@+%aqzF=5w5VfCeZe+8}aE`(nm#BoMzwj-gBmbT33xnZ#x? zZs^UK(u7a~GXV&}1NOUz^wo@eEHa+)JJDR3s%#D+yFQQaa%cX=>2t1-aPPK&-{riU%C91<)%j#n;yAwV5w>6dv&|scj4?z%oSOTuTU;=WL$ z#g=W$Esrg>Ja)6~N9x-hODzXUdh31l_=l9?^`@&$ON}HN9)~PhTQ?i{dCiX5z@4>? z^Up7>-Sn~I@wc5nID23=vQobGLi&7qzU3P;D-{jP6)lSuEmyZ(d-mUVy;t$jU751b z@?J&jJwHm_3n}$Y%XJ-#bsfufor`sy*S>foaC6%a%a-c)%?9SSoiF=vUBmqDZ+#sd z57~kwq=ZfF-?y%9e{0|MeK%X*>3O?nsr~5E#-~WyY!=ca!2fFKpFe(Fsq0t&IkWCb z{Pi*3|G2aC@LJE0w^!l*lhD?~b)LU;Z#~@P$y>#=vRJ+#8|Eb?Mh0EHiHp{0R%XjL zT2HwlcRl(=jxHd@pEL>)tVzCeSVK;WodHmGq2~hsIFwadP7X0W=?}Y2B9Nq=BoJ~2 zObs$_L;cW=vt~cOD(HC15V}yQIE^#2@`X+|kdZ8h#Z=ChK=c^O)lugTdOpv0) zcn{;{l0xSC)A(+clexMW{W^ULoM}zUk*NR$m0UWKHvgeIrG(vrKBjA93E{QpQNYrK zQD|)zoLxGa%LHB^%LOZ_*Ii;QdN~ifoTT>0NBvyHvIBR%jpemvvhnga(a@XaB4XjdP?k;JxrN zL%9%;V+Xe(s1ZyHE|TP)11^m^&Vg)(T>ebC!tV6wlZa6v+>p_-Iq>Tgfea8Fj&_jNOF zAv8u;M7^Ci5SXXuu~EpI9V18lA!G)R|=S#%P9k0$US zN}N-ms)j0O_Yy^!`Nqthike%sU%p-O;>x=9E7f(&)vb%wt+Rbt?G-h%A75N-=(&KVzT?&Wd81;H(X%3D=GzvMz5j z3yA?uvpfcBJO~<=)hLYL8A^TSO&r$ zk!0I1DYhFH%4fu$AL5%Da|%3p*C8J7)Vne8Fr<2I1`aK0c7UVAZkdna))gWByYvGaCbi_(^pX~qqU?` zZsgBHY!B691A|`44Q`PTFGK?WdH-DNa@EGgs*MYeELLrP&)5F{d%S2XmkeRN>7xjU z(;_x%p~r*ZJ(zSxGHfw05c^5^1U$+mHJ}wa74e&k~r{GngP#+BBWr%*p8P^LyW9L zUR9tm`M4 zqL@7k%ZJ)6xTbjnsYIt4IOB^gvSK!p(O^MU_(^VlsolVC<~Y++j;@{6j&+ajg-e*= zfNKY|Y3Q_-;#cln>UT4=85{p)>;F1j=*7oGdKtbs7Ljay(@ro3z8A5QOsia$q(5hT z1vsT{Qno=hn}mk>B8-sGwEJw=ZfWEvn9x21vT1gxUe5A5GDN;Wdu@W?FdOJ(S0k-S z>~6IK%A829oWktSq6j&xI%JL|y2ilC5%J3r!nOlSM-s>2a@;&^Lvr?hWPL600}PX= z#!-P`94EIHyCoflkIew&!F0UOWGLj8$(D}h9cBYZ7VZ#T8>}={KPnc5~M_j|1N!^P;bL z!FR3Ywy*O}S>Fu&d@4y#!oCVJO0E|d9dF7 zm-XI*8%v|P6pmIU0duwbx1ya{86NB2vE`y3`yy$s7%lk@DDAY0JJFgVmSQ1(=w1>+ zkgMc-PH>8(si1?@U%pTW@)chBG#L3EyX&Z96U~t;Piea8IogI6flEGTZw0nt ziA|UNpQw923GB1^-X`r6m)60!{z(vvcMPHSC>9R;1&Wh;WD>yG(Auj`I4n8oAwd<}vN zqj~2dC^IH~S7MU$Df_}4Hv7|g`!r4oE>>JC{1jd_OO%ANJC3n!M__AIvTSz5pMW2Mx;@%&S> zeRFLq(}2L&NR3F+4I+S-Pmz`@6F0L_G2|Q?}2-F-QIsx)XIIZyH(bHMkXw{ z%6%V#m9))2_kO75UOC#hU!nMOxQ4UZa_P1Qu0(9%$<Ov>2_&wdtmRW`E|WFOCqjJJKu075Xu_ME%9!*@*NWSy%RnR3euJ*PFp?FA!S1U~8Y{kwK6xGStd_VmW$Y zjxGsRPgv)(N+=XoFrSGyo#6vT4&PJ8Fic4M_HJXnZqHuL_QE}=vqgBnC!!kJvIK5M zY86M9f?I=2qZKC7Lqm25tJv0V8zcjgB?`l&*eOcUkSGat&enEOodv@s)UPS3kArKe zIhF(>@yWOzh0h8h>t#Zb$82&03yV*32_eBZm}8{x8GX$etKr>>s5 z(YDyO>!!NY_85s(kCRxnhs3JALfZ*l486971Udgj|9so+3T*|d_}*{s6_HTaCf;q` zai_Zea{EGfsiE_|>aGvz$E}UWmKu)VdhUhys=sunVbhhK%RNgCTbCQQEjDahYItPs z;0Nm(?$kA19=^4C_tJ*PZ`bWvsoQYRRZ`Y=r?L6U;me2T{4495uk5|N_cixxK5D(} zV%hxY?TWDd{#yCn^{ubDzwLvcwxW8ud?SWsOPj*CyU_Z2=he>lDthh)%a?=e7lZ3X zRKdH!t+wbnKeJTTHGA-b@~RIjYF;Y^Q0Ahq1?Zs@L~m_+eyR3_+ZA7ePDlRcd*w=~ z^H=xQDvfQ_?*F;xarw6cs@b;JTwHU_^H$(`U~bLribwv%BIflc2lpLbqx@Cvfs!Zp zDSzD<#E-w(S9Un){#nqC_n)oVa(K5p>OoF<5grkvSS3zdAauIG9&IK9N1U2|NVw2! ziUZu1a%L222i85EzyZqIZtos!?>4EW>mEkij5~D}TJU5{PmP$w6fF8k$SEQTs3Yl6 zFBF$V^oml@tTp>J;HvwOpR>jiy_9P#B7jSH{gySB>fX=S$5(!k1JNQz`C@zH7^3>L zXVekFvXhK?`JA;l@Z|X%azghYsCiP3nEyE;=(flE84#3$8|Kf~0JNtWno|+ZS9~0f znxz8wUipFty_#|5^u|#ja>h=EOyboAmz+b;I)D0+{6z~{E4xlfK5;^-;PWS04w6@j zZQ?M3dru@!BWn0%)c+B!o&JxAihlHefBoxUe}unZhbzq8NTA@Yv*s7@#_{->HFDEH zcZ$pZ1?4Guj#c@LyEhr--P7h1lw5jHY*)c|&=8o_2dSDNE+MuPaCpBR)Mb8`KXA2{ z$@O~h1N$FD5_OU&v82T#_?=$EwAdM^4;05b$r8ecmGxv*nK#IivU9O*=ThY^m{<_o zy#L?s|3#>CWo^xD?@E31suC(|pYyJ)t(&hzkn=<~%+1rj{E|T-$K7 z`kf7LZ&+$PyjXpBuJ^%uHeGAF=~;gC$l{|%mKu*PRv*3CyHe9IzwP3e7iuV=Yq@2| zV#|(qYj%)-{;7*k<)+@4xcTf4&;CgL;a6{I2X9yRLPn{n|8DR1>t1iX+IY>lap3yM zjhAki*Ww6i>wmj{spYAq#$!Kw?q`Fy8lPRPe)gNxW3JQte)Z;i^#I4c2Bo%P_RyX3 zbr-&V{_FE+7E-T&?dsQ-%6H!K?POYxDQf}vMPTKjj8E>@$&}h&WeB*0Sz#61<2lzy z6bY44w}jW5WLz*S=tgvuw|AQ_(%UJzJx8}cpxY6;Jx#ZRbQ`7H8M;l;?W=Swk%b(oqOu;;o~b^J6GM$s@~dgLm$^| z^wxZQSoL_DJ`TCO`#<)D@Vn9P-LP8g@^-BHJl>9vLvC;RYM>FfJpu3fkLxOMYjt}! ztp>JxTUN(am$&_6pUYduw^d)YcNYVndl^LsoeK!h*J>>u*6=&88 zZCW0DoUK`UKGn$qA3RB1n`qlK_!wO2 zk*4`ZHvlY-*6S2U4clQyWRVp|f#gYZ#5w41l{f~QPVp?fikW(HjfPXIc?D&{E_TO? z#d{SA4;p!^ZTw`~FKxY@MEVK;+1if46!w0uU-Ye?KlGk&6R(_pxM}mL4?>#%*d z4Vy^d>~xSWEJxm{0Gk+XL+6@!+Pd??n@Q~9we=UE@}K6G z$Qni=H3F#$uVSupS%$)run7s9E}TtFu4&gOS!D_?SpplJs;6BS#U>^jI0iiS))m(z1&2I~JS+ztI?*4l z6jIGoNTcl*5uMRq*x-nim|vn>7v0#D$JRQw+v${M(2b;MbC_-<2MgCGNl11eO2*4| zX4JSDr|(qIA}J_GfIf(y>GETsH-eDzmYV%U>E6PZ95PD5{2Q)>FNc>Kx)vL{mKu8C z#@xL1{f5UDDzClt*5vicA58t}wp$I4Vedo3V|N;w=8f-cfnT$s@k%?4U~S*&<_#3< zwfXji_RBpY%Ds7h^TN8z^d*4W@hDqqXyH!{&3Kgm78?iFE9-ajHsH5v4%T{p?DgRO zAgMS13q~bG$pSJ@=ws4tTP~Rode^KrRC#LznWxV*H_m0_gtAJKY`)Az;ff|x^U)@M|VSZ^iFxgC7A%9=gw!+M{Z&0WU6NQ<##!s zUWB_7(#d~2BBv@oR+JB#W7;fYT^zeu!HMV6#6K91Bu>+bp>!aajHf38k2=6GAok(R zV91ry6(K^@EJ1?-Z)U&XHjbd_9Ic8o*lag~J%!9XA?FFc7(0v7Br~&|I!4E*4JWl8 zKIOEB+7~+T-&=zM15+Y^(yD1QC{$NZ^nM_Z0s72qO9(mXzQC#yvK`I7{IQ zwKnv-@vnx&t#0~Ak(%Z*dIagV7Y}~V6Kuba)O0Q+Y+G)eAVHGnIprS_Z@udS-&#BJ zzTYHG6`FW4>Oim)3U2|OxJ@7E_99hG3OI?hA&9h%E^pPU&+Dxf1cUPA5e$dmQE##Y zg97z4ex5>F(fuaH2#E>LD%TlGqZ^HxP17$c4r!wF&)rgxTM{dycw4`qw&*sAw#=W? zFYXAZ|22Mo;_mM5jyh5XQs|x0=|j9g#!}7F6yC%&Q<^AAp(^)c_7$_^THPq&%c3L#2AsBw1$I!-R~q$6sRK65;`PGbIHgP}IJJtH6JI#B zYE5pyHo~~=X`>+LSK6ctI}HBlDL7z*J%gX90b#f)Wh(>E8T<9vTWJ0Vw34ZO%9t8V zMoj$(DVgTPc#0x)aG;bQr-UGSc7PA*C`}}JMHFi#JNb{H?`lwX#vxl>brKJa19hS>m4teA^kJNl#WN@L5l z!}r~4Xy>`!yKAa0jD2Ga@%yio+;h48)ptTQ7oI-<^nCBaV~dTQw?kd`N)>nk$6g)# z)qS5*(L$$LAQN_@{qd7<{rRgu;WhHZx&w8}kL#)r^tgZAt>R8cK2nG!e3TVmgsWbh zd%})vi%0@a6K9nSf_~cH)n&sX?dm#+{jUgSHU?7WgpuCVD^6=?NIA#hkYR&$K^`@h zR|#qI$wbCON8P8rU0pa#1$CL}_QOU0oevxhB!a7;Szy};G6%c5gvAvgN6Dddue9S5 zPqaxlZGePoCgKM^?VKK`mpGdT)a<923G;vAmM-n;;sbL~y~WAtwN4w^^LWxFU0t+W z7r7$v)lrngZ#W+cx+2&q9jOmkVjK?Ypb9;`m0?7j+(sz-TxHvVMH)5dpu?JQq6P(b zzf8TY$eA%db^~DcCgA(Fcr+lZL<@=`ule`*5H2}%!X#pnDM4^L_SPIS{~IND2;r=Q z%91g{+)B6C=(Za-_~LO$5Dxd`K=MpgA*aB?6jWp`T`^gps-8Ry#iEae00)BuU@ZyxzedhngS0Yi? zFLB3;Q`LWPjk;9NDpXcA@N>ogb0ze11ux~lQ0o3(+58Jd`-QS86F73N^g~6P^WRpq zk3Fh-NWEY3yjR^dyYs$6&->$n3bl2v^}d3~{Z>t_nN8hS@VI|Sb*cWj(+eH<6};RJ z)Ty;|wf7Y~?r&G|B{07ov61-VqhDL*e~*7*uhSRQqw31`$5!2CYW2MhiYGLiUUJv} z+_QG2tabLw%Vn*LWv#ci9lTxEd+yMRC$Q{Ux9C|nA6z(bqjRO{32b`w)}bnIuX@+{ zSh`SsExyup$oY6U=VRGI>c+`?E_K5r_Gg!OJ52lDpk1?nVf&5xm8OTC!rQYI`xaWS zO;g!+r))=VS*rW_m8PRk*<(2kmn=k9ntGg1+wKM{mxGOq!N#TFhI73ic>J@i7sBVm za|h0ME_hxKT@AsxQTKKoc_#WV_Frp#Ys>X5H&gFSy**_o{co?!+j=joctrH}{{yh& BDp>#k literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/display.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/display.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5df29fc45a74fffde55d97b52bbb0c1523d1d158 GIT binary patch literal 29281 zcmeHwdvp|6dS_L?)Gf8%5A*^Gfsk5=mH_ca!hiq^8(|y#(%5cV-6g4^)h$=G5Nb;^ z%&c=p^56iQ%|RSbVkXDQ$ZPKzyxHuKoNU5)vWd?odrr3-N9`JBLz2nKnSIKLnemcM zc7NZ!Rn^^6gC~!(XaCr;xm|VZ-dp$ay}$2X{c&+|p@8d^)UOWz)F%jkNe{+l*Kd|K zh=Ooc2nqv2Pz+ka;;3c7D$>0*Y#X%?*hd`$j?sdFf>GyybJR898Z8_sWbbX^qEYvN zd$f3I4T64 zuM0t!T=t%o_hn!e%PmB1kz8x$*0EeSa*O3UGq;}QmLRt@E4P8=mLa!1E4Pv5Rv@=B ztKHQsw+gw{@@li)H7vIVxvS)IGk5J|t*0)2{5ii8ijJ#NFr+NEJd9uD}&qKaRQwo5^OBr>VS{9|Fc@W(W2kEl6h z6$NCE19#^`YE0D}A$2GemNh575{k*^V_JcKP#yEfMl{=*XegrDLuxRjc&wUj!XG}X zSyg#Va}KFNIS>uX9*b7o%R6{t@QfUYY2~NTMot#0+E0z67n-v#CM*6yx;rrz3q>RT zu*a#{4~z#xQO(hJMDdTxn)}7*_^I(h`MFR~j%tO^g+}Elzb`o%P(p*j-e_QaRF1?n z=Mi-L$x!61<}&V7&2|Xg3g`gGeoW~54Lp7w@FxocB4E%G6bGz9%YZFd9<&B+-xOzr zAu(uwy=cJB?i{Z>2OM%iu;6v!J-xjFC!U?MOD>d)hAef+9kK*nuiMP`ZoCIfna{;| zF3Nf?2?DkTN`u8n%YuNYf%0G}(uyG9XrOXNI4=%VofJG3N(CDC|AJc(4kXmvB8lB1fdyNJ!PQCEO`;Y+Q)|QU)ifRwyzy9+LucI4ngKX^em;D8-_v zC9@_B_!=6I1ZYj#rBFmRnDr^0=St|j3G(LH zc>JLVjfJ`wl+}=extZ{vlZT?psMI|`b&N15D;TWI*Nb;W zl15^&u{|9fqiQhX9SsGPs2UxLc>~eW4mq-UT-_UM!^ckNQ?n0fPBWJ z8N<#uStnx(6(g|8nr5Ol5v+U82M^K`t|+efC#0ti9S0=?C`6T<8qYrSq%;Ql#CsBz z{1P>cWoMH(ArI<6M$^?d#4;HWNl`|52vNp?3GKYNvE&Ty0X-3{zdsy`%fZ}c_*ba= zG%MpuIJX@F8%&rwJ_aJJV-Z>#RImVYrvE{C3@CzG@lF)9OMCsh6qH(>P4^) zKw1J)nhGG{RJAefBhwnXs&)AL#R0c@mV2uzr}a9_cjJ>@=;tDuW=Q zNM^o*dQ0d0Vd_2FJK_(k@@c+c3eoaC20ob+bBYk(KMEF%nPg>vee`8Q0h(}Ln}GQQ z(N#r$b(|9`VgPJK#tdpo-{cgU09^8`jCT+LWuNnp$D&N2;7e_GflYj7>WPiuoE! zq0vz}7((~)dC(|;H?@NPX1bO=iP?iTu}KFn^P6B__>PkMp&ay+T0w6BzH-o`Gc9S< ze?BxiJ__tt)ezR*Y)$b;hGnmm-3zvqUd|@5RMdpN9PQF+nzqx@=s0K{A*mdjkh9it z^A^loP}(B3h9ZG5VEmlyX_unZ--(dQ7_zJ=L>s|!{m22Sp!K2az!+9i22*A{kd{dQ z7|H@48Fj^|X-$aCvXz(By}WfPHaSLhhs@^qI)HXd5&0aZ%bZVxIvqYwu%k0UgN<_D z*VEI3rDNo1j1gJZD&d%Ib>Z98YT)IA2&tSrb&>((|@ z8Vj{;-P+j}^GKVhjokb$2k%y#Dq5z7$Jee>mTp%2Sz(~o!zoyFccdLjC#TL zn>>=V9`h0)&b>$4bn=P5r_2%Zwm>Aiv)h~4rUpj9UQ{NgjKoI69i+g>-stdf-sV_) ztgC*BMEn)KZPC|}q@51xh{{sxU&|Nw&)}Zjf8S;@{bGX4if#?IJagcA-}48a^YtD$ zb-?TWIr>5i+x>IZV;?^$%hCY=CVMb3o@h^KY;qzL9F}7$2WY;)^hOus`CHB>86>l0 zC=7*gFa#Ztw1%KACXt#+H8qPe*#EAm70O|mbT3~h7;x%J5p;TibSx|WExm%LUly+l zQ*XoPa(!E6qGq7yxD+MoU%??-nSc?w}|{RCA?O4`qjg+ za^pFFi5O{X?0Qe{h1xb{&l#5^GpCyqgs0KTkn_d`Caz zI;IU0*g)d|UG_?c&ySIu0|~+aYzQ$*7)(oHbi;cj-j0eSZmy_7nG?jQm{ixzxc8}d zq4d)SG%H?1>DMLq_!Eq>8;n!MS3^S~(wt0Tgz>p7)s4Eq+1`-B>^aBsdWxXqlc;o< zn5kxG-`AXml%lN0=rubeYA{=xWzFgHL1&Bke2PSmg&`1H(wPFXW@nn9=JJjD&&oc~ z08gQ2Q|0gwE2=c1yt0mx4OG)cqfnaZ)@5>3{ymq^$IL7~pGq)87{IOz4_@qe7LvT$ z0ntk72+HRexfwgl$qxN`&&iQ?cwcPbS@(o4H%cPEOZ_v>%;ez)&~zTX|c?Kzw-t(=*< zQzIqTMN&1hj9n|trP^q%EIv0#BHODAbfShlz65%^K9JVOL2ac{3eQ`R4M zF=Eg`5bx4lqcE8<8Ir-dvJpi%>NsFSgd)ihK`R^{hkE0qf|}E)!qCHGRW?zbt(16? zsI*{`bV2E$oNY+rZVsos!PlwGStNkczjW570Xci#*mK8S{x6#6s*>*J+wK;ErtaD9 zMA3$HWAj2|XR@*LM%8y$f3P~$xc`=zY&;0CIi4;qzx2ZF3yI=&*@bF9s7*EQxw$3T z*iD7*Hnz}@(uwZ{Oe&8DlL!4CAj^QOQE}R^Fk7Z=E+GR$XI!YW?3x1KGAQ^0qola zOdjhy(XUx12Jvhgg`x1rv@V*h|3v>`PpM`JMU|Z_1Lz`i#AxzCTMvQN$v((FK9d{x z$e7?`d`v6qV_FnvQ_YX65FL-{b!<@>dNemQPl(dY7^t!*QyXDVr2auDgT=iFB_VK+ zF{CV-P{1}=QB`w7pko#V%^nCxRoPRhNEn3DPRV9UXiQ2s63xLCX3fq%s#%7{v;rC{ zEXSG^jpXt)iDPveYQ{@-?ql%JE67y;7|8|UCl0~2_6N?&MVr<2qIjoq-9lq;va$Ep zsgHK28lRm#K6B*q;m@2xN%c2goUx=UYOZ>&c;*gX@4f6vRd{9!($3NaXJgXYIQQ&r z=laaksoTz`%+u4ioom@sL(8-_Sn=Xg@oe$M(z~S< zGlieuZxG5F?g^sNyQ9g*qaWEm3Z)ufpx*uS!;4mW_dq4gyjXW|r|{vC4@ zHPA*fn+J3pMwu*%@`naR5yHZ>Wy*3Uo9?ip#4$3Q>V1=nObanneghXVWl_Bnehf?u zTFnuiZRsT$c55%U+Wh!`e+3mR`$jw^ zKr?bHXm)1K(d^7-u32H^hS*BReoZ{3*%jblSXqzHXjT}oG%K8Joc7fDfZ8U>@skV2 zH{=h*APhVFDx(Aiu_&W;o&t{agzuUqGNv4(n_{%*Lvuuu#$~O_pkCQcDSarZ5+rg# zR!90CWW-x_r2j$^I8SZ-E)wGM^><6lFP)z~KWBUA@XYyCY1@qL4&=?)rTA?88~f+{ z9~Z4nS5?m*zEfOwx$0{DmHKb^u8SWRuUjk>s_U*EyK-#q)howm4yP+uUEOhI$JKpT z_We@NZ10aqs_jcv980*5-L0*E+i}e?r@Vdc+PUk&x296H?K8!9)^1o>+ml?|b8{NF zz4nEKvoT#>ov3Y3mbcH3C(FBL9O=^POVhK{bEi_JO$()M$&gunZ4)ns5O@M6$48QDz zU&eRQqiVfJ1|~YEtY=Ie*XR@BC8IuNkP-68Dh4fqcfMenT;K4({5uMDc zy2A!4EW8a|ZG{F4eefyUcqaFqcdhs4J$)bNj$HdX1_3}QYIlX z!~48k{4uBQ`b+wRrrvho=_ zVe*$}znm&vd%ZeQx-sG0_&@Je3oYHB-zlxVCs@$2iiSl&T)ksS5G!}4_jQBE7x(^ZCt^LpI@GRvg^#{@o(neQ$H^p>>5H?ziLq`!?61HP-JJyARb_ zzh7s^eU1n~gnp zw!u_%kAq}-8kqgWAm1`K!gxI*V;dd|g99e(sf3o2PQwYb;%oIKe;6zI7=_ekBo~A~ zFRh(>dH(5-S9_VQ;DuDhiwXCOpGuyY>4dX${#7KLMrKnza~fi3=@!$ex*kHHb8!~)>TM=XzK7=mYiD1?9ruH0I<2}r_cF{hjGqgh6S*;A@j_^3Um3K)&YYxNmk@rIB` z-GKxan&MK(zR+}cy|F7@+xWKgnsesh%=m2Ir$xoY=yqS(JvVr{JK>h@@~4EmaphbS zmu4V0ha1vkVH*+i@gU3n#MF!aM|6HgG z6Xwr8KQl_cma!5~n^7a(O-B4klk}Ql-ka`O(FQfPPxlS0N}#*xHKfx`%qxZm5{U5B zk-s8hhY%0K-RP*k-0;U|e42U(Gafr*2>UwN5SF*@u_5qD31~L@JhK@xL!rm6 zIXI{xeo6`W{IQs#Y{$%L#l{F(o>rQf5tgAto}!>^4(Jv6D8#}?z7b!%T!*<#)?ZNh zBS-&)RU*v&7Otk-O1+N zsph?lR-vpO#Imd#WYg8X68LC=8SwobZkQ2;RGxnu3y%2T-@XZ!<(RMp*Kh_T8wPC;y}{Y4((YKWor4l-H2KEpQUOat-e2LW~3K5t@Ss z&nZMq8Mx$_-B>-UqMO}xIzNsa!#r%j+JB`|1Va~uA2_RZyW3pX+q!pSI zwq$+VeAjn&zq>nCzkQ*8U$TDR&F53~hZF9@GrgC0q$|4?D)%NU_ui`dqt)MAoj!CF zAX2ptAX3#Q0!E7a#Jd@*9H`c=E4yY++^wu$2|C0t80f6Q4OnGfKA?z`;-m#^FyMX*f}m6xl%H-=8u2+kIt!y5eC;nFH+z5+ zc#c=|0cNVRA^t5D-GBr`beCN^@y3aC<;I1|&B@BmH>-Ys?QgG5RBldH_9fhX#<<}q zqU*>hPc=DBC}_#&(+Yh)*u=)ebno{0ULE&`^*04RAH2E9CK}`q`i8>(VU>9$n8_EW zsu)zt065}EG^mihNTDfLJd})3(nHB(l#o!Oj8Sr)5`tZYR!^Z3YQ?&Hg@O`&J}fjd zGSehJ#*I-GRFo3ZRMc-G`TTX^Gs~AmyL0ipMW|eL;fY0Cg?)dzQTnMBzxP{9`5cHI_<0PRXOe5_o`g>ntL@id(BVXNEj-x?gr3P^D;ETB@zx+MxDCIQfrg# zGGa{0s6qb_O=^GLKHv;G5Dn@AFgX=yY(o41$qv1t9=(PzV#F~|n_cPI*TFlU;m!RN#Z09F#$02v z1d=U@Ni02s1SoF101bQ^b|v^&ki)O39Dg$Wz}fy|@+}jQU>Cfxg3o3=O@c1B;SJPcqtEqHa&oq zKnryX-hksf1b4+uPr7>5%#pj5HE`WI)7AC(DNNTi;-@J4=gp#(6q;l^M*M7O^ijl* z$L3Fq(A=%?e-Qge)#cZFI@yck#k3`23EE&A70%GGmRfu1K(8JC08r$_y)^3kn5i+YiM3jDkN9B^>~=7WOj6 z!B!V)Jl$(<)T7`cfCF5`zeHIMy=BJsmjMPDhIxJ6`9?KZODe6H2_r;K;}r&sWCX*t z1SUj;$xmE*Y400*f9Uq6t81_AzJBW4U;5UUQVm;@)mvtd+$G?F50`ZOh0=A&(sk*w zs;kZ`PBPiIU1=jVW$%@}>B_ovWeqX=x!$**xb{S#R9kGQA@-#Y*mcBKjx{C^8da)@?Y@Q`kbj}4N->6i2^3KH9wu#D_t zZ-&YgPZ9+YM+52%o6|Yk%^-!0fIZne?9EVc(o1*&itJ^P-6}%6DFh3luQ6cUPy!8;iow=hMH~>d|NA1dC5KV{26@z_%BSDN$N67G4XfiA4p|Q;hYKV(4fE z5g-DOJ2XbsI~C==tWhJ*9p+6mOLk8lH*XAuE50{tN#HvEW|5^ zp*}=nHXYh<-q@6_88i8mJ)edc1gkc5w)b@Q60{DBjKvh7P9F0FLct0$&Ud(;sh8}^ zn9mU~0<8pLVivf8tRc9S-VuLM6e*m_(H~!Dtk-gkV+^6=wa#fqn&V|mV9C~3p2l~e z`!(Z-Q*S5y%RwgGYc{erYgU-#G{^WDfh-TjAlkwxp~uB#1d?wvtVAneU-20Vj&g-w zGj>7J1DBO)8VHT)y1->-COuT^l!@WIDMR!TT_wu+Ih2R83Wy2?>5?rACA*R(yKYvb zO7_iIKP{@eQ(ZT=@$I&2ZP#CzS5oy`Q`OrNJNptljwP#)foH%ndwllz^)2(y%^bh& z?xLWf@LX@w**3rJhW*C5r1SAxH7V!gE2R$NwnT}SNDRt~%MeBQO-Q{CI-Em(&xJZ(3k9b; zMqbrJ{Jm$!hM}y|@?k?=iO%pTG@tge{2H>kmPZ8;Z3dl6E9g7HyaI;(hYIDh{}2-U z;Bf{J0#C7Vf?Ed6m7J579qa|-V{aJwiI1&H@Vi7;W< zG4y~_7McJ?S>7$kM_IBc2~)TWP@D#qOF}9$J1$KELXo%XCKM+E;_h5u|(_rV%O1*e(-C zz~+Z#Y`?_D2)4J0N6jMEnu|^(SF-JF%Q-RYiqX=!kUT-=n|uu!`#8x$t?z!s&Jyek z#7@pBNkw>*3OXpJF$0UK2YA%#j$9q8{p zaFY5*4ZwwpZZKJqjcgllF?Wk@>&`8mUAsDW?QYjC47)lz+a=wg&_(x|x#`~44%F1g z*WEbZxyEwvkKl*vIK+U|{P?vhcZy6L zi{{|i&INZ*(%o}YNx2Vl9E;2alg{?}lQ)`g)+C+BZtX}pk8#+4pFaDqC|OQ{S%)a0 z5Znv~xqv}67W)$ngPzbah!sOo^MdxnuB9&gOYE)=O@TnI}@=X=Z!qkSoNei8R^h+u z$r0O$X%XXDx`5=WklBloi8WP9GOQ^GUt=7iz9C(GP0SM6O=gy3A0tbe$r_m@&6MU4 zUn2NOabOqO{r$ghkXPb6%k&+}GWN1;-pnW;Wzni*=OAP%Gt0~d^&-uNEe>WFClz1| zL{ypNu%K^U97F-OGZ&hU*#yKjA2u@&h0f<|o4-KosEbl;zb@N058<4BjS+Eb6%?Fy zxf20rK=>tHI^1J^i8|ZT^0N8N_tkSB-$Q#qM=`Ka*D?Aw-3`jvH_LacV;3*MyZNby zHm{BkmVv^*`Q+ZE@sRHCPU|{+jd7Hv=0m?3IXh8Bc7^ zj7kK+-hN1yq{}GlDIv?BW@Beh6lRu3t5`Wd_)!==C!fDr+;VI zbVtEm`mpw$W{=F9huCAY@jvf(gO>NLhRQxr$HdL{bKYd5;SyZeLPsg~|Ubx*2zKY}_C>^LzyF=tz-?MT*k zAh=_pwk=uPmR`N~ord{S-+A%f7jMe9*YzeE4+Bc-j)-@u1QlH@u-0x_60Bug7X_

    q?Lya9|)oCiWZxofiy@WmZc;s`HkhC1Cz;lMJI_{UW)9E-Zm1zD_rN)3oXgG|Fh3 zNvY!JpCa1Zx-S-EyahiV7FH2yiAn4L8L!lbC|PV{R%3Kz2&kpb+LbxgLSKC%cqve>&}v2PTr_gpx>=oD73O>fwk-q5z>sx4=)`uOU?Bugh@ZGCg769RJ?`8PKt+h5 z1rSD^bnp{gsTNPMQj2E&{pfK%VRV@&$_}l`a;B~{5D;O>CyNq&;=%z|7dK2M#m@0B z7D^c?U?(RuuG6P=>GCuVqWEIDRLv4hRZ}v3q*SW@L&ee+?e_1+_3D*s!?RTVmpydeC*&b1Ocb%yb)bm z#j{!e^y!tN(dpA{|90*xE+OGn#@Uc{_z64U0?rH{F9xXH1Ad@#Uj`GKmb` ziT;UuXteu}@8J<$&&eKz5pS$}foP!F`X){NP%9*OTHkhQh<@OETLBb0!Jy)L;T4M0 zDL^fQ5_~F4DKKZ5x4ja&s2(vx{irZ#Bc?)O)?Lw`hc|YLF5jW!G+MF-SY zIu(row;!j5nIDu8S&SWsS#VB3Yc{O|m)?Z_G&mj#$2Q}^geK5gnlZW{-N3zxb7au- z<)I0G!I7bH;%59;`!F&Q{gCg*q?I^8AY0rh^^KQ#>U*VAbncUZeRQr4 z_CL}leJG`L><#ABY>yqVX3WbZttajCN3=z3Br`>sMZm5tCYi#J9srDUC$8C;ekdMh zAHAm;=f`*X!}xpzrckVy-V}f&Yr^BbD->aZV%;li5Ol0rwh~NVFbEXWfggw+{g6(G zX)!feD>uN@q{rBu2#qH+mQT0U*6JI`c(m8biPh>KzG!;ohp&oO|A==k6QT`QW=8k^ zkcML_;L5+J$3LRvBP1&ERE84_FIW@^iJkF^%%mAdAbdz7Cdr==Z(kA-0d;x9#eKR~ z?oD@gkygH)_J8akt$fGbbz4aXUvrnoxXf+C=8+lO-KyG$>FLndp%Rp|eq8+YeAmLJ z6Uj{{Qk$Me6s)WGwzK8Yuj<#&*xoGR+JY%`psRGxgdhnwUl+e_`MUM%HmLiS8F9uk zW1F!K*@EKhu4(%ed9JMfvnXunN770fV&X)GSF$70fFa{L59C`MKvw9`H=@FN@E?-} zj3qRiHX+}DYeXoJNfb44AQc^26$}mGOg1_~QjH=uV?y!64h7;wRw>{DKj0AdZ)Gym zC!H(!I7!sGH?!LjZ3Wn)v#fFknexzi#z4S-^w!`w;CdzKAau+a^rs+e#4i!a2DUXd zt4$C=LV=OYuo%muF8g(>E2fGtC^Br8VZ7+?)mMhwoI9GWAoLQPF1siEt2!q`oD2J^ z&Q|jcCa0;`M3j#wyYHDsXl04S(PXmz8x3X}A%2lFPgG|p1p2{1A*WWpve_-M=o>R* zXzb@(Qko{}B-W5E19?ht{-fCr3z)}Q@T6w@|uki9dgf`kUM)QoJoVF$#X0P{9lP*=fST|+)YI&Ba z&fGYyA1h)xN2S_vjD)F(@Vb;{AIosD$0p?4E*iA(ZQ?E*OL0<|bxjFm??H5pHE)aA z$3@sM9+)qt?X%eRFlFb)y6J-1qOUqF!fX)^9n!}!UEmUC3#SloqnDxWpZWUhG-`;# zMX!zZXxUK^PLW!&vpza;#6za#D$=NR8;ueztvg4bwxEt-%Gka_Z?cRON459XThj2c%piqz2zf)EJ&93VO^Y&DO_me8vBt41REq7|A>(y_S&WkWk zCcOJUuHB!m*|1QvDOs~={_rO?TNhoZd!P0UUG9Oc>$?BrQsQyt)r(C+RsGEI#Rj2e z-_7CV#>0uS_35&jtHoD}6Kl5IF58-3z3HA%Sib%8;dEWo_2GH>x-VJRb@^a=)w;y0 z&7ZDrnYX<4%A5t;lBypU@3!y1we{Bctxd`H_OEHSC3ygo@mV$5%VH2COWgUh~#0x)al=o{4T%Xq(c_!k-25rrN7DUi(Z1> zu)`pzZ_BQrg}t?9j!V-Iq`(1euY+bFyxR_WML1&`H!=-S^a@NZ_V@JOK&ElT_m~DR zQ+&ym0ZaiUBMg}I`GK`r?Ra2E(yTrZU&`^I&?gwV-iRAEtvb=lbO-y=ak{)goJqjy zSAKxk%J-1aAu%wek{*EAEg}S2c2)*A@$O}4YIOCH_-Yb^!v>rnVBaa!)?bZZiC^Dv zT}`dplqlPz8)O|>qA@eN{wDR0rdC;?PV(IYILU?1$W)X((7j^!z#pJq-1BpHeK&QJ z&{F~?Gjj}LIX{vivFWk&rk?bs zuJoquO9j@lo#Y`QF;&hN**(y1Xh=WGR{hYhdHkgje(?biXLFV_C)|`3dwl@ zQu&l7*V3#i8g2kLY>{+-<9|ZdvK3nHZ~Q~5zI<(r53U5OXJ~D-RHQ zzwwJ5AZs%M%ip*5Fs-X4A8~mPou>@kI z10v$6H7#CjwUG~&b}1~oGSLx$9ZUZMu@EXQsjkYeP(nLbm@=-}B2bBN${@C;b0zmf zdPRZ^;@vjkM|0~oT9PnSt&skT0!*!tG?YJ~*9F|bqbmOqPb;wccaRyc$--(5oy@KI z3W3Qlpa3L;InsJ46qVZ<7ZVD8EOy{im3a2=}XdV+4QDWG_$gY>}jgY*}hSMMm0{KcG9J+T0PE z&j(80MCMZbEf7`p1fIwTTEu*yaDJ|D;r`Ebdnf(huy(0@zkU5;uSIxTd{$htcG=4p zBcjmRvt(Um-?`W&bYe?tp?$}_S{F8=))d)W7(%fx1kkv75h15*399MJ$moJhWHjH@ zv@$S{MNH$+K5Q64jhVarja zrzVH#G+^fLH0v-`o{BRw4GVT7E&WNr?Rnibq&KuI{A*e07X{}n^Dvx(k$|-fTa`cC zpab{VvZCgnPZ+|HdfX<)`-B}<3|)p`rXUS*MZJtCn7xLn#XN{Jw*|!94Ubb)Z*FWF zbrRNh?4)A#nJdJcD4ep)ZTyBU%$zo6S~fJtJ{&_t2Ui$J>%twQ|2YYEYA2gw-jun^ zj2lOm{cR0c>L{Q3?UfFk^M}IxFC|bf)IG-E5E;{#(Hm8UI}q87KOVvgbg+ra2`4ng zv0VTiwhM?t{BX~&7+{HCvtYn)!psX64N>fU(O|r6&yA&DS&L%$%Ro+J5*3o?S?qzK z(n*xDj*=!y{tG26Zry=9Hc`56O=uf0K15?QjK;G>rLg0NY0vzyTg0i)79^dubHRD* zjgf@2_7ms+l{|~Ei~cQrh~!~fn^H>(2L1Ue+9LbK8)R8D4)uE3#oDo=9c-Ls?ZA1R zZ~LqvV$qpGK^w~3=}=QTm=xtr_j0E3O!=%0F6Cr#VC(7|oMfi~KozRVWJ0iDF|Gu( zcvHlWhh-H&UTOBVQWH=(d?^17xqNm0JKg;cN+cwRiYC#Azc*j0HssO5F_Q>RA}~K5 zFXgLeX1q!3cLc>D+VBG%e(2u)Y2^lNW_|fv*wC^q;oe54#lHN;%RhAYd|K(5-|(Hy z@8ST2T?zNDzjAN;v~tZ{?Cr^Glc`Ei!tGhP&Y;KwJ5Bf&~U;{%ZoZ)YOISq(Xeu9>@O5@S1D`B8g%1`lz@2D#w_+Tyh z;O|iRs(gmmM(8Is!pdvbq0t!5U!?CZSH>u+DPG0_j;$ICD}0Mqt`Dy+2tRag{GoIE zrzH*Fh~kvdvh@pPZOJlhb6eQdo!r!YGm_eLJXO|Dr;}A(nY>>0?YeK(&G&xi#JeX_ z?cFz_=O0Rz9!fY5J!08M@SR64JLxr~LoB z^l9DkDUKhjdb{pg9rTeC-#U@nu>FHCr*{lhIl#e@Dp- zC9_DFIp;BMbtU+bj)K$%a{W}l^_|Yn5lug>HhQnD9eSj!HGKgvp{zu^W&iN`TR82_@ zC95c@rG$uZ_~|b_iUTB&sG#~QNTAV);%64CX#0s%5L^CCIJh7j{4=2` zDK!1HaNw_n_N35$&n6bNUnscm9J7iwIQCDV-}}J=k61YK+7&-72YM65=BasEm?N_lX&Vlkr`Q}6gg?)C@zxNb=}0W+o%PqAf;BjBXXtX zE<3vvOZM500IiW6dhDs_y_cwtYIp6NnjU&fp`d7e>i1^36dfr} zfMlhew=+BQ=Dj!XeeW&*($kYtaDD&AuZutHRg`~FC%R(Ihpo5qa7{6lDaBOHn5|B! zlE$WDlE$avl4?^LXxvVeJEl5RnycBJ<>XXSJ}2z1a%w7t=e=gf>*`e6>@zz-yUl(x z3EE@sGrK@D=75<3?KStCY0y390ka!)ula!41KMXEG&7+6<{`5ebf0l}nBkVouEW9?9`j4O&uXriXEkoytY-NoW>xBb$#qhx$r7(K zujE#36C50@_Dh`EmcyA-EzfYlbWyC9x#OQ?U}JOL^K+@x3$Eh}Yo_X3uH#_}XOAs# zQGblK!1g?s`WIPqBC7`JBKHf;{m|{46!i&y#m8e;r9Otq72P)?+tVTqcO3Ut3C$bI z8!FC1TTxcjS=j&euBDi-;)T54Y0^2G|B1_tEymty@>P{pW#_6wYu9=_o6zfEa>4O@ z-L}bSylKGDewN1!yx=CAsj~~0rS+t-Y2qVfYF5^ZmI2!^T$3d%aA6W*nLOlX@>#uV z`%SJVS*>IlI0%mwxx)o`;~cn8?CWk-uybcGOkVo7WX7EZOSldl0$b39rO()$;iRzE zaeZFVO?IMYIi_3lvNXP6u@gAK>XmGcJrAzcO2w{QPLb)7ozKe^TlYEhaD*707FDMZ z4Njk=?V+m!H^LdaHr%4tZVv2fIScMQHzl_=a|{o&6FgVU$=PtkG91QoB1L_s8wRiV zFeLm_cg)bs+=}#}Y-qR3y3otq=facBhg;XZlAmTXy2nHLI`0;wQTM{%%#ET6l)d&YlbtyVOaxC zg3uz7=pz1xPD+NMN6d)>BNhlM7-H}$1st(EE+Y>%ZHvGbrxQ5aku3Awrp%$8i510k zPR^_8@I;u$b?w%=3$tvR#-~YLUsSQHoK|&w%a%;49s<20xCf&$xEXpg94AN``BmY- zO-{DhVgFg(ux!gGCvse8c*b^(d2*$DActRpC|0?QK}>{u>$70I%?5U$kP78C+9NoD zQ0~XQB@pSqj9pU}W6OyBrPyj>t`+;+;qJHA&JlKe;#ySSX|7p}z1u>BrMTZ2O*G?+ z@ol8=lhOE`%oR~Dq;oy@_NixT(GFsuO_t2gnb@Z(3-;d|y`Srgp0?>?+)TXN5lOYA zEoyTE+i#<%2>(oV{;P^2QvQKYzWI^5+9CG)2cz-1L($VVH9I4zRHcr;Y;r;nG-hK# zGV=96BaghRo(bZBnn|E{LPkjAq08hp?3{F(T8TT%bdfyB6W|f2vzeeHgaTS%^D9B( z2UUPpkf;EB{2=bty&y?=M6-ev;8*w_`7`EM;A0r7&QyeJV3#0q*{yIV(8zrSowXoW z2@;l5sruQ@K=ZggE9d}47rlrZWi!xdb&!m3K#+|*I(!+P%gc9P&3^~}@8u~9@+M!% z`+%0pyw{?+1we4#wr28S+8oP`KA!h1pAT1bV_q+EFW*cFa#9!tG9TwE^&m}NUI+&p z4_je|Y4&sD2p!$_&g9xA<_u zY4y^3N5(h1pZzGVbnn@MKuXXN>Vd=_x=375@C8Yvt^#Q+7`oZGI07OqEgr&?N0X+f znRpO1$lPlKaSVeL0^Xx&{Df8@5>p%xoL-;rUXniR-GA`??y$`4#SwC{6V`<|QLBh@t0kd!*a4@}buE z=Gc1&M>qOM|ET>M}|WJR3l7DLeCr5(zQZ1j(8YNKCVnMc_-&z(If zbEa(-OMZ=0%XnEgJj*LZCF9+GHuQN_h|h6TP{@C4huHaz{`{skav!n(gf&Qy%JM}M z3DQ=URKHc!?v@PaT1gKJo7bW`*GhTOn4(0!hI0G<9MjutqNl}}*$TBK#c!odgrY{F z81Y8BQ4xl}Wfx2vMM+!DJyUfsWQG+}^sPd8eg6Uxk%;04b>T@kox@WS;nAQ1LY;yw znqN97)llvDK8oWq@(t5x+^UbN%rU8ok#bz&M%AZEJFHK_jM(V3AQnKqk#37MBpx}A z1QEns4+%#{`sy?-K_y<$T_{9Zv``4NIoEO|bO0p@@Wcq3K&?oOgsdS(YP69+Qdho< z+oSkgRzBLJB-6`RZzuQP>CUX3Up-F{y?*}Yk&%rfBR9H7SJaO?l-|8-#ns}Py=t$I zu3I-UCy*Zqde$G>=pWqFPTa?v7@HMS(Wx4?g=$GAD`N<& z?72>}fDvDVTolvy8jZ5truO)kARD}?x~n(sE}k||&h#7v`r!_t+FdEDejS;75OY8% z17_7mS2LLm4PlHB8H6GbguD}kJOqT!1M`#k((`k`91PKp+5JIhpj$09A~7tP`kK9*f$yvwekpK;ENO$D=mmaVu{~MgO1zNLN?B!=lM+h#q;#S8 zl4SBoq(Ijdc>oeo?k2}k-c)UVMi7`#z2bcj%|~%nRsS7JsM=OWQB${-?%T@V+e+%6 z%Fz#$M?X*=-s%`qk8e$@G4;$=DyBY3&EwRJZlyA6cI#LiWBXNfldAdzHDe#6c~Wlu Ef4gg}UH||9 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/guisupport.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/guisupport.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87c720bf8dc0e7d3a6c690965e565c1cfce9ea34 GIT binary patch literal 5905 zcmcIo&65+y6`zr`yV}trfr0R0zzr-cBA^Y#Wv3{YD>i1yh6GG@9am9Fq*+a`H0)?b zbdOdmEL=*;hb49yZg5DYIOGtDe;}1p?zyah)G8_;sB-0y8!^tsr~F>ej6QZ3Czni> zG#}ml`n}(K@Aux!U$<>DG#tNr^83>7_G;RfbQ2x1@Z!Y}adA(xv}>BBTQNtk#ID73 z&5D1bU5i_WHS&pmErIhW&Lh?so{r)!iMuhJ$8kdqWnY%u7Jg+KqhB5no!!LX8lvJ~A*XJdH)t<{t$MNct z(Ia6NeS4X+s^j@e1_>nTHEEVOrm#?qA-R-ToQoc?vMHHg_n2ibE^%v;>J z;W@)NlVkH`&ah#{c1?#Zn37vPQ8KVG&~(5G=9h(6E0tMfioqDJugv9V-D=JMk>@St zHrz8Cps+GVu-Np&m8=MxC985_dzMW%4H8u^a~InQCd_)?CXuwfZrTb8Lfixp823G8 z94mSj&#?~yOr`4Z3Kt{iWSK&tUbY>mF{`wNCU|BN{2p^XA0S7fNGj}+wqH|@Kc$2sh8*Rg0qK}^`N}*K zH8(QA^+d&VNTZ7Bx?G%M(qj#;1|;1npHNZ4f@!S6O&2O77`V@iP=%nkm41-vB4l&M zS!f)BgQ%$ruZW21g}@RQE_bFEg@>qgtw2=@#9=K14M{D+Cs-89g$+eSRj_iaRYM9Z zqu7E91BwUADiYaq2%KNxNFa*>nnp+&-}9U$*rn`Kc{kuF(u$Igat}#nSqLNYtk=)b zNKRipN<-$kJlus~1v+)JAx}lv7*NTEaE#f;VEzLs?wSh@w@B4R<<>ey5d145Ny?pJK!hBiCb}GnOP)qbKvP7RTasah zbE%?GawLcXP2d9g=pg2-2C2+fY^jo~V#4mt3d5I+p?B5VQ)*9yea*2{(AhpsA%_IA z5%EKEH;W{36u6-f#i4-P#_R#82q7F3`;R5)Nb(r-iLlA@s; zrB1~JGZ1sr62q9MOs#lU&Ea4f*9SbZ7mT<38hjItYcSfU!|Q4dQ{yY9)6=*OSsrBxe9<_-1mx}gPb|ZK8z}m z^eUWaU?Zt0PlSq}tkk4`lIn?)T_~Vt<&^<>;+;YPVQBikuor4zgpjsgl4z8|g~Gh3 z@j`(Bf}LT4EO6wu%OOhuKw&vV(_zq%NyCWsz(Ew`wl)auh|;&e@c(Ad3^^VKK@p@X z#joNuqTn7UZ7?8=-XNnxgegr51vEH>rh>IEVKeFjm{U)*z(Kk2k&4}*2I5Z12c`o% z*uG@Trc}a=l_FVNC_1J@#~XM+k&9z5ad1G{M7NC9plW-O^aLGISE%-cc)`57 z%c?a&96)?QnWZL>ACX%{uWAET)MM38h4TZ*jIhTFz>K!CcoiKH92YeNC>Q^vSBte)8 zG<7Tf7RF*4)+PG$qpPN7Yfb$R`sX^WoYS%+H&36ZcNDZIz_|`0Ctw+hSH#V#1yCIT zRbWA{OqaV!!7W=LW@fVSZmho29Stf(H}!sFPPN)77uiHNVTzLMjxN>dEJm@m8;5*J zs-Xh2Z+@aer*!&Tt`}#P+S9Tl&%ojOvY8Q)?MM1&KO(GBtlJ zde+1X>!VP%m}qL(lhH{3Jg4D#s(&9{Me-05iJJ#!1O7)a4Dd+EyE)~?`EGi+mSsl; z8QxS|)s5LzNhY9{;aytm?zQDW!OVv`kUzhJ z;VbybU*fN&eLbofyFWeHdbcw+-uk$c+P0oL^f-0s!P)hrZ?uoT@u$hhN8j%3-1FSf zlBw25U!?bb>a51U7)!6pwOx}>$BuO}udHVdw=;*=l82ws^<+CU`6P3EEqPp|vBQw7 z$x`L&k8yDikis>a-L3gFM;%S=Q8+GNv*5~nF9hI@o&%%Vnijc(zCjGmZh#er@8PcL zIn|X?Z5j61OB&0|^E26ma*F~na7i-i>>ldM6O!}|ov>3?mO(!N|NR&@@sn@jucbYs z42ob)9er^AY3fAh;NjKy)8zh6GIeL-_QYrD&cP$A@xLYaKcfMh17xwjcl22BCLTpB zSkZ6cYs}V+_HF1XcHG<4WWtJ<^hN#F|IUkvo4Fxgyo#5WEqF0_HR=%~_>UcMamk4|sC~`Px9K(XXU8#wI zQ;1`TH-qF*wS?&HhX1-ajG-!iat41b?H`HPJ4R;RIM6l@tQ*JL#<3^HR7iAx&+P2% z-gEc8yKk<(*GaQgzMf|7GRfy3-1^jo_SA*HSWl)dttBr#9}S6Y-~F@qC!eHWdnub?=Jws2UD@NX z-(Y{mVH150+W_#^JT}Bk|CPrQ!@RYT*Wi)?9vk+`%XmzANRgTH10foa*$7|Z#k|-@ z@ap&r^JUj29wSGfzG}avnbbJ-h-?7X)Z~M?r>X29n~mQd|17m7n`QOO+41gJK5u!& ze7?IU;(($jcn31I1)mz;7N;;oHpv|Rp2u}v r|5xG%dg9+Vbxr@?R})D+^J3R_ed@*JxPIiTL+UoI@BW(MR>}Jh-66Dk literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/latextools.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/latextools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1958e764b1436310ae7cf2425b8b9a6b749cf2c GIT binary patch literal 10400 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 A^#A|> literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py b/.venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py new file mode 100644 index 0000000..e7ad51e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py @@ -0,0 +1,491 @@ +# -*- coding: utf-8 -*- +"""Manage background (threaded) jobs conveniently from an interactive shell. + +This module provides a BackgroundJobManager class. This is the main class +meant for public usage, it implements an object which can create and manage +new background jobs. + +It also provides the actual job classes managed by these BackgroundJobManager +objects, see their docstrings below. + + +This system was inspired by discussions with B. Granger and the +BackgroundCommand class described in the book Python Scripting for +Computational Science, by H. P. Langtangen: + +http://folk.uio.no/hpl/scripting + +(although ultimately no code from this text was used, as IPython's system is a +separate implementation). + +An example notebook is provided in our documentation illustrating interactive +use of the system. +""" + +#***************************************************************************** +# Copyright (C) 2005-2006 Fernando Perez +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** + +# Code begins +import sys +import threading + +from IPython import get_ipython +from IPython.core.ultratb import AutoFormattedTB +from logging import error, debug + + +class BackgroundJobManager(object): + """Class to manage a pool of backgrounded threaded jobs. + + Below, we assume that 'jobs' is a BackgroundJobManager instance. + + Usage summary (see the method docstrings for details): + + jobs.new(...) -> start a new job + + jobs() or jobs.status() -> print status summary of all jobs + + jobs[N] -> returns job number N. + + foo = jobs[N].result -> assign to variable foo the result of job N + + jobs[N].traceback() -> print the traceback of dead job N + + jobs.remove(N) -> remove (finished) job N + + jobs.flush() -> remove all finished jobs + + As a convenience feature, BackgroundJobManager instances provide the + utility result and traceback methods which retrieve the corresponding + information from the jobs list: + + jobs.result(N) <--> jobs[N].result + jobs.traceback(N) <--> jobs[N].traceback() + + While this appears minor, it allows you to use tab completion + interactively on the job manager instance. + """ + + def __init__(self): + # Lists for job management, accessed via a property to ensure they're + # up to date.x + self._running = [] + self._completed = [] + self._dead = [] + # A dict of all jobs, so users can easily access any of them + self.all = {} + # For reporting + self._comp_report = [] + self._dead_report = [] + # Store status codes locally for fast lookups + self._s_created = BackgroundJobBase.stat_created_c + self._s_running = BackgroundJobBase.stat_running_c + self._s_completed = BackgroundJobBase.stat_completed_c + self._s_dead = BackgroundJobBase.stat_dead_c + self._current_job_id = 0 + + @property + def running(self): + self._update_status() + return self._running + + @property + def dead(self): + self._update_status() + return self._dead + + @property + def completed(self): + self._update_status() + return self._completed + + def new(self, func_or_exp, *args, **kwargs): + """Add a new background job and start it in a separate thread. + + There are two types of jobs which can be created: + + 1. Jobs based on expressions which can be passed to an eval() call. + The expression must be given as a string. For example: + + job_manager.new('myfunc(x,y,z=1)'[,glob[,loc]]) + + The given expression is passed to eval(), along with the optional + global/local dicts provided. If no dicts are given, they are + extracted automatically from the caller's frame. + + A Python statement is NOT a valid eval() expression. Basically, you + can only use as an eval() argument something which can go on the right + of an '=' sign and be assigned to a variable. + + For example,"print 'hello'" is not valid, but '2+3' is. + + 2. Jobs given a function object, optionally passing additional + positional arguments: + + job_manager.new(myfunc, x, y) + + The function is called with the given arguments. + + If you need to pass keyword arguments to your function, you must + supply them as a dict named kw: + + job_manager.new(myfunc, x, y, kw=dict(z=1)) + + The reason for this asymmetry is that the new() method needs to + maintain access to its own keywords, and this prevents name collisions + between arguments to new() and arguments to your own functions. + + In both cases, the result is stored in the job.result field of the + background job object. + + You can set `daemon` attribute of the thread by giving the keyword + argument `daemon`. + + Notes and caveats: + + 1. All threads running share the same standard output. Thus, if your + background jobs generate output, it will come out on top of whatever + you are currently writing. For this reason, background jobs are best + used with silent functions which simply return their output. + + 2. Threads also all work within the same global namespace, and this + system does not lock interactive variables. So if you send job to the + background which operates on a mutable object for a long time, and + start modifying that same mutable object interactively (or in another + backgrounded job), all sorts of bizarre behaviour will occur. + + 3. If a background job is spending a lot of time inside a C extension + module which does not release the Python Global Interpreter Lock + (GIL), this will block the IPython prompt. This is simply because the + Python interpreter can only switch between threads at Python + bytecodes. While the execution is inside C code, the interpreter must + simply wait unless the extension module releases the GIL. + + 4. There is no way, due to limitations in the Python threads library, + to kill a thread once it has started.""" + + if callable(func_or_exp): + kw = kwargs.get('kw',{}) + job = BackgroundJobFunc(func_or_exp,*args,**kw) + elif isinstance(func_or_exp, str): + if not args: + frame = sys._getframe(1) + glob, loc = frame.f_globals, frame.f_locals + elif len(args)==1: + glob = loc = args[0] + elif len(args)==2: + glob,loc = args + else: + raise ValueError( + 'Expression jobs take at most 2 args (globals,locals)') + job = BackgroundJobExpr(func_or_exp, glob, loc) + else: + raise TypeError('invalid args for new job') + + if kwargs.get('daemon', False): + job.daemon = True + job.num = self._current_job_id + self._current_job_id += 1 + self.running.append(job) + self.all[job.num] = job + debug('Starting job # %s in a separate thread.' % job.num) + job.start() + return job + + def __getitem__(self, job_key): + num = job_key if isinstance(job_key, int) else job_key.num + return self.all[num] + + def __call__(self): + """An alias to self.status(), + + This allows you to simply call a job manager instance much like the + Unix `jobs` shell command.""" + + return self.status() + + def _update_status(self): + """Update the status of the job lists. + + This method moves finished jobs to one of two lists: + - self.completed: jobs which completed successfully + - self.dead: jobs which finished but died. + + It also copies those jobs to corresponding _report lists. These lists + are used to report jobs completed/dead since the last update, and are + then cleared by the reporting function after each call.""" + + # Status codes + srun, scomp, sdead = self._s_running, self._s_completed, self._s_dead + # State lists, use the actual lists b/c the public names are properties + # that call this very function on access + running, completed, dead = self._running, self._completed, self._dead + + # Now, update all state lists + for num, job in enumerate(running): + stat = job.stat_code + if stat == srun: + continue + elif stat == scomp: + completed.append(job) + self._comp_report.append(job) + running[num] = False + elif stat == sdead: + dead.append(job) + self._dead_report.append(job) + running[num] = False + # Remove dead/completed jobs from running list + running[:] = filter(None, running) + + def _group_report(self,group,name): + """Report summary for a given job group. + + Return True if the group had any elements.""" + + if group: + print('%s jobs:' % name) + for job in group: + print('%s : %s' % (job.num,job)) + print() + return True + + def _group_flush(self,group,name): + """Flush a given job group + + Return True if the group had any elements.""" + + njobs = len(group) + if njobs: + plural = {1:''}.setdefault(njobs,'s') + print('Flushing %s %s job%s.' % (njobs,name,plural)) + group[:] = [] + return True + + def _status_new(self): + """Print the status of newly finished jobs. + + Return True if any new jobs are reported. + + This call resets its own state every time, so it only reports jobs + which have finished since the last time it was called.""" + + self._update_status() + new_comp = self._group_report(self._comp_report, 'Completed') + new_dead = self._group_report(self._dead_report, + 'Dead, call jobs.traceback() for details') + self._comp_report[:] = [] + self._dead_report[:] = [] + return new_comp or new_dead + + def status(self,verbose=0): + """Print a status of all jobs currently being managed.""" + + self._update_status() + self._group_report(self.running,'Running') + self._group_report(self.completed,'Completed') + self._group_report(self.dead,'Dead') + # Also flush the report queues + self._comp_report[:] = [] + self._dead_report[:] = [] + + def remove(self,num): + """Remove a finished (completed or dead) job.""" + + try: + job = self.all[num] + except KeyError: + error('Job #%s not found' % num) + else: + stat_code = job.stat_code + if stat_code == self._s_running: + error('Job #%s is still running, it can not be removed.' % num) + return + elif stat_code == self._s_completed: + self.completed.remove(job) + elif stat_code == self._s_dead: + self.dead.remove(job) + + def flush(self): + """Flush all finished jobs (completed and dead) from lists. + + Running jobs are never flushed. + + It first calls _status_new(), to update info. If any jobs have + completed since the last _status_new() call, the flush operation + aborts.""" + + # Remove the finished jobs from the master dict + alljobs = self.all + for job in self.completed+self.dead: + del(alljobs[job.num]) + + # Now flush these lists completely + fl_comp = self._group_flush(self.completed, 'Completed') + fl_dead = self._group_flush(self.dead, 'Dead') + if not (fl_comp or fl_dead): + print('No jobs to flush.') + + def result(self,num): + """result(N) -> return the result of job N.""" + try: + return self.all[num].result + except KeyError: + error('Job #%s not found' % num) + + def _traceback(self, job): + num = job if isinstance(job, int) else job.num + try: + self.all[num].traceback() + except KeyError: + error('Job #%s not found' % num) + + def traceback(self, job=None): + if job is None: + self._update_status() + for deadjob in self.dead: + print("Traceback for: %r" % deadjob) + self._traceback(deadjob) + print() + else: + self._traceback(job) + + +class BackgroundJobBase(threading.Thread): + """Base class to build BackgroundJob classes. + + The derived classes must implement: + + - Their own __init__, since the one here raises NotImplementedError. The + derived constructor must call self._init() at the end, to provide common + initialization. + + - A strform attribute used in calls to __str__. + + - A call() method, which will make the actual execution call and must + return a value to be held in the 'result' field of the job object. + """ + + # Class constants for status, in string and as numerical codes (when + # updating jobs lists, we don't want to do string comparisons). This will + # be done at every user prompt, so it has to be as fast as possible + stat_created = 'Created'; stat_created_c = 0 + stat_running = 'Running'; stat_running_c = 1 + stat_completed = 'Completed'; stat_completed_c = 2 + stat_dead = 'Dead (Exception), call jobs.traceback() for details' + stat_dead_c = -1 + + def __init__(self): + """Must be implemented in subclasses. + + Subclasses must call :meth:`_init` for standard initialisation. + """ + raise NotImplementedError("This class can not be instantiated directly.") + + def _init(self): + """Common initialization for all BackgroundJob objects""" + + for attr in ['call','strform']: + assert hasattr(self,attr), "Missing attribute <%s>" % attr + + # The num tag can be set by an external job manager + self.num = None + + self.status = BackgroundJobBase.stat_created + self.stat_code = BackgroundJobBase.stat_created_c + self.finished = False + self.result = '' + + # reuse the ipython traceback handler if we can get to it, otherwise + # make a new one + try: + make_tb = get_ipython().InteractiveTB.text + except: + make_tb = AutoFormattedTB(mode = 'Context', + color_scheme='NoColor', + tb_offset = 1).text + # Note that the actual API for text() requires the three args to be + # passed in, so we wrap it in a simple lambda. + self._make_tb = lambda : make_tb(None, None, None) + + # Hold a formatted traceback if one is generated. + self._tb = None + + threading.Thread.__init__(self) + + def __str__(self): + return self.strform + + def __repr__(self): + return '' % (self.num, self.strform) + + def traceback(self): + print(self._tb) + + def run(self): + try: + self.status = BackgroundJobBase.stat_running + self.stat_code = BackgroundJobBase.stat_running_c + self.result = self.call() + except: + self.status = BackgroundJobBase.stat_dead + self.stat_code = BackgroundJobBase.stat_dead_c + self.finished = None + self.result = ('') + self._tb = self._make_tb() + else: + self.status = BackgroundJobBase.stat_completed + self.stat_code = BackgroundJobBase.stat_completed_c + self.finished = True + + +class BackgroundJobExpr(BackgroundJobBase): + """Evaluate an expression as a background job (uses a separate thread).""" + + def __init__(self, expression, glob=None, loc=None): + """Create a new job from a string which can be fed to eval(). + + global/locals dicts can be provided, which will be passed to the eval + call.""" + + # fail immediately if the given expression can't be compiled + self.code = compile(expression,'','eval') + + glob = {} if glob is None else glob + loc = {} if loc is None else loc + self.expression = self.strform = expression + self.glob = glob + self.loc = loc + self._init() + + def call(self): + return eval(self.code,self.glob,self.loc) + + +class BackgroundJobFunc(BackgroundJobBase): + """Run a function call as a background job (uses a separate thread).""" + + def __init__(self, func, *args, **kwargs): + """Create a new job from a callable object. + + Any positional arguments and keyword args given to this constructor + after the initial callable are passed directly to it.""" + + if not callable(func): + raise TypeError( + 'first argument to BackgroundJobFunc must be callable') + + self.func = func + self.args = args + self.kwargs = kwargs + # The string form will only include the function passed, because + # generating string representations of the arguments is a potentially + # _very_ expensive operation (e.g. with large arrays). + self.strform = str(func) + self._init() + + def call(self): + return self.func(*self.args, **self.kwargs) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/clipboard.py b/.venv/lib/python3.12/site-packages/IPython/lib/clipboard.py new file mode 100644 index 0000000..e0bf80b --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/clipboard.py @@ -0,0 +1,102 @@ +""" Utilities for accessing the platform's clipboard. +""" + +import os +import subprocess + +from IPython.core.error import TryNext +import IPython.utils.py3compat as py3compat + + +class ClipboardEmpty(ValueError): + pass + + +def win32_clipboard_get(): + """ Get the current clipboard's text on Windows. + + Requires Mark Hammond's pywin32 extensions. + """ + try: + import win32clipboard + except ImportError as e: + raise TryNext("Getting text from the clipboard requires the pywin32 " + "extensions: http://sourceforge.net/projects/pywin32/") from e + win32clipboard.OpenClipboard() + try: + text = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT) + except (TypeError, win32clipboard.error): + try: + text = win32clipboard.GetClipboardData(win32clipboard.CF_TEXT) + text = py3compat.cast_unicode(text, py3compat.DEFAULT_ENCODING) + except (TypeError, win32clipboard.error) as e: + raise ClipboardEmpty from e + finally: + win32clipboard.CloseClipboard() + return text + + +def osx_clipboard_get() -> str: + """ Get the clipboard's text on OS X. + """ + p = subprocess.Popen(['pbpaste', '-Prefer', 'ascii'], + stdout=subprocess.PIPE) + bytes_, stderr = p.communicate() + # Text comes in with old Mac \r line endings. Change them to \n. + bytes_ = bytes_.replace(b'\r', b'\n') + text = py3compat.decode(bytes_) + return text + + +def tkinter_clipboard_get(): + """ Get the clipboard's text using Tkinter. + + This is the default on systems that are not Windows or OS X. It may + interfere with other UI toolkits and should be replaced with an + implementation that uses that toolkit. + """ + try: + from tkinter import Tk, TclError + except ImportError as e: + raise TryNext("Getting text from the clipboard on this platform requires tkinter.") from e + + root = Tk() + root.withdraw() + try: + text = root.clipboard_get() + except TclError as e: + raise ClipboardEmpty from e + finally: + root.destroy() + text = py3compat.cast_unicode(text, py3compat.DEFAULT_ENCODING) + return text + + +def wayland_clipboard_get(): + """Get the clipboard's text under Wayland using wl-paste command. + + This requires Wayland and wl-clipboard installed and running. + """ + if os.environ.get("XDG_SESSION_TYPE") != "wayland": + raise TryNext("wayland is not detected") + + try: + with subprocess.Popen(["wl-paste"], stdout=subprocess.PIPE) as p: + raw, err = p.communicate() + if p.wait(): + raise TryNext(err) + except FileNotFoundError as e: + raise TryNext( + "Getting text from the clipboard under Wayland requires the wl-clipboard " + "extension: https://github.com/bugaevc/wl-clipboard" + ) from e + + if not raw: + raise ClipboardEmpty + + try: + text = py3compat.decode(raw) + except UnicodeDecodeError as e: + raise ClipboardEmpty from e + + return text diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/deepreload.py b/.venv/lib/python3.12/site-packages/IPython/lib/deepreload.py new file mode 100644 index 0000000..aaedab2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/deepreload.py @@ -0,0 +1,310 @@ +# -*- coding: utf-8 -*- +""" +Provides a reload() function that acts recursively. + +Python's normal :func:`python:reload` function only reloads the module that it's +passed. The :func:`reload` function in this module also reloads everything +imported from that module, which is useful when you're changing files deep +inside a package. + +To use this as your default reload function, type this:: + + import builtins + from IPython.lib import deepreload + builtins.reload = deepreload.reload + +A reference to the original :func:`python:reload` is stored in this module as +:data:`original_reload`, so you can restore it later. + +This code is almost entirely based on knee.py, which is a Python +re-implementation of hierarchical module import. +""" +#***************************************************************************** +# Copyright (C) 2001 Nathaniel Gray +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#***************************************************************************** + +import builtins as builtin_mod +from contextlib import contextmanager +import importlib +import sys + +from types import ModuleType +from warnings import warn +import types + +original_import = builtin_mod.__import__ + +@contextmanager +def replace_import_hook(new_import): + saved_import = builtin_mod.__import__ + builtin_mod.__import__ = new_import + try: + yield + finally: + builtin_mod.__import__ = saved_import + +def get_parent(globals, level): + """ + parent, name = get_parent(globals, level) + + Return the package that an import is being performed in. If globals comes + from the module foo.bar.bat (not itself a package), this returns the + sys.modules entry for foo.bar. If globals is from a package's __init__.py, + the package's entry in sys.modules is returned. + + If globals doesn't come from a package or a module in a package, or a + corresponding entry is not found in sys.modules, None is returned. + """ + orig_level = level + + if not level or not isinstance(globals, dict): + return None, '' + + pkgname = globals.get('__package__', None) + + if pkgname is not None: + # __package__ is set, so use it + if not hasattr(pkgname, 'rindex'): + raise ValueError('__package__ set to non-string') + if len(pkgname) == 0: + if level > 0: + raise ValueError('Attempted relative import in non-package') + return None, '' + name = pkgname + else: + # __package__ not set, so figure it out and set it + if '__name__' not in globals: + return None, '' + modname = globals['__name__'] + + if '__path__' in globals: + # __path__ is set, so modname is already the package name + globals['__package__'] = name = modname + else: + # Normal module, so work out the package name if any + lastdot = modname.rfind('.') + if lastdot < 0 < level: + raise ValueError("Attempted relative import in non-package") + if lastdot < 0: + globals['__package__'] = None + return None, '' + globals['__package__'] = name = modname[:lastdot] + + dot = len(name) + for x in range(level, 1, -1): + try: + dot = name.rindex('.', 0, dot) + except ValueError as e: + raise ValueError("attempted relative import beyond top-level " + "package") from e + name = name[:dot] + + try: + parent = sys.modules[name] + except BaseException as e: + if orig_level < 1: + warn("Parent module '%.200s' not found while handling absolute " + "import" % name) + parent = None + else: + raise SystemError("Parent module '%.200s' not loaded, cannot " + "perform relative import" % name) from e + + # We expect, but can't guarantee, if parent != None, that: + # - parent.__name__ == name + # - parent.__dict__ is globals + # If this is violated... Who cares? + return parent, name + +def load_next(mod, altmod, name, buf): + """ + mod, name, buf = load_next(mod, altmod, name, buf) + + altmod is either None or same as mod + """ + + if len(name) == 0: + # completely empty module name should only happen in + # 'from . import' (or '__import__("")') + return mod, None, buf + + dot = name.find('.') + if dot == 0: + raise ValueError('Empty module name') + + if dot < 0: + subname = name + next = None + else: + subname = name[:dot] + next = name[dot+1:] + + if buf != '': + buf += '.' + buf += subname + + result = import_submodule(mod, subname, buf) + if result is None and mod != altmod: + result = import_submodule(altmod, subname, subname) + if result is not None: + buf = subname + + if result is None: + raise ImportError("No module named %.200s" % name) + + return result, next, buf + + +# Need to keep track of what we've already reloaded to prevent cyclic evil +found_now = {} + +def import_submodule(mod, subname, fullname): + """m = import_submodule(mod, subname, fullname)""" + # Require: + # if mod == None: subname == fullname + # else: mod.__name__ + "." + subname == fullname + + global found_now + if fullname in found_now and fullname in sys.modules: + m = sys.modules[fullname] + else: + print('Reloading', fullname) + found_now[fullname] = 1 + oldm = sys.modules.get(fullname, None) + try: + if oldm is not None: + m = importlib.reload(oldm) + else: + m = importlib.import_module(subname, mod) + except: + # load_module probably removed name from modules because of + # the error. Put back the original module object. + if oldm: + sys.modules[fullname] = oldm + raise + + add_submodule(mod, m, fullname, subname) + + return m + +def add_submodule(mod, submod, fullname, subname): + """mod.{subname} = submod""" + if mod is None: + return #Nothing to do here. + + if submod is None: + submod = sys.modules[fullname] + + setattr(mod, subname, submod) + + return + +def ensure_fromlist(mod, fromlist, buf, recursive): + """Handle 'from module import a, b, c' imports.""" + if not hasattr(mod, '__path__'): + return + for item in fromlist: + if not hasattr(item, 'rindex'): + raise TypeError("Item in ``from list'' not a string") + if item == '*': + if recursive: + continue # avoid endless recursion + try: + all = mod.__all__ + except AttributeError: + pass + else: + ret = ensure_fromlist(mod, all, buf, 1) + if not ret: + return 0 + elif not hasattr(mod, item): + import_submodule(mod, item, buf + '.' + item) + +def deep_import_hook(name, globals=None, locals=None, fromlist=None, level=-1): + """Replacement for __import__()""" + parent, buf = get_parent(globals, level) + + head, name, buf = load_next(parent, None if level < 0 else parent, name, buf) + + tail = head + while name: + tail, name, buf = load_next(tail, tail, name, buf) + + # If tail is None, both get_parent and load_next found + # an empty module name: someone called __import__("") or + # doctored faulty bytecode + if tail is None: + raise ValueError('Empty module name') + + if not fromlist: + return head + + ensure_fromlist(tail, fromlist, buf, 0) + return tail + +modules_reloading = {} + +def deep_reload_hook(m): + """Replacement for reload().""" + # Hardcode this one as it would raise a NotImplementedError from the + # bowels of Python and screw up the import machinery after. + # unlike other imports the `exclude` list already in place is not enough. + + if m is types: + return m + if not isinstance(m, ModuleType): + raise TypeError("reload() argument must be module") + + name = m.__name__ + + if name not in sys.modules: + raise ImportError("reload(): module %.200s not in sys.modules" % name) + + global modules_reloading + try: + return modules_reloading[name] + except: + modules_reloading[name] = m + + try: + newm = importlib.reload(m) + except: + sys.modules[name] = m + raise + finally: + modules_reloading.clear() + return newm + +# Save the original hooks +original_reload = importlib.reload + +# Replacement for reload() +def reload( + module, + exclude=( + *sys.builtin_module_names, + "sys", + "os.path", + "builtins", + "__main__", + "numpy", + "numpy._globals", + ), +): + """Recursively reload all modules used in the given module. Optionally + takes a list of modules to exclude from reloading. The default exclude + list contains modules listed in sys.builtin_module_names with additional + sys, os.path, builtins and __main__, to prevent, e.g., resetting + display, exception, and io hooks. + """ + global found_now + for i in exclude: + found_now[i] = 1 + try: + with replace_import_hook(deep_import_hook): + return deep_reload_hook(module) + finally: + found_now = {} diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/demo.py b/.venv/lib/python3.12/site-packages/IPython/lib/demo.py new file mode 100644 index 0000000..ebffd54 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/demo.py @@ -0,0 +1,672 @@ +"""Module for interactive demos using IPython. + +This module implements a few classes for running Python scripts interactively +in IPython for demonstrations. With very simple markup (a few tags in +comments), you can control points where the script stops executing and returns +control to IPython. + + +Provided classes +---------------- + +The classes are (see their docstrings for further details): + + - Demo: pure python demos + + - IPythonDemo: demos with input to be processed by IPython as if it had been + typed interactively (so magics work, as well as any other special syntax you + may have added via input prefilters). + + - LineDemo: single-line version of the Demo class. These demos are executed + one line at a time, and require no markup. + + - IPythonLineDemo: IPython version of the LineDemo class (the demo is + executed a line at a time, but processed via IPython). + + - ClearMixin: mixin to make Demo classes with less visual clutter. It + declares an empty marquee and a pre_cmd that clears the screen before each + block (see Subclassing below). + + - ClearDemo, ClearIPDemo: mixin-enabled versions of the Demo and IPythonDemo + classes. + +Inheritance diagram: + +.. inheritance-diagram:: IPython.lib.demo + :parts: 3 + +Subclassing +----------- + +The classes here all include a few methods meant to make customization by +subclassing more convenient. Their docstrings below have some more details: + + - highlight(): format every block and optionally highlight comments and + docstring content. + + - marquee(): generates a marquee to provide visible on-screen markers at each + block start and end. + + - pre_cmd(): run right before the execution of each block. + + - post_cmd(): run right after the execution of each block. If the block + raises an exception, this is NOT called. + + +Operation +--------- + +The file is run in its own empty namespace (though you can pass it a string of +arguments as if in a command line environment, and it will see those as +sys.argv). But at each stop, the global IPython namespace is updated with the +current internal demo namespace, so you can work interactively with the data +accumulated so far. + +By default, each block of code is printed (with syntax highlighting) before +executing it and you have to confirm execution. This is intended to show the +code to an audience first so you can discuss it, and only proceed with +execution once you agree. There are a few tags which allow you to modify this +behavior. + +The supported tags are: + +# stop + + Defines block boundaries, the points where IPython stops execution of the + file and returns to the interactive prompt. + + You can optionally mark the stop tag with extra dashes before and after the + word 'stop', to help visually distinguish the blocks in a text editor: + + # --- stop --- + + +# silent + + Make a block execute silently (and hence automatically). Typically used in + cases where you have some boilerplate or initialization code which you need + executed but do not want to be seen in the demo. + +# auto + + Make a block execute automatically, but still being printed. Useful for + simple code which does not warrant discussion, since it avoids the extra + manual confirmation. + +# auto_all + + This tag can _only_ be in the first block, and if given it overrides the + individual auto tags to make the whole demo fully automatic (no block asks + for confirmation). It can also be given at creation time (or the attribute + set later) to override what's in the file. + +While _any_ python file can be run as a Demo instance, if there are no stop +tags the whole file will run in a single block (no different that calling +first %pycat and then %run). The minimal markup to make this useful is to +place a set of stop tags; the other tags are only there to let you fine-tune +the execution. + +This is probably best explained with the simple example file below. You can +copy this into a file named ex_demo.py, and try running it via:: + + from IPython.lib.demo import Demo + d = Demo('ex_demo.py') + d() + +Each time you call the demo object, it runs the next block. The demo object +has a few useful methods for navigation, like again(), edit(), jump(), seek() +and back(). It can be reset for a new run via reset() or reloaded from disk +(in case you've edited the source) via reload(). See their docstrings below. + +Note: To make this simpler to explore, a file called "demo-exercizer.py" has +been added to the "docs/examples/core" directory. Just cd to this directory in +an IPython session, and type:: + + %run demo-exercizer.py + +and then follow the directions. + +Example +------- + +The following is a very simple example of a valid demo file. + +:: + + #################### EXAMPLE DEMO ############################### + '''A simple interactive demo to illustrate the use of IPython's Demo class.''' + + print('Hello, welcome to an interactive IPython demo.') + + # The mark below defines a block boundary, which is a point where IPython will + # stop execution and return to the interactive prompt. The dashes are actually + # optional and used only as a visual aid to clearly separate blocks while + # editing the demo code. + # stop + + x = 1 + y = 2 + + # stop + + # the mark below makes this block as silent + # silent + + print('This is a silent block, which gets executed but not printed.') + + # stop + # auto + print('This is an automatic block.') + print('It is executed without asking for confirmation, but printed.') + z = x + y + + print('z =', x) + + # stop + # This is just another normal block. + print('z is now:', z) + + print('bye!') + ################### END EXAMPLE DEMO ############################ +""" + + +#***************************************************************************** +# Copyright (C) 2005-2006 Fernando Perez. +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +# +#***************************************************************************** + +import os +import re +import shlex +import sys +import pygments +from pathlib import Path + +from IPython.utils.text import marquee +from IPython.utils import openpy +from IPython.utils import py3compat +__all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError'] + +class DemoError(Exception): pass + +def re_mark(mark): + return re.compile(r'^\s*#\s+\s+%s\s*$' % mark,re.MULTILINE) + +class Demo(object): + + re_stop = re_mark(r'-*\s?stop\s?-*') + re_silent = re_mark('silent') + re_auto = re_mark('auto') + re_auto_all = re_mark('auto_all') + + def __init__(self,src,title='',arg_str='',auto_all=None, format_rst=False, + formatter='terminal', style='default'): + """Make a new demo object. To run the demo, simply call the object. + + See the module docstring for full details and an example (you can use + IPython.Demo? in IPython to see it). + + Inputs: + + - src is either a file, or file-like object, or a + string that can be resolved to a filename. + + Optional inputs: + + - title: a string to use as the demo name. Of most use when the demo + you are making comes from an object that has no filename, or if you + want an alternate denotation distinct from the filename. + + - arg_str(''): a string of arguments, internally converted to a list + just like sys.argv, so the demo script can see a similar + environment. + + - auto_all(None): global flag to run all blocks automatically without + confirmation. This attribute overrides the block-level tags and + applies to the whole demo. It is an attribute of the object, and + can be changed at runtime simply by reassigning it to a boolean + value. + + - format_rst(False): a bool to enable comments and doc strings + formatting with pygments rst lexer + + - formatter('terminal'): a string of pygments formatter name to be + used. Useful values for terminals: terminal, terminal256, + terminal16m + + - style('default'): a string of pygments style name to be used. + """ + if hasattr(src, "read"): + # It seems to be a file or a file-like object + self.fname = "from a file-like object" + if title == '': + self.title = "from a file-like object" + else: + self.title = title + else: + # Assume it's a string or something that can be converted to one + self.fname = src + if title == '': + (filepath, filename) = os.path.split(src) + self.title = filename + else: + self.title = title + self.sys_argv = [src] + shlex.split(arg_str) + self.auto_all = auto_all + self.src = src + + try: + ip = get_ipython() # this is in builtins whenever IPython is running + self.inside_ipython = True + except NameError: + self.inside_ipython = False + + if self.inside_ipython: + # get a few things from ipython. While it's a bit ugly design-wise, + # it ensures that things like color scheme and the like are always in + # sync with the ipython mode being used. This class is only meant to + # be used inside ipython anyways, so it's OK. + self.ip_ns = ip.user_ns + self.ip_colorize = ip.pycolorize + self.ip_showtb = ip.showtraceback + self.ip_run_cell = ip.run_cell + self.shell = ip + + self.formatter = pygments.formatters.get_formatter_by_name(formatter, + style=style) + self.python_lexer = pygments.lexers.get_lexer_by_name("py3") + self.format_rst = format_rst + if format_rst: + self.rst_lexer = pygments.lexers.get_lexer_by_name("rst") + + # load user data and initialize data structures + self.reload() + + def fload(self): + """Load file object.""" + # read data and parse into blocks + if hasattr(self, 'fobj') and self.fobj is not None: + self.fobj.close() + if hasattr(self.src, "read"): + # It seems to be a file or a file-like object + self.fobj = self.src + else: + # Assume it's a string or something that can be converted to one + self.fobj = openpy.open(self.fname) + + def reload(self): + """Reload source from disk and initialize state.""" + self.fload() + + self.src = "".join(openpy.strip_encoding_cookie(self.fobj)) + src_b = [b.strip() for b in self.re_stop.split(self.src) if b] + self._silent = [bool(self.re_silent.findall(b)) for b in src_b] + self._auto = [bool(self.re_auto.findall(b)) for b in src_b] + + # if auto_all is not given (def. None), we read it from the file + if self.auto_all is None: + self.auto_all = bool(self.re_auto_all.findall(src_b[0])) + else: + self.auto_all = bool(self.auto_all) + + # Clean the sources from all markup so it doesn't get displayed when + # running the demo + src_blocks = [] + auto_strip = lambda s: self.re_auto.sub('',s) + for i,b in enumerate(src_b): + if self._auto[i]: + src_blocks.append(auto_strip(b)) + else: + src_blocks.append(b) + # remove the auto_all marker + src_blocks[0] = self.re_auto_all.sub('',src_blocks[0]) + + self.nblocks = len(src_blocks) + self.src_blocks = src_blocks + + # also build syntax-highlighted source + self.src_blocks_colored = list(map(self.highlight,self.src_blocks)) + + # ensure clean namespace and seek offset + self.reset() + + def reset(self): + """Reset the namespace and seek pointer to restart the demo""" + self.user_ns = {} + self.finished = False + self.block_index = 0 + + def _validate_index(self,index): + if index<0 or index>=self.nblocks: + raise ValueError('invalid block index %s' % index) + + def _get_index(self,index): + """Get the current block index, validating and checking status. + + Returns None if the demo is finished""" + + if index is None: + if self.finished: + print('Demo finished. Use .reset() if you want to rerun it.') + return None + index = self.block_index + else: + self._validate_index(index) + return index + + def seek(self,index): + """Move the current seek pointer to the given block. + + You can use negative indices to seek from the end, with identical + semantics to those of Python lists.""" + if index<0: + index = self.nblocks + index + self._validate_index(index) + self.block_index = index + self.finished = False + + def back(self,num=1): + """Move the seek pointer back num blocks (default is 1).""" + self.seek(self.block_index-num) + + def jump(self,num=1): + """Jump a given number of blocks relative to the current one. + + The offset can be positive or negative, defaults to 1.""" + self.seek(self.block_index+num) + + def again(self): + """Move the seek pointer back one block and re-execute.""" + self.back(1) + self() + + def edit(self,index=None): + """Edit a block. + + If no number is given, use the last block executed. + + This edits the in-memory copy of the demo, it does NOT modify the + original source file. If you want to do that, simply open the file in + an editor and use reload() when you make changes to the file. This + method is meant to let you change a block during a demonstration for + explanatory purposes, without damaging your original script.""" + + index = self._get_index(index) + if index is None: + return + # decrease the index by one (unless we're at the very beginning), so + # that the default demo.edit() call opens up the sblock we've last run + if index>0: + index -= 1 + + filename = self.shell.mktempfile(self.src_blocks[index]) + self.shell.hooks.editor(filename, 1) + with open(Path(filename), "r", encoding="utf-8") as f: + new_block = f.read() + # update the source and colored block + self.src_blocks[index] = new_block + self.src_blocks_colored[index] = self.highlight(new_block) + self.block_index = index + # call to run with the newly edited index + self() + + def show(self,index=None): + """Show a single block on screen""" + + index = self._get_index(index) + if index is None: + return + + print(self.marquee('<%s> block # %s (%s remaining)' % + (self.title,index,self.nblocks-index-1))) + print(self.src_blocks_colored[index]) + sys.stdout.flush() + + def show_all(self): + """Show entire demo on screen, block by block""" + + fname = self.title + title = self.title + nblocks = self.nblocks + silent = self._silent + marquee = self.marquee + for index,block in enumerate(self.src_blocks_colored): + if silent[index]: + print(marquee('<%s> SILENT block # %s (%s remaining)' % + (title,index,nblocks-index-1))) + else: + print(marquee('<%s> block # %s (%s remaining)' % + (title,index,nblocks-index-1))) + print(block, end=' ') + sys.stdout.flush() + + def run_cell(self,source): + """Execute a string with one or more lines of code""" + + exec(source, self.user_ns) + + def __call__(self,index=None): + """run a block of the demo. + + If index is given, it should be an integer >=1 and <= nblocks. This + means that the calling convention is one off from typical Python + lists. The reason for the inconsistency is that the demo always + prints 'Block n/N, and N is the total, so it would be very odd to use + zero-indexing here.""" + + index = self._get_index(index) + if index is None: + return + try: + marquee = self.marquee + next_block = self.src_blocks[index] + self.block_index += 1 + if self._silent[index]: + print(marquee('Executing silent block # %s (%s remaining)' % + (index,self.nblocks-index-1))) + else: + self.pre_cmd() + self.show(index) + if self.auto_all or self._auto[index]: + print(marquee('output:')) + else: + print(marquee('Press to quit, to execute...'), end=' ') + ans = py3compat.input().strip() + if ans: + print(marquee('Block NOT executed')) + return + try: + save_argv = sys.argv + sys.argv = self.sys_argv + self.run_cell(next_block) + self.post_cmd() + finally: + sys.argv = save_argv + + except: + if self.inside_ipython: + self.ip_showtb(filename=self.fname) + else: + if self.inside_ipython: + self.ip_ns.update(self.user_ns) + + if self.block_index == self.nblocks: + mq1 = self.marquee('END OF DEMO') + if mq1: + # avoid spurious print if empty marquees are used + print() + print(mq1) + print(self.marquee('Use .reset() if you want to rerun it.')) + self.finished = True + + # These methods are meant to be overridden by subclasses who may wish to + # customize the behavior of of their demos. + def marquee(self,txt='',width=78,mark='*'): + """Return the input string centered in a 'marquee'.""" + return marquee(txt,width,mark) + + def pre_cmd(self): + """Method called before executing each block.""" + pass + + def post_cmd(self): + """Method called after executing each block.""" + pass + + def highlight(self, block): + """Method called on each block to highlight it content""" + tokens = pygments.lex(block, self.python_lexer) + if self.format_rst: + from pygments.token import Token + toks = [] + for token in tokens: + if token[0] == Token.String.Doc and len(token[1]) > 6: + toks += pygments.lex(token[1][:3], self.python_lexer) + # parse doc string content by rst lexer + toks += pygments.lex(token[1][3:-3], self.rst_lexer) + toks += pygments.lex(token[1][-3:], self.python_lexer) + elif token[0] == Token.Comment.Single: + toks.append((Token.Comment.Single, token[1][0])) + # parse comment content by rst lexer + # remove the extra newline added by rst lexer + toks += list(pygments.lex(token[1][1:], self.rst_lexer))[:-1] + else: + toks.append(token) + tokens = toks + return pygments.format(tokens, self.formatter) + + +class IPythonDemo(Demo): + """Class for interactive demos with IPython's input processing applied. + + This subclasses Demo, but instead of executing each block by the Python + interpreter (via exec), it actually calls IPython on it, so that any input + filters which may be in place are applied to the input block. + + If you have an interactive environment which exposes special input + processing, you can use this class instead to write demo scripts which + operate exactly as if you had typed them interactively. The default Demo + class requires the input to be valid, pure Python code. + """ + + def run_cell(self,source): + """Execute a string with one or more lines of code""" + + self.shell.run_cell(source) + +class LineDemo(Demo): + """Demo where each line is executed as a separate block. + + The input script should be valid Python code. + + This class doesn't require any markup at all, and it's meant for simple + scripts (with no nesting or any kind of indentation) which consist of + multiple lines of input to be executed, one at a time, as if they had been + typed in the interactive prompt. + + Note: the input can not have *any* indentation, which means that only + single-lines of input are accepted, not even function definitions are + valid.""" + + def reload(self): + """Reload source from disk and initialize state.""" + # read data and parse into blocks + self.fload() + lines = self.fobj.readlines() + src_b = [l for l in lines if l.strip()] + nblocks = len(src_b) + self.src = ''.join(lines) + self._silent = [False]*nblocks + self._auto = [True]*nblocks + self.auto_all = True + self.nblocks = nblocks + self.src_blocks = src_b + + # also build syntax-highlighted source + self.src_blocks_colored = list(map(self.highlight,self.src_blocks)) + + # ensure clean namespace and seek offset + self.reset() + + +class IPythonLineDemo(IPythonDemo,LineDemo): + """Variant of the LineDemo class whose input is processed by IPython.""" + pass + + +class ClearMixin(object): + """Use this mixin to make Demo classes with less visual clutter. + + Demos using this mixin will clear the screen before every block and use + blank marquees. + + Note that in order for the methods defined here to actually override those + of the classes it's mixed with, it must go /first/ in the inheritance + tree. For example: + + class ClearIPDemo(ClearMixin,IPythonDemo): pass + + will provide an IPythonDemo class with the mixin's features. + """ + + def marquee(self,txt='',width=78,mark='*'): + """Blank marquee that returns '' no matter what the input.""" + return '' + + def pre_cmd(self): + """Method called before executing each block. + + This one simply clears the screen.""" + from IPython.utils.terminal import _term_clear + _term_clear() + +class ClearDemo(ClearMixin,Demo): + pass + + +class ClearIPDemo(ClearMixin,IPythonDemo): + pass + + +def slide(file_path, noclear=False, format_rst=True, formatter="terminal", + style="native", auto_all=False, delimiter='...'): + if noclear: + demo_class = Demo + else: + demo_class = ClearDemo + demo = demo_class(file_path, format_rst=format_rst, formatter=formatter, + style=style, auto_all=auto_all) + while not demo.finished: + demo() + try: + py3compat.input('\n' + delimiter) + except KeyboardInterrupt: + exit(1) + +if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser(description='Run python demos') + parser.add_argument('--noclear', '-C', action='store_true', + help='Do not clear terminal on each slide') + parser.add_argument('--rst', '-r', action='store_true', + help='Highlight comments and dostrings as rst') + parser.add_argument('--formatter', '-f', default='terminal', + help='pygments formatter name could be: terminal, ' + 'terminal256, terminal16m') + parser.add_argument('--style', '-s', default='default', + help='pygments style name') + parser.add_argument('--auto', '-a', action='store_true', + help='Run all blocks automatically without' + 'confirmation') + parser.add_argument('--delimiter', '-d', default='...', + help='slides delimiter added after each slide run') + parser.add_argument('file', nargs=1, + help='python demo file') + args = parser.parse_args() + slide(args.file[0], noclear=args.noclear, format_rst=args.rst, + formatter=args.formatter, style=args.style, auto_all=args.auto, + delimiter=args.delimiter) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/display.py b/.venv/lib/python3.12/site-packages/IPython/lib/display.py new file mode 100644 index 0000000..f39f389 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/display.py @@ -0,0 +1,677 @@ +"""Various display related classes. + +Authors : MinRK, gregcaporaso, dannystaple +""" +from html import escape as html_escape +from os.path import exists, isfile, splitext, abspath, join, isdir +from os import walk, sep, fsdecode + +from IPython.core.display import DisplayObject, TextDisplayObject + +from typing import Tuple, Iterable, Optional + +__all__ = ['Audio', 'IFrame', 'YouTubeVideo', 'VimeoVideo', 'ScribdDocument', + 'FileLink', 'FileLinks', 'Code'] + + +class Audio(DisplayObject): + """Create an audio object. + + When this object is returned by an input cell or passed to the + display function, it will result in Audio controls being displayed + in the frontend (only works in the notebook). + + Parameters + ---------- + data : numpy array, list, unicode, str or bytes + Can be one of + + * Numpy 1d array containing the desired waveform (mono) + * Numpy 2d array containing waveforms for each channel. + Shape=(NCHAN, NSAMPLES). For the standard channel order, see + http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx + * List of float or integer representing the waveform (mono) + * String containing the filename + * Bytestring containing raw PCM data or + * URL pointing to a file on the web. + + If the array option is used, the waveform will be normalized. + + If a filename or url is used, the format support will be browser + dependent. + url : unicode + A URL to download the data from. + filename : unicode + Path to a local file to load the data from. + embed : boolean + Should the audio data be embedded using a data URI (True) or should + the original source be referenced. Set this to True if you want the + audio to playable later with no internet connection in the notebook. + + Default is `True`, unless the keyword argument `url` is set, then + default value is `False`. + rate : integer + The sampling rate of the raw data. + Only required when data parameter is being used as an array + autoplay : bool + Set to True if the audio should immediately start playing. + Default is `False`. + normalize : bool + Whether audio should be normalized (rescaled) to the maximum possible + range. Default is `True`. When set to `False`, `data` must be between + -1 and 1 (inclusive), otherwise an error is raised. + Applies only when `data` is a list or array of samples; other types of + audio are never normalized. + + Examples + -------- + + >>> import pytest + >>> np = pytest.importorskip("numpy") + + Generate a sound + + >>> import numpy as np + >>> framerate = 44100 + >>> t = np.linspace(0,5,framerate*5) + >>> data = np.sin(2*np.pi*220*t) + np.sin(2*np.pi*224*t) + >>> Audio(data, rate=framerate) + + + Can also do stereo or more channels + + >>> dataleft = np.sin(2*np.pi*220*t) + >>> dataright = np.sin(2*np.pi*224*t) + >>> Audio([dataleft, dataright], rate=framerate) + + + From URL: + + >>> Audio("http://www.nch.com.au/acm/8k16bitpcm.wav") # doctest: +SKIP + >>> Audio(url="http://www.w3schools.com/html/horse.ogg") # doctest: +SKIP + + From a File: + + >>> Audio('IPython/lib/tests/test.wav') # doctest: +SKIP + >>> Audio(filename='IPython/lib/tests/test.wav') # doctest: +SKIP + + From Bytes: + + >>> Audio(b'RAW_WAV_DATA..') # doctest: +SKIP + >>> Audio(data=b'RAW_WAV_DATA..') # doctest: +SKIP + + See Also + -------- + ipywidgets.Audio + + Audio widget with more more flexibility and options. + + """ + _read_flags = 'rb' + + def __init__(self, data=None, filename=None, url=None, embed=None, rate=None, autoplay=False, normalize=True, *, + element_id=None): + if filename is None and url is None and data is None: + raise ValueError("No audio data found. Expecting filename, url, or data.") + if embed is False and url is None: + raise ValueError("No url found. Expecting url when embed=False") + + if url is not None and embed is not True: + self.embed = False + else: + self.embed = True + self.autoplay = autoplay + self.element_id = element_id + super(Audio, self).__init__(data=data, url=url, filename=filename) + + if self.data is not None and not isinstance(self.data, bytes): + if rate is None: + raise ValueError("rate must be specified when data is a numpy array or list of audio samples.") + self.data = Audio._make_wav(data, rate, normalize) + + def reload(self): + """Reload the raw data from file or URL.""" + import mimetypes + if self.embed: + super(Audio, self).reload() + + if self.filename is not None: + self.mimetype = mimetypes.guess_type(self.filename)[0] + elif self.url is not None: + self.mimetype = mimetypes.guess_type(self.url)[0] + else: + self.mimetype = "audio/wav" + + @staticmethod + def _make_wav(data, rate, normalize): + """ Transform a numpy array to a PCM bytestring """ + from io import BytesIO + import wave + + try: + scaled, nchan = Audio._validate_and_normalize_with_numpy(data, normalize) + except ImportError: + scaled, nchan = Audio._validate_and_normalize_without_numpy(data, normalize) + + fp = BytesIO() + waveobj = wave.open(fp,mode='wb') + waveobj.setnchannels(nchan) + waveobj.setframerate(rate) + waveobj.setsampwidth(2) + waveobj.setcomptype('NONE','NONE') + waveobj.writeframes(scaled) + val = fp.getvalue() + waveobj.close() + + return val + + @staticmethod + def _validate_and_normalize_with_numpy(data, normalize) -> Tuple[bytes, int]: + import numpy as np + + data = np.array(data, dtype=float) + if len(data.shape) == 1: + nchan = 1 + elif len(data.shape) == 2: + # In wave files,channels are interleaved. E.g., + # "L1R1L2R2..." for stereo. See + # http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx + # for channel ordering + nchan = data.shape[0] + data = data.T.ravel() + else: + raise ValueError('Array audio input must be a 1D or 2D array') + + max_abs_value = np.max(np.abs(data)) + normalization_factor = Audio._get_normalization_factor(max_abs_value, normalize) + scaled = data / normalization_factor * 32767 + return scaled.astype(" 1: + raise ValueError('Audio data must be between -1 and 1 when normalize=False.') + return max_abs_value if normalize else 1 + + def _data_and_metadata(self): + """shortcut for returning metadata with url information, if defined""" + md = {} + if self.url: + md['url'] = self.url + if md: + return self.data, md + else: + return self.data + + def _repr_html_(self): + src = """ + + """ + return src.format(src=self.src_attr(), type=self.mimetype, autoplay=self.autoplay_attr(), + element_id=self.element_id_attr()) + + def src_attr(self): + import base64 + if self.embed and (self.data is not None): + data = base64=base64.b64encode(self.data).decode('ascii') + return """data:{type};base64,{base64}""".format(type=self.mimetype, + base64=data) + elif self.url is not None: + return self.url + else: + return "" + + def autoplay_attr(self): + if(self.autoplay): + return 'autoplay="autoplay"' + else: + return '' + + def element_id_attr(self): + if (self.element_id): + return 'id="{element_id}"'.format(element_id=self.element_id) + else: + return '' + +class IFrame(object): + """ + Generic class to embed an iframe in an IPython notebook + """ + + iframe = """ + + """ + + def __init__( + self, src, width, height, extras: Optional[Iterable[str]] = None, **kwargs + ): + if extras is None: + extras = [] + + self.src = src + self.width = width + self.height = height + self.extras = extras + self.params = kwargs + + def _repr_html_(self): + """return the embed iframe""" + if self.params: + from urllib.parse import urlencode + params = "?" + urlencode(self.params) + else: + params = "" + return self.iframe.format( + src=self.src, + width=self.width, + height=self.height, + params=params, + extras=" ".join(self.extras), + ) + + +class YouTubeVideo(IFrame): + """Class for embedding a YouTube Video in an IPython session, based on its video id. + + e.g. to embed the video from https://www.youtube.com/watch?v=foo , you would + do:: + + vid = YouTubeVideo("foo") + display(vid) + + To start from 30 seconds:: + + vid = YouTubeVideo("abc", start=30) + display(vid) + + To calculate seconds from time as hours, minutes, seconds use + :class:`datetime.timedelta`:: + + start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds()) + + Other parameters can be provided as documented at + https://developers.google.com/youtube/player_parameters#Parameters + + When converting the notebook using nbconvert, a jpeg representation of the video + will be inserted in the document. + """ + + def __init__(self, id, width=400, height=300, allow_autoplay=False, **kwargs): + self.id=id + src = "https://www.youtube.com/embed/{0}".format(id) + if allow_autoplay: + extras = list(kwargs.get("extras", [])) + ['allow="autoplay"'] + kwargs.update(autoplay=1, extras=extras) + super(YouTubeVideo, self).__init__(src, width, height, **kwargs) + + def _repr_jpeg_(self): + # Deferred import + from urllib.request import urlopen + + try: + return urlopen("https://img.youtube.com/vi/{id}/hqdefault.jpg".format(id=self.id)).read() + except IOError: + return None + +class VimeoVideo(IFrame): + """ + Class for embedding a Vimeo video in an IPython session, based on its video id. + """ + + def __init__(self, id, width=400, height=300, **kwargs): + src="https://player.vimeo.com/video/{0}".format(id) + super(VimeoVideo, self).__init__(src, width, height, **kwargs) + +class ScribdDocument(IFrame): + """ + Class for embedding a Scribd document in an IPython session + + Use the start_page params to specify a starting point in the document + Use the view_mode params to specify display type one off scroll | slideshow | book + + e.g to Display Wes' foundational paper about PANDAS in book mode from page 3 + + ScribdDocument(71048089, width=800, height=400, start_page=3, view_mode="book") + """ + + def __init__(self, id, width=400, height=300, **kwargs): + src="https://www.scribd.com/embeds/{0}/content".format(id) + super(ScribdDocument, self).__init__(src, width, height, **kwargs) + +class FileLink(object): + """Class for embedding a local file link in an IPython session, based on path + + e.g. to embed a link that was generated in the IPython notebook as my/data.txt + + you would do:: + + local_file = FileLink("my/data.txt") + display(local_file) + + or in the HTML notebook, just:: + + FileLink("my/data.txt") + """ + + html_link_str = "%s" + + def __init__(self, + path, + url_prefix='', + result_html_prefix='', + result_html_suffix='
    '): + """ + Parameters + ---------- + path : str + path to the file or directory that should be formatted + url_prefix : str + prefix to be prepended to all files to form a working link [default: + ''] + result_html_prefix : str + text to append to beginning to link [default: ''] + result_html_suffix : str + text to append at the end of link [default: '
    '] + """ + if isdir(path): + raise ValueError("Cannot display a directory using FileLink. " + "Use FileLinks to display '%s'." % path) + self.path = fsdecode(path) + self.url_prefix = url_prefix + self.result_html_prefix = result_html_prefix + self.result_html_suffix = result_html_suffix + + def _format_path(self): + fp = ''.join([self.url_prefix, html_escape(self.path)]) + return ''.join([self.result_html_prefix, + self.html_link_str % \ + (fp, html_escape(self.path, quote=False)), + self.result_html_suffix]) + + def _repr_html_(self): + """return html link to file + """ + if not exists(self.path): + return ("Path (%s) doesn't exist. " + "It may still be in the process of " + "being generated, or you may have the " + "incorrect path." % self.path) + + return self._format_path() + + def __repr__(self): + """return absolute path to file + """ + return abspath(self.path) + +class FileLinks(FileLink): + """Class for embedding local file links in an IPython session, based on path + + e.g. to embed links to files that were generated in the IPython notebook + under ``my/data``, you would do:: + + local_files = FileLinks("my/data") + display(local_files) + + or in the HTML notebook, just:: + + FileLinks("my/data") + """ + def __init__(self, + path, + url_prefix='', + included_suffixes=None, + result_html_prefix='', + result_html_suffix='
    ', + notebook_display_formatter=None, + terminal_display_formatter=None, + recursive=True): + """ + See :class:`FileLink` for the ``path``, ``url_prefix``, + ``result_html_prefix`` and ``result_html_suffix`` parameters. + + included_suffixes : list + Filename suffixes to include when formatting output [default: include + all files] + + notebook_display_formatter : function + Used to format links for display in the notebook. See discussion of + formatter functions below. + + terminal_display_formatter : function + Used to format links for display in the terminal. See discussion of + formatter functions below. + + Formatter functions must be of the form:: + + f(dirname, fnames, included_suffixes) + + dirname : str + The name of a directory + fnames : list + The files in that directory + included_suffixes : list + The file suffixes that should be included in the output (passing None + meansto include all suffixes in the output in the built-in formatters) + recursive : boolean + Whether to recurse into subdirectories. Default is True. + + The function should return a list of lines that will be printed in the + notebook (if passing notebook_display_formatter) or the terminal (if + passing terminal_display_formatter). This function is iterated over for + each directory in self.path. Default formatters are in place, can be + passed here to support alternative formatting. + + """ + if isfile(path): + raise ValueError("Cannot display a file using FileLinks. " + "Use FileLink to display '%s'." % path) + self.included_suffixes = included_suffixes + # remove trailing slashes for more consistent output formatting + path = path.rstrip('/') + + self.path = path + self.url_prefix = url_prefix + self.result_html_prefix = result_html_prefix + self.result_html_suffix = result_html_suffix + + self.notebook_display_formatter = \ + notebook_display_formatter or self._get_notebook_display_formatter() + self.terminal_display_formatter = \ + terminal_display_formatter or self._get_terminal_display_formatter() + + self.recursive = recursive + + def _get_display_formatter( + self, dirname_output_format, fname_output_format, fp_format, fp_cleaner=None + ): + """generate built-in formatter function + + this is used to define both the notebook and terminal built-in + formatters as they only differ by some wrapper text for each entry + + dirname_output_format: string to use for formatting directory + names, dirname will be substituted for a single "%s" which + must appear in this string + fname_output_format: string to use for formatting file names, + if a single "%s" appears in the string, fname will be substituted + if two "%s" appear in the string, the path to fname will be + substituted for the first and fname will be substituted for the + second + fp_format: string to use for formatting filepaths, must contain + exactly two "%s" and the dirname will be substituted for the first + and fname will be substituted for the second + """ + def f(dirname, fnames, included_suffixes=None): + result = [] + # begin by figuring out which filenames, if any, + # are going to be displayed + display_fnames = [] + for fname in fnames: + if (isfile(join(dirname,fname)) and + (included_suffixes is None or + splitext(fname)[1] in included_suffixes)): + display_fnames.append(fname) + + if len(display_fnames) == 0: + # if there are no filenames to display, don't print anything + # (not even the directory name) + pass + else: + # otherwise print the formatted directory name followed by + # the formatted filenames + dirname_output_line = dirname_output_format % dirname + result.append(dirname_output_line) + for fname in display_fnames: + fp = fp_format % (dirname,fname) + if fp_cleaner is not None: + fp = fp_cleaner(fp) + try: + # output can include both a filepath and a filename... + fname_output_line = fname_output_format % (fp, fname) + except TypeError: + # ... or just a single filepath + fname_output_line = fname_output_format % fname + result.append(fname_output_line) + return result + return f + + def _get_notebook_display_formatter(self, + spacer="  "): + """ generate function to use for notebook formatting + """ + dirname_output_format = \ + self.result_html_prefix + "%s/" + self.result_html_suffix + fname_output_format = \ + self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix + fp_format = self.url_prefix + '%s/%s' + if sep == "\\": + # Working on a platform where the path separator is "\", so + # must convert these to "/" for generating a URI + def fp_cleaner(fp): + # Replace all occurrences of backslash ("\") with a forward + # slash ("/") - this is necessary on windows when a path is + # provided as input, but we must link to a URI + return fp.replace('\\','/') + else: + fp_cleaner = None + + return self._get_display_formatter(dirname_output_format, + fname_output_format, + fp_format, + fp_cleaner) + + def _get_terminal_display_formatter(self, + spacer=" "): + """ generate function to use for terminal formatting + """ + dirname_output_format = "%s/" + fname_output_format = spacer + "%s" + fp_format = '%s/%s' + + return self._get_display_formatter(dirname_output_format, + fname_output_format, + fp_format) + + def _format_path(self): + result_lines = [] + if self.recursive: + walked_dir = list(walk(self.path)) + else: + walked_dir = [next(walk(self.path))] + walked_dir.sort() + for dirname, subdirs, fnames in walked_dir: + result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes) + return '\n'.join(result_lines) + + def __repr__(self): + """return newline-separated absolute paths + """ + result_lines = [] + if self.recursive: + walked_dir = list(walk(self.path)) + else: + walked_dir = [next(walk(self.path))] + walked_dir.sort() + for dirname, subdirs, fnames in walked_dir: + result_lines += self.terminal_display_formatter(dirname, fnames, self.included_suffixes) + return '\n'.join(result_lines) + + +class Code(TextDisplayObject): + """Display syntax-highlighted source code. + + This uses Pygments to highlight the code for HTML and Latex output. + + Parameters + ---------- + data : str + The code as a string + url : str + A URL to fetch the code from + filename : str + A local filename to load the code from + language : str + The short name of a Pygments lexer to use for highlighting. + If not specified, it will guess the lexer based on the filename + or the code. Available lexers: http://pygments.org/docs/lexers/ + """ + def __init__(self, data=None, url=None, filename=None, language=None): + self.language = language + super().__init__(data=data, url=url, filename=filename) + + def _get_lexer(self): + if self.language: + from pygments.lexers import get_lexer_by_name + return get_lexer_by_name(self.language) + elif self.filename: + from pygments.lexers import get_lexer_for_filename + return get_lexer_for_filename(self.filename) + else: + from pygments.lexers import guess_lexer + return guess_lexer(self.data) + + def __repr__(self): + return self.data + + def _repr_html_(self): + from pygments import highlight + from pygments.formatters import HtmlFormatter + fmt = HtmlFormatter() + style = ''.format(fmt.get_style_defs('.output_html')) + return style + highlight(self.data, self._get_lexer(), fmt) + + def _repr_latex_(self): + from pygments import highlight + from pygments.formatters import LatexFormatter + return highlight(self.data, self._get_lexer(), LatexFormatter()) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py b/.venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py new file mode 100644 index 0000000..d8bd6ac --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py @@ -0,0 +1,127 @@ +""" 'editor' hooks for common editors that work well with ipython + +They should honor the line number argument, at least. + +Contributions are *very* welcome. +""" + +import os +import shlex +import subprocess +import sys + +from IPython import get_ipython +from IPython.core.error import TryNext +from IPython.utils import py3compat + + +def install_editor(template, wait=False): + """Installs the editor that is called by IPython for the %edit magic. + + This overrides the default editor, which is generally set by your EDITOR + environment variable or is notepad (windows) or vi (linux). By supplying a + template string `run_template`, you can control how the editor is invoked + by IPython -- (e.g. the format in which it accepts command line options) + + Parameters + ---------- + template : basestring + run_template acts as a template for how your editor is invoked by + the shell. It should contain '{filename}', which will be replaced on + invocation with the file name, and '{line}', $line by line number + (or 0) to invoke the file with. + wait : bool + If `wait` is true, wait until the user presses enter before returning, + to facilitate non-blocking editors that exit immediately after + the call. + """ + + # not all editors support $line, so we'll leave out this check + # for substitution in ['$file', '$line']: + # if not substitution in run_template: + # raise ValueError(('run_template should contain %s' + # ' for string substitution. You supplied "%s"' % (substitution, + # run_template))) + + def call_editor(self, filename, line=0): + if line is None: + line = 0 + cmd = template.format(filename=shlex.quote(filename), line=line) + print(">", cmd) + # shlex.quote doesn't work right on Windows, but it does after splitting + if sys.platform.startswith('win'): + cmd = shlex.split(cmd) + proc = subprocess.Popen(cmd, shell=True) + if proc.wait() != 0: + raise TryNext() + if wait: + py3compat.input("Press Enter when done editing:") + + get_ipython().set_hook('editor', call_editor) + get_ipython().editor = template + + +# in these, exe is always the path/name of the executable. Useful +# if you don't have the editor directory in your path +def komodo(exe=u'komodo'): + """ Activestate Komodo [Edit] """ + install_editor(exe + u' -l {line} {filename}', wait=True) + + +def scite(exe=u"scite"): + """ SciTE or Sc1 """ + install_editor(exe + u' {filename} -goto:{line}') + + +def notepadplusplus(exe=u'notepad++'): + """ Notepad++ http://notepad-plus.sourceforge.net """ + install_editor(exe + u' -n{line} {filename}') + + +def jed(exe=u'jed'): + """ JED, the lightweight emacsish editor """ + install_editor(exe + u' +{line} {filename}') + + +def idle(exe=u'idle'): + """ Idle, the editor bundled with python + + Parameters + ---------- + exe : str, None + If none, should be pretty smart about finding the executable. + """ + if exe is None: + import idlelib + p = os.path.dirname(idlelib.__filename__) + # i'm not sure if this actually works. Is this idle.py script + # guaranteed to be executable? + exe = os.path.join(p, 'idle.py') + install_editor(exe + u' {filename}') + + +def mate(exe=u'mate'): + """ TextMate, the missing editor""" + # wait=True is not required since we're using the -w flag to mate + install_editor(exe + u' -w -l {line} {filename}') + + +# ########################################## +# these are untested, report any problems +# ########################################## + + +def emacs(exe=u'emacs'): + install_editor(exe + u' +{line} {filename}') + + +def gnuclient(exe=u'gnuclient'): + install_editor(exe + u' -nw +{line} {filename}') + + +def crimson_editor(exe=u'cedt.exe'): + install_editor(exe + u' /L:{line} {filename}') + + +def kate(exe=u'kate'): + install_editor(exe + u' -u -l {line} {filename}') diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/guisupport.py b/.venv/lib/python3.12/site-packages/IPython/lib/guisupport.py new file mode 100644 index 0000000..4d532d0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/guisupport.py @@ -0,0 +1,155 @@ +# coding: utf-8 +""" +Support for creating GUI apps and starting event loops. + +IPython's GUI integration allows interactive plotting and GUI usage in IPython +session. IPython has two different types of GUI integration: + +1. The terminal based IPython supports GUI event loops through Python's + PyOS_InputHook. PyOS_InputHook is a hook that Python calls periodically + whenever raw_input is waiting for a user to type code. We implement GUI + support in the terminal by setting PyOS_InputHook to a function that + iterates the event loop for a short while. It is important to note that + in this situation, the real GUI event loop is NOT run in the normal + manner, so you can't use the normal means to detect that it is running. +2. In the two process IPython kernel/frontend, the GUI event loop is run in + the kernel. In this case, the event loop is run in the normal manner by + calling the function or method of the GUI toolkit that starts the event + loop. + +In addition to starting the GUI event loops in one of these two ways, IPython +will *always* create an appropriate GUI application object when GUi +integration is enabled. + +If you want your GUI apps to run in IPython you need to do two things: + +1. Test to see if there is already an existing main application object. If + there is, you should use it. If there is not an existing application object + you should create one. +2. Test to see if the GUI event loop is running. If it is, you should not + start it. If the event loop is not running you may start it. + +This module contains functions for each toolkit that perform these things +in a consistent manner. Because of how PyOS_InputHook runs the event loop +you cannot detect if the event loop is running using the traditional calls +(such as ``wx.GetApp.IsMainLoopRunning()`` in wxPython). If PyOS_InputHook is +set These methods will return a false negative. That is, they will say the +event loop is not running, when is actually is. To work around this limitation +we proposed the following informal protocol: + +* Whenever someone starts the event loop, they *must* set the ``_in_event_loop`` + attribute of the main application object to ``True``. This should be done + regardless of how the event loop is actually run. +* Whenever someone stops the event loop, they *must* set the ``_in_event_loop`` + attribute of the main application object to ``False``. +* If you want to see if the event loop is running, you *must* use ``hasattr`` + to see if ``_in_event_loop`` attribute has been set. If it is set, you + *must* use its value. If it has not been set, you can query the toolkit + in the normal manner. +* If you want GUI support and no one else has created an application or + started the event loop you *must* do this. We don't want projects to + attempt to defer these things to someone else if they themselves need it. + +The functions below implement this logic for each GUI toolkit. If you need +to create custom application subclasses, you will likely have to modify this +code for your own purposes. This code can be copied into your own project +so you don't have to depend on IPython. + +""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +from IPython.core.getipython import get_ipython + +#----------------------------------------------------------------------------- +# wx +#----------------------------------------------------------------------------- + +def get_app_wx(*args, **kwargs): + """Create a new wx app or return an exiting one.""" + import wx + app = wx.GetApp() + if app is None: + if 'redirect' not in kwargs: + kwargs['redirect'] = False + app = wx.PySimpleApp(*args, **kwargs) + return app + +def is_event_loop_running_wx(app=None): + """Is the wx event loop running.""" + # New way: check attribute on shell instance + ip = get_ipython() + if ip is not None: + if ip.active_eventloop and ip.active_eventloop == 'wx': + return True + # Fall through to checking the application, because Wx has a native way + # to check if the event loop is running, unlike Qt. + + # Old way: check Wx application + if app is None: + app = get_app_wx() + if hasattr(app, '_in_event_loop'): + return app._in_event_loop + else: + return app.IsMainLoopRunning() + +def start_event_loop_wx(app=None): + """Start the wx event loop in a consistent manner.""" + if app is None: + app = get_app_wx() + if not is_event_loop_running_wx(app): + app._in_event_loop = True + app.MainLoop() + app._in_event_loop = False + else: + app._in_event_loop = True + +#----------------------------------------------------------------------------- +# Qt +#----------------------------------------------------------------------------- + +def get_app_qt4(*args, **kwargs): + """Create a new Qt app or return an existing one.""" + from IPython.external.qt_for_kernel import QtGui + app = QtGui.QApplication.instance() + if app is None: + if not args: + args = ([""],) + app = QtGui.QApplication(*args, **kwargs) + return app + +def is_event_loop_running_qt4(app=None): + """Is the qt event loop running.""" + # New way: check attribute on shell instance + ip = get_ipython() + if ip is not None: + return ip.active_eventloop and ip.active_eventloop.startswith('qt') + + # Old way: check attribute on QApplication singleton + if app is None: + app = get_app_qt4([""]) + if hasattr(app, '_in_event_loop'): + return app._in_event_loop + else: + # Does qt provide a other way to detect this? + return False + +def start_event_loop_qt4(app=None): + """Start the qt event loop in a consistent manner.""" + if app is None: + app = get_app_qt4([""]) + if not is_event_loop_running_qt4(app): + app._in_event_loop = True + app.exec_() + app._in_event_loop = False + else: + app._in_event_loop = True + +#----------------------------------------------------------------------------- +# Tk +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# gtk +#----------------------------------------------------------------------------- diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/latextools.py b/.venv/lib/python3.12/site-packages/IPython/lib/latextools.py new file mode 100644 index 0000000..7bea589 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/latextools.py @@ -0,0 +1,257 @@ +# -*- coding: utf-8 -*- +"""Tools for handling LaTeX.""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +from io import BytesIO, open +import os +import tempfile +import shutil +import subprocess +from base64 import encodebytes +import textwrap + +from pathlib import Path + +from IPython.utils.process import find_cmd, FindCmdError +from traitlets.config import get_config +from traitlets.config.configurable import SingletonConfigurable +from traitlets import List, Bool, Unicode + + +class LaTeXTool(SingletonConfigurable): + """An object to store configuration of the LaTeX tool.""" + def _config_default(self): + return get_config() + + backends = List( + Unicode(), ["matplotlib", "dvipng"], + help="Preferred backend to draw LaTeX math equations. " + "Backends in the list are checked one by one and the first " + "usable one is used. Note that `matplotlib` backend " + "is usable only for inline style equations. To draw " + "display style equations, `dvipng` backend must be specified. ", + # It is a List instead of Enum, to make configuration more + # flexible. For example, to use matplotlib mainly but dvipng + # for display style, the default ["matplotlib", "dvipng"] can + # be used. To NOT use dvipng so that other repr such as + # unicode pretty printing is used, you can use ["matplotlib"]. + ).tag(config=True) + + use_breqn = Bool( + True, + help="Use breqn.sty to automatically break long equations. " + "This configuration takes effect only for dvipng backend.", + ).tag(config=True) + + packages = List( + ['amsmath', 'amsthm', 'amssymb', 'bm'], + help="A list of packages to use for dvipng backend. " + "'breqn' will be automatically appended when use_breqn=True.", + ).tag(config=True) + + preamble = Unicode( + help="Additional preamble to use when generating LaTeX source " + "for dvipng backend.", + ).tag(config=True) + + +def latex_to_png( + s: str, encode=False, backend=None, wrap=False, color="Black", scale=1.0 +): + """Render a LaTeX string to PNG. + + Parameters + ---------- + s : str + The raw string containing valid inline LaTeX. + encode : bool, optional + Should the PNG data base64 encoded to make it JSON'able. + backend : {matplotlib, dvipng} + Backend for producing PNG data. + wrap : bool + If true, Automatically wrap `s` as a LaTeX equation. + color : string + Foreground color name among dvipsnames, e.g. 'Maroon' or on hex RGB + format, e.g. '#AA20FA'. + scale : float + Scale factor for the resulting PNG. + None is returned when the backend cannot be used. + + """ + assert isinstance(s, str) + allowed_backends = LaTeXTool.instance().backends + if backend is None: + backend = allowed_backends[0] + if backend not in allowed_backends: + return None + if backend == 'matplotlib': + f = latex_to_png_mpl + elif backend == 'dvipng': + f = latex_to_png_dvipng + if color.startswith('#'): + # Convert hex RGB color to LaTeX RGB color. + if len(color) == 7: + try: + color = "RGB {}".format(" ".join([str(int(x, 16)) for x in + textwrap.wrap(color[1:], 2)])) + except ValueError as e: + raise ValueError('Invalid color specification {}.'.format(color)) from e + else: + raise ValueError('Invalid color specification {}.'.format(color)) + else: + raise ValueError('No such backend {0}'.format(backend)) + bin_data = f(s, wrap, color, scale) + if encode and bin_data: + bin_data = encodebytes(bin_data) + return bin_data + + +def latex_to_png_mpl(s, wrap, color='Black', scale=1.0): + try: + from matplotlib import figure, font_manager, mathtext + from matplotlib.backends import backend_agg + from pyparsing import ParseFatalException + except ImportError: + return None + + # mpl mathtext doesn't support display math, force inline + s = s.replace('$$', '$') + if wrap: + s = u'${0}$'.format(s) + + try: + prop = font_manager.FontProperties(size=12) + dpi = 120 * scale + buffer = BytesIO() + + # Adapted from mathtext.math_to_image + parser = mathtext.MathTextParser("path") + width, height, depth, _, _ = parser.parse(s, dpi=72, prop=prop) + fig = figure.Figure(figsize=(width / 72, height / 72)) + fig.text(0, depth / height, s, fontproperties=prop, color=color) + backend_agg.FigureCanvasAgg(fig) + fig.savefig(buffer, dpi=dpi, format="png", transparent=True) + return buffer.getvalue() + except (ValueError, RuntimeError, ParseFatalException): + return None + + +def latex_to_png_dvipng(s, wrap, color='Black', scale=1.0): + try: + find_cmd('latex') + find_cmd('dvipng') + except FindCmdError: + return None + + startupinfo = None + if os.name == "nt": + # prevent popup-windows + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + + try: + workdir = Path(tempfile.mkdtemp()) + tmpfile = "tmp.tex" + dvifile = "tmp.dvi" + outfile = "tmp.png" + + with workdir.joinpath(tmpfile).open("w", encoding="utf8") as f: + f.writelines(genelatex(s, wrap)) + + subprocess.check_call( + ["latex", "-halt-on-error", "-interaction", "batchmode", tmpfile], + cwd=workdir, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + startupinfo=startupinfo, + ) + + resolution = round(150 * scale) + subprocess.check_call( + [ + "dvipng", + "-T", + "tight", + "-D", + str(resolution), + "-z", + "9", + "-bg", + "Transparent", + "-o", + outfile, + dvifile, + "-fg", + color, + ], + cwd=workdir, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + startupinfo=startupinfo, + ) + + with workdir.joinpath(outfile).open("rb") as f: + return f.read() + except subprocess.CalledProcessError: + return None + finally: + shutil.rmtree(workdir) + + +def kpsewhich(filename): + """Invoke kpsewhich command with an argument `filename`.""" + try: + find_cmd("kpsewhich") + proc = subprocess.Popen( + ["kpsewhich", filename], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout, stderr) = proc.communicate() + return stdout.strip().decode('utf8', 'replace') + except FindCmdError: + pass + + +def genelatex(body, wrap): + """Generate LaTeX document for dvipng backend.""" + lt = LaTeXTool.instance() + breqn = wrap and lt.use_breqn and kpsewhich("breqn.sty") + yield r'\documentclass{article}' + packages = lt.packages + if breqn: + packages = packages + ['breqn'] + for pack in packages: + yield r'\usepackage{{{0}}}'.format(pack) + yield r'\pagestyle{empty}' + if lt.preamble: + yield lt.preamble + yield r'\begin{document}' + if breqn: + yield r'\begin{dmath*}' + yield body + yield r'\end{dmath*}' + elif wrap: + yield u'$${0}$$'.format(body) + else: + yield body + yield u'\\end{document}' + + +_data_uri_template_png = u"""%s""" + +def latex_to_html(s, alt='image'): + """Render LaTeX to HTML with embedded PNG data using data URIs. + + Parameters + ---------- + s : str + The raw string containing valid inline LateX. + alt : str + The alt text to use for the HTML. + """ + base64_data = latex_to_png(s, encode=True).decode('ascii') + if base64_data: + return _data_uri_template_png % (base64_data, alt) + + diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/lexers.py b/.venv/lib/python3.12/site-packages/IPython/lib/lexers.py new file mode 100644 index 0000000..9aa3433 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/lexers.py @@ -0,0 +1,540 @@ +# -*- coding: utf-8 -*- +""" +Defines a variety of Pygments lexers for highlighting IPython code. + +This includes: + + IPythonLexer, IPython3Lexer + Lexers for pure IPython (python + magic/shell commands) + + IPythonPartialTracebackLexer, IPythonTracebackLexer + Supports 2.x and 3.x via keyword `python3`. The partial traceback + lexer reads everything but the Python code appearing in a traceback. + The full lexer combines the partial lexer with an IPython lexer. + + IPythonConsoleLexer + A lexer for IPython console sessions, with support for tracebacks. + + IPyLexer + A friendly lexer which examines the first line of text and from it, + decides whether to use an IPython lexer or an IPython console lexer. + This is probably the only lexer that needs to be explicitly added + to Pygments. + +""" +#----------------------------------------------------------------------------- +# Copyright (c) 2013, the IPython Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- + +# Standard library +import re + +# Third party +from pygments.lexers import ( + BashLexer, HtmlLexer, JavascriptLexer, RubyLexer, PerlLexer, PythonLexer, + Python3Lexer, TexLexer) +from pygments.lexer import ( + Lexer, DelegatingLexer, RegexLexer, do_insertions, bygroups, using, +) +from pygments.token import ( + Generic, Keyword, Literal, Name, Operator, Other, Text, Error, +) +from pygments.util import get_bool_opt + +# Local + +line_re = re.compile('.*?\n') + +__all__ = ['build_ipy_lexer', 'IPython3Lexer', 'IPythonLexer', + 'IPythonPartialTracebackLexer', 'IPythonTracebackLexer', + 'IPythonConsoleLexer', 'IPyLexer'] + + +def build_ipy_lexer(python3): + """Builds IPython lexers depending on the value of `python3`. + + The lexer inherits from an appropriate Python lexer and then adds + information about IPython specific keywords (i.e. magic commands, + shell commands, etc.) + + Parameters + ---------- + python3 : bool + If `True`, then build an IPython lexer from a Python 3 lexer. + + """ + # It would be nice to have a single IPython lexer class which takes + # a boolean `python3`. But since there are two Python lexer classes, + # we will also have two IPython lexer classes. + if python3: + PyLexer = Python3Lexer + name = 'IPython3' + aliases = ['ipython3'] + doc = """IPython3 Lexer""" + else: + PyLexer = PythonLexer + name = 'IPython' + aliases = ['ipython2', 'ipython'] + doc = """IPython Lexer""" + + ipython_tokens = [ + (r'(?s)(\s*)(%%capture)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?s)(\s*)(%%debug)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?is)(\s*)(%%html)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(HtmlLexer))), + (r'(?s)(\s*)(%%javascript)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(JavascriptLexer))), + (r'(?s)(\s*)(%%js)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(JavascriptLexer))), + (r'(?s)(\s*)(%%latex)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(TexLexer))), + (r'(?s)(\s*)(%%perl)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PerlLexer))), + (r'(?s)(\s*)(%%prun)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?s)(\s*)(%%pypy)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?s)(\s*)(%%python)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?s)(\s*)(%%python2)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PythonLexer))), + (r'(?s)(\s*)(%%python3)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(Python3Lexer))), + (r'(?s)(\s*)(%%ruby)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(RubyLexer))), + (r'(?s)(\s*)(%%time)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?s)(\s*)(%%timeit)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?s)(\s*)(%%writefile)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r'(?s)(\s*)(%%file)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), + (r"(?s)(\s*)(%%)(\w+)(.*)", bygroups(Text, Operator, Keyword, Text)), + (r'(?s)(^\s*)(%%!)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(BashLexer))), + (r"(%%?)(\w+)(\?\??)$", bygroups(Operator, Keyword, Operator)), + (r"\b(\?\??)(\s*)$", bygroups(Operator, Text)), + (r'(%)(sx|sc|system)(.*)(\n)', bygroups(Operator, Keyword, + using(BashLexer), Text)), + (r'(%)(\w+)(.*\n)', bygroups(Operator, Keyword, Text)), + (r'^(!!)(.+)(\n)', bygroups(Operator, using(BashLexer), Text)), + (r'(!)(?!=)(.+)(\n)', bygroups(Operator, using(BashLexer), Text)), + (r'^(\s*)(\?\??)(\s*%{0,2}[\w\.\*]*)', bygroups(Text, Operator, Text)), + (r'(\s*%{0,2}[\w\.\*]*)(\?\??)(\s*)$', bygroups(Text, Operator, Text)), + ] + + tokens = PyLexer.tokens.copy() + tokens['root'] = ipython_tokens + tokens['root'] + + attrs = {'name': name, 'aliases': aliases, 'filenames': [], + '__doc__': doc, 'tokens': tokens} + + return type(name, (PyLexer,), attrs) + + +IPython3Lexer = build_ipy_lexer(python3=True) +IPythonLexer = build_ipy_lexer(python3=False) + + +class IPythonPartialTracebackLexer(RegexLexer): + """ + Partial lexer for IPython tracebacks. + + Handles all the non-python output. + + """ + name = 'IPython Partial Traceback' + + tokens = { + 'root': [ + # Tracebacks for syntax errors have a different style. + # For both types of tracebacks, we mark the first line with + # Generic.Traceback. For syntax errors, we mark the filename + # as we mark the filenames for non-syntax tracebacks. + # + # These two regexps define how IPythonConsoleLexer finds a + # traceback. + # + ## Non-syntax traceback + (r'^(\^C)?(-+\n)', bygroups(Error, Generic.Traceback)), + ## Syntax traceback + (r'^( File)(.*)(, line )(\d+\n)', + bygroups(Generic.Traceback, Name.Namespace, + Generic.Traceback, Literal.Number.Integer)), + + # (Exception Identifier)(Whitespace)(Traceback Message) + (r'(?u)(^[^\d\W]\w*)(\s*)(Traceback.*?\n)', + bygroups(Name.Exception, Generic.Whitespace, Text)), + # (Module/Filename)(Text)(Callee)(Function Signature) + # Better options for callee and function signature? + (r'(.*)( in )(.*)(\(.*\)\n)', + bygroups(Name.Namespace, Text, Name.Entity, Name.Tag)), + # Regular line: (Whitespace)(Line Number)(Python Code) + (r'(\s*?)(\d+)(.*?\n)', + bygroups(Generic.Whitespace, Literal.Number.Integer, Other)), + # Emphasized line: (Arrow)(Line Number)(Python Code) + # Using Exception token so arrow color matches the Exception. + (r'(-*>?\s?)(\d+)(.*?\n)', + bygroups(Name.Exception, Literal.Number.Integer, Other)), + # (Exception Identifier)(Message) + (r'(?u)(^[^\d\W]\w*)(:.*?\n)', + bygroups(Name.Exception, Text)), + # Tag everything else as Other, will be handled later. + (r'.*\n', Other), + ], + } + + +class IPythonTracebackLexer(DelegatingLexer): + """ + IPython traceback lexer. + + For doctests, the tracebacks can be snipped as much as desired with the + exception to the lines that designate a traceback. For non-syntax error + tracebacks, this is the line of hyphens. For syntax error tracebacks, + this is the line which lists the File and line number. + + """ + # The lexer inherits from DelegatingLexer. The "root" lexer is an + # appropriate IPython lexer, which depends on the value of the boolean + # `python3`. First, we parse with the partial IPython traceback lexer. + # Then, any code marked with the "Other" token is delegated to the root + # lexer. + # + name = 'IPython Traceback' + aliases = ['ipythontb'] + + def __init__(self, **options): + """ + A subclass of `DelegatingLexer` which delegates to the appropriate to either IPyLexer, + IPythonPartialTracebackLexer. + """ + # note we need a __init__ doc, as otherwise it inherits the doc from the super class + # which will fail the documentation build as it references section of the pygments docs that + # do not exists when building IPython's docs. + self.python3 = get_bool_opt(options, 'python3', False) + if self.python3: + self.aliases = ['ipython3tb'] + else: + self.aliases = ['ipython2tb', 'ipythontb'] + + if self.python3: + IPyLexer = IPython3Lexer + else: + IPyLexer = IPythonLexer + + DelegatingLexer.__init__(self, IPyLexer, + IPythonPartialTracebackLexer, **options) + +class IPythonConsoleLexer(Lexer): + """ + An IPython console lexer for IPython code-blocks and doctests, such as: + + .. code-block:: rst + + .. code-block:: ipythonconsole + + In [1]: a = 'foo' + + In [2]: a + Out[2]: 'foo' + + In [3]: print(a) + foo + + + Support is also provided for IPython exceptions: + + .. code-block:: rst + + .. code-block:: ipythonconsole + + In [1]: raise Exception + Traceback (most recent call last): + ... + Exception + + """ + name = 'IPython console session' + aliases = ['ipythonconsole'] + mimetypes = ['text/x-ipython-console'] + + # The regexps used to determine what is input and what is output. + # The default prompts for IPython are: + # + # in = 'In [#]: ' + # continuation = ' .D.: ' + # template = 'Out[#]: ' + # + # Where '#' is the 'prompt number' or 'execution count' and 'D' + # D is a number of dots matching the width of the execution count + # + in1_regex = r'In \[[0-9]+\]: ' + in2_regex = r' \.\.+\.: ' + out_regex = r'Out\[[0-9]+\]: ' + + #: The regex to determine when a traceback starts. + ipytb_start = re.compile(r'^(\^C)?(-+\n)|^( File)(.*)(, line )(\d+\n)') + + def __init__(self, **options): + """Initialize the IPython console lexer. + + Parameters + ---------- + python3 : bool + If `True`, then the console inputs are parsed using a Python 3 + lexer. Otherwise, they are parsed using a Python 2 lexer. + in1_regex : RegexObject + The compiled regular expression used to detect the start + of inputs. Although the IPython configuration setting may have a + trailing whitespace, do not include it in the regex. If `None`, + then the default input prompt is assumed. + in2_regex : RegexObject + The compiled regular expression used to detect the continuation + of inputs. Although the IPython configuration setting may have a + trailing whitespace, do not include it in the regex. If `None`, + then the default input prompt is assumed. + out_regex : RegexObject + The compiled regular expression used to detect outputs. If `None`, + then the default output prompt is assumed. + + """ + self.python3 = get_bool_opt(options, 'python3', False) + if self.python3: + self.aliases = ['ipython3console'] + else: + self.aliases = ['ipython2console', 'ipythonconsole'] + + in1_regex = options.get('in1_regex', self.in1_regex) + in2_regex = options.get('in2_regex', self.in2_regex) + out_regex = options.get('out_regex', self.out_regex) + + # So that we can work with input and output prompts which have been + # rstrip'd (possibly by editors) we also need rstrip'd variants. If + # we do not do this, then such prompts will be tagged as 'output'. + # The reason can't just use the rstrip'd variants instead is because + # we want any whitespace associated with the prompt to be inserted + # with the token. This allows formatted code to be modified so as hide + # the appearance of prompts, with the whitespace included. One example + # use of this is in copybutton.js from the standard lib Python docs. + in1_regex_rstrip = in1_regex.rstrip() + '\n' + in2_regex_rstrip = in2_regex.rstrip() + '\n' + out_regex_rstrip = out_regex.rstrip() + '\n' + + # Compile and save them all. + attrs = ['in1_regex', 'in2_regex', 'out_regex', + 'in1_regex_rstrip', 'in2_regex_rstrip', 'out_regex_rstrip'] + for attr in attrs: + self.__setattr__(attr, re.compile(locals()[attr])) + + Lexer.__init__(self, **options) + + if self.python3: + pylexer = IPython3Lexer + tblexer = IPythonTracebackLexer + else: + pylexer = IPythonLexer + tblexer = IPythonTracebackLexer + + self.pylexer = pylexer(**options) + self.tblexer = tblexer(**options) + + self.reset() + + def reset(self): + self.mode = 'output' + self.index = 0 + self.buffer = u'' + self.insertions = [] + + def buffered_tokens(self): + """ + Generator of unprocessed tokens after doing insertions and before + changing to a new state. + + """ + if self.mode == 'output': + tokens = [(0, Generic.Output, self.buffer)] + elif self.mode == 'input': + tokens = self.pylexer.get_tokens_unprocessed(self.buffer) + else: # traceback + tokens = self.tblexer.get_tokens_unprocessed(self.buffer) + + for i, t, v in do_insertions(self.insertions, tokens): + # All token indexes are relative to the buffer. + yield self.index + i, t, v + + # Clear it all + self.index += len(self.buffer) + self.buffer = u'' + self.insertions = [] + + def get_mci(self, line): + """ + Parses the line and returns a 3-tuple: (mode, code, insertion). + + `mode` is the next mode (or state) of the lexer, and is always equal + to 'input', 'output', or 'tb'. + + `code` is a portion of the line that should be added to the buffer + corresponding to the next mode and eventually lexed by another lexer. + For example, `code` could be Python code if `mode` were 'input'. + + `insertion` is a 3-tuple (index, token, text) representing an + unprocessed "token" that will be inserted into the stream of tokens + that are created from the buffer once we change modes. This is usually + the input or output prompt. + + In general, the next mode depends on current mode and on the contents + of `line`. + + """ + # To reduce the number of regex match checks, we have multiple + # 'if' blocks instead of 'if-elif' blocks. + + # Check for possible end of input + in2_match = self.in2_regex.match(line) + in2_match_rstrip = self.in2_regex_rstrip.match(line) + if (in2_match and in2_match.group().rstrip() == line.rstrip()) or \ + in2_match_rstrip: + end_input = True + else: + end_input = False + if end_input and self.mode != 'tb': + # Only look for an end of input when not in tb mode. + # An ellipsis could appear within the traceback. + mode = 'output' + code = u'' + insertion = (0, Generic.Prompt, line) + return mode, code, insertion + + # Check for output prompt + out_match = self.out_regex.match(line) + out_match_rstrip = self.out_regex_rstrip.match(line) + if out_match or out_match_rstrip: + mode = 'output' + if out_match: + idx = out_match.end() + else: + idx = out_match_rstrip.end() + code = line[idx:] + # Use the 'heading' token for output. We cannot use Generic.Error + # since it would conflict with exceptions. + insertion = (0, Generic.Heading, line[:idx]) + return mode, code, insertion + + + # Check for input or continuation prompt (non stripped version) + in1_match = self.in1_regex.match(line) + if in1_match or (in2_match and self.mode != 'tb'): + # New input or when not in tb, continued input. + # We do not check for continued input when in tb since it is + # allowable to replace a long stack with an ellipsis. + mode = 'input' + if in1_match: + idx = in1_match.end() + else: # in2_match + idx = in2_match.end() + code = line[idx:] + insertion = (0, Generic.Prompt, line[:idx]) + return mode, code, insertion + + # Check for input or continuation prompt (stripped version) + in1_match_rstrip = self.in1_regex_rstrip.match(line) + if in1_match_rstrip or (in2_match_rstrip and self.mode != 'tb'): + # New input or when not in tb, continued input. + # We do not check for continued input when in tb since it is + # allowable to replace a long stack with an ellipsis. + mode = 'input' + if in1_match_rstrip: + idx = in1_match_rstrip.end() + else: # in2_match + idx = in2_match_rstrip.end() + code = line[idx:] + insertion = (0, Generic.Prompt, line[:idx]) + return mode, code, insertion + + # Check for traceback + if self.ipytb_start.match(line): + mode = 'tb' + code = line + insertion = None + return mode, code, insertion + + # All other stuff... + if self.mode in ('input', 'output'): + # We assume all other text is output. Multiline input that + # does not use the continuation marker cannot be detected. + # For example, the 3 in the following is clearly output: + # + # In [1]: print(3) + # 3 + # + # But the following second line is part of the input: + # + # In [2]: while True: + # print(True) + # + # In both cases, the 2nd line will be 'output'. + # + mode = 'output' + else: + mode = 'tb' + + code = line + insertion = None + + return mode, code, insertion + + def get_tokens_unprocessed(self, text): + self.reset() + for match in line_re.finditer(text): + line = match.group() + mode, code, insertion = self.get_mci(line) + + if mode != self.mode: + # Yield buffered tokens before transitioning to new mode. + for token in self.buffered_tokens(): + yield token + self.mode = mode + + if insertion: + self.insertions.append((len(self.buffer), [insertion])) + self.buffer += code + + for token in self.buffered_tokens(): + yield token + +class IPyLexer(Lexer): + r""" + Primary lexer for all IPython-like code. + + This is a simple helper lexer. If the first line of the text begins with + "In \[[0-9]+\]:", then the entire text is parsed with an IPython console + lexer. If not, then the entire text is parsed with an IPython lexer. + + The goal is to reduce the number of lexers that are registered + with Pygments. + + """ + name = 'IPy session' + aliases = ['ipy'] + + def __init__(self, **options): + """ + Create a new IPyLexer instance which dispatch to either an + IPythonCOnsoleLexer (if In prompts are present) or and IPythonLexer (if + In prompts are not present). + """ + # init docstring is necessary for docs not to fail to build do to parent + # docs referenceing a section in pygments docs. + self.python3 = get_bool_opt(options, 'python3', False) + if self.python3: + self.aliases = ['ipy3'] + else: + self.aliases = ['ipy2', 'ipy'] + + Lexer.__init__(self, **options) + + self.IPythonLexer = IPythonLexer(**options) + self.IPythonConsoleLexer = IPythonConsoleLexer(**options) + + def get_tokens_unprocessed(self, text): + # Search for the input prompt anywhere...this allows code blocks to + # begin with comments as well. + if re.match(r'.*(In \[[0-9]+\]:)', text.strip(), re.DOTALL): + lex = self.IPythonConsoleLexer + else: + lex = self.IPythonLexer + for token in lex.get_tokens_unprocessed(text): + yield token + diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py b/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py new file mode 100644 index 0000000..a232e4e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py @@ -0,0 +1,961 @@ +""" +Python advanced pretty printer. This pretty printer is intended to +replace the old `pprint` python module which does not allow developers +to provide their own pretty print callbacks. + +This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`. + + +Example Usage +------------- + +To directly print the representation of an object use `pprint`:: + + from pretty import pprint + pprint(complex_object) + +To get a string of the output use `pretty`:: + + from pretty import pretty + string = pretty(complex_object) + + +Extending +--------- + +The pretty library allows developers to add pretty printing rules for their +own objects. This process is straightforward. All you have to do is to +add a `_repr_pretty_` method to your object and call the methods on the +pretty printer passed:: + + class MyObject(object): + + def _repr_pretty_(self, p, cycle): + ... + +Here's an example for a class with a simple constructor:: + + class MySimpleObject: + + def __init__(self, a, b, *, c=None): + self.a = a + self.b = b + self.c = c + + def _repr_pretty_(self, p, cycle): + ctor = CallExpression.factory(self.__class__.__name__) + if self.c is None: + p.pretty(ctor(a, b)) + else: + p.pretty(ctor(a, b, c=c)) + +Here is an example implementation of a `_repr_pretty_` method for a list +subclass:: + + class MyList(list): + + def _repr_pretty_(self, p, cycle): + if cycle: + p.text('MyList(...)') + else: + with p.group(8, 'MyList([', '])'): + for idx, item in enumerate(self): + if idx: + p.text(',') + p.breakable() + p.pretty(item) + +The `cycle` parameter is `True` if pretty detected a cycle. You *have* to +react to that or the result is an infinite loop. `p.text()` just adds +non breaking text to the output, `p.breakable()` either adds a whitespace +or breaks here. If you pass it an argument it's used instead of the +default space. `p.pretty` prettyprints another object using the pretty print +method. + +The first parameter to the `group` function specifies the extra indentation +of the next line. In this example the next item will either be on the same +line (if the items are short enough) or aligned with the right edge of the +opening bracket of `MyList`. + +If you just want to indent something you can use the group function +without open / close parameters. You can also use this code:: + + with p.indent(2): + ... + +Inheritance diagram: + +.. inheritance-diagram:: IPython.lib.pretty + :parts: 3 + +:copyright: 2007 by Armin Ronacher. + Portions (c) 2009 by Robert Kern. +:license: BSD License. +""" + +from contextlib import contextmanager +import datetime +import os +import re +import sys +import types +from collections import deque +from inspect import signature +from io import StringIO +from warnings import warn + +from IPython.utils.decorators import undoc +from IPython.utils.py3compat import PYPY + +from typing import Dict + +__all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter', + 'for_type', 'for_type_by_name', 'RawText', 'RawStringLiteral', 'CallExpression'] + + +MAX_SEQ_LENGTH = 1000 +_re_pattern_type = type(re.compile('')) + +def _safe_getattr(obj, attr, default=None): + """Safe version of getattr. + + Same as getattr, but will return ``default`` on any Exception, + rather than raising. + """ + try: + return getattr(obj, attr, default) + except Exception: + return default + +@undoc +class CUnicodeIO(StringIO): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + warn(("CUnicodeIO is deprecated since IPython 6.0. " + "Please use io.StringIO instead."), + DeprecationWarning, stacklevel=2) + +def _sorted_for_pprint(items): + """ + Sort the given items for pretty printing. Since some predictable + sorting is better than no sorting at all, we sort on the string + representation if normal sorting fails. + """ + items = list(items) + try: + return sorted(items) + except Exception: + try: + return sorted(items, key=str) + except Exception: + return items + +def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): + """ + Pretty print the object's representation. + """ + stream = StringIO() + printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length=max_seq_length) + printer.pretty(obj) + printer.flush() + return stream.getvalue() + + +def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): + """ + Like `pretty` but print to stdout. + """ + printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length=max_seq_length) + printer.pretty(obj) + printer.flush() + sys.stdout.write(newline) + sys.stdout.flush() + +class _PrettyPrinterBase(object): + + @contextmanager + def indent(self, indent): + """with statement support for indenting/dedenting.""" + self.indentation += indent + try: + yield + finally: + self.indentation -= indent + + @contextmanager + def group(self, indent=0, open='', close=''): + """like begin_group / end_group but for the with statement.""" + self.begin_group(indent, open) + try: + yield + finally: + self.end_group(indent, close) + +class PrettyPrinter(_PrettyPrinterBase): + """ + Baseclass for the `RepresentationPrinter` prettyprinter that is used to + generate pretty reprs of objects. Contrary to the `RepresentationPrinter` + this printer knows nothing about the default pprinters or the `_repr_pretty_` + callback method. + """ + + def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): + self.output = output + self.max_width = max_width + self.newline = newline + self.max_seq_length = max_seq_length + self.output_width = 0 + self.buffer_width = 0 + self.buffer = deque() + + root_group = Group(0) + self.group_stack = [root_group] + self.group_queue = GroupQueue(root_group) + self.indentation = 0 + + def _break_one_group(self, group): + while group.breakables: + x = self.buffer.popleft() + self.output_width = x.output(self.output, self.output_width) + self.buffer_width -= x.width + while self.buffer and isinstance(self.buffer[0], Text): + x = self.buffer.popleft() + self.output_width = x.output(self.output, self.output_width) + self.buffer_width -= x.width + + def _break_outer_groups(self): + while self.max_width < self.output_width + self.buffer_width: + group = self.group_queue.deq() + if not group: + return + self._break_one_group(group) + + def text(self, obj): + """Add literal text to the output.""" + width = len(obj) + if self.buffer: + text = self.buffer[-1] + if not isinstance(text, Text): + text = Text() + self.buffer.append(text) + text.add(obj, width) + self.buffer_width += width + self._break_outer_groups() + else: + self.output.write(obj) + self.output_width += width + + def breakable(self, sep=' '): + """ + Add a breakable separator to the output. This does not mean that it + will automatically break here. If no breaking on this position takes + place the `sep` is inserted which default to one space. + """ + width = len(sep) + group = self.group_stack[-1] + if group.want_break: + self.flush() + self.output.write(self.newline) + self.output.write(' ' * self.indentation) + self.output_width = self.indentation + self.buffer_width = 0 + else: + self.buffer.append(Breakable(sep, width, self)) + self.buffer_width += width + self._break_outer_groups() + + def break_(self): + """ + Explicitly insert a newline into the output, maintaining correct indentation. + """ + group = self.group_queue.deq() + if group: + self._break_one_group(group) + self.flush() + self.output.write(self.newline) + self.output.write(' ' * self.indentation) + self.output_width = self.indentation + self.buffer_width = 0 + + + def begin_group(self, indent=0, open=''): + """ + Begin a group. + The first parameter specifies the indentation for the next line (usually + the width of the opening text), the second the opening text. All + parameters are optional. + """ + if open: + self.text(open) + group = Group(self.group_stack[-1].depth + 1) + self.group_stack.append(group) + self.group_queue.enq(group) + self.indentation += indent + + def _enumerate(self, seq): + """like enumerate, but with an upper limit on the number of items""" + for idx, x in enumerate(seq): + if self.max_seq_length and idx >= self.max_seq_length: + self.text(',') + self.breakable() + self.text('...') + return + yield idx, x + + def end_group(self, dedent=0, close=''): + """End a group. See `begin_group` for more details.""" + self.indentation -= dedent + group = self.group_stack.pop() + if not group.breakables: + self.group_queue.remove(group) + if close: + self.text(close) + + def flush(self): + """Flush data that is left in the buffer.""" + for data in self.buffer: + self.output_width += data.output(self.output, self.output_width) + self.buffer.clear() + self.buffer_width = 0 + + +def _get_mro(obj_class): + """ Get a reasonable method resolution order of a class and its superclasses + for both old-style and new-style classes. + """ + if not hasattr(obj_class, '__mro__'): + # Old-style class. Mix in object to make a fake new-style class. + try: + obj_class = type(obj_class.__name__, (obj_class, object), {}) + except TypeError: + # Old-style extension type that does not descend from object. + # FIXME: try to construct a more thorough MRO. + mro = [obj_class] + else: + mro = obj_class.__mro__[1:-1] + else: + mro = obj_class.__mro__ + return mro + + +class RepresentationPrinter(PrettyPrinter): + """ + Special pretty printer that has a `pretty` method that calls the pretty + printer for a python object. + + This class stores processing data on `self` so you must *never* use + this class in a threaded environment. Always lock it or reinstanciate + it. + + Instances also have a verbose flag callbacks can access to control their + output. For example the default instance repr prints all attributes and + methods that are not prefixed by an underscore if the printer is in + verbose mode. + """ + + def __init__(self, output, verbose=False, max_width=79, newline='\n', + singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None, + max_seq_length=MAX_SEQ_LENGTH): + + PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length) + self.verbose = verbose + self.stack = [] + if singleton_pprinters is None: + singleton_pprinters = _singleton_pprinters.copy() + self.singleton_pprinters = singleton_pprinters + if type_pprinters is None: + type_pprinters = _type_pprinters.copy() + self.type_pprinters = type_pprinters + if deferred_pprinters is None: + deferred_pprinters = _deferred_type_pprinters.copy() + self.deferred_pprinters = deferred_pprinters + + def pretty(self, obj): + """Pretty print the given object.""" + obj_id = id(obj) + cycle = obj_id in self.stack + self.stack.append(obj_id) + self.begin_group() + try: + obj_class = _safe_getattr(obj, '__class__', None) or type(obj) + # First try to find registered singleton printers for the type. + try: + printer = self.singleton_pprinters[obj_id] + except (TypeError, KeyError): + pass + else: + return printer(obj, self, cycle) + # Next walk the mro and check for either: + # 1) a registered printer + # 2) a _repr_pretty_ method + for cls in _get_mro(obj_class): + if cls in self.type_pprinters: + # printer registered in self.type_pprinters + return self.type_pprinters[cls](obj, self, cycle) + else: + # deferred printer + printer = self._in_deferred_types(cls) + if printer is not None: + return printer(obj, self, cycle) + else: + # Finally look for special method names. + # Some objects automatically create any requested + # attribute. Try to ignore most of them by checking for + # callability. + if '_repr_pretty_' in cls.__dict__: + meth = cls._repr_pretty_ + if callable(meth): + return meth(obj, self, cycle) + if ( + cls is not object + # check if cls defines __repr__ + and "__repr__" in cls.__dict__ + # check if __repr__ is callable. + # Note: we need to test getattr(cls, '__repr__') + # instead of cls.__dict__['__repr__'] + # in order to work with descriptors like partialmethod, + and callable(_safe_getattr(cls, "__repr__", None)) + ): + return _repr_pprint(obj, self, cycle) + + return _default_pprint(obj, self, cycle) + finally: + self.end_group() + self.stack.pop() + + def _in_deferred_types(self, cls): + """ + Check if the given class is specified in the deferred type registry. + + Returns the printer from the registry if it exists, and None if the + class is not in the registry. Successful matches will be moved to the + regular type registry for future use. + """ + mod = _safe_getattr(cls, '__module__', None) + name = _safe_getattr(cls, '__name__', None) + key = (mod, name) + printer = None + if key in self.deferred_pprinters: + # Move the printer over to the regular registry. + printer = self.deferred_pprinters.pop(key) + self.type_pprinters[cls] = printer + return printer + + +class Printable(object): + + def output(self, stream, output_width): + return output_width + + +class Text(Printable): + + def __init__(self): + self.objs = [] + self.width = 0 + + def output(self, stream, output_width): + for obj in self.objs: + stream.write(obj) + return output_width + self.width + + def add(self, obj, width): + self.objs.append(obj) + self.width += width + + +class Breakable(Printable): + + def __init__(self, seq, width, pretty): + self.obj = seq + self.width = width + self.pretty = pretty + self.indentation = pretty.indentation + self.group = pretty.group_stack[-1] + self.group.breakables.append(self) + + def output(self, stream, output_width): + self.group.breakables.popleft() + if self.group.want_break: + stream.write(self.pretty.newline) + stream.write(' ' * self.indentation) + return self.indentation + if not self.group.breakables: + self.pretty.group_queue.remove(self.group) + stream.write(self.obj) + return output_width + self.width + + +class Group(Printable): + + def __init__(self, depth): + self.depth = depth + self.breakables = deque() + self.want_break = False + + +class GroupQueue(object): + + def __init__(self, *groups): + self.queue = [] + for group in groups: + self.enq(group) + + def enq(self, group): + depth = group.depth + while depth > len(self.queue) - 1: + self.queue.append([]) + self.queue[depth].append(group) + + def deq(self): + for stack in self.queue: + for idx, group in enumerate(reversed(stack)): + if group.breakables: + del stack[idx] + group.want_break = True + return group + for group in stack: + group.want_break = True + del stack[:] + + def remove(self, group): + try: + self.queue[group.depth].remove(group) + except ValueError: + pass + + +class RawText: + """ Object such that ``p.pretty(RawText(value))`` is the same as ``p.text(value)``. + + An example usage of this would be to show a list as binary numbers, using + ``p.pretty([RawText(bin(i)) for i in integers])``. + """ + def __init__(self, value): + self.value = value + + def _repr_pretty_(self, p, cycle): + p.text(self.value) + + +class CallExpression: + """ Object which emits a line-wrapped call expression in the form `__name(*args, **kwargs)` """ + def __init__(__self, __name, *args, **kwargs): + # dunders are to avoid clashes with kwargs, as python's name managing + # will kick in. + self = __self + self.name = __name + self.args = args + self.kwargs = kwargs + + @classmethod + def factory(cls, name): + def inner(*args, **kwargs): + return cls(name, *args, **kwargs) + return inner + + def _repr_pretty_(self, p, cycle): + # dunders are to avoid clashes with kwargs, as python's name managing + # will kick in. + + started = False + def new_item(): + nonlocal started + if started: + p.text(",") + p.breakable() + started = True + + prefix = self.name + "(" + with p.group(len(prefix), prefix, ")"): + for arg in self.args: + new_item() + p.pretty(arg) + for arg_name, arg in self.kwargs.items(): + new_item() + arg_prefix = arg_name + "=" + with p.group(len(arg_prefix), arg_prefix): + p.pretty(arg) + + +class RawStringLiteral: + """ Wrapper that shows a string with a `r` prefix """ + def __init__(self, value): + self.value = value + + def _repr_pretty_(self, p, cycle): + base_repr = repr(self.value) + if base_repr[:1] in 'uU': + base_repr = base_repr[1:] + prefix = 'ur' + else: + prefix = 'r' + base_repr = prefix + base_repr.replace('\\\\', '\\') + p.text(base_repr) + + +def _default_pprint(obj, p, cycle): + """ + The default print function. Used if an object does not provide one and + it's none of the builtin objects. + """ + klass = _safe_getattr(obj, '__class__', None) or type(obj) + if _safe_getattr(klass, '__repr__', None) is not object.__repr__: + # A user-provided repr. Find newlines and replace them with p.break_() + _repr_pprint(obj, p, cycle) + return + p.begin_group(1, '<') + p.pretty(klass) + p.text(' at 0x%x' % id(obj)) + if cycle: + p.text(' ...') + elif p.verbose: + first = True + for key in dir(obj): + if not key.startswith('_'): + try: + value = getattr(obj, key) + except AttributeError: + continue + if isinstance(value, types.MethodType): + continue + if not first: + p.text(',') + p.breakable() + p.text(key) + p.text('=') + step = len(key) + 1 + p.indentation += step + p.pretty(value) + p.indentation -= step + first = False + p.end_group(1, '>') + + +def _seq_pprinter_factory(start, end): + """ + Factory that returns a pprint function useful for sequences. Used by + the default pprint for tuples and lists. + """ + def inner(obj, p, cycle): + if cycle: + return p.text(start + '...' + end) + step = len(start) + p.begin_group(step, start) + for idx, x in p._enumerate(obj): + if idx: + p.text(',') + p.breakable() + p.pretty(x) + if len(obj) == 1 and isinstance(obj, tuple): + # Special case for 1-item tuples. + p.text(',') + p.end_group(step, end) + return inner + + +def _set_pprinter_factory(start, end): + """ + Factory that returns a pprint function useful for sets and frozensets. + """ + def inner(obj, p, cycle): + if cycle: + return p.text(start + '...' + end) + if len(obj) == 0: + # Special case. + p.text(type(obj).__name__ + '()') + else: + step = len(start) + p.begin_group(step, start) + # Like dictionary keys, we will try to sort the items if there aren't too many + if not (p.max_seq_length and len(obj) >= p.max_seq_length): + items = _sorted_for_pprint(obj) + else: + items = obj + for idx, x in p._enumerate(items): + if idx: + p.text(',') + p.breakable() + p.pretty(x) + p.end_group(step, end) + return inner + + +def _dict_pprinter_factory(start, end): + """ + Factory that returns a pprint function used by the default pprint of + dicts and dict proxies. + """ + def inner(obj, p, cycle): + if cycle: + return p.text('{...}') + step = len(start) + p.begin_group(step, start) + keys = obj.keys() + for idx, key in p._enumerate(keys): + if idx: + p.text(',') + p.breakable() + p.pretty(key) + p.text(': ') + p.pretty(obj[key]) + p.end_group(step, end) + return inner + + +def _super_pprint(obj, p, cycle): + """The pprint for the super type.""" + p.begin_group(8, '') + + + +class _ReFlags: + def __init__(self, value): + self.value = value + + def _repr_pretty_(self, p, cycle): + done_one = False + for flag in ( + "IGNORECASE", + "LOCALE", + "MULTILINE", + "DOTALL", + "UNICODE", + "VERBOSE", + "DEBUG", + ): + if self.value & getattr(re, flag): + if done_one: + p.text('|') + p.text('re.' + flag) + done_one = True + + +def _re_pattern_pprint(obj, p, cycle): + """The pprint function for regular expression patterns.""" + re_compile = CallExpression.factory('re.compile') + if obj.flags: + p.pretty(re_compile(RawStringLiteral(obj.pattern), _ReFlags(obj.flags))) + else: + p.pretty(re_compile(RawStringLiteral(obj.pattern))) + + +def _types_simplenamespace_pprint(obj, p, cycle): + """The pprint function for types.SimpleNamespace.""" + namespace = CallExpression.factory('namespace') + if cycle: + p.pretty(namespace(RawText("..."))) + else: + p.pretty(namespace(**obj.__dict__)) + + +def _type_pprint(obj, p, cycle): + """The pprint for classes and types.""" + # Heap allocated types might not have the module attribute, + # and others may set it to None. + + # Checks for a __repr__ override in the metaclass. Can't compare the + # type(obj).__repr__ directly because in PyPy the representation function + # inherited from type isn't the same type.__repr__ + if [m for m in _get_mro(type(obj)) if "__repr__" in vars(m)][:1] != [type]: + _repr_pprint(obj, p, cycle) + return + + mod = _safe_getattr(obj, '__module__', None) + try: + name = obj.__qualname__ + if not isinstance(name, str): + # This can happen if the type implements __qualname__ as a property + # or other descriptor in Python 2. + raise Exception("Try __name__") + except Exception: + name = obj.__name__ + if not isinstance(name, str): + name = '' + + if mod in (None, '__builtin__', 'builtins', 'exceptions'): + p.text(name) + else: + p.text(mod + '.' + name) + + +def _repr_pprint(obj, p, cycle): + """A pprint that just redirects to the normal repr function.""" + # Find newlines and replace them with p.break_() + output = repr(obj) + lines = output.splitlines() + with p.group(): + for idx, output_line in enumerate(lines): + if idx: + p.break_() + p.text(output_line) + + +def _function_pprint(obj, p, cycle): + """Base pprint for all functions and builtin functions.""" + name = _safe_getattr(obj, '__qualname__', obj.__name__) + mod = obj.__module__ + if mod and mod not in ('__builtin__', 'builtins', 'exceptions'): + name = mod + '.' + name + try: + func_def = name + str(signature(obj)) + except ValueError: + func_def = name + p.text('' % func_def) + + +def _exception_pprint(obj, p, cycle): + """Base pprint for all exceptions.""" + name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__) + if obj.__class__.__module__ not in ('exceptions', 'builtins'): + name = '%s.%s' % (obj.__class__.__module__, name) + + p.pretty(CallExpression(name, *getattr(obj, 'args', ()))) + + +#: the exception base +_exception_base: type +try: + _exception_base = BaseException +except NameError: + _exception_base = Exception + + +#: printers for builtin types +_type_pprinters = { + int: _repr_pprint, + float: _repr_pprint, + str: _repr_pprint, + tuple: _seq_pprinter_factory('(', ')'), + list: _seq_pprinter_factory('[', ']'), + dict: _dict_pprinter_factory('{', '}'), + set: _set_pprinter_factory('{', '}'), + frozenset: _set_pprinter_factory('frozenset({', '})'), + super: _super_pprint, + _re_pattern_type: _re_pattern_pprint, + type: _type_pprint, + types.FunctionType: _function_pprint, + types.BuiltinFunctionType: _function_pprint, + types.MethodType: _repr_pprint, + types.SimpleNamespace: _types_simplenamespace_pprint, + datetime.datetime: _repr_pprint, + datetime.timedelta: _repr_pprint, + _exception_base: _exception_pprint +} + +# render os.environ like a dict +_env_type = type(os.environ) +# future-proof in case os.environ becomes a plain dict? +if _env_type is not dict: + _type_pprinters[_env_type] = _dict_pprinter_factory('environ{', '}') + +_type_pprinters[types.MappingProxyType] = _dict_pprinter_factory("mappingproxy({", "})") +_type_pprinters[slice] = _repr_pprint + +_type_pprinters[range] = _repr_pprint +_type_pprinters[bytes] = _repr_pprint + +#: printers for types specified by name +_deferred_type_pprinters: Dict = {} + + +def for_type(typ, func): + """ + Add a pretty printer for a given type. + """ + oldfunc = _type_pprinters.get(typ, None) + if func is not None: + # To support easy restoration of old pprinters, we need to ignore Nones. + _type_pprinters[typ] = func + return oldfunc + +def for_type_by_name(type_module, type_name, func): + """ + Add a pretty printer for a type specified by the module and name of a type + rather than the type object itself. + """ + key = (type_module, type_name) + oldfunc = _deferred_type_pprinters.get(key, None) + if func is not None: + # To support easy restoration of old pprinters, we need to ignore Nones. + _deferred_type_pprinters[key] = func + return oldfunc + + +#: printers for the default singletons +_singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis, + NotImplemented]), _repr_pprint) + + +def _defaultdict_pprint(obj, p, cycle): + cls_ctor = CallExpression.factory(obj.__class__.__name__) + if cycle: + p.pretty(cls_ctor(RawText("..."))) + else: + p.pretty(cls_ctor(obj.default_factory, dict(obj))) + +def _ordereddict_pprint(obj, p, cycle): + cls_ctor = CallExpression.factory(obj.__class__.__name__) + if cycle: + p.pretty(cls_ctor(RawText("..."))) + elif len(obj): + p.pretty(cls_ctor(list(obj.items()))) + else: + p.pretty(cls_ctor()) + +def _deque_pprint(obj, p, cycle): + cls_ctor = CallExpression.factory(obj.__class__.__name__) + if cycle: + p.pretty(cls_ctor(RawText("..."))) + elif obj.maxlen is not None: + p.pretty(cls_ctor(list(obj), maxlen=obj.maxlen)) + else: + p.pretty(cls_ctor(list(obj))) + +def _counter_pprint(obj, p, cycle): + cls_ctor = CallExpression.factory(obj.__class__.__name__) + if cycle: + p.pretty(cls_ctor(RawText("..."))) + elif len(obj): + p.pretty(cls_ctor(dict(obj.most_common()))) + else: + p.pretty(cls_ctor()) + + +def _userlist_pprint(obj, p, cycle): + cls_ctor = CallExpression.factory(obj.__class__.__name__) + if cycle: + p.pretty(cls_ctor(RawText("..."))) + else: + p.pretty(cls_ctor(obj.data)) + + +for_type_by_name('collections', 'defaultdict', _defaultdict_pprint) +for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint) +for_type_by_name('collections', 'deque', _deque_pprint) +for_type_by_name('collections', 'Counter', _counter_pprint) +for_type_by_name("collections", "UserList", _userlist_pprint) + +if __name__ == '__main__': + from random import randrange + class Foo(object): + def __init__(self): + self.foo = 1 + self.bar = re.compile(r'\s+') + self.blub = dict.fromkeys(range(30), randrange(1, 40)) + self.hehe = 23424.234234 + self.list = ["blub", "blah", self] + + def get_foo(self): + print("foo") + + pprint(Foo(), verbose=True) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__init__.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4eb612b7e4942f3c6d878a4cd3ff1c9a613bb60e GIT binary patch literal 193 zcmX@j%ge<81aX(=rGx0lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdm7pJ5oLW?@UkW7k zQ&P+HOHzwV3bKpgv|d?iUYUMQW|DqEWl2VUp0S>xk$!PzNvdu^Vsdt3dTO!0X8>3R xtO%sNSU)~KGcU6wK3=b&@)w6qZhlH>PO4oIE6_qlAT92tvun+) zlR9!Lw~EvT4&{K!oA14uAG*4t1n866*V#`&`UO84Bn86OH4yF*gG>>F8j?k)DD<)=&B;>=C5AE; zGDFkU2rbj84k2}b6gI-kWJ)zu;1MGNJZeONYb7bJEyg}Fxy$uwhv|iql}hWb<5*mu zbBv;8jz^#1uP5Ww>rSUKvsva8Z6oibd3Nm5z;8dle)K|y2Ajh!1nmH{V54qxu1w0b zEIp#DGO7`>B)fq`NM7;BT6vkQ2DX%xbNr|OQu+sd*Rsy zA%KEn zGKLX44voJEtU?}Z2k!UPj}6rOjy?@ZodcE2Pdi8`a(m+D#GUIuDt&eBK;_*nP$g}# zMkhq9uYz!oY{xp^fD4)g)EZA010u+vWwO{onz6n`AN!5IGh$c1Yg5AeF7Nxt*A{O zA4d!LCj+fXxF)u(Z-M=tzpH`S5-F2>)8AkaIv2e5se!X4 zTBdpQZU;410vyu3NYQo$gZ9IKi*5^=9RUZW337`8yA7t!A=KIO+FNHXx08vTZI1@OVnz$=P0qzlIlflYGWu z?n4PD(%hqYju>bhfQGP4`pPT@6E8#K=YdtouUgkn+R3VRvZf7JF4xu0yXuPi#gUrY zU%6OULbtEnys~_?u65o$vvTJ1iK=$un>W_A(W)}Krj71#MyDZr|BEwn5rcx@+?!|8 z7~4j=LATGT%?1&>gBl1iq-`5m{ooEY_}s=y+nRgrqh-yK99I^5ns~`Lw#yvr3D!Y| z$2l2~uov*77ugYHnE$K~m?vAN?L{)qT){G3(|}3{N$iEDts}muzdpJvDSUZy?bNjMoo)77+lwes>+Z*R$3{2cK-ec>sqX;#Oi*AFJIeDe@z?u zA3zZDR{9G7?FGsfAPWHX3jhV+(Vb}>fq(^w3lK3K{=Mu|bqhA{#=61^amb zMFfCwX@-~B1!#N@*uRROHf*hFvFG8Vz!tyH$%e zo4u-m+)`m^9G{%ayowKt7UfHj{MEd@M zfLKtm)LknULd**X#y-}th&>N8|K{?4#zsM90vf*oY$wn*R1)d(@2>kpH8obb=+~U` zO1Y*DJfQ2^U{x91tqwJBx&0b63Rk?-3n!C?lSwAUv&hqer{Fle7a79Pcm60!qEd?_ z!wZ;U(G{5^yn09kl*M!DnR?EDd!J|HpoG<*UjnuvQ%ZlAC{?y%gm(VXLFm{6~Jt`gE>{aQBtzL}|i=X@n3V&Ug literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_clipboard.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_clipboard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28869832599b3330d393babc105ef02c9b65c231 GIT binary patch literal 827 zcmYjP&ubGw6n?Xt&9Ck@AzFl7YN7}^WY;L72N6U(C>R9w&>ReDcA9SUW0#p}ngsMs6wLD zQx?|gNFZIl*YkpPzs219{Xm5BhIhT7>1{Lzesff-wdXIyE`g}ynSMmrgA53QBsTS> zEj6o3px-k73+7bSzXXv|*%u(vito?g;o3vkB_Uh_5${LlF9SohYY>7kRsGrB4vh3Q z*dY~CucV@-4i!x=2*sv9h>T6&@AAlME748NMp=)011?&FHjQ*H7?U!Y)QRgLEiN@) zoNYMIIAz?~Ms!>{bOhxh=<dfvKo`nBtJ?V7_qL90Ql-EDO!cOE>B=ZK4B z`)PA?F^(OCQ9&louH=Ml87D~M;dO*pFv(_&^09g0?V}@e^}t*`GOGt>_0V+Qkdr** zi|xzgX09GJyFpc&SWw0XQ#P;_G8)r_y;le^`c@HunW(!XeFi6%jm z+bhf`w%b0VHf79b@nWJCl|a4rV*Yq@QBmcj5^vD4U5f23;WN(UpAgIW1XHBIEQDG5 scHeimd-M)FkD=T*FC$EJLdY1djN$4SZcLJ(<$r4yDNl99*f}iw2V}L!B>(^b literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_deepreload.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_deepreload.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..166f7e9c5d52f49c3c72166be1308f1f5b01396e GIT binary patch literal 3022 zcmb7GO>7%Q6rS<^*=sva?2x3irrXleIxRM#NmL<{)+vodQA?465Efv$-c928XRXTOXdpqx&_fs&aB4}?cel{_zAasXK+~#qJm2n{Ekd9JF$GWG0Qy4~};3*0z0XKPK zN(7!*kcx6j<~*sO6ul`gr)8jhDV5Vo!Cwrd0ziA;MX8|fgT75yp$}C(F@J6Mm|;=P zs^qAljhjTHlZK`nMwu7|Gox!oQ?C?^_#e!+6ESRyCo^;s#_*U?ESn@ls?X(!k)h}&4{`>fv@^ESQuGf zlR!_KJ8O-utRAQ!%X199gZ1Eykmfg(NzrascB;pvS|febrS-O}Ay*gw4*y`)Lvf6{ zTIgdg<;F+%<@X}TGVq|&U2lzqTm5fQdcdm<*10EPw7LFfROo+?WYCSI@1Yy>pyyTj zany$_Jng~gRk*zvUBnmmpAlX~(|D7Ww#`>AeEv85gPZfKa+4oxuN~rA034oCHE3mEsAgUp(#A-|P*2pv5!hebm196cwWJE`1|#BTe!sS7+R!ot zFez6u_NasS`4 zWLu`ivYsQh+8i0I*?63vMc8$-1@qLDB?H9*p=oOqiI>4wD^YF z!_PVk$axms^=)1BMVHZ5X|Uea2=1squ^5cqLy!6f8(X56$3NM2?pUMak&9FH!G*5a zR|mfDUg}6LBOE-8e|YIud&it|Nx9K8ywrYZRbb4!o5_xBls&xEo@BBk_)ehn*Ffj8 zj3S+LdoS(%sQ28FMj&!ASr;x>ZU%NYBGJp)df%4^KR>t_+5e5W5b0kC^n-ZkmUGDq z&ow%_=c1RQpT70Y>q{L+?tw|YjrQ)#xPGKQaI-zej_AD`>00XEyBLXm_0rFg_(C9l ztGj28en`*1c;BhFB0XFqJN&}2TVPKAhyCYYc)$Q@Au_NK7`PD`SRH`ytO^h^9=BDQ zdCn|2jMr90<{F!fz@!I^VA1MbTipSBmRVfaT07UQJba1w1EV{Ix#(z@^j-MqQ_3}Y z3y{~ghmQ^^*ZPvZF!^z7XjD~x>`nH=g^bRli4#Aa{q7858qJPP|4YEs$ zt}+g1uURZ0-v*Mha7~tyAtlysE9tauX47c`PdKs_28n=X9FVyKwwFQ$Ii4#R9Iovy z2hQRk6>nh}M_9tX4!=3}Hdm}da|J8z){th28fRz|^BKbNOT;}SkFzPeGdvt?-e;Qu z9wvRjV{x()&@BrXc7qYhyIkKc<|4|Ak)9%6>yX*{0n27 BprHT& literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_display.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_display.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45479057d41125c0b3669a24d06b48a6ef4ea521 GIT binary patch literal 15423 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 KpMSTW1^EBe0Q(aF literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_editorhooks.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_editorhooks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..161d40dc1e8d7e4da5229d8888b5e758edb655f4 GIT binary patch literal 1733 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 K-y>XVKK}<-^ zBGqK+SKf zUtf=p{i^wde*ZvePbsUz(O))D-c!zVHttzYbe`wL5~<=nw1A$TN(OZS>XxbuXf=a+ z0QFk()-b3KP`?FQ%b=xzmPxfn4Rs7!4rqlXZ@p-j>O&3cw>h;%mB>?N$EpzvKQL{ z5Vndf2;0QP2!rAhgv;1SEX7E)O3RJ$ZfDRoK!cX?Ss^Y%i4K;w9BJ*Aw3Q6H0?-a= zrBTl+23-m0D#>^1gg#d0uaUEh)8bZy&xlVW+{V8448FEavPq8j1hqvy z+ZlX2;5&dvovL?;J5grmusygdwcwbPNG1ZkaXGN}@Nn{EJl4@4J<%~JOUdML$33bi z=uk>_#D`)@Nmjg~)Ege^Pm0kRjHVb1~1wDvIY2ojG-Q^D4mWh+yV;^Ps@Fp)2U0E-h#TTDVRw z!JoD9+*i;~f}FE|g*(d!OS)5D6%lP69UZ}YG)}1!4f2Q&KH}RIF6dN*q;w7x-Y3V0 z1{Jpy8yb-0FgSn+NO7N#rSR$SiGE3@J_a3fIf3~>#Ss~f^h*jKMeJm>Urf*l2k4P2 zD2qQNOM|jTAE8vWP7_vWBQhqwieQYp<1L@@`7i9A*gdu7L*K%WDk`tkU96j~nBIFW zk*!#MpDXb%zPo7o^_|~2aN|IB(Z&ayvtseZeN)d(JMPrg&(t@(<9y3Gow(|ysP`@J zH~b%|k!#zpmd#YxT-kGR&-9nRe(1g*XtelG7VCG_tz4Pf=-HbP{62wK*jq_c(Lls9{Vs49jErXtGnn|U~h9W1yrpz$TQXT zuN_oBMk&QVMoejbjD5(}9Y4r;zZ(paN6L9r{1i&d6l}oX9FfO)ZbopaA0>G4kE&X| z2*10wlk9~pk%L=9QGS3LAJ6fm0<8)Vl7aA;_drQ%EW*?nwK?xG)!1WduqeVWpq!lD z_lONs!m(#J1s?I6Qf|GoZE`IVf_9md1CvaOlPRIltwuX}8wD&Z%nu0C(GZ{3cjKS{u|2LEG3Fw^Hpxul_!P63wxBq=w0tQM=zr1`(27y!|J zioTNfh{E|Cn^!Nn)0kcAkQ7Ra4hlzYm|ECQLkA~p`?%NnVP~);wTNa-fk<4IrARUm zjft3Jgp<*D4DkT7858$NYo}bAW$8)T+C4dBN?jsd$ZVAT98Xe}JTkVN+}!tK?=>qD^U-q4mhUxlf8o=LY4isTP`( zU;<*auVZt6JQD6tZ0#^IJxArM5&WF{EL<#49vaQf);nVRRvxw0bFd|o; zm;iOjuM^5BkuT<+BfNz~V3(#|^8i(W96AxBiNSCZ^MY94roge2QXt1-45)S$n~JLz zC97dz2$Xh00(dAUB7&K^6iA}5EcIbdOcU?GAm-MHv7#cGqO7D$HfVRyrlPDBFE?!R z^Z1cpKwu>q#m|tTw@-c%>6CGf3XO3OJzPbdiiWpOX3JY?{1^T0kMPUp2q#a5lWb6m zj%YLyp#EW?$jt%r?+>4d_D7S$fiQ+NaXLCUh_q-gt1lMUhi^SPZww!^o_YYu8Mg*D zZk8HDk&{w{tP}ZVUHUx?tW2BVj4U*!4P|*e~SBkh90`Ref+=mMK@s|i70MV}FD(kN-xVT^%Gv$`C zeKX#g>E@f>wv5o0_O=zu17k4WM{!LlA*Md32tj#|Xgdw43{?~3MPZaTRZ}rnigoys zBtzMAih7;*jMz?j@<4bs2H!qn&l!A2(3#qlH~520AOz0F<`9yQ<|+0?00Be|n{sJ}l|VZ0+d19ih&VowYw z6yF(m)1U*PZ+heK{S6at6kl{;FfJ$KGVvJ`MT$T*!L8@j{0HPVkR^OgaT~QOPEBc$ zoF+-C`cIk}zSaJPs8=DQS0U<^oJ96X{3VVd7~^JLT-Cy{{U6V7zCFJ^Gr#?M>gN27 z8CQM!=_9jt&Qbl)3DI`Dyd_iKa&3RMeAU?AyZ)*R$0v?YZ+vI#TU)dKWn;T%ycJWS zo8HA4VR724Iw~Tl+;|Mi*$L3+u~E{XBm<++`=XVdNP9f?`GV8Kns z=+N{7s*y%Vap~oAXJ z)mcLh?HJ?r4^h?U(hiL*dvq(Lk2jZKidiC0YF3-|Vea7IxSU$;1@?^)bfnrJhY4s~ zhIS4fv9|_u%B=ocAJx#YVuY8FPEv86J<)I@@FU!_5d8`CzUxL@0FYtr&njhSj znzu6^YsDmnEYiSQIleP`CQ1T+7v)i{%6-U` zH{aEaNz|w!;x%OXL;NLZ#y!S;>@K^oU}C|oy0)x4c%S1P3-7v0FZd_?m-{Y7Z@B`W z*a7;4;4JacoEOD@w`m)1|32^7<|)ZxA8pk1MW7j<37o909C81CvDPtX{+FB!~%nbU^Q7!?-K?i5bDwtfP$WM1ib`0Z4*z|)@0ZQlIcMoCi#d6RsuWm(96bN+3X&&YP*Vq8l@{_> zsp~|ss&HTfK^|~mL6s4gN3w3LMe&YST|^9Air;cA zB@xj|BBGTgK9XNYshq*nDMxdO=}f|W*S4eEx@DU2*vE z#|`&iiQ+v56FhO4E#~L&yFp$56(9LJZ)K=cfaE_G2b`d%>1s#+B`cwr(`_V2B^9c# zQJX1kp7h%zHeJa*!PkwvvnYS=7d6G{1zHgf9lu+N(qF9(j8>TM-<0VzuqIs~)qO>Du(d zjkjEzFsmsopFB2hyKCmXUitQDwqiwI?mZv6_7)0TQe<}g&5;3Rr45q~Oub-Yz%m0i zs00;g&xo-_fgA|MD21)gXyh*nBG-uR2B0Zpwyf8LEdX}WAv&?SNXyMIThe{69LD$~ z-otE5IgI>|9D$7+H@3rXiq-z(P=rE1oM!S-B&m3G%85a^f^;12qGfCieTp4<*~+it zz-%korDIT=i;;+2P?aktScGY`>2{#}u#PN&Y5ad00|in+y}EB-KzHNl5yb z%4#_Bm0fmBNtb+C--2;o$I-&9Z~p(sQ67#|&I$rYj^xlFHpCdLRfr`!a;Q5gir`6= zhYU}wq9XFpO#IIlT$NT`-Zj1C(t&L0!ru@-eGgx=NXv|1vfk`yJ1=1|i4rA;rX08%=Mm zNG)o5=(ZSlipu3Z2KpXj_=q5e90i4S=z>i%7<1BZZ1;=28ZpJCS`&L?Sh+E*h#Z$k z6;nJzu@kf;6w$yVimIrXcC^TZM(koLsuu$ zEwqDNd5hx5N2XDM`H8AXVkgw*C{In8A@1$ z;FssQhl0zokAF}rIMzJyS%Zzg@Yx()strzsBKR{N!@{oz$h46QwvM_FO3CmJa+c;S zeUOWVk-;;pIC+iLr`UcFTHP~UHDrX3@KIjhWD7&v)~yKS#KtP9KwfBa7R02p*cj); zat4+_u{Xya=}*XPj!#6TagF>(h^H!yHez1P%KZx9!~z6BR$0}Bk%^J%9oMSgcU~L* z?z#`we77T8wk_@2R%ilH)vQ|qL}(EM;sUY!hZdJvvr~;P?)cKtV}}j~j_f*oB(VF? zk-&}v+m0R$EJ+*({;0XdXVR6{CabgPzeeUn1p;z`EWa*(Cwe2ADO;a*t!M2dml9#z z;trwC7o9@?Q%a!Vukgpb1L{`6?fe{O%o|japmfF0Q2PR$;MAZT3ZZdeW3dyFC+Bp7 ztMlFRgyz(e$Bb7_Gmh(PuH@X1&mgcmMO5w`pym=;s!p=+BNGlaaEWF_fOO3Zxh3ll zGN*gGX7f$&=8Uj8?cJ=R9r=uhL^12?KSAUTL0!EX;l3u&_U~~46l**06743H>wBO^ zc^hb3ccEY=Mzyf#^EK88XD$JLUO9_D8M;n{79$cg%VS>V=pORm%Rl&DEc%0Q#l;`o zh-fWgKSbE{F#iWu%d`&b)BXLn;Lu>AM*pZ_MNPtvPjV=UK;{<=yviVUH zzKVe5cUhIb>cma;BrW-@?-=`NaIAz&Q2oCIPgK>7?^ij2ZK45t{V7ryWvDeP{0{kt z0F@b~&U1fhPrcEZ3geeXfUi^?uX$l`vwKJ<$*UqZsRn!HHp_n-? z@}HrMmp=6sM5uwTnz3y&Uf9EDA%3 z0ahQ&%p81||B!xzHLBIm6vHvtC99B6anj}nNmM7xKDNdhQkP$mLqrah=E%*dRFUq} zQbT9uFt%05`fN;No_~*gsTGWQPJ|QDh-xsHJX)lNc|@aaC`UBvExo*CV)IOJMcUVV z%eVAyS!U0APP)S4FRZV62v`)ek9#&+K=t-f8lEK|Dd`nqgs z*VwZ&E$hafy)86?yRNRu2!R>F`$qR`-Iv$i5*jFe@U?^I56wV-geF2+f796RkFW&U z^KM(FX4y^evW&27#@lq;yCmaXa=kj^U6B!1q`fN&xs;?9+71eRr#A|9kp)HYzOD@rhTnxSKI9BM!$1x*X%m3vH1ZON;)R|0s7FXLm8-(qw}uFiAl2fM@bRAnj_A2RNhlIr6}+w`@cxA`cY%X=ylBV>#;BMm*Xc zcoo~}x>kJQC-qW6RUVZw)$r9;e6Mv=p!EyayrLB?T4=4^8YkLS8{KXNYkko^YE7X6 zqeSc^VU#j0DbyQ|VE@*z{0^X+(J7NhTj5X0|B+xK1&r`@vs0sd)f~49Jj>_gpP|@u zMEsW!A>yx^^n>{88^*TX5^C0Q@0r02C~-7B!B>Uo}@wcFe;@U!3>FvH5UYt@X~llE;&yPlf$moTm<|FyZo z(274qiyzMw`IK&Gza09e^*htX#e#=Jr|=@$4|)&UujDb>&#+;O`Ke4tV-fA=>X!c# z`jYZn4)M0->Oc|$Ob0GT#L$5l3YD#UZJHkRJh2{RCu~DjvWTlkh}q`l!Y%3pL?qSt zx~2-(U*o63(-oJW&s4A1wy2ku^Rj{*(FddsakihccId@6rV>dJt_oT;5g3q?uz8lk zVoBIHi=?h%N!V74q}9ce*07{C#gf*tq_xG8*0H2@#gf*ur1iy;Hn5}(#gaC%q>a#E zskYqlVBFsxumXwuN!QtB68@%+lm7y*c`B`tu`L*se~tpZgtK#qn2c?(F?h3Pa=~;N zG!VU5MVg&g%DA`bZ_d5{FW9th zb~yhxY|sV^3|jWpBG&A06FHdHY-#({b8o(qDQ*8$zC*-DtSkQ*L0CXWt?6Jc(@Z4( zG&q+y()warhe$C^L%f)FAzn0ubxo}4pDZab zILjvMrk1B&O?Ta;K+)AD*Mw_gwsHBbQfS$B7@VGlS$nm+adsJF&V^~$qS=-8j5)i0 zZRRBVni-t5Kjw;h`3dfU5N)PkL-$ZvkBb?q)owK%Md5wp1SXk?@N#lFFep;f5QXY> zz3{&Axq-$%Yb zpe_+vkkf>B_%A>E5OW+qO_eGp8>aTBU4gsq@~O@@=cntIrCrPKxGN!Tn$is&Y1c}Y zGHtu%o|j&*G40wk>vk~8_5IqEOKv4bx%<#A7=?IMpJH?}%0*!}5k2PahoN0kG(Dmf zWYI=3$`duteTblMM#Xt>Op7#fqG=K3FsDt$Tp?JowreZa@E_93GuEDq?6A@K3ai;Q z0<9w(Qzqt!u@P6HrDTvga3zRfnSMD&ok_1Y1YEJREF%VQjyUtDU)rj*9jn$bO+%=L zok&TQ4`Awz<3iYfd2YCkCSpr-A+(2UQy>>MirGwf5Yxt7FeA&>ZLNj|A;QDcdV(fl z+Y8}D&#gNO;Ud9z7Q!Wh?<$1%5`1?dypQ0|7Q#;wd`}@fO7Ojf@KXfeR|r2%@co7G zeu5t;gbxt>U?Dt4@a{r*oZyEF;e!M}TnK-K;LjDpWr80mgeM4ov=E*o__0Fx5W&Ax z2tPyc=L_Ly3I0MM{2al*TnJ~A^{*7dQKqH2?$X=t=8U^}Z2L@Y{n(*9RW(!bY}L}S12YXv#tuzw%LuhI4Q*QNJ|wws zeEVc=x}pVsuRCt<__2#!QztI18}H7N;NF#X?FRJSb+=nKW?DA>$hT=aJpSAif2HJN z$tCy1OE-O+vhJs5Z4I8qv-U>!5;(#@fp$vZAaq1(3*!6$e=b#TLe6b5<3S|L*HJOk0N6s|4TFwBq?ASRg+mD( zLrAi>)KAS~mP}h-G{K22t>F_9xS#q?Mo*pYABe>VUy&2Zp)+UC4X0Z3C(jyr2aE7?e?R-3xFKf%6YG*zZ;4SzwBfZT_g zBxuUGo5r^Pq^jo98dU-uxCQ=iggCe*)cwTmova=oO}iF=#V1Zoif=ZiYsis@*S9LK z_TFw7}t+`(B7WA;O7*WuX;H{ihUhyo{EC zhO}ED#CN;s5{PV5N49+B*xrw-7u>F1lBr%o3nbs&@x7K0qJPwpS+gh8zBgOFZ|tD9 z{BiZjJ3VjpWXsyYy5t1`l>w0Bh@2?+QmBZ1#Rg!b0pQc@0cP(wZ! zv-5#aDwp@@=o8s8q&mE!6Gu33hlJ?(oEi;F|BQ|p8?Fdo7dYbhE8W+qUIY<{_Xc{0 zVr+$xUH#IX3T)N^fx&npdJfl6oa~@`JKDnSfn|fitvQRHL`j$&aC0=Xp{)fnKg`qi zn(lkc07-e(lY@g{Y$sudXy}4R+yt3mYnoJAo5qz5NXP?;9q+{!`Cds|`PbW`Uz2D! zeDktH(dpOF-0@b;RMpIssRy%CO?f%n^slRuQazLe;xjtSXjMLjreQ8xhbGFTq^&Eo z+R3E6w#oI#_92&yq2)XSc^`S>ySG>Lrf5g&GfuT*o@YP0Or z(^>@AUf^_!j9b|TPGHXhy9I;!Vgph?fH7R|8J2N<2q}z!6pPR$Ep%x}4#r84GZH_* z8Uo^F?aB>`k@?$@Q05B0x%U6IO|*SOz*Z7__aol8ylN5^vYivEhq>q(y}I0f8hfey zL<}@e*ab4LnGWaQp4XL~*Y$_{|3vt3&8~FWZrFq>^XkJ&%{Q2rK1Q@$tY;?UnLX%* zp`~pI1Ie(KGq-qNqv;w%j3$nr>v>>az7y)f172^?nO%;)@T!nOo4|!LO#~>+#O-p1A%uu%Qj4| zVZ*|*6eqt*l(CW@PLbK!<%+m4@Tio`Ar)j*NrgsMJ2tBb1JRhIwkvOZ)a`PmtR4fG zxIkI;NdcE-HLP{TZLP7)L`$1|1tmNNQU=V%?6aZcI{J#niFf ziW0b>noDd%DY%H;b<_T=dnsma-q!cmeP_#!Egw{7mv7Fn{ivEOyjt^iUDmts+VeNP z%QM3Aw0AkfP;i&rjM@~h#SyK#0tr(xi5*oG5Nc&FH8n;tvR74mv>!3Wg^i0zatSJ4 z%O%CC{b7s7)s0=>qcSufkv&vTE5%k(u$BVqi~JM?jJ2Mo*e(k8Q9ySDuv?GVwLKu` zuzXtaV%%XXV;-G?Ig`TeCEr3e#cf<^!>*iRH;%AtGuV|7?A`(SHI~shcdnj^9jA|6 zpx`0}mne_x7<#n>^K!N=UfpoUc0d0yW%)h@e?|dq7Gs-5*rGXGU}LU)<_~3)ZDwaP zLy74u74M9H2%mW}=rF<16e&i^y6>1SNsLuVMW?9DW`yvhhvh$FO6RZ+hsm@&0kzJ<9tZdI*j@ z49@cn6vxj)C(pab&rsZrmHN7QW3F3V)kDF-*Ao;!4@*&GYMoJI)p#$(s~&iqeCvZs z7lK*@SRb^x-kA5=yxV+zhOeIy8tw=sKk=1K?z-cvncRQJS2k5KWuM%Gw<&BRQZp+bx=Q#3Qy2vNJgBtstq(oa<672ZwfB`;yp`{o zYP((8lBsNY$l>MTG2X#%m=b6hHry}gDjKI(X3Lk2`5!oK{FVnEA3yIwQyJg!VDUl( z`}hik%W4pGH6z%~dk{7*L+}zyYIE?N56VmVZvNq-5`N9p3)82mRcjuiRkhhp-t6-R4C3(-cb z5NpH>aRMyLVk}-(7U65KXa&!wDS&Hm73%5msUiQC-WpZW=Nc3ejMg*5n^3Y6&Z8}gj&fGQLw8C;EkKn-x zz+N56Hn>QGuRf?V)FrP=@0Y$1hXCiQ#2F_jakhy>>pOZY9w2)W?_TsnH;dsV#PxpmfDH=WvLv+W}}oqO{wQ`B5`tX;BJOBE)}0f4@f z3=e{fVHvr0$IHmqLqkwT(Qk(1zQI8}!a%YG|7tM#`j6)K=ELl4FFU)Feed_g+&3TI zoWEK6YVo(kTvwfYicF~JeP`sj>ZRC5n^`WigRFi&YyViJ><@1gg>8iVDp?0X&%)=V zLkzlkYN5)kRsBkpxmAQ1iN3OefbveU-Krt5D=T`r#nBknp9^3_dxbwp`4~DJ#v{g&Y(f73jAXm7&h!#9J$0s=nAt-!7-OF1 zcG|UOh09(%4Tpg#y@M~+#N+Zd^?$23HkeQj$2cgSO8~iCRj$bpRZhc8=PzBzFMOO| zEH33Qa_PiRNcsvPab{ZFA8 z`sh%4YvIP}FHY}DtqW1E<eC>;j5=3eZvC7`RMcpL|F%J(B58 z7~P{McgP2Qs*<-KrH}L#$*13Wp#1W#FaH^d??%ujQ_Pcpq}$Wo34BjTfbNdZpH!a% Docd|? literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test.wav b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test.wav new file mode 100644 index 0000000000000000000000000000000000000000..aa74fc5bd273a5ba80a7b677f1cf782e82f54613 GIT binary patch literal 44144 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py new file mode 100644 index 0000000..fc76ff1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py @@ -0,0 +1,85 @@ +"""Tests for pylab tools module. +""" +#----------------------------------------------------------------------------- +# Copyright (c) 2011, the IPython Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +# Stdlib imports +import time + +# Our own imports +from IPython.lib import backgroundjobs as bg + +#----------------------------------------------------------------------------- +# Globals and constants +#----------------------------------------------------------------------------- +t_short = 0.0001 # very short interval to wait on jobs + +#----------------------------------------------------------------------------- +# Local utilities +#----------------------------------------------------------------------------- +def sleeper(interval=t_short, *a, **kw): + args = dict(interval=interval, + other_args=a, + kw_args=kw) + time.sleep(interval) + return args + +def crasher(interval=t_short, *a, **kw): + time.sleep(interval) + raise Exception("Dead job with interval %s" % interval) + +#----------------------------------------------------------------------------- +# Classes and functions +#----------------------------------------------------------------------------- + +def test_result(): + """Test job submission and result retrieval""" + jobs = bg.BackgroundJobManager() + j = jobs.new(sleeper) + j.join() + assert j.result["interval"] == t_short + + +def test_flush(): + """Test job control""" + jobs = bg.BackgroundJobManager() + j = jobs.new(sleeper) + j.join() + assert len(jobs.completed) == 1 + assert len(jobs.dead) == 0 + jobs.flush() + assert len(jobs.completed) == 0 + + +def test_dead(): + """Test control of dead jobs""" + jobs = bg.BackgroundJobManager() + j = jobs.new(crasher) + j.join() + assert len(jobs.completed) == 0 + assert len(jobs.dead) == 1 + jobs.flush() + assert len(jobs.dead) == 0 + + +def test_longer(): + """Test control of longer-running jobs""" + jobs = bg.BackgroundJobManager() + # Sleep for long enough for the following two checks to still report the + # job as running, but not so long that it makes the test suite noticeably + # slower. + j = jobs.new(sleeper, 0.1) + assert len(jobs.running) == 1 + assert len(jobs.completed) == 0 + j.join() + assert len(jobs.running) == 0 + assert len(jobs.completed) == 1 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py new file mode 100644 index 0000000..6597c94 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py @@ -0,0 +1,20 @@ +from IPython.core.error import TryNext +from IPython.lib.clipboard import ClipboardEmpty +from IPython.testing.decorators import skip_if_no_x11 + + +@skip_if_no_x11 +def test_clipboard_get(): + # Smoketest for clipboard access - we can't easily guarantee that the + # clipboard is accessible and has something on it, but this tries to + # exercise the relevant code anyway. + try: + a = get_ipython().hooks.clipboard_get() + except ClipboardEmpty: + # Nothing in clipboard to get + pass + except TryNext: + # No clipboard access API available + pass + else: + assert isinstance(a, str) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py new file mode 100644 index 0000000..5da606c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +"""Test suite for the deepreload module.""" + +# Copyright (c) IPython Development Team. +# Distributed under the terms of the Modified BSD License. + +import types +from pathlib import Path + +import pytest +from tempfile import TemporaryDirectory + +from IPython.lib.deepreload import modules_reloading +from IPython.lib.deepreload import reload as dreload +from IPython.utils.syspathcontext import prepended_to_syspath + + +def test_deepreload(): + "Test that dreload does deep reloads and skips excluded modules." + with TemporaryDirectory() as tmpdir: + with prepended_to_syspath(tmpdir): + tmpdirpath = Path(tmpdir) + with open(tmpdirpath / "A.py", "w", encoding="utf-8") as f: + f.write("class Object:\n pass\nok = True\n") + with open(tmpdirpath / "B.py", "w", encoding="utf-8") as f: + f.write("import A\nassert A.ok, 'we are fine'\n") + import A + import B + + # Test that A is not reloaded. + obj = A.Object() + dreload(B, exclude=["A"]) + assert isinstance(obj, A.Object) is True + + # Test that an import failure will not blow-up us. + A.ok = False + with pytest.raises(AssertionError, match="we are fine"): + dreload(B, exclude=["A"]) + assert len(modules_reloading) == 0 + assert not A.ok + + # Test that A is reloaded. + obj = A.Object() + A.ok = False + dreload(B) + assert A.ok + assert isinstance(obj, A.Object) is False + + +def test_not_module(): + pytest.raises(TypeError, dreload, "modulename") + + +def test_not_in_sys_modules(): + fake_module = types.ModuleType("fake_module") + with pytest.raises(ImportError, match="not in sys.modules"): + dreload(fake_module) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py new file mode 100644 index 0000000..f5ed34c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py @@ -0,0 +1,272 @@ +"""Tests for IPython.lib.display. + +""" +#----------------------------------------------------------------------------- +# Copyright (c) 2012, the IPython Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file COPYING.txt, distributed with this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- +from tempfile import NamedTemporaryFile, mkdtemp +from os.path import split, join as pjoin, dirname +import pathlib +from unittest import TestCase, mock +import struct +import wave +from io import BytesIO + +# Third-party imports +import pytest + +try: + import numpy +except ImportError: + pass + +# Our own imports +from IPython.lib import display + +from IPython.testing.decorators import skipif_not_numpy + +#----------------------------------------------------------------------------- +# Classes and functions +#----------------------------------------------------------------------------- + +#-------------------------- +# FileLink tests +#-------------------------- + +def test_instantiation_FileLink(): + """FileLink: Test class can be instantiated""" + fl = display.FileLink('example.txt') + # TODO: remove if when only Python >= 3.6 is supported + fl = display.FileLink(pathlib.PurePath('example.txt')) + +def test_warning_on_non_existent_path_FileLink(): + """FileLink: Calling _repr_html_ on non-existent files returns a warning""" + fl = display.FileLink("example.txt") + assert fl._repr_html_().startswith("Path (example.txt)") + + +def test_existing_path_FileLink(): + """FileLink: Calling _repr_html_ functions as expected on existing filepath + """ + tf = NamedTemporaryFile() + fl = display.FileLink(tf.name) + actual = fl._repr_html_() + expected = "%s
    " % (tf.name, tf.name) + assert actual == expected + + +def test_existing_path_FileLink_repr(): + """FileLink: Calling repr() functions as expected on existing filepath + """ + tf = NamedTemporaryFile() + fl = display.FileLink(tf.name) + actual = repr(fl) + expected = tf.name + assert actual == expected + + +def test_error_on_directory_to_FileLink(): + """FileLink: Raises error when passed directory + """ + td = mkdtemp() + pytest.raises(ValueError, display.FileLink, td) + +#-------------------------- +# FileLinks tests +#-------------------------- + +def test_instantiation_FileLinks(): + """FileLinks: Test class can be instantiated + """ + fls = display.FileLinks('example') + +def test_warning_on_non_existent_path_FileLinks(): + """FileLinks: Calling _repr_html_ on non-existent files returns a warning""" + fls = display.FileLinks("example") + assert fls._repr_html_().startswith("Path (example)") + + +def test_existing_path_FileLinks(): + """FileLinks: Calling _repr_html_ functions as expected on existing dir + """ + td = mkdtemp() + tf1 = NamedTemporaryFile(dir=td) + tf2 = NamedTemporaryFile(dir=td) + fl = display.FileLinks(td) + actual = fl._repr_html_() + actual = actual.split('\n') + actual.sort() + # the links should always have forward slashes, even on windows, so replace + # backslashes with forward slashes here + expected = ["%s/
    " % td, + "  %s
    " %\ + (tf2.name.replace("\\","/"),split(tf2.name)[1]), + "  %s
    " %\ + (tf1.name.replace("\\","/"),split(tf1.name)[1])] + expected.sort() + # We compare the sorted list of links here as that's more reliable + assert actual == expected + + +def test_existing_path_FileLinks_alt_formatter(): + """FileLinks: Calling _repr_html_ functions as expected w/ an alt formatter + """ + td = mkdtemp() + tf1 = NamedTemporaryFile(dir=td) + tf2 = NamedTemporaryFile(dir=td) + def fake_formatter(dirname,fnames,included_suffixes): + return ["hello","world"] + fl = display.FileLinks(td,notebook_display_formatter=fake_formatter) + actual = fl._repr_html_() + actual = actual.split('\n') + actual.sort() + expected = ["hello","world"] + expected.sort() + # We compare the sorted list of links here as that's more reliable + assert actual == expected + + +def test_existing_path_FileLinks_repr(): + """FileLinks: Calling repr() functions as expected on existing directory """ + td = mkdtemp() + tf1 = NamedTemporaryFile(dir=td) + tf2 = NamedTemporaryFile(dir=td) + fl = display.FileLinks(td) + actual = repr(fl) + actual = actual.split('\n') + actual.sort() + expected = ['%s/' % td, ' %s' % split(tf1.name)[1],' %s' % split(tf2.name)[1]] + expected.sort() + # We compare the sorted list of links here as that's more reliable + assert actual == expected + + +def test_existing_path_FileLinks_repr_alt_formatter(): + """FileLinks: Calling repr() functions as expected w/ alt formatter + """ + td = mkdtemp() + tf1 = NamedTemporaryFile(dir=td) + tf2 = NamedTemporaryFile(dir=td) + def fake_formatter(dirname,fnames,included_suffixes): + return ["hello","world"] + fl = display.FileLinks(td,terminal_display_formatter=fake_formatter) + actual = repr(fl) + actual = actual.split('\n') + actual.sort() + expected = ["hello","world"] + expected.sort() + # We compare the sorted list of links here as that's more reliable + assert actual == expected + + +def test_error_on_file_to_FileLinks(): + """FileLinks: Raises error when passed file + """ + td = mkdtemp() + tf1 = NamedTemporaryFile(dir=td) + pytest.raises(ValueError, display.FileLinks, tf1.name) + + +def test_recursive_FileLinks(): + """FileLinks: Does not recurse when recursive=False + """ + td = mkdtemp() + tf = NamedTemporaryFile(dir=td) + subtd = mkdtemp(dir=td) + subtf = NamedTemporaryFile(dir=subtd) + fl = display.FileLinks(td) + actual = str(fl) + actual = actual.split('\n') + assert len(actual) == 4, actual + fl = display.FileLinks(td, recursive=False) + actual = str(fl) + actual = actual.split('\n') + assert len(actual) == 2, actual + +def test_audio_from_file(): + path = pjoin(dirname(__file__), 'test.wav') + display.Audio(filename=path) + +class TestAudioDataWithNumpy(TestCase): + + @skipif_not_numpy + def test_audio_from_numpy_array(self): + test_tone = get_test_tone() + audio = display.Audio(test_tone, rate=44100) + assert len(read_wav(audio.data)) == len(test_tone) + + @skipif_not_numpy + def test_audio_from_list(self): + test_tone = get_test_tone() + audio = display.Audio(list(test_tone), rate=44100) + assert len(read_wav(audio.data)) == len(test_tone) + + @skipif_not_numpy + def test_audio_from_numpy_array_without_rate_raises(self): + self.assertRaises(ValueError, display.Audio, get_test_tone()) + + @skipif_not_numpy + def test_audio_data_normalization(self): + expected_max_value = numpy.iinfo(numpy.int16).max + for scale in [1, 0.5, 2]: + audio = display.Audio(get_test_tone(scale), rate=44100) + actual_max_value = numpy.max(numpy.abs(read_wav(audio.data))) + assert actual_max_value == expected_max_value + + @skipif_not_numpy + def test_audio_data_without_normalization(self): + max_int16 = numpy.iinfo(numpy.int16).max + for scale in [1, 0.5, 0.2]: + test_tone = get_test_tone(scale) + test_tone_max_abs = numpy.max(numpy.abs(test_tone)) + expected_max_value = int(max_int16 * test_tone_max_abs) + audio = display.Audio(test_tone, rate=44100, normalize=False) + actual_max_value = numpy.max(numpy.abs(read_wav(audio.data))) + assert actual_max_value == expected_max_value + + def test_audio_data_without_normalization_raises_for_invalid_data(self): + self.assertRaises( + ValueError, + lambda: display.Audio([1.001], rate=44100, normalize=False)) + self.assertRaises( + ValueError, + lambda: display.Audio([-1.001], rate=44100, normalize=False)) + +def simulate_numpy_not_installed(): + try: + import numpy + return mock.patch('numpy.array', mock.MagicMock(side_effect=ImportError)) + except ModuleNotFoundError: + return lambda x:x + +@simulate_numpy_not_installed() +class TestAudioDataWithoutNumpy(TestAudioDataWithNumpy): + # All tests from `TestAudioDataWithNumpy` are inherited. + + @skipif_not_numpy + def test_audio_raises_for_nested_list(self): + stereo_signal = [list(get_test_tone())] * 2 + self.assertRaises(TypeError, lambda: display.Audio(stereo_signal, rate=44100)) + + +@skipif_not_numpy +def get_test_tone(scale=1): + return numpy.sin(2 * numpy.pi * 440 * numpy.linspace(0, 1, 44100)) * scale + +def read_wav(data): + with wave.open(BytesIO(data)) as wave_file: + wave_data = wave_file.readframes(wave_file.getnframes()) + num_samples = wave_file.getnframes() * wave_file.getnchannels() + return struct.unpack('<%sh' % num_samples, wave_data) + +def test_code_from_file(): + c = display.Code(filename=__file__) + assert c._repr_html_().startswith(' + + +

    %(title)s

    + +''' + +DOC_HEADER_EXTERNALCSS = '''\ + + + + + %(title)s + + + + +

    %(title)s

    + +''' + +DOC_FOOTER = '''\ + + +''' + + +class HtmlFormatter(Formatter): + r""" + Format tokens as HTML 4 ```` tags. By default, the content is enclosed + in a ``
    `` tag, itself wrapped in a ``
    `` tag (but see the `nowrap` option). + The ``
    ``'s CSS class can be set by the `cssclass` option. + + If the `linenos` option is set to ``"table"``, the ``
    `` is
    +    additionally wrapped inside a ```` which has one row and two
    +    cells: one containing the line numbers and one containing the code.
    +    Example:
    +
    +    .. sourcecode:: html
    +
    +        
    +
    + + +
    +
    1
    +            2
    +
    +
    def foo(bar):
    +              pass
    +            
    +
    + + (whitespace added to improve clarity). + + A list of lines can be specified using the `hl_lines` option to make these + lines highlighted (as of Pygments 0.11). + + With the `full` option, a complete HTML 4 document is output, including + the style definitions inside a `` + {% else %} + {{ head | safe }} + {% endif %} +{% if not embed %} + + +{% endif %} +{{ body | safe }} +{% for diagram in diagrams %} +
    +

    {{ diagram.title }}

    +
    {{ diagram.text }}
    +
    + {{ diagram.svg }} +
    +
    +{% endfor %} +{% if not embed %} + + +{% endif %} +""" + +template = Template(jinja2_template_source) + +# Note: ideally this would be a dataclass, but we're supporting Python 3.5+ so we can't do this yet +NamedDiagram = NamedTuple( + "NamedDiagram", + [("name", str), ("diagram", typing.Optional[railroad.DiagramItem]), ("index", int)], +) +""" +A simple structure for associating a name with a railroad diagram +""" + +T = TypeVar("T") + + +class EachItem(railroad.Group): + """ + Custom railroad item to compose a: + - Group containing a + - OneOrMore containing a + - Choice of the elements in the Each + with the group label indicating that all must be matched + """ + + all_label = "[ALL]" + + def __init__(self, *items): + choice_item = railroad.Choice(len(items) - 1, *items) + one_or_more_item = railroad.OneOrMore(item=choice_item) + super().__init__(one_or_more_item, label=self.all_label) + + +class AnnotatedItem(railroad.Group): + """ + Simple subclass of Group that creates an annotation label + """ + + def __init__(self, label: str, item): + super().__init__(item=item, label="[{}]".format(label) if label else label) + + +class EditablePartial(Generic[T]): + """ + Acts like a functools.partial, but can be edited. In other words, it represents a type that hasn't yet been + constructed. + """ + + # We need this here because the railroad constructors actually transform the data, so can't be called until the + # entire tree is assembled + + def __init__(self, func: Callable[..., T], args: list, kwargs: dict): + self.func = func + self.args = args + self.kwargs = kwargs + + @classmethod + def from_call(cls, func: Callable[..., T], *args, **kwargs) -> "EditablePartial[T]": + """ + If you call this function in the same way that you would call the constructor, it will store the arguments + as you expect. For example EditablePartial.from_call(Fraction, 1, 3)() == Fraction(1, 3) + """ + return EditablePartial(func=func, args=list(args), kwargs=kwargs) + + @property + def name(self): + return self.kwargs["name"] + + def __call__(self) -> T: + """ + Evaluate the partial and return the result + """ + args = self.args.copy() + kwargs = self.kwargs.copy() + + # This is a helpful hack to allow you to specify varargs parameters (e.g. *args) as keyword args (e.g. + # args=['list', 'of', 'things']) + arg_spec = inspect.getfullargspec(self.func) + if arg_spec.varargs in self.kwargs: + args += kwargs.pop(arg_spec.varargs) + + return self.func(*args, **kwargs) + + +def railroad_to_html(diagrams: List[NamedDiagram], embed=False, **kwargs) -> str: + """ + Given a list of NamedDiagram, produce a single HTML string that visualises those diagrams + :params kwargs: kwargs to be passed in to the template + """ + data = [] + for diagram in diagrams: + if diagram.diagram is None: + continue + io = StringIO() + try: + css = kwargs.get('css') + diagram.diagram.writeStandalone(io.write, css=css) + except AttributeError: + diagram.diagram.writeSvg(io.write) + title = diagram.name + if diagram.index == 0: + title += " (root)" + data.append({"title": title, "text": "", "svg": io.getvalue()}) + + return template.render(diagrams=data, embed=embed, **kwargs) + + +def resolve_partial(partial: "EditablePartial[T]") -> T: + """ + Recursively resolves a collection of Partials into whatever type they are + """ + if isinstance(partial, EditablePartial): + partial.args = resolve_partial(partial.args) + partial.kwargs = resolve_partial(partial.kwargs) + return partial() + elif isinstance(partial, list): + return [resolve_partial(x) for x in partial] + elif isinstance(partial, dict): + return {key: resolve_partial(x) for key, x in partial.items()} + else: + return partial + + +def to_railroad( + element: pyparsing.ParserElement, + diagram_kwargs: typing.Optional[dict] = None, + vertical: int = 3, + show_results_names: bool = False, + show_groups: bool = False, +) -> List[NamedDiagram]: + """ + Convert a pyparsing element tree into a list of diagrams. This is the recommended entrypoint to diagram + creation if you want to access the Railroad tree before it is converted to HTML + :param element: base element of the parser being diagrammed + :param diagram_kwargs: kwargs to pass to the Diagram() constructor + :param vertical: (optional) - int - limit at which number of alternatives should be + shown vertically instead of horizontally + :param show_results_names - bool to indicate whether results name annotations should be + included in the diagram + :param show_groups - bool to indicate whether groups should be highlighted with an unlabeled + surrounding box + """ + # Convert the whole tree underneath the root + lookup = ConverterState(diagram_kwargs=diagram_kwargs or {}) + _to_diagram_element( + element, + lookup=lookup, + parent=None, + vertical=vertical, + show_results_names=show_results_names, + show_groups=show_groups, + ) + + root_id = id(element) + # Convert the root if it hasn't been already + if root_id in lookup: + if not element.customName: + lookup[root_id].name = "" + lookup[root_id].mark_for_extraction(root_id, lookup, force=True) + + # Now that we're finished, we can convert from intermediate structures into Railroad elements + diags = list(lookup.diagrams.values()) + if len(diags) > 1: + # collapse out duplicate diags with the same name + seen = set() + deduped_diags = [] + for d in diags: + # don't extract SkipTo elements, they are uninformative as subdiagrams + if d.name == "...": + continue + if d.name is not None and d.name not in seen: + seen.add(d.name) + deduped_diags.append(d) + resolved = [resolve_partial(partial) for partial in deduped_diags] + else: + # special case - if just one diagram, always display it, even if + # it has no name + resolved = [resolve_partial(partial) for partial in diags] + return sorted(resolved, key=lambda diag: diag.index) + + +def _should_vertical( + specification: int, exprs: Iterable[pyparsing.ParserElement] +) -> bool: + """ + Returns true if we should return a vertical list of elements + """ + if specification is None: + return False + else: + return len(_visible_exprs(exprs)) >= specification + + +class ElementState: + """ + State recorded for an individual pyparsing Element + """ + + # Note: this should be a dataclass, but we have to support Python 3.5 + def __init__( + self, + element: pyparsing.ParserElement, + converted: EditablePartial, + parent: EditablePartial, + number: int, + name: str = None, + parent_index: typing.Optional[int] = None, + ): + #: The pyparsing element that this represents + self.element: pyparsing.ParserElement = element + #: The name of the element + self.name: typing.Optional[str] = name + #: The output Railroad element in an unconverted state + self.converted: EditablePartial = converted + #: The parent Railroad element, which we store so that we can extract this if it's duplicated + self.parent: EditablePartial = parent + #: The order in which we found this element, used for sorting diagrams if this is extracted into a diagram + self.number: int = number + #: The index of this inside its parent + self.parent_index: typing.Optional[int] = parent_index + #: If true, we should extract this out into a subdiagram + self.extract: bool = False + #: If true, all of this element's children have been filled out + self.complete: bool = False + + def mark_for_extraction( + self, el_id: int, state: "ConverterState", name: str = None, force: bool = False + ): + """ + Called when this instance has been seen twice, and thus should eventually be extracted into a sub-diagram + :param el_id: id of the element + :param state: element/diagram state tracker + :param name: name to use for this element's text + :param force: If true, force extraction now, regardless of the state of this. Only useful for extracting the + root element when we know we're finished + """ + self.extract = True + + # Set the name + if not self.name: + if name: + # Allow forcing a custom name + self.name = name + elif self.element.customName: + self.name = self.element.customName + else: + self.name = "" + + # Just because this is marked for extraction doesn't mean we can do it yet. We may have to wait for children + # to be added + # Also, if this is just a string literal etc, don't bother extracting it + if force or (self.complete and _worth_extracting(self.element)): + state.extract_into_diagram(el_id) + + +class ConverterState: + """ + Stores some state that persists between recursions into the element tree + """ + + def __init__(self, diagram_kwargs: typing.Optional[dict] = None): + #: A dictionary mapping ParserElements to state relating to them + self._element_diagram_states: Dict[int, ElementState] = {} + #: A dictionary mapping ParserElement IDs to subdiagrams generated from them + self.diagrams: Dict[int, EditablePartial[NamedDiagram]] = {} + #: The index of the next unnamed element + self.unnamed_index: int = 1 + #: The index of the next element. This is used for sorting + self.index: int = 0 + #: Shared kwargs that are used to customize the construction of diagrams + self.diagram_kwargs: dict = diagram_kwargs or {} + self.extracted_diagram_names: Set[str] = set() + + def __setitem__(self, key: int, value: ElementState): + self._element_diagram_states[key] = value + + def __getitem__(self, key: int) -> ElementState: + return self._element_diagram_states[key] + + def __delitem__(self, key: int): + del self._element_diagram_states[key] + + def __contains__(self, key: int): + return key in self._element_diagram_states + + def generate_unnamed(self) -> int: + """ + Generate a number used in the name of an otherwise unnamed diagram + """ + self.unnamed_index += 1 + return self.unnamed_index + + def generate_index(self) -> int: + """ + Generate a number used to index a diagram + """ + self.index += 1 + return self.index + + def extract_into_diagram(self, el_id: int): + """ + Used when we encounter the same token twice in the same tree. When this + happens, we replace all instances of that token with a terminal, and + create a new subdiagram for the token + """ + position = self[el_id] + + # Replace the original definition of this element with a regular block + if position.parent: + ret = EditablePartial.from_call(railroad.NonTerminal, text=position.name) + if "item" in position.parent.kwargs: + position.parent.kwargs["item"] = ret + elif "items" in position.parent.kwargs: + position.parent.kwargs["items"][position.parent_index] = ret + + # If the element we're extracting is a group, skip to its content but keep the title + if position.converted.func == railroad.Group: + content = position.converted.kwargs["item"] + else: + content = position.converted + + self.diagrams[el_id] = EditablePartial.from_call( + NamedDiagram, + name=position.name, + diagram=EditablePartial.from_call( + railroad.Diagram, content, **self.diagram_kwargs + ), + index=position.number, + ) + + del self[el_id] + + +def _worth_extracting(element: pyparsing.ParserElement) -> bool: + """ + Returns true if this element is worth having its own sub-diagram. Simply, if any of its children + themselves have children, then its complex enough to extract + """ + children = element.recurse() + return any(child.recurse() for child in children) + + +def _apply_diagram_item_enhancements(fn): + """ + decorator to ensure enhancements to a diagram item (such as results name annotations) + get applied on return from _to_diagram_element (we do this since there are several + returns in _to_diagram_element) + """ + + def _inner( + element: pyparsing.ParserElement, + parent: typing.Optional[EditablePartial], + lookup: ConverterState = None, + vertical: int = None, + index: int = 0, + name_hint: str = None, + show_results_names: bool = False, + show_groups: bool = False, + ) -> typing.Optional[EditablePartial]: + ret = fn( + element, + parent, + lookup, + vertical, + index, + name_hint, + show_results_names, + show_groups, + ) + + # apply annotation for results name, if present + if show_results_names and ret is not None: + element_results_name = element.resultsName + if element_results_name: + # add "*" to indicate if this is a "list all results" name + element_results_name += "" if element.modalResults else "*" + ret = EditablePartial.from_call( + railroad.Group, item=ret, label=element_results_name + ) + + return ret + + return _inner + + +def _visible_exprs(exprs: Iterable[pyparsing.ParserElement]): + non_diagramming_exprs = ( + pyparsing.ParseElementEnhance, + pyparsing.PositionToken, + pyparsing.And._ErrorStop, + ) + return [ + e + for e in exprs + if not (e.customName or e.resultsName or isinstance(e, non_diagramming_exprs)) + ] + + +@_apply_diagram_item_enhancements +def _to_diagram_element( + element: pyparsing.ParserElement, + parent: typing.Optional[EditablePartial], + lookup: ConverterState = None, + vertical: int = None, + index: int = 0, + name_hint: str = None, + show_results_names: bool = False, + show_groups: bool = False, +) -> typing.Optional[EditablePartial]: + """ + Recursively converts a PyParsing Element to a railroad Element + :param lookup: The shared converter state that keeps track of useful things + :param index: The index of this element within the parent + :param parent: The parent of this element in the output tree + :param vertical: Controls at what point we make a list of elements vertical. If this is an integer (the default), + it sets the threshold of the number of items before we go vertical. If True, always go vertical, if False, never + do so + :param name_hint: If provided, this will override the generated name + :param show_results_names: bool flag indicating whether to add annotations for results names + :returns: The converted version of the input element, but as a Partial that hasn't yet been constructed + :param show_groups: bool flag indicating whether to show groups using bounding box + """ + exprs = element.recurse() + name = name_hint or element.customName or element.__class__.__name__ + + # Python's id() is used to provide a unique identifier for elements + el_id = id(element) + + element_results_name = element.resultsName + + # Here we basically bypass processing certain wrapper elements if they contribute nothing to the diagram + if not element.customName: + if isinstance( + element, + ( + # pyparsing.TokenConverter, + # pyparsing.Forward, + pyparsing.Located, + ), + ): + # However, if this element has a useful custom name, and its child does not, we can pass it on to the child + if exprs: + if not exprs[0].customName: + propagated_name = name + else: + propagated_name = None + + return _to_diagram_element( + element.expr, + parent=parent, + lookup=lookup, + vertical=vertical, + index=index, + name_hint=propagated_name, + show_results_names=show_results_names, + show_groups=show_groups, + ) + + # If the element isn't worth extracting, we always treat it as the first time we say it + if _worth_extracting(element): + if el_id in lookup: + # If we've seen this element exactly once before, we are only just now finding out that it's a duplicate, + # so we have to extract it into a new diagram. + looked_up = lookup[el_id] + looked_up.mark_for_extraction(el_id, lookup, name=name_hint) + ret = EditablePartial.from_call(railroad.NonTerminal, text=looked_up.name) + return ret + + elif el_id in lookup.diagrams: + # If we have seen the element at least twice before, and have already extracted it into a subdiagram, we + # just put in a marker element that refers to the sub-diagram + ret = EditablePartial.from_call( + railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] + ) + return ret + + # Recursively convert child elements + # Here we find the most relevant Railroad element for matching pyparsing Element + # We use ``items=[]`` here to hold the place for where the child elements will go once created + if isinstance(element, pyparsing.And): + # detect And's created with ``expr*N`` notation - for these use a OneOrMore with a repeat + # (all will have the same name, and resultsName) + if not exprs: + return None + if len(set((e.name, e.resultsName) for e in exprs)) == 1: + ret = EditablePartial.from_call( + railroad.OneOrMore, item="", repeat=str(len(exprs)) + ) + elif _should_vertical(vertical, exprs): + ret = EditablePartial.from_call(railroad.Stack, items=[]) + else: + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + elif isinstance(element, (pyparsing.Or, pyparsing.MatchFirst)): + if not exprs: + return None + if _should_vertical(vertical, exprs): + ret = EditablePartial.from_call(railroad.Choice, 0, items=[]) + else: + ret = EditablePartial.from_call(railroad.HorizontalChoice, items=[]) + elif isinstance(element, pyparsing.Each): + if not exprs: + return None + ret = EditablePartial.from_call(EachItem, items=[]) + elif isinstance(element, pyparsing.NotAny): + ret = EditablePartial.from_call(AnnotatedItem, label="NOT", item="") + elif isinstance(element, pyparsing.FollowedBy): + ret = EditablePartial.from_call(AnnotatedItem, label="LOOKAHEAD", item="") + elif isinstance(element, pyparsing.PrecededBy): + ret = EditablePartial.from_call(AnnotatedItem, label="LOOKBEHIND", item="") + elif isinstance(element, pyparsing.Group): + if show_groups: + ret = EditablePartial.from_call(AnnotatedItem, label="", item="") + else: + ret = EditablePartial.from_call(railroad.Group, label="", item="") + elif isinstance(element, pyparsing.TokenConverter): + label = type(element).__name__.lower() + if label == "tokenconverter": + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + else: + ret = EditablePartial.from_call(AnnotatedItem, label=label, item="") + elif isinstance(element, pyparsing.Opt): + ret = EditablePartial.from_call(railroad.Optional, item="") + elif isinstance(element, pyparsing.OneOrMore): + ret = EditablePartial.from_call(railroad.OneOrMore, item="") + elif isinstance(element, pyparsing.ZeroOrMore): + ret = EditablePartial.from_call(railroad.ZeroOrMore, item="") + elif isinstance(element, pyparsing.Group): + ret = EditablePartial.from_call( + railroad.Group, item=None, label=element_results_name + ) + elif isinstance(element, pyparsing.Empty) and not element.customName: + # Skip unnamed "Empty" elements + ret = None + elif isinstance(element, pyparsing.ParseElementEnhance): + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + elif len(exprs) > 0 and not element_results_name: + ret = EditablePartial.from_call(railroad.Group, item="", label=name) + elif len(exprs) > 0: + ret = EditablePartial.from_call(railroad.Sequence, items=[]) + else: + terminal = EditablePartial.from_call(railroad.Terminal, element.defaultName) + ret = terminal + + if ret is None: + return + + # Indicate this element's position in the tree so we can extract it if necessary + lookup[el_id] = ElementState( + element=element, + converted=ret, + parent=parent, + parent_index=index, + number=lookup.generate_index(), + ) + if element.customName: + lookup[el_id].mark_for_extraction(el_id, lookup, element.customName) + + i = 0 + for expr in exprs: + # Add a placeholder index in case we have to extract the child before we even add it to the parent + if "items" in ret.kwargs: + ret.kwargs["items"].insert(i, None) + + item = _to_diagram_element( + expr, + parent=ret, + lookup=lookup, + vertical=vertical, + index=i, + show_results_names=show_results_names, + show_groups=show_groups, + ) + + # Some elements don't need to be shown in the diagram + if item is not None: + if "item" in ret.kwargs: + ret.kwargs["item"] = item + elif "items" in ret.kwargs: + # If we've already extracted the child, don't touch this index, since it's occupied by a nonterminal + ret.kwargs["items"][i] = item + i += 1 + elif "items" in ret.kwargs: + # If we're supposed to skip this element, remove it from the parent + del ret.kwargs["items"][i] + + # If all this items children are none, skip this item + if ret and ( + ("items" in ret.kwargs and len(ret.kwargs["items"]) == 0) + or ("item" in ret.kwargs and ret.kwargs["item"] is None) + ): + ret = EditablePartial.from_call(railroad.Terminal, name) + + # Mark this element as "complete", ie it has all of its children + if el_id in lookup: + lookup[el_id].complete = True + + if el_id in lookup and lookup[el_id].extract and lookup[el_id].complete: + lookup.extract_into_diagram(el_id) + if ret is not None: + ret = EditablePartial.from_call( + railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] + ) + + return ret diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e09c8a0f9f4380c634bb7dff594af5d11bd4f59 GIT binary patch literal 26818 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py new file mode 100644 index 0000000..12219f1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py @@ -0,0 +1,299 @@ +# exceptions.py + +import re +import sys +import typing + +from .util import ( + col, + line, + lineno, + _collapse_string_to_ranges, + replaced_by_pep8, +) +from .unicode import pyparsing_unicode as ppu + + +class ExceptionWordUnicode(ppu.Latin1, ppu.LatinA, ppu.LatinB, ppu.Greek, ppu.Cyrillic): + pass + + +_extract_alphanums = _collapse_string_to_ranges(ExceptionWordUnicode.alphanums) +_exception_word_extractor = re.compile("([" + _extract_alphanums + "]{1,16})|.") + + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + + loc: int + msg: str + pstr: str + parser_element: typing.Any # "ParserElement" + args: typing.Tuple[str, int, typing.Optional[str]] + + __slots__ = ( + "loc", + "msg", + "pstr", + "parser_element", + "args", + ) + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( + self, + pstr: str, + loc: int = 0, + msg: typing.Optional[str] = None, + elem=None, + ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parser_element = elem + self.args = (pstr, loc, msg) + + @staticmethod + def explain_exception(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + """ + import inspect + from .core import ParserElement + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(" " * (exc.column - 1) + "^") + ret.append(f"{type(exc).__name__}: {exc}") + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff[0] + + f_self = frm.f_locals.get("self", None) + if isinstance(f_self, ParserElement): + if not frm.f_code.co_name.startswith( + ("parseImpl", "_parseNoCache") + ): + continue + if id(f_self) in seen: + continue + seen.add(id(f_self)) + + self_type = type(f_self) + ret.append( + f"{self_type.__module__}.{self_type.__name__} - {f_self}" + ) + + elif f_self is not None: + self_type = type(f_self) + ret.append(f"{self_type.__module__}.{self_type.__name__}") + + else: + code = frm.f_code + if code.co_name in ("wrapper", ""): + continue + + ret.append(code.co_name) + + depth -= 1 + if not depth: + break + + return "\n".join(ret) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parser_element) + + @property + def line(self) -> str: + """ + Return the line of text where the exception occurred. + """ + return line(self.loc, self.pstr) + + @property + def lineno(self) -> int: + """ + Return the 1-based line number of text where the exception occurred. + """ + return lineno(self.loc, self.pstr) + + @property + def col(self) -> int: + """ + Return the 1-based column on the line of text where the exception occurred. + """ + return col(self.loc, self.pstr) + + @property + def column(self) -> int: + """ + Return the 1-based column on the line of text where the exception occurred. + """ + return col(self.loc, self.pstr) + + # pre-PEP8 compatibility + @property + def parserElement(self): + return self.parser_element + + @parserElement.setter + def parserElement(self, elem): + self.parser_element = elem + + def __str__(self) -> str: + if self.pstr: + if self.loc >= len(self.pstr): + foundstr = ", found end of text" + else: + # pull out next word at error location + found_match = _exception_word_extractor.match(self.pstr, self.loc) + if found_match is not None: + found = found_match.group(0) + else: + found = self.pstr[self.loc : self.loc + 1] + foundstr = (", found %r" % found).replace(r"\\", "\\") + else: + foundstr = "" + return f"{self.msg}{foundstr} (at char {self.loc}), (line:{self.lineno}, col:{self.column})" + + def __repr__(self): + return str(self) + + def mark_input_line( + self, marker_string: typing.Optional[str] = None, *, markerString: str = ">!<" + ) -> str: + """ + Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + markerString = marker_string if marker_string is not None else markerString + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join( + (line_str[:line_column], markerString, line_str[line_column:]) + ) + return line_str.strip() + + def explain(self, depth=16) -> str: + """ + Method to translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Example:: + + expr = pp.Word(pp.nums) * 3 + try: + expr.parse_string("123 456 A789") + except pp.ParseException as pe: + print(pe.explain(depth=0)) + + prints:: + + 123 456 A789 + ^ + ParseException: Expected W:(0-9), found 'A' (at char 8), (line:1, col:9) + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `set_name` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + Note: pyparsing's default truncation of exception tracebacks may also truncate the + stack of expressions that are displayed in the ``explain`` output. To get the full listing + of parser expressions, you may have to set ``ParserElement.verbose_stacktrace = True`` + """ + return self.explain_exception(self, depth) + + # fmt: off + @replaced_by_pep8(mark_input_line) + def markInputline(self): ... + # fmt: on + + +class ParseException(ParseBaseException): + """ + Exception thrown when a parse expression doesn't match the input string + + Example:: + + try: + Word(nums).set_name("integer").parse_string("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.column)) + + prints:: + + Expected integer (at char 0), (line:1, col:1) + column: 1 + + """ + + +class ParseFatalException(ParseBaseException): + """ + User-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately + """ + + +class ParseSyntaxException(ParseFatalException): + """ + Just like :class:`ParseFatalException`, but thrown internally + when an :class:`ErrorStop` ('-' operator) indicates + that parsing is to stop immediately because an unbacktrackable + syntax error has been found. + """ + + +class RecursiveGrammarException(Exception): + """ + Exception thrown by :class:`ParserElement.validate` if the + grammar could be left-recursive; parser may need to enable + left recursion using :class:`ParserElement.enable_left_recursion` + """ + + def __init__(self, parseElementList): + self.parseElementTrace = parseElementList + + def __str__(self) -> str: + return f"RecursiveGrammarException: {self.parseElementTrace}" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py new file mode 100644 index 0000000..018f0d6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py @@ -0,0 +1,1100 @@ +# helpers.py +import html.entities +import re +import sys +import typing + +from . import __diag__ +from .core import * +from .util import ( + _bslash, + _flatten, + _escape_regex_range_chars, + replaced_by_pep8, +) + + +# +# global helpers +# +def counted_array( + expr: ParserElement, + int_expr: typing.Optional[ParserElement] = None, + *, + intExpr: typing.Optional[ParserElement] = None, +) -> ParserElement: + """Helper to define a counted list of expressions. + + This helper defines a pattern of the form:: + + integer expr expr expr... + + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the + leading count token is suppressed. + + If ``int_expr`` is specified, it should be a pyparsing expression + that produces an integer value. + + Example:: + + counted_array(Word(alphas)).parse_string('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binary_constant = Word('01').set_parse_action(lambda t: int(t[0], 2)) + counted_array(Word(alphas), int_expr=binary_constant).parse_string('10 ab cd ef') # -> ['ab', 'cd'] + + # if other fields must be parsed after the count but before the + # list items, give the fields results names and they will + # be preserved in the returned ParseResults: + count_with_metadata = integer + Word(alphas)("type") + typed_array = counted_array(Word(alphanums), int_expr=count_with_metadata)("items") + result = typed_array.parse_string("3 bool True True False") + print(result.dump()) + + # prints + # ['True', 'True', 'False'] + # - items: ['True', 'True', 'False'] + # - type: 'bool' + """ + intExpr = intExpr or int_expr + array_expr = Forward() + + def count_field_parse_action(s, l, t): + nonlocal array_expr + n = t[0] + array_expr <<= (expr * n) if n else Empty() + # clear list contents, but keep any named results + del t[:] + + if intExpr is None: + intExpr = Word(nums).set_parse_action(lambda t: int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.set_name("arrayLen") + intExpr.add_parse_action(count_field_parse_action, call_during_try=True) + return (intExpr + array_expr).set_name("(len) " + str(expr) + "...") + + +def match_previous_literal(expr: ParserElement) -> ParserElement: + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = match_previous_literal(first) + match_expr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`match_previous_expr`. Do *not* use with packrat parsing + enabled. + """ + rep = Forward() + + def copy_token_to_repeater(s, l, t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.as_list()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + + expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) + rep.set_name("(prev) " + str(expr)) + return rep + + +def match_previous_expr(expr: ParserElement) -> ParserElement: + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = match_previous_expr(first) + match_expr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *not* use + with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + + def copy_token_to_repeater(s, l, t): + matchTokens = _flatten(t.as_list()) + + def must_match_these_tokens(s, l, t): + theseTokens = _flatten(t.as_list()) + if theseTokens != matchTokens: + raise ParseException( + s, l, f"Expected {matchTokens}, found{theseTokens}" + ) + + rep.set_parse_action(must_match_these_tokens, callDuringTry=True) + + expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) + rep.set_name("(prev) " + str(expr)) + return rep + + +def one_of( + strs: Union[typing.Iterable[str], str], + caseless: bool = False, + use_regex: bool = True, + as_keyword: bool = False, + *, + useRegex: bool = True, + asKeyword: bool = False, +) -> ParserElement: + """Helper to quickly define a set of alternative :class:`Literal` s, + and makes sure to do longest-first testing when there is a conflict, + regardless of the input order, but returns + a :class:`MatchFirst` for best performance. + + Parameters: + + - ``strs`` - a string of space-delimited literals, or a collection of + string literals + - ``caseless`` - treat all literals as caseless - (default= ``False``) + - ``use_regex`` - as an optimization, will + generate a :class:`Regex` object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True`` or ``as_keyword=True``, or if + creating a :class:`Regex` raises an exception) - (default= ``True``) + - ``as_keyword`` - enforce :class:`Keyword`-style matching on the + generated expressions - (default= ``False``) + - ``asKeyword`` and ``useRegex`` are retained for pre-PEP8 compatibility, + but will be removed in a future release + + Example:: + + comp_oper = one_of("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.search_string("B = 12 AA=23 B<=AA AA>12")) + + prints:: + + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + asKeyword = asKeyword or as_keyword + useRegex = useRegex and use_regex + + if ( + isinstance(caseless, str_type) + and __diag__.warn_on_multiple_string_args_to_oneof + ): + warnings.warn( + "More than one string argument passed to one_of, pass" + " choices as a list or space-delimited string", + stacklevel=2, + ) + + if caseless: + isequal = lambda a, b: a.upper() == b.upper() + masks = lambda a, b: b.upper().startswith(a.upper()) + parseElementClass = CaselessKeyword if asKeyword else CaselessLiteral + else: + isequal = lambda a, b: a == b + masks = lambda a, b: b.startswith(a) + parseElementClass = Keyword if asKeyword else Literal + + symbols: List[str] = [] + if isinstance(strs, str_type): + strs = typing.cast(str, strs) + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + raise TypeError("Invalid argument to one_of, expected string or iterable") + if not symbols: + return NoMatch() + + # reorder given symbols to take care to avoid masking longer choices with shorter ones + # (but only if the given symbols are not just single characters) + if any(len(sym) > 1 for sym in symbols): + i = 0 + while i < len(symbols) - 1: + cur = symbols[i] + for j, other in enumerate(symbols[i + 1 :]): + if isequal(other, cur): + del symbols[i + j + 1] + break + elif masks(cur, other): + del symbols[i + j + 1] + symbols.insert(i, other) + break + else: + i += 1 + + if useRegex: + re_flags: int = re.IGNORECASE if caseless else 0 + + try: + if all(len(sym) == 1 for sym in symbols): + # symbols are just single characters, create range regex pattern + patt = f"[{''.join(_escape_regex_range_chars(sym) for sym in symbols)}]" + else: + patt = "|".join(re.escape(sym) for sym in symbols) + + # wrap with \b word break markers if defining as keywords + if asKeyword: + patt = rf"\b(?:{patt})\b" + + ret = Regex(patt, flags=re_flags).set_name(" | ".join(symbols)) + + if caseless: + # add parse action to return symbols as specified, not in random + # casing as found in input string + symbol_map = {sym.lower(): sym for sym in symbols} + ret.add_parse_action(lambda s, l, t: symbol_map[t[0].lower()]) + + return ret + + except re.error: + warnings.warn( + "Exception creating Regex for one_of, building MatchFirst", stacklevel=2 + ) + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).set_name( + " | ".join(symbols) + ) + + +def dict_of(key: ParserElement, value: ParserElement) -> ParserElement: + """Helper to easily and clearly define a dictionary by specifying + the respective patterns for the key and value. Takes care of + defining the :class:`Dict`, :class:`ZeroOrMore`, and + :class:`Group` tokens in the proper order. The key pattern + can include delimiting markers or punctuation, as long as they are + suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the :class:`Dict` results + can include named token fields. + + Example:: + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) + print(attr_expr[1, ...].parse_string(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join) + + # similar to Dict, but simpler call format + result = dict_of(attr_label, attr_value).parse_string(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.as_dict()) + + prints:: + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: 'light blue' + - posn: 'upper left' + - shape: 'SQUARE' + - texture: 'burlap' + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict(OneOrMore(Group(key + value))) + + +def original_text_for( + expr: ParserElement, as_string: bool = True, *, asString: bool = True +) -> ParserElement: + """Helper to return the original, untokenized text for a given + expression. Useful to restore the parsed fields of an HTML start + tag into the raw tag text itself, or to revert separate tokens with + intervening whitespace back to the original matching input text. By + default, returns a string containing the original parsed text. + + If the optional ``as_string`` argument is passed as + ``False``, then the return value is + a :class:`ParseResults` containing any results names that + were originally matched, and a single token containing the original + matched text from the input string. So if the expression passed to + :class:`original_text_for` contains expressions with defined + results names, you must set ``as_string`` to ``False`` if you + want to preserve those results name values. + + The ``asString`` pre-PEP8 argument is retained for compatibility, + but will be removed in a future release. + + Example:: + + src = "this is test bold text normal text " + for tag in ("b", "i"): + opener, closer = make_html_tags(tag) + patt = original_text_for(opener + ... + closer) + print(patt.search_string(src)[0]) + + prints:: + + [' bold text '] + ['text'] + """ + asString = asString and as_string + + locMarker = Empty().set_parse_action(lambda s, loc, t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s, l, t: s[t._original_start : t._original_end] + else: + + def extractText(s, l, t): + t[:] = [s[t.pop("_original_start") : t.pop("_original_end")]] + + matchExpr.set_parse_action(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + matchExpr.suppress_warning(Diagnostics.warn_ungrouped_named_tokens_in_collection) + return matchExpr + + +def ungroup(expr: ParserElement) -> ParserElement: + """Helper to undo pyparsing's default grouping of And expressions, + even if all but one are non-empty. + """ + return TokenConverter(expr).add_parse_action(lambda t: t[0]) + + +def locatedExpr(expr: ParserElement) -> ParserElement: + """ + (DEPRECATED - future code should use the :class:`Located` class) + Helper to decorate a returned token with its starting and ending + locations in the input string. + + This helper adds the following results names: + + - ``locn_start`` - location where matched expression begins + - ``locn_end`` - location where matched expression ends + - ``value`` - the actual parsed results + + Be careful if the input text contains ```` characters, you + may want to call :class:`ParserElement.parse_with_tabs` + + Example:: + + wd = Word(alphas) + for match in locatedExpr(wd).search_string("ljsdf123lksdjjf123lkkjj1222"): + print(match) + + prints:: + + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().set_parse_action(lambda ss, ll, tt: ll) + return Group( + locator("locn_start") + + expr("value") + + locator.copy().leaveWhitespace()("locn_end") + ) + + +def nested_expr( + opener: Union[str, ParserElement] = "(", + closer: Union[str, ParserElement] = ")", + content: typing.Optional[ParserElement] = None, + ignore_expr: ParserElement = quoted_string(), + *, + ignoreExpr: ParserElement = quoted_string(), +) -> ParserElement: + """Helper method for defining nested lists enclosed in opening and + closing delimiters (``"("`` and ``")"`` are the default). + + Parameters: + + - ``opener`` - opening character for a nested list + (default= ``"("``); can also be a pyparsing expression + - ``closer`` - closing character for a nested list + (default= ``")"``); can also be a pyparsing expression + - ``content`` - expression for items within the nested lists + (default= ``None``) + - ``ignore_expr`` - expression for ignoring opening and closing delimiters + (default= :class:`quoted_string`) + - ``ignoreExpr`` - this pre-PEP8 argument is retained for compatibility + but will be removed in a future release + + If an expression is not provided for the content argument, the + nested expression will capture all whitespace-delimited content + between delimiters as a list of separate values. + + Use the ``ignore_expr`` argument to define expressions that may + contain opening or closing characters that should not be treated as + opening or closing characters for nesting, such as quoted_string or + a comment expression. Specify multiple expressions using an + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quoted_string`, but if no expressions are to be ignored, then + pass ``None`` for this argument. + + Example:: + + data_type = one_of("void int short long char float double") + decl_data_type = Combine(data_type + Opt(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR, RPAR = map(Suppress, "()") + + code_body = nested_expr('{', '}', ignore_expr=(quoted_string | c_style_comment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Opt(DelimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(c_style_comment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.search_string(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + + prints:: + + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if ignoreExpr != ignore_expr: + ignoreExpr = ignore_expr if ignoreExpr == quoted_string() else ignoreExpr + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener, str_type) and isinstance(closer, str_type): + opener = typing.cast(str, opener) + closer = typing.cast(str, closer) + if len(opener) == 1 and len(closer) == 1: + if ignoreExpr is not None: + content = Combine( + OneOrMore( + ~ignoreExpr + + CharsNotIn( + opener + closer + ParserElement.DEFAULT_WHITE_CHARS, + exact=1, + ) + ) + ).set_parse_action(lambda t: t[0].strip()) + else: + content = empty.copy() + CharsNotIn( + opener + closer + ParserElement.DEFAULT_WHITE_CHARS + ).set_parse_action(lambda t: t[0].strip()) + else: + if ignoreExpr is not None: + content = Combine( + OneOrMore( + ~ignoreExpr + + ~Literal(opener) + + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) + ) + ).set_parse_action(lambda t: t[0].strip()) + else: + content = Combine( + OneOrMore( + ~Literal(opener) + + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) + ) + ).set_parse_action(lambda t: t[0].strip()) + else: + raise ValueError( + "opening and closing arguments must be strings if no content expression is given" + ) + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( + Suppress(opener) + ZeroOrMore(ignoreExpr | ret | content) + Suppress(closer) + ) + else: + ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer)) + ret.set_name("nested %s%s expression" % (opener, closer)) + return ret + + +def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr, str_type): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas, alphanums + "_-:") + if xml: + tagAttrValue = dbl_quoted_string.copy().set_parse_action(remove_quotes) + openTag = ( + suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue))) + + Opt("/", default=[False])("empty").set_parse_action( + lambda s, l, t: t[0] == "/" + ) + + suppress_GT + ) + else: + tagAttrValue = quoted_string.copy().set_parse_action(remove_quotes) | Word( + printables, exclude_chars=">" + ) + openTag = ( + suppress_LT + + tagStr("tag") + + Dict( + ZeroOrMore( + Group( + tagAttrName.set_parse_action(lambda t: t[0].lower()) + + Opt(Suppress("=") + tagAttrValue) + ) + ) + ) + + Opt("/", default=[False])("empty").set_parse_action( + lambda s, l, t: t[0] == "/" + ) + + suppress_GT + ) + closeTag = Combine(Literal("", adjacent=False) + + openTag.set_name("<%s>" % resname) + # add start results name in parse action now that ungrouped names are not reported at two levels + openTag.add_parse_action( + lambda t: t.__setitem__( + "start" + "".join(resname.replace(":", " ").title().split()), t.copy() + ) + ) + closeTag = closeTag( + "end" + "".join(resname.replace(":", " ").title().split()) + ).set_name("" % resname) + openTag.tag = resname + closeTag.tag = resname + openTag.tag_body = SkipTo(closeTag()) + return openTag, closeTag + + +def make_html_tags( + tag_str: Union[str, ParserElement] +) -> Tuple[ParserElement, ParserElement]: + """Helper to construct opening and closing tag expressions for HTML, + given a tag name. Matches tags in either upper or lower case, + attributes with namespaces and with quoted or unquoted values. + + Example:: + + text = 'More info at the pyparsing wiki page' + # make_html_tags returns pyparsing expressions for the opening and + # closing tags as a 2-tuple + a, a_end = make_html_tags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.search_string(text): + # attributes in the tag (like "href" shown here) are + # also accessible as named results + print(link.link_text, '->', link.href) + + prints:: + + pyparsing -> https://github.com/pyparsing/pyparsing/wiki + """ + return _makeTags(tag_str, False) + + +def make_xml_tags( + tag_str: Union[str, ParserElement] +) -> Tuple[ParserElement, ParserElement]: + """Helper to construct opening and closing tag expressions for XML, + given a tag name. Matches tags only in the given upper/lower case. + + Example: similar to :class:`make_html_tags` + """ + return _makeTags(tag_str, True) + + +any_open_tag: ParserElement +any_close_tag: ParserElement +any_open_tag, any_close_tag = make_html_tags( + Word(alphas, alphanums + "_:").set_name("any tag") +) + +_htmlEntityMap = {k.rstrip(";"): v for k, v in html.entities.html5.items()} +common_html_entity = Regex("&(?P" + "|".join(_htmlEntityMap) + ");").set_name( + "common HTML entity" +) + + +def replace_html_entity(s, l, t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + + +class OpAssoc(Enum): + """Enumeration of operator associativity + - used in constructing InfixNotationOperatorSpec for :class:`infix_notation`""" + + LEFT = 1 + RIGHT = 2 + + +InfixNotationOperatorArgType = Union[ + ParserElement, str, Tuple[Union[ParserElement, str], Union[ParserElement, str]] +] +InfixNotationOperatorSpec = Union[ + Tuple[ + InfixNotationOperatorArgType, + int, + OpAssoc, + typing.Optional[ParseAction], + ], + Tuple[ + InfixNotationOperatorArgType, + int, + OpAssoc, + ], +] + + +def infix_notation( + base_expr: ParserElement, + op_list: List[InfixNotationOperatorSpec], + lpar: Union[str, ParserElement] = Suppress("("), + rpar: Union[str, ParserElement] = Suppress(")"), +) -> ParserElement: + """Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary + or binary, left- or right-associative. Parse actions can also be + attached to operator expressions. The generated parser will also + recognize the use of parentheses to override operator precedences + (see example below). + + Note: if you define a deep operator list, you may see performance + issues when using infix_notation. See + :class:`ParserElement.enable_packrat` for a mechanism to potentially + improve your parser performance. + + Parameters: + + - ``base_expr`` - expression representing the most basic operand to + be used in the expression + - ``op_list`` - list of tuples, one for each operator precedence level + in the expression grammar; each tuple is of the form ``(op_expr, + num_operands, right_left_assoc, (optional)parse_action)``, where: + + - ``op_expr`` is the pyparsing expression for the operator; may also + be a string, which will be converted to a Literal; if ``num_operands`` + is 3, ``op_expr`` is a tuple of two expressions, for the two + operators separating the 3 terms + - ``num_operands`` is the number of terms for this operator (must be 1, + 2, or 3) + - ``right_left_assoc`` is the indicator whether the operator is right + or left associative, using the pyparsing-defined constants + ``OpAssoc.RIGHT`` and ``OpAssoc.LEFT``. + - ``parse_action`` is the parse action to be associated with + expressions matching this operator expression (the parse action + tuple member may be omitted); if the parse action is passed + a tuple or list of functions, this is equivalent to calling + ``set_parse_action(*fn)`` + (:class:`ParserElement.set_parse_action`) + - ``lpar`` - expression for matching left-parentheses; if passed as a + str, then will be parsed as ``Suppress(lpar)``. If lpar is passed as + an expression (such as ``Literal('(')``), then it will be kept in + the parsed results, and grouped with them. (default= ``Suppress('(')``) + - ``rpar`` - expression for matching right-parentheses; if passed as a + str, then will be parsed as ``Suppress(rpar)``. If rpar is passed as + an expression (such as ``Literal(')')``), then it will be kept in + the parsed results, and grouped with them. (default= ``Suppress(')')``) + + Example:: + + # simple example of four-function arithmetic with ints and + # variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infix_notation(integer | varname, + [ + ('-', 1, OpAssoc.RIGHT), + (one_of('* /'), 2, OpAssoc.LEFT), + (one_of('+ -'), 2, OpAssoc.LEFT), + ]) + + arith_expr.run_tests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', full_dump=False) + + prints:: + + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + (5+x)*y + [[[5, '+', 'x'], '*', 'y']] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.try_parse(instring, loc) + return loc, [] + + _FB.__name__ = "FollowedBy>" + + ret = Forward() + if isinstance(lpar, str): + lpar = Suppress(lpar) + if isinstance(rpar, str): + rpar = Suppress(rpar) + + # if lpar and rpar are not suppressed, wrap in group + if not (isinstance(rpar, Suppress) and isinstance(rpar, Suppress)): + lastExpr = base_expr | Group(lpar + ret + rpar) + else: + lastExpr = base_expr | (lpar + ret + rpar) + + arity: int + rightLeftAssoc: opAssoc + pa: typing.Optional[ParseAction] + opExpr1: ParserElement + opExpr2: ParserElement + for i, operDef in enumerate(op_list): + opExpr, arity, rightLeftAssoc, pa = (operDef + (None,))[:4] # type: ignore[assignment] + if isinstance(opExpr, str_type): + opExpr = ParserElement._literalStringClass(opExpr) + opExpr = typing.cast(ParserElement, opExpr) + if arity == 3: + if not isinstance(opExpr, (tuple, list)) or len(opExpr) != 2: + raise ValueError( + "if numterms=3, opExpr must be a tuple or list of two expressions" + ) + opExpr1, opExpr2 = opExpr + term_name = f"{opExpr1}{opExpr2} term" + else: + term_name = f"{opExpr} term" + + if not 1 <= arity <= 3: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + + if rightLeftAssoc not in (OpAssoc.LEFT, OpAssoc.RIGHT): + raise ValueError("operator must indicate right or left associativity") + + thisExpr: ParserElement = Forward().set_name(term_name) + thisExpr = typing.cast(Forward, thisExpr) + if rightLeftAssoc is OpAssoc.LEFT: + if arity == 1: + matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + opExpr[1, ...]) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( + lastExpr + (opExpr + lastExpr)[1, ...] + ) + else: + matchExpr = _FB(lastExpr + lastExpr) + Group(lastExpr[2, ...]) + elif arity == 3: + matchExpr = _FB( + lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr + ) + Group(lastExpr + OneOrMore(opExpr1 + lastExpr + opExpr2 + lastExpr)) + elif rightLeftAssoc is OpAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Opt): + opExpr = Opt(opExpr) + matchExpr = _FB(opExpr.expr + thisExpr) + Group(opExpr + thisExpr) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( + lastExpr + (opExpr + thisExpr)[1, ...] + ) + else: + matchExpr = _FB(lastExpr + thisExpr) + Group( + lastExpr + thisExpr[1, ...] + ) + elif arity == 3: + matchExpr = _FB( + lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr + ) + Group(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.set_parse_action(*pa) + else: + matchExpr.set_parse_action(pa) + thisExpr <<= (matchExpr | lastExpr).setName(term_name) + lastExpr = thisExpr + ret <<= lastExpr + return ret + + +def indentedBlock(blockStatementExpr, indentStack, indent=True, backup_stacks=[]): + """ + (DEPRECATED - use :class:`IndentedBlock` class instead) + Helper method for defining space-delimited indentation blocks, + such as those used to define block statements in Python source code. + + Parameters: + + - ``blockStatementExpr`` - expression defining syntax of statement that + is repeated within the indented block + - ``indentStack`` - list created by caller to manage indentation stack + (multiple ``statementWithIndentedBlock`` expressions within a single + grammar should share a common ``indentStack``) + - ``indent`` - boolean indicating whether block must be indented beyond + the current level; set to ``False`` for block of left-most statements + (default= ``True``) + + A valid block must contain at least one ``blockStatement``. + + (Note that indentedBlock uses internal parse actions which make it + incompatible with packrat parsing.) + + Example:: + + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group("(" + Opt(delimitedList(identifier)) + ")") + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group(funcDecl + func_body) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Opt(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << (funcDef | assignment | identifier) + + module_body = stmt[1, ...] + + parseTree = module_body.parseString(data) + parseTree.pprint() + + prints:: + + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + backup_stacks.append(indentStack[:]) + + def reset_stack(): + indentStack[:] = backup_stacks[-1] + + def checkPeerIndent(s, l, t): + if l >= len(s): + return + curCol = col(l, s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseException(s, l, "illegal nesting") + raise ParseException(s, l, "not a peer entry") + + def checkSubIndent(s, l, t): + curCol = col(l, s) + if curCol > indentStack[-1]: + indentStack.append(curCol) + else: + raise ParseException(s, l, "not a subentry") + + def checkUnindent(s, l, t): + if l >= len(s): + return + curCol = col(l, s) + if not (indentStack and curCol in indentStack): + raise ParseException(s, l, "not an unindent") + if curCol < indentStack[-1]: + indentStack.pop() + + NL = OneOrMore(LineEnd().set_whitespace_chars("\t ").suppress()) + INDENT = (Empty() + Empty().set_parse_action(checkSubIndent)).set_name("INDENT") + PEER = Empty().set_parse_action(checkPeerIndent).set_name("") + UNDENT = Empty().set_parse_action(checkUnindent).set_name("UNINDENT") + if indent: + smExpr = Group( + Opt(NL) + + INDENT + + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) + + UNDENT + ) + else: + smExpr = Group( + Opt(NL) + + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) + + Opt(UNDENT) + ) + + # add a parse action to remove backup_stack from list of backups + smExpr.add_parse_action( + lambda: backup_stacks.pop(-1) and None if backup_stacks else None + ) + smExpr.set_fail_action(lambda a, b, c, d: reset_stack()) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.set_name("indented block") + + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +c_style_comment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/").set_name( + "C style comment" +) +"Comment of the form ``/* ... */``" + +html_comment = Regex(r"").set_name("HTML comment") +"Comment of the form ````" + +rest_of_line = Regex(r".*").leave_whitespace().set_name("rest of line") +dbl_slash_comment = Regex(r"//(?:\\\n|[^\n])*").set_name("// comment") +"Comment of the form ``// ... (to end of line)``" + +cpp_style_comment = Combine( + Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/" | dbl_slash_comment +).set_name("C++ style comment") +"Comment of either form :class:`c_style_comment` or :class:`dbl_slash_comment`" + +java_style_comment = cpp_style_comment +"Same as :class:`cpp_style_comment`" + +python_style_comment = Regex(r"#.*").set_name("Python style comment") +"Comment of the form ``# ... (to end of line)``" + + +# build list of built-in expressions, for future reference if a global default value +# gets updated +_builtin_exprs: List[ParserElement] = [ + v for v in vars().values() if isinstance(v, ParserElement) +] + + +# compatibility function, superseded by DelimitedList class +def delimited_list( + expr: Union[str, ParserElement], + delim: Union[str, ParserElement] = ",", + combine: bool = False, + min: typing.Optional[int] = None, + max: typing.Optional[int] = None, + *, + allow_trailing_delim: bool = False, +) -> ParserElement: + """(DEPRECATED - use :class:`DelimitedList` class)""" + return DelimitedList( + expr, delim, combine, min, max, allow_trailing_delim=allow_trailing_delim + ) + + +# pre-PEP8 compatible names +# fmt: off +opAssoc = OpAssoc +anyOpenTag = any_open_tag +anyCloseTag = any_close_tag +commonHTMLEntity = common_html_entity +cStyleComment = c_style_comment +htmlComment = html_comment +restOfLine = rest_of_line +dblSlashComment = dbl_slash_comment +cppStyleComment = cpp_style_comment +javaStyleComment = java_style_comment +pythonStyleComment = python_style_comment + +@replaced_by_pep8(DelimitedList) +def delimitedList(): ... + +@replaced_by_pep8(DelimitedList) +def delimited_list(): ... + +@replaced_by_pep8(counted_array) +def countedArray(): ... + +@replaced_by_pep8(match_previous_literal) +def matchPreviousLiteral(): ... + +@replaced_by_pep8(match_previous_expr) +def matchPreviousExpr(): ... + +@replaced_by_pep8(one_of) +def oneOf(): ... + +@replaced_by_pep8(dict_of) +def dictOf(): ... + +@replaced_by_pep8(original_text_for) +def originalTextFor(): ... + +@replaced_by_pep8(nested_expr) +def nestedExpr(): ... + +@replaced_by_pep8(make_html_tags) +def makeHTMLTags(): ... + +@replaced_by_pep8(make_xml_tags) +def makeXMLTags(): ... + +@replaced_by_pep8(replace_html_entity) +def replaceHTMLEntity(): ... + +@replaced_by_pep8(infix_notation) +def infixNotation(): ... +# fmt: on diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py new file mode 100644 index 0000000..0313049 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py @@ -0,0 +1,796 @@ +# results.py +from collections.abc import ( + MutableMapping, + Mapping, + MutableSequence, + Iterator, + Sequence, + Container, +) +import pprint +from typing import Tuple, Any, Dict, Set, List + +str_type: Tuple[type, ...] = (str, bytes) +_generator_type = type((_ for _ in ())) + + +class _ParseResultsWithOffset: + tup: Tuple["ParseResults", int] + __slots__ = ["tup"] + + def __init__(self, p1: "ParseResults", p2: int): + self.tup: Tuple[ParseResults, int] = (p1, p2) + + def __getitem__(self, i): + return self.tup[i] + + def __getstate__(self): + return self.tup + + def __setstate__(self, *args): + self.tup = args[0] + + +class ParseResults: + """Structured parse results, to provide multiple means of access to + the parsed data: + + - as a list (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.`` - see :class:`ParserElement.set_results_name`) + + Example:: + + integer = Word(nums) + date_str = (integer.set_results_name("year") + '/' + + integer.set_results_name("month") + '/' + + integer.set_results_name("day")) + # equivalent form: + # date_str = (integer("year") + '/' + # + integer("month") + '/' + # + integer("day")) + + # parse_string returns a ParseResults object + result = date_str.parse_string("1999/12/31") + + def test(s, fn=repr): + print(f"{s} -> {fn(eval(s))}") + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + + prints:: + + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: '31' + - month: '12' + - year: '1999' + """ + + _null_values: Tuple[Any, ...] = (None, [], ()) + + _name: str + _parent: "ParseResults" + _all_names: Set[str] + _modal: bool + _toklist: List[Any] + _tokdict: Dict[str, Any] + + __slots__ = ( + "_name", + "_parent", + "_all_names", + "_modal", + "_toklist", + "_tokdict", + ) + + class List(list): + """ + Simple wrapper class to distinguish parsed list results that should be preserved + as actual Python lists, instead of being converted to :class:`ParseResults`:: + + LBRACK, RBRACK = map(pp.Suppress, "[]") + element = pp.Forward() + item = ppc.integer + element_list = LBRACK + pp.DelimitedList(element) + RBRACK + + # add parse actions to convert from ParseResults to actual Python collection types + def as_python_list(t): + return pp.ParseResults.List(t.as_list()) + element_list.add_parse_action(as_python_list) + + element <<= item | element_list + + element.run_tests(''' + 100 + [2,3,4] + [[2, 1],3,4] + [(2, 1),3,4] + (2,3,4) + ''', post_parse=lambda s, r: (r[0], type(r[0]))) + + prints:: + + 100 + (100, ) + + [2,3,4] + ([2, 3, 4], ) + + [[2, 1],3,4] + ([[2, 1], 3, 4], ) + + (Used internally by :class:`Group` when `aslist=True`.) + """ + + def __new__(cls, contained=None): + if contained is None: + contained = [] + + if not isinstance(contained, list): + raise TypeError( + f"{cls.__name__} may only be constructed with a list, not {type(contained).__name__}" + ) + + return list.__new__(cls) + + def __new__(cls, toklist=None, name=None, **kwargs): + if isinstance(toklist, ParseResults): + return toklist + self = object.__new__(cls) + self._name = None + self._parent = None + self._all_names = set() + + if toklist is None: + self._toklist = [] + elif isinstance(toklist, (list, _generator_type)): + self._toklist = ( + [toklist[:]] + if isinstance(toklist, ParseResults.List) + else list(toklist) + ) + else: + self._toklist = [toklist] + self._tokdict = dict() + return self + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( + self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance + ): + self._tokdict: Dict[str, _ParseResultsWithOffset] + self._modal = modal + if name is not None and name != "": + if isinstance(name, int): + name = str(name) + if not modal: + self._all_names = {name} + self._name = name + if toklist not in self._null_values: + if isinstance(toklist, (str_type, type)): + toklist = [toklist] + if asList: + if isinstance(toklist, ParseResults): + self[name] = _ParseResultsWithOffset( + ParseResults(toklist._toklist), 0 + ) + else: + self[name] = _ParseResultsWithOffset( + ParseResults(toklist[0]), 0 + ) + self[name]._name = name + else: + try: + self[name] = toklist[0] + except (KeyError, TypeError, IndexError): + if toklist is not self: + self[name] = toklist + else: + self._name = name + + def __getitem__(self, i): + if isinstance(i, (int, slice)): + return self._toklist[i] + else: + if i not in self._all_names: + return self._tokdict[i][-1][0] + else: + return ParseResults([v[0] for v in self._tokdict[i]]) + + def __setitem__(self, k, v, isinstance=isinstance): + if isinstance(v, _ParseResultsWithOffset): + self._tokdict[k] = self._tokdict.get(k, list()) + [v] + sub = v[0] + elif isinstance(k, (int, slice)): + self._toklist[k] = v + sub = v + else: + self._tokdict[k] = self._tokdict.get(k, list()) + [ + _ParseResultsWithOffset(v, 0) + ] + sub = v + if isinstance(sub, ParseResults): + sub._parent = self + + def __delitem__(self, i): + if isinstance(i, (int, slice)): + mylen = len(self._toklist) + del self._toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i + 1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name, occurrences in self._tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset( + value, position - (position > j) + ) + else: + del self._tokdict[i] + + def __contains__(self, k) -> bool: + return k in self._tokdict + + def __len__(self) -> int: + return len(self._toklist) + + def __bool__(self) -> bool: + return not not (self._toklist or self._tokdict) + + def __iter__(self) -> Iterator: + return iter(self._toklist) + + def __reversed__(self) -> Iterator: + return iter(self._toklist[::-1]) + + def keys(self): + return iter(self._tokdict) + + def values(self): + return (self[k] for k in self.keys()) + + def items(self): + return ((k, self[k]) for k in self.keys()) + + def haskeys(self) -> bool: + """ + Since ``keys()`` returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return not not self._tokdict + + def pop(self, *args, **kwargs): + """ + Removes and returns item at specified index (default= ``last``). + Supports both ``list`` and ``dict`` semantics for ``pop()``. If + passed no argument or an integer argument, it will use ``list`` + semantics and pop tokens from the list of parsed tokens. If passed + a non-integer argument (most likely a string), it will use ``dict`` + semantics and pop the corresponding value from any defined results + names. A second default return value argument is supported, just as in + ``dict.pop()``. + + Example:: + + numlist = Word(nums)[...] + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] + + def remove_first(tokens): + tokens.pop(0) + numlist.add_parse_action(remove_first) + print(numlist.parse_string("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + Word(nums)[1, ...] + print(patt.parse_string("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.add_parse_action(remove_LABEL) + print(patt.parse_string("AAB 123 321").dump()) + + prints:: + + ['AAB', '123', '321'] + - LABEL: 'AAB' + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k, v in kwargs.items(): + if k == "default": + args = (args[0], v) + else: + raise TypeError(f"pop() got an unexpected keyword argument {k!r}") + if isinstance(args[0], int) or len(args) == 1 or args[0] in self: + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, default_value=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given ``default_value`` or ``None`` if no + ``default_value`` is specified. + + Similar to ``dict.get()``. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parse_string("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return default_value + + def insert(self, index, ins_string): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to ``list.insert()``. + + Example:: + + numlist = Word(nums)[...] + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + numlist.add_parse_action(insert_locn) + print(numlist.parse_string("0 123 321")) # -> [0, '0', '123', '321'] + """ + self._toklist.insert(index, ins_string) + # fixup indices in token dictionary + for name, occurrences in self._tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset( + value, position + (position > index) + ) + + def append(self, item): + """ + Add single element to end of ``ParseResults`` list of elements. + + Example:: + + numlist = Word(nums)[...] + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + numlist.add_parse_action(append_sum) + print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321', 444] + """ + self._toklist.append(item) + + def extend(self, itemseq): + """ + Add sequence of elements to end of ``ParseResults`` list of elements. + + Example:: + + patt = Word(alphas)[1, ...] + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + patt.add_parse_action(make_palindrome) + print(patt.parse_string("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self.__iadd__(itemseq) + else: + self._toklist.extend(itemseq) + + def clear(self): + """ + Clear all elements and results names. + """ + del self._toklist[:] + self._tokdict.clear() + + def __getattr__(self, name): + try: + return self[name] + except KeyError: + if name.startswith("__"): + raise AttributeError(name) + return "" + + def __add__(self, other: "ParseResults") -> "ParseResults": + ret = self.copy() + ret += other + return ret + + def __iadd__(self, other: "ParseResults") -> "ParseResults": + if not other: + return self + + if other._tokdict: + offset = len(self._toklist) + addoffset = lambda a: offset if a < 0 else a + offset + otheritems = other._tokdict.items() + otherdictitems = [ + (k, _ParseResultsWithOffset(v[0], addoffset(v[1]))) + for k, vlist in otheritems + for v in vlist + ] + for k, v in otherdictitems: + self[k] = v + if isinstance(v[0], ParseResults): + v[0]._parent = self + + self._toklist += other._toklist + self._all_names |= other._all_names + return self + + def __radd__(self, other) -> "ParseResults": + if isinstance(other, int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__(self) -> str: + return f"{type(self).__name__}({self._toklist!r}, {self.as_dict()})" + + def __str__(self) -> str: + return ( + "[" + + ", ".join( + [ + str(i) if isinstance(i, ParseResults) else repr(i) + for i in self._toklist + ] + ) + + "]" + ) + + def _asStringList(self, sep=""): + out = [] + for item in self._toklist: + if out and sep: + out.append(sep) + if isinstance(item, ParseResults): + out += item._asStringList() + else: + out.append(str(item)) + return out + + def as_list(self) -> list: + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + + patt = Word(alphas)[1, ...] + result = patt.parse_string("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] + + # Use as_list() to create an actual list + result_list = result.as_list() + print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [ + res.as_list() if isinstance(res, ParseResults) else res + for res in self._toklist + ] + + def as_dict(self) -> dict: + """ + Returns the named parse results as a nested dictionary. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parse_string('12/31/1999') + print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.as_dict() + print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.as_dict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + + def to_item(obj): + if isinstance(obj, ParseResults): + return obj.as_dict() if obj.haskeys() else [to_item(v) for v in obj] + else: + return obj + + return dict((k, to_item(v)) for k, v in self.items()) + + def copy(self) -> "ParseResults": + """ + Returns a new shallow copy of a :class:`ParseResults` object. `ParseResults` + items contained within the source are shared with the copy. Use + :class:`ParseResults.deepcopy()` to create a copy with its own separate + content values. + """ + ret = ParseResults(self._toklist) + ret._tokdict = self._tokdict.copy() + ret._parent = self._parent + ret._all_names |= self._all_names + ret._name = self._name + return ret + + def deepcopy(self) -> "ParseResults": + """ + Returns a new deep copy of a :class:`ParseResults` object. + """ + ret = self.copy() + # replace values with copies if they are of known mutable types + for i, obj in enumerate(self._toklist): + if isinstance(obj, ParseResults): + self._toklist[i] = obj.deepcopy() + elif isinstance(obj, (str, bytes)): + pass + elif isinstance(obj, MutableMapping): + self._toklist[i] = dest = type(obj)() + for k, v in obj.items(): + dest[k] = v.deepcopy() if isinstance(v, ParseResults) else v + elif isinstance(obj, Container): + self._toklist[i] = type(obj)( + v.deepcopy() if isinstance(v, ParseResults) else v for v in obj + ) + return ret + + def get_name(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = user_data[1, ...] + + result = user_info.parse_string("22 111-22-3333 #221B") + for item in result: + print(item.get_name(), ':', item[0]) + + prints:: + + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self._name: + return self._name + elif self._parent: + par: "ParseResults" = self._parent + parent_tokdict_items = par._tokdict.items() + return next( + ( + k + for k, vlist in parent_tokdict_items + for v, loc in vlist + if v is self + ), + None, + ) + elif ( + len(self) == 1 + and len(self._tokdict) == 1 + and next(iter(self._tokdict.values()))[0][1] in (0, -1) + ): + return next(iter(self._tokdict.keys())) + else: + return None + + def dump(self, indent="", full=True, include_list=True, _depth=0) -> str: + """ + Diagnostic method for listing out the contents of + a :class:`ParseResults`. Accepts an optional ``indent`` argument so + that this string can be embedded in a nested display of other data. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parse_string('1999/12/31') + print(result.dump()) + + prints:: + + ['1999', '/', '12', '/', '31'] + - day: '31' + - month: '12' + - year: '1999' + """ + out = [] + NL = "\n" + out.append(indent + str(self.as_list()) if include_list else "") + + if full: + if self.haskeys(): + items = sorted((str(k), v) for k, v in self.items()) + for k, v in items: + if out: + out.append(NL) + out.append(f"{indent}{(' ' * _depth)}- {k}: ") + if isinstance(v, ParseResults): + if v: + out.append( + v.dump( + indent=indent, + full=full, + include_list=include_list, + _depth=_depth + 1, + ) + ) + else: + out.append(str(v)) + else: + out.append(repr(v)) + if any(isinstance(vv, ParseResults) for vv in self): + v = self + for i, vv in enumerate(v): + if isinstance(vv, ParseResults): + out.append( + "\n{}{}[{}]:\n{}{}{}".format( + indent, + (" " * (_depth)), + i, + indent, + (" " * (_depth + 1)), + vv.dump( + indent=indent, + full=full, + include_list=include_list, + _depth=_depth + 1, + ), + ) + ) + else: + out.append( + "\n%s%s[%d]:\n%s%s%s" + % ( + indent, + (" " * (_depth)), + i, + indent, + (" " * (_depth + 1)), + str(vv), + ) + ) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the + `pprint `_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint `_ . + + Example:: + + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(DelimitedList(term))) + result = func.parse_string("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + + prints:: + + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.as_list(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( + self._toklist, + ( + self._tokdict.copy(), + None, + self._all_names, + self._name, + ), + ) + + def __setstate__(self, state): + self._toklist, (self._tokdict, par, inAccumNames, self._name) = state + self._all_names = set(inAccumNames) + self._parent = None + + def __getnewargs__(self): + return self._toklist, self._name + + def __dir__(self): + return dir(type(self)) + list(self.keys()) + + @classmethod + def from_dict(cls, other, name=None) -> "ParseResults": + """ + Helper classmethod to construct a ``ParseResults`` from a ``dict``, preserving the + name-value relations as results names. If an optional ``name`` argument is + given, a nested ``ParseResults`` will be returned. + """ + + def is_iterable(obj): + try: + iter(obj) + except Exception: + return False + # str's are iterable, but in pyparsing, we don't want to iterate over them + else: + return not isinstance(obj, str_type) + + ret = cls([]) + for k, v in other.items(): + if isinstance(v, Mapping): + ret += cls.from_dict(v, name=k) + else: + ret += cls([v], name=k, asList=is_iterable(v)) + if name is not None: + ret = cls([ret], name=name) + return ret + + asList = as_list + """Deprecated - use :class:`as_list`""" + asDict = as_dict + """Deprecated - use :class:`as_dict`""" + getName = get_name + """Deprecated - use :class:`get_name`""" + + +MutableMapping.register(ParseResults) +MutableSequence.register(ParseResults) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py new file mode 100644 index 0000000..6a254c1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py @@ -0,0 +1,331 @@ +# testing.py + +from contextlib import contextmanager +import typing + +from .core import ( + ParserElement, + ParseException, + Keyword, + __diag__, + __compat__, +) + + +class pyparsing_test: + """ + namespace class for classes useful in writing unit tests + """ + + class reset_pyparsing_context: + """ + Context manager to be used when writing unit tests that modify pyparsing config values: + - packrat parsing + - bounded recursion parsing + - default whitespace characters. + - default keyword characters + - literal string auto-conversion class + - __diag__ settings + + Example:: + + with reset_pyparsing_context(): + # test that literals used to construct a grammar are automatically suppressed + ParserElement.inlineLiteralsUsing(Suppress) + + term = Word(alphas) | Word(nums) + group = Group('(' + term[...] + ')') + + # assert that the '()' characters are not included in the parsed tokens + self.assertParseAndCheckList(group, "(abc 123 def)", ['abc', '123', 'def']) + + # after exiting context manager, literals are converted to Literal expressions again + """ + + def __init__(self): + self._save_context = {} + + def save(self): + self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS + self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS + + self._save_context[ + "literal_string_class" + ] = ParserElement._literalStringClass + + self._save_context["verbose_stacktrace"] = ParserElement.verbose_stacktrace + + self._save_context["packrat_enabled"] = ParserElement._packratEnabled + if ParserElement._packratEnabled: + self._save_context[ + "packrat_cache_size" + ] = ParserElement.packrat_cache.size + else: + self._save_context["packrat_cache_size"] = None + self._save_context["packrat_parse"] = ParserElement._parse + self._save_context[ + "recursion_enabled" + ] = ParserElement._left_recursion_enabled + + self._save_context["__diag__"] = { + name: getattr(__diag__, name) for name in __diag__._all_names + } + + self._save_context["__compat__"] = { + "collect_all_And_tokens": __compat__.collect_all_And_tokens + } + + return self + + def restore(self): + # reset pyparsing global state + if ( + ParserElement.DEFAULT_WHITE_CHARS + != self._save_context["default_whitespace"] + ): + ParserElement.set_default_whitespace_chars( + self._save_context["default_whitespace"] + ) + + ParserElement.verbose_stacktrace = self._save_context["verbose_stacktrace"] + + Keyword.DEFAULT_KEYWORD_CHARS = self._save_context["default_keyword_chars"] + ParserElement.inlineLiteralsUsing( + self._save_context["literal_string_class"] + ) + + for name, value in self._save_context["__diag__"].items(): + (__diag__.enable if value else __diag__.disable)(name) + + ParserElement._packratEnabled = False + if self._save_context["packrat_enabled"]: + ParserElement.enable_packrat(self._save_context["packrat_cache_size"]) + else: + ParserElement._parse = self._save_context["packrat_parse"] + ParserElement._left_recursion_enabled = self._save_context[ + "recursion_enabled" + ] + + __compat__.collect_all_And_tokens = self._save_context["__compat__"] + + return self + + def copy(self): + ret = type(self)() + ret._save_context.update(self._save_context) + return ret + + def __enter__(self): + return self.save() + + def __exit__(self, *args): + self.restore() + + class TestParseResultsAsserts: + """ + A mixin class to add parse results assertion methods to normal unittest.TestCase classes. + """ + + def assertParseResultsEquals( + self, result, expected_list=None, expected_dict=None, msg=None + ): + """ + Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``, + and compare any defined results names with an optional ``expected_dict``. + """ + if expected_list is not None: + self.assertEqual(expected_list, result.as_list(), msg=msg) + if expected_dict is not None: + self.assertEqual(expected_dict, result.as_dict(), msg=msg) + + def assertParseAndCheckList( + self, expr, test_string, expected_list, msg=None, verbose=True + ): + """ + Convenience wrapper assert to test a parser element and input string, and assert that + the resulting ``ParseResults.asList()`` is equal to the ``expected_list``. + """ + result = expr.parse_string(test_string, parse_all=True) + if verbose: + print(result.dump()) + else: + print(result.as_list()) + self.assertParseResultsEquals(result, expected_list=expected_list, msg=msg) + + def assertParseAndCheckDict( + self, expr, test_string, expected_dict, msg=None, verbose=True + ): + """ + Convenience wrapper assert to test a parser element and input string, and assert that + the resulting ``ParseResults.asDict()`` is equal to the ``expected_dict``. + """ + result = expr.parse_string(test_string, parseAll=True) + if verbose: + print(result.dump()) + else: + print(result.as_list()) + self.assertParseResultsEquals(result, expected_dict=expected_dict, msg=msg) + + def assertRunTestResults( + self, run_tests_report, expected_parse_results=None, msg=None + ): + """ + Unit test assertion to evaluate output of ``ParserElement.runTests()``. If a list of + list-dict tuples is given as the ``expected_parse_results`` argument, then these are zipped + with the report tuples returned by ``runTests`` and evaluated using ``assertParseResultsEquals``. + Finally, asserts that the overall ``runTests()`` success value is ``True``. + + :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests + :param expected_parse_results (optional): [tuple(str, list, dict, Exception)] + """ + run_test_success, run_test_results = run_tests_report + + if expected_parse_results is not None: + merged = [ + (*rpt, expected) + for rpt, expected in zip(run_test_results, expected_parse_results) + ] + for test_string, result, expected in merged: + # expected should be a tuple containing a list and/or a dict or an exception, + # and optional failure message string + # an empty tuple will skip any result validation + fail_msg = next( + (exp for exp in expected if isinstance(exp, str)), None + ) + expected_exception = next( + ( + exp + for exp in expected + if isinstance(exp, type) and issubclass(exp, Exception) + ), + None, + ) + if expected_exception is not None: + with self.assertRaises( + expected_exception=expected_exception, msg=fail_msg or msg + ): + if isinstance(result, Exception): + raise result + else: + expected_list = next( + (exp for exp in expected if isinstance(exp, list)), None + ) + expected_dict = next( + (exp for exp in expected if isinstance(exp, dict)), None + ) + if (expected_list, expected_dict) != (None, None): + self.assertParseResultsEquals( + result, + expected_list=expected_list, + expected_dict=expected_dict, + msg=fail_msg or msg, + ) + else: + # warning here maybe? + print(f"no validation for {test_string!r}") + + # do this last, in case some specific test results can be reported instead + self.assertTrue( + run_test_success, msg=msg if msg is not None else "failed runTests" + ) + + @contextmanager + def assertRaisesParseException(self, exc_type=ParseException, msg=None): + with self.assertRaises(exc_type, msg=msg): + yield + + @staticmethod + def with_line_numbers( + s: str, + start_line: typing.Optional[int] = None, + end_line: typing.Optional[int] = None, + expand_tabs: bool = True, + eol_mark: str = "|", + mark_spaces: typing.Optional[str] = None, + mark_control: typing.Optional[str] = None, + ) -> str: + """ + Helpful method for debugging a parser - prints a string with line and column numbers. + (Line and column numbers are 1-based.) + + :param s: tuple(bool, str - string to be printed with line and column numbers + :param start_line: int - (optional) starting line number in s to print (default=1) + :param end_line: int - (optional) ending line number in s to print (default=len(s)) + :param expand_tabs: bool - (optional) expand tabs to spaces, to match the pyparsing default + :param eol_mark: str - (optional) string to mark the end of lines, helps visualize trailing spaces (default="|") + :param mark_spaces: str - (optional) special character to display in place of spaces + :param mark_control: str - (optional) convert non-printing control characters to a placeholding + character; valid values: + - "unicode" - replaces control chars with Unicode symbols, such as "â" and "âŠ" + - any single character string - replace control characters with given string + - None (default) - string is displayed as-is + + :return: str - input string with leading line numbers and column number headers + """ + if expand_tabs: + s = s.expandtabs() + if mark_control is not None: + mark_control = typing.cast(str, mark_control) + if mark_control == "unicode": + transtable_map = { + c: u for c, u in zip(range(0, 33), range(0x2400, 0x2433)) + } + transtable_map[127] = 0x2421 + tbl = str.maketrans(transtable_map) + eol_mark = "" + else: + ord_mark_control = ord(mark_control) + tbl = str.maketrans( + {c: ord_mark_control for c in list(range(0, 32)) + [127]} + ) + s = s.translate(tbl) + if mark_spaces is not None and mark_spaces != " ": + if mark_spaces == "unicode": + tbl = str.maketrans({9: 0x2409, 32: 0x2423}) + s = s.translate(tbl) + else: + s = s.replace(" ", mark_spaces) + if start_line is None: + start_line = 1 + if end_line is None: + end_line = len(s) + end_line = min(end_line, len(s)) + start_line = min(max(1, start_line), end_line) + + if mark_control != "unicode": + s_lines = s.splitlines()[start_line - 1 : end_line] + else: + s_lines = [line + "âŠ" for line in s.split("âŠ")[start_line - 1 : end_line]] + if not s_lines: + return "" + + lineno_width = len(str(end_line)) + max_line_len = max(len(line) for line in s_lines) + lead = " " * (lineno_width + 1) + if max_line_len >= 99: + header0 = ( + lead + + "".join( + f"{' ' * 99}{(i + 1) % 100}" + for i in range(max(max_line_len // 100, 1)) + ) + + "\n" + ) + else: + header0 = "" + header1 = ( + header0 + + lead + + "".join(f" {(i + 1) % 10}" for i in range(-(-max_line_len // 10))) + + "\n" + ) + header2 = lead + "1234567890" * (-(-max_line_len // 10)) + "\n" + return ( + header1 + + header2 + + "\n".join( + f"{i:{lineno_width}d}:{line}{eol_mark}" + for i, line in enumerate(s_lines, start=start_line) + ) + + "\n" + ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py new file mode 100644 index 0000000..ec0b3a4 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py @@ -0,0 +1,361 @@ +# unicode.py + +import sys +from itertools import filterfalse +from typing import List, Tuple, Union + + +class _lazyclassproperty: + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, "_intern") or any( + cls._intern is getattr(superclass, "_intern", []) + for superclass in cls.__mro__[1:] + ): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +UnicodeRangeList = List[Union[Tuple[int, int], Tuple[int]]] + + +class unicode_set: + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``. Ranges can be specified using + 2-tuples or a 1-tuple, such as:: + + _ranges = [ + (0x0020, 0x007e), + (0x00a0, 0x00ff), + (0x0100,), + ] + + Ranges are left- and right-inclusive. A 1-tuple of (x,) is treated as (x, x). + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + + _ranges: UnicodeRangeList = [] + + @_lazyclassproperty + def _chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in getattr(cc, "_ranges", ()): + ret.extend(range(rr[0], rr[-1] + 1)) + return [chr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + """all non-whitespace characters in this range""" + return "".join(filterfalse(str.isspace, cls._chars_for_ranges)) + + @_lazyclassproperty + def alphas(cls): + """all alphabetic characters in this range""" + return "".join(filter(str.isalpha, cls._chars_for_ranges)) + + @_lazyclassproperty + def nums(cls): + """all numeric digit characters in this range""" + return "".join(filter(str.isdigit, cls._chars_for_ranges)) + + @_lazyclassproperty + def alphanums(cls): + """all alphanumeric characters in this range""" + return cls.alphas + cls.nums + + @_lazyclassproperty + def identchars(cls): + """all characters in this range that are valid identifier characters, plus underscore '_'""" + return "".join( + sorted( + set( + "".join(filter(str.isidentifier, cls._chars_for_ranges)) + + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº" + + "ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" + + "_" + ) + ) + ) + + @_lazyclassproperty + def identbodychars(cls): + """ + all characters in this range that are valid identifier body characters, + plus the digits 0-9, and · (Unicode MIDDLE DOT) + """ + return "".join( + sorted( + set( + cls.identchars + + "0123456789·" + + "".join( + [c for c in cls._chars_for_ranges if ("_" + c).isidentifier()] + ) + ) + ) + ) + + @_lazyclassproperty + def identifier(cls): + """ + a pyparsing Word expression for an identifier using this range's definitions for + identchars and identbodychars + """ + from pip._vendor.pyparsing import Word + + return Word(cls.identchars, cls.identbodychars) + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + + # fmt: off + + # define ranges in language character sets + _ranges: UnicodeRangeList = [ + (0x0020, sys.maxunicode), + ] + + class BasicMultilingualPlane(unicode_set): + """Unicode set for the Basic Multilingual Plane""" + _ranges: UnicodeRangeList = [ + (0x0020, 0xFFFF), + ] + + class Latin1(unicode_set): + """Unicode set for Latin-1 Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0020, 0x007E), + (0x00A0, 0x00FF), + ] + + class LatinA(unicode_set): + """Unicode set for Latin-A Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0100, 0x017F), + ] + + class LatinB(unicode_set): + """Unicode set for Latin-B Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0180, 0x024F), + ] + + class Greek(unicode_set): + """Unicode set for Greek Unicode Character Ranges""" + _ranges: UnicodeRangeList = [ + (0x0342, 0x0345), + (0x0370, 0x0377), + (0x037A, 0x037F), + (0x0384, 0x038A), + (0x038C,), + (0x038E, 0x03A1), + (0x03A3, 0x03E1), + (0x03F0, 0x03FF), + (0x1D26, 0x1D2A), + (0x1D5E,), + (0x1D60,), + (0x1D66, 0x1D6A), + (0x1F00, 0x1F15), + (0x1F18, 0x1F1D), + (0x1F20, 0x1F45), + (0x1F48, 0x1F4D), + (0x1F50, 0x1F57), + (0x1F59,), + (0x1F5B,), + (0x1F5D,), + (0x1F5F, 0x1F7D), + (0x1F80, 0x1FB4), + (0x1FB6, 0x1FC4), + (0x1FC6, 0x1FD3), + (0x1FD6, 0x1FDB), + (0x1FDD, 0x1FEF), + (0x1FF2, 0x1FF4), + (0x1FF6, 0x1FFE), + (0x2129,), + (0x2719, 0x271A), + (0xAB65,), + (0x10140, 0x1018D), + (0x101A0,), + (0x1D200, 0x1D245), + (0x1F7A1, 0x1F7A7), + ] + + class Cyrillic(unicode_set): + """Unicode set for Cyrillic Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0400, 0x052F), + (0x1C80, 0x1C88), + (0x1D2B,), + (0x1D78,), + (0x2DE0, 0x2DFF), + (0xA640, 0xA672), + (0xA674, 0xA69F), + (0xFE2E, 0xFE2F), + ] + + class Chinese(unicode_set): + """Unicode set for Chinese Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x2E80, 0x2E99), + (0x2E9B, 0x2EF3), + (0x31C0, 0x31E3), + (0x3400, 0x4DB5), + (0x4E00, 0x9FEF), + (0xA700, 0xA707), + (0xF900, 0xFA6D), + (0xFA70, 0xFAD9), + (0x16FE2, 0x16FE3), + (0x1F210, 0x1F212), + (0x1F214, 0x1F23B), + (0x1F240, 0x1F248), + (0x20000, 0x2A6D6), + (0x2A700, 0x2B734), + (0x2B740, 0x2B81D), + (0x2B820, 0x2CEA1), + (0x2CEB0, 0x2EBE0), + (0x2F800, 0x2FA1D), + ] + + class Japanese(unicode_set): + """Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges""" + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges: UnicodeRangeList = [ + (0x4E00, 0x9FBF), + (0x3000, 0x303F), + ] + + class Hiragana(unicode_set): + """Unicode set for Hiragana Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x3041, 0x3096), + (0x3099, 0x30A0), + (0x30FC,), + (0xFF70,), + (0x1B001,), + (0x1B150, 0x1B152), + (0x1F200,), + ] + + class Katakana(unicode_set): + """Unicode set for Katakana Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x3099, 0x309C), + (0x30A0, 0x30FF), + (0x31F0, 0x31FF), + (0x32D0, 0x32FE), + (0xFF65, 0xFF9F), + (0x1B000,), + (0x1B164, 0x1B167), + (0x1F201, 0x1F202), + (0x1F213,), + ] + + 漢字 = Kanji + カタカナ = Katakana + ã²ã‚‰ãŒãª = Hiragana + + _ranges = ( + Kanji._ranges + + Hiragana._ranges + + Katakana._ranges + ) + + class Hangul(unicode_set): + """Unicode set for Hangul (Korean) Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x1100, 0x11FF), + (0x302E, 0x302F), + (0x3131, 0x318E), + (0x3200, 0x321C), + (0x3260, 0x327B), + (0x327E,), + (0xA960, 0xA97C), + (0xAC00, 0xD7A3), + (0xD7B0, 0xD7C6), + (0xD7CB, 0xD7FB), + (0xFFA0, 0xFFBE), + (0xFFC2, 0xFFC7), + (0xFFCA, 0xFFCF), + (0xFFD2, 0xFFD7), + (0xFFDA, 0xFFDC), + ] + + Korean = Hangul + + class CJK(Chinese, Japanese, Hangul): + """Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range""" + + class Thai(unicode_set): + """Unicode set for Thai Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0E01, 0x0E3A), + (0x0E3F, 0x0E5B) + ] + + class Arabic(unicode_set): + """Unicode set for Arabic Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0600, 0x061B), + (0x061E, 0x06FF), + (0x0700, 0x077F), + ] + + class Hebrew(unicode_set): + """Unicode set for Hebrew Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0591, 0x05C7), + (0x05D0, 0x05EA), + (0x05EF, 0x05F4), + (0xFB1D, 0xFB36), + (0xFB38, 0xFB3C), + (0xFB3E,), + (0xFB40, 0xFB41), + (0xFB43, 0xFB44), + (0xFB46, 0xFB4F), + ] + + class Devanagari(unicode_set): + """Unicode set for Devanagari Unicode Character Range""" + _ranges: UnicodeRangeList = [ + (0x0900, 0x097F), + (0xA8E0, 0xA8FF) + ] + + BMP = BasicMultilingualPlane + + # add language identifiers using language Unicode + العربية = Arabic + 中文 = Chinese + кириллица = Cyrillic + Ελληνικά = Greek + עִברִית = Hebrew + 日本語 = Japanese + 한국어 = Korean + ไทย = Thai + देवनागरी = Devanagari + + # fmt: on diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py new file mode 100644 index 0000000..d8d3f41 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py @@ -0,0 +1,284 @@ +# util.py +import inspect +import warnings +import types +import collections +import itertools +from functools import lru_cache, wraps +from typing import Callable, List, Union, Iterable, TypeVar, cast + +_bslash = chr(92) +C = TypeVar("C", bound=Callable) + + +class __config_flags: + """Internal class for defining compatibility and debugging flags""" + + _all_names: List[str] = [] + _fixed_names: List[str] = [] + _type_desc = "configuration" + + @classmethod + def _set(cls, dname, value): + if dname in cls._fixed_names: + warnings.warn( + f"{cls.__name__}.{dname} {cls._type_desc} is {str(getattr(cls, dname)).upper()}" + f" and cannot be overridden", + stacklevel=3, + ) + return + if dname in cls._all_names: + setattr(cls, dname, value) + else: + raise ValueError(f"no such {cls._type_desc} {dname!r}") + + enable = classmethod(lambda cls, name: cls._set(name, True)) + disable = classmethod(lambda cls, name: cls._set(name, False)) + + +@lru_cache(maxsize=128) +def col(loc: int, strg: str) -> int: + """ + Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See + :class:`ParserElement.parse_string` for more + information on parsing strings containing ```` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + """ + s = strg + return 1 if 0 < loc < len(s) and s[loc - 1] == "\n" else loc - s.rfind("\n", 0, loc) + + +@lru_cache(maxsize=128) +def lineno(loc: int, strg: str) -> int: + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note - the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`ParserElement.parse_string` + for more information on parsing strings containing ```` s, and + suggested methods to maintain a consistent view of the parsed string, the + parse location, and line and column positions within the parsed string. + """ + return strg.count("\n", 0, loc) + 1 + + +@lru_cache(maxsize=128) +def line(loc: int, strg: str) -> str: + """ + Returns the line of text containing loc within a string, counting newlines as line separators. + """ + last_cr = strg.rfind("\n", 0, loc) + next_cr = strg.find("\n", loc) + return strg[last_cr + 1 : next_cr] if next_cr >= 0 else strg[last_cr + 1 :] + + +class _UnboundedCache: + def __init__(self): + cache = {} + cache_get = cache.get + self.not_in_cache = not_in_cache = object() + + def get(_, key): + return cache_get(key, not_in_cache) + + def set_(_, key, value): + cache[key] = value + + def clear(_): + cache.clear() + + self.size = None + self.get = types.MethodType(get, self) + self.set = types.MethodType(set_, self) + self.clear = types.MethodType(clear, self) + + +class _FifoCache: + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + cache = {} + keyring = [object()] * size + cache_get = cache.get + cache_pop = cache.pop + keyiter = itertools.cycle(range(size)) + + def get(_, key): + return cache_get(key, not_in_cache) + + def set_(_, key, value): + cache[key] = value + i = next(keyiter) + cache_pop(keyring[i], None) + keyring[i] = key + + def clear(_): + cache.clear() + keyring[:] = [object()] * size + + self.size = size + self.get = types.MethodType(get, self) + self.set = types.MethodType(set_, self) + self.clear = types.MethodType(clear, self) + + +class LRUMemo: + """ + A memoizing mapping that retains `capacity` deleted items + + The memo tracks retained items by their access order; once `capacity` items + are retained, the least recently used item is discarded. + """ + + def __init__(self, capacity): + self._capacity = capacity + self._active = {} + self._memory = collections.OrderedDict() + + def __getitem__(self, key): + try: + return self._active[key] + except KeyError: + self._memory.move_to_end(key) + return self._memory[key] + + def __setitem__(self, key, value): + self._memory.pop(key, None) + self._active[key] = value + + def __delitem__(self, key): + try: + value = self._active.pop(key) + except KeyError: + pass + else: + while len(self._memory) >= self._capacity: + self._memory.popitem(last=False) + self._memory[key] = value + + def clear(self): + self._active.clear() + self._memory.clear() + + +class UnboundedMemo(dict): + """ + A memoizing mapping that retains all deleted items + """ + + def __delitem__(self, key): + pass + + +def _escape_regex_range_chars(s: str) -> str: + # escape these chars: ^-[] + for c in r"\^-[]": + s = s.replace(c, _bslash + c) + s = s.replace("\n", r"\n") + s = s.replace("\t", r"\t") + return str(s) + + +def _collapse_string_to_ranges( + s: Union[str, Iterable[str]], re_escape: bool = True +) -> str: + def is_consecutive(c): + c_int = ord(c) + is_consecutive.prev, prev = c_int, is_consecutive.prev + if c_int - prev > 1: + is_consecutive.value = next(is_consecutive.counter) + return is_consecutive.value + + is_consecutive.prev = 0 # type: ignore [attr-defined] + is_consecutive.counter = itertools.count() # type: ignore [attr-defined] + is_consecutive.value = -1 # type: ignore [attr-defined] + + def escape_re_range_char(c): + return "\\" + c if c in r"\^-][" else c + + def no_escape_re_range_char(c): + return c + + if not re_escape: + escape_re_range_char = no_escape_re_range_char + + ret = [] + s = "".join(sorted(set(s))) + if len(s) > 3: + for _, chars in itertools.groupby(s, key=is_consecutive): + first = last = next(chars) + last = collections.deque( + itertools.chain(iter([last]), chars), maxlen=1 + ).pop() + if first == last: + ret.append(escape_re_range_char(first)) + else: + sep = "" if ord(last) == ord(first) + 1 else "-" + ret.append( + f"{escape_re_range_char(first)}{sep}{escape_re_range_char(last)}" + ) + else: + ret = [escape_re_range_char(c) for c in s] + + return "".join(ret) + + +def _flatten(ll: list) -> list: + ret = [] + for i in ll: + if isinstance(i, list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + + +def _make_synonym_function(compat_name: str, fn: C) -> C: + # In a future version, uncomment the code in the internal _inner() functions + # to begin emitting DeprecationWarnings. + + # Unwrap staticmethod/classmethod + fn = getattr(fn, "__func__", fn) + + # (Presence of 'self' arg in signature is used by explain_exception() methods, so we take + # some extra steps to add it if present in decorated function.) + if "self" == list(inspect.signature(fn).parameters)[0]: + + @wraps(fn) + def _inner(self, *args, **kwargs): + # warnings.warn( + # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 + # ) + return fn(self, *args, **kwargs) + + else: + + @wraps(fn) + def _inner(*args, **kwargs): + # warnings.warn( + # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 + # ) + return fn(*args, **kwargs) + + _inner.__doc__ = f"""Deprecated - use :class:`{fn.__name__}`""" + _inner.__name__ = compat_name + _inner.__annotations__ = fn.__annotations__ + if isinstance(fn, types.FunctionType): + _inner.__kwdefaults__ = fn.__kwdefaults__ + elif isinstance(fn, type) and hasattr(fn, "__init__"): + _inner.__kwdefaults__ = fn.__init__.__kwdefaults__ + else: + _inner.__kwdefaults__ = None + _inner.__qualname__ = fn.__qualname__ + return cast(C, _inner) + + +def replaced_by_pep8(fn: C) -> Callable[[Callable], C]: + """ + Decorator for pre-PEP8 compatibility synonyms, to link them to the new function. + """ + return lambda other: _make_synonym_function(other.__name__, fn) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py new file mode 100644 index 0000000..ddfcf7f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py @@ -0,0 +1,23 @@ +"""Wrappers to call pyproject.toml-based build backend hooks. +""" + +from ._impl import ( + BackendInvalid, + BackendUnavailable, + BuildBackendHookCaller, + HookMissing, + UnsupportedOperation, + default_subprocess_runner, + quiet_subprocess_runner, +) + +__version__ = '1.0.0' +__all__ = [ + 'BackendUnavailable', + 'BackendInvalid', + 'HookMissing', + 'UnsupportedOperation', + 'default_subprocess_runner', + 'quiet_subprocess_runner', + 'BuildBackendHookCaller', +] diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bd7fc96e20e2bcaa4f8d13f014e0680bd7b1277 GIT binary patch literal 618 zcmZvZzit#U5XSAj+dsKgh=`&fy6eyt*-fB95K)8%3ZOb6xv_j_b8*gVJGOVFO9f9s zM?uGvQ1AxZQX!gz6p>OfP7bQL`0aRSKF{azkIl^yg7y8`m&I?4(9gK}w~}>m`4ocB zh$DhH=83{hLXu`c2F;KRo0OzYMzSU+c~g)ABR(J-3&e+CF&VAWNp|-9y<^r2=f}Z} z=S-=wU0G*N#5`2NG-_|gyx`+mD;1Ey9bO`|b69 zs#(XRVlyTB-J^KII`InhFQJ!keHr67(tD{F{mxYT)>`9&;P1c`3)1NRAr~K5s{-}y z46MzC_tdpogZjZ~E5#j&v-F_aul6Uo8-hhQh{z)Hh$3PmA_csilzmPqH*-q+l*-1c zTfvPqR@^1+OG-N!8yEx`=;1n)enXc~kFHPZsfT3U0&6b1ItU-^(*OTfozPvafmwhWe|H7X2}-9*H+pZT4-(@6s_Nc-i*GcRB9P0t?cT$IBX1Wm3ZOqL+kh? n{t@7OfHA&EFdklI1x~II;3DFD2W{p literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8d2bd7762353d214448d8e4b2fd5585022a6f24 GIT binary patch literal 379 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

    0Z{gBqQC8!8_SKfWj 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 U&5dHq{YTC_#m#pGiaA;T3)=cY%>V!Z literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py new file mode 100644 index 0000000..95e509c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py @@ -0,0 +1,8 @@ +__all__ = ("tomllib",) + +import sys + +if sys.version_info >= (3, 11): + import tomllib +else: + from pip._vendor import tomli as tomllib diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py new file mode 100644 index 0000000..37b0e65 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py @@ -0,0 +1,330 @@ +import json +import os +import sys +import tempfile +from contextlib import contextmanager +from os.path import abspath +from os.path import join as pjoin +from subprocess import STDOUT, check_call, check_output + +from ._in_process import _in_proc_script_path + + +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) + + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + def __init__(self, traceback): + self.traceback = traceback + + +class BackendInvalid(Exception): + """Will be raised if the backend is invalid.""" + def __init__(self, backend_name, backend_path, message): + super().__init__(message) + self.backend_name = backend_name + self.backend_path = backend_path + + +class HookMissing(Exception): + """Will be raised on missing hooks (if a fallback can't be used).""" + def __init__(self, hook_name): + super().__init__(hook_name) + self.hook_name = hook_name + + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + def __init__(self, traceback): + self.traceback = traceback + + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess. + + This uses :func:`subprocess.check_call` under the hood. + """ + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + +def quiet_subprocess_runner(cmd, cwd=None, extra_environ=None): + """Call the subprocess while suppressing output. + + This uses :func:`subprocess.check_output` under the hood. + """ + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_output(cmd, cwd=cwd, env=env, stderr=STDOUT) + + +def norm_and_check(source_tree, requested): + """Normalise and check a backend path. + + Ensure that the requested backend path is specified as a relative path, + and resolves to a location under the given source tree. + + Return an absolute version of the requested path. + """ + if os.path.isabs(requested): + raise ValueError("paths must be relative") + + abs_source = os.path.abspath(source_tree) + abs_requested = os.path.normpath(os.path.join(abs_source, requested)) + # We have to use commonprefix for Python 2.7 compatibility. So we + # normalise case to avoid problems because commonprefix is a character + # based comparison :-( + norm_source = os.path.normcase(abs_source) + norm_requested = os.path.normcase(abs_requested) + if os.path.commonprefix([norm_source, norm_requested]) != norm_source: + raise ValueError("paths must be inside source tree") + + return abs_requested + + +class BuildBackendHookCaller: + """A wrapper to call the build backend hooks for a source directory. + """ + + def __init__( + self, + source_dir, + build_backend, + backend_path=None, + runner=None, + python_executable=None, + ): + """ + :param source_dir: The source directory to invoke the build backend for + :param build_backend: The build backend spec + :param backend_path: Additional path entries for the build backend spec + :param runner: The :ref:`subprocess runner ` to use + :param python_executable: + The Python executable used to invoke the build backend + """ + if runner is None: + runner = default_subprocess_runner + + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + if backend_path: + backend_path = [ + norm_and_check(self.source_dir, p) for p in backend_path + ] + self.backend_path = backend_path + self._subprocess_runner = runner + if not python_executable: + python_executable = sys.executable + self.python_executable = python_executable + + @contextmanager + def subprocess_runner(self, runner): + """A context manager for temporarily overriding the default + :ref:`subprocess runner `. + + .. code-block:: python + + hook_caller = BuildBackendHookCaller(...) + with hook_caller.subprocess_runner(quiet_subprocess_runner): + ... + """ + prev = self._subprocess_runner + self._subprocess_runner = runner + try: + yield + finally: + self._subprocess_runner = prev + + def _supported_features(self): + """Return the list of optional features supported by the backend.""" + return self._call_hook('_supported_features', {}) + + def get_requires_for_build_wheel(self, config_settings=None): + """Get additional dependencies required for building a wheel. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + + .. admonition:: Fallback + + If the build backend does not defined a hook with this name, an + empty list will be returned. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None, + _allow_fallback=True): + """Prepare a ``*.dist-info`` folder with metadata for this project. + + :returns: Name of the newly created subfolder within + ``metadata_directory``, containing the metadata. + :rtype: str + + .. admonition:: Fallback + + If the build backend does not define a hook with this name and + ``_allow_fallback`` is truthy, the backend will be asked to build a + wheel via the ``build_wheel`` hook and the dist-info extracted from + that will be returned. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + '_allow_fallback': _allow_fallback, + }) + + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build a wheel from this project. + + :returns: + The name of the newly created wheel within ``wheel_directory``. + + .. admonition:: Interaction with fallback + + If the ``build_wheel`` hook was called in the fallback for + :meth:`prepare_metadata_for_build_wheel`, the build backend would + not be invoked. Instead, the previously built wheel will be copied + to ``wheel_directory`` and the name of that file will be returned. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_editable(self, config_settings=None): + """Get additional dependencies required for building an editable wheel. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + + .. admonition:: Fallback + + If the build backend does not defined a hook with this name, an + empty list will be returned. + """ + return self._call_hook('get_requires_for_build_editable', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_editable( + self, metadata_directory, config_settings=None, + _allow_fallback=True): + """Prepare a ``*.dist-info`` folder with metadata for this project. + + :returns: Name of the newly created subfolder within + ``metadata_directory``, containing the metadata. + :rtype: str + + .. admonition:: Fallback + + If the build backend does not define a hook with this name and + ``_allow_fallback`` is truthy, the backend will be asked to build a + wheel via the ``build_editable`` hook and the dist-info + extracted from that will be returned. + """ + return self._call_hook('prepare_metadata_for_build_editable', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + '_allow_fallback': _allow_fallback, + }) + + def build_editable( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build an editable wheel from this project. + + :returns: + The name of the newly created wheel within ``wheel_directory``. + + .. admonition:: Interaction with fallback + + If the ``build_editable`` hook was called in the fallback for + :meth:`prepare_metadata_for_build_editable`, the build backend + would not be invoked. Instead, the previously built wheel will be + copied to ``wheel_directory`` and the name of that file will be + returned. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_editable', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Get additional dependencies required for building an sdist. + + :returns: A list of :pep:`dependency specifiers <508>`. + :rtype: list[str] + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + :returns: + The name of the newly created sdist within ``wheel_directory``. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + def _call_hook(self, hook_name, kwargs): + extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend} + + if self.backend_path: + backend_path = os.pathsep.join(self.backend_path) + extra_environ['PEP517_BACKEND_PATH'] = backend_path + + with tempfile.TemporaryDirectory() as td: + hook_input = {'kwargs': kwargs} + write_json(hook_input, pjoin(td, 'input.json'), indent=2) + + # Run the hook in a subprocess + with _in_proc_script_path() as script: + python = self.python_executable + self._subprocess_runner( + [python, abspath(str(script)), hook_name, td], + cwd=self.source_dir, + extra_environ=extra_environ + ) + + data = read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation(data.get('traceback', '')) + if data.get('no_backend'): + raise BackendUnavailable(data.get('traceback', '')) + if data.get('backend_invalid'): + raise BackendInvalid( + backend_name=self.build_backend, + backend_path=self.backend_path, + message=data.get('backend_error', '') + ) + if data.get('hook_missing'): + raise HookMissing(data.get('missing_hook_name') or hook_name) + return data['return_val'] diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py new file mode 100644 index 0000000..917fa06 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py @@ -0,0 +1,18 @@ +"""This is a subpackage because the directory is on sys.path for _in_process.py + +The subpackage should stay as empty as possible to avoid shadowing modules that +the backend might import. +""" + +import importlib.resources as resources + +try: + resources.files +except AttributeError: + # Python 3.8 compatibility + def _in_proc_script_path(): + return resources.path(__package__, '_in_process.py') +else: + def _in_proc_script_path(): + return resources.as_file( + resources.files(__package__).joinpath('_in_process.py')) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d4cd01ddb7026d300d7e880d28218da01144af5 GIT binary patch literal 1085 zcmah|&ubGw6rR~1ZIW)9LaT_UK`k_hSz19vTR|l!p%GdS?Pb|yr`b)D%rY}cn;wdY zAobE?L5e3Y#ecy6z=M~T9x6+3p1eh)AU*kJn@wXc4%s)~%zN|Ro9~-^$!0SM#^(p` zt2Z=+zNtkrj6Uc+2e5}cw2D0JX?5JtRyB;$h-$TwB=};+$kSh=RimTbMAW>6_z3J6 zYG(y?v<T_H@7}5`+*?vbBSn`L$|W-Rw*gdirW&DNS_if;Itwc@2Du&B%&h< zp(}l|#yD|;rW0~jp#nBLnanaA7|J7j)~b6%NVh{=L1-hCF$kFuLAeeE7;)PyfDqsH z*hbK-k_Piybt<5?D>JHrGBib-9%%$sUy`5^GA;|5@9MIPm5VDQWWqv+ueS+i4@sOj zYryK|G2~4+9tx2IPCxdu)Y3!lKJ;+nP39$Zpe=5V|4U2WjMAJ6*5bfZH0laxEvVDT zR8~Y|j?<^zaiUa>1x>~70qUtDXKnk1pj_CX2Dd%hwj~uZTo;46(5B6{T@T83*pWVK z-Yv||*&>kiPCu)#!yvRB2=f?+AdssDf;v89kY=b;+kr(O9S4+*rV@uEDm(}!^eBCv zg_b7Z6E>Ka=rnijBu9>N1`s06I{^;|++?dEl^q>qfa#}q)W{!np2ZYiYtj*S9h3QXMm?)J|1 z{`%qVhsU}3!_<6yAU_g~I*!LGpvL6+V*_#v1O4Jsd^AZIjX#!>2j!NeMa~(&RQW75 zfBv2y@kuzM-jcWvrmJI&e`p3aep?97bd5AF;;%;bP3cvsXK7{;|LKmQ)YYFz#|ys< YY%X+7KxaZ-=dE=ey-Q8&AMmvP7v6dW!~g&Q literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72fab5608ea88a72ab778b8193ca22b04edf82b8 GIT binary patch literal 14402 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py new file mode 100644 index 0000000..ee511ff --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py @@ -0,0 +1,353 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variables: + PEP517_BUILD_BACKEND=entry.point:spec + PEP517_BACKEND_PATH=paths (separated with os.pathsep) +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +import json +import os +import os.path +import re +import shutil +import sys +import traceback +from glob import glob +from importlib import import_module +from os.path import join as pjoin + +# This file is run as a script, and `import wrappers` is not zip-safe, so we +# include write_json() and read_json() from wrappers.py. + + +def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + +def read_json(path): + with open(path, encoding='utf-8') as f: + return json.load(f) + + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + def __init__(self, traceback): + self.traceback = traceback + + +class BackendInvalid(Exception): + """Raised if the backend is invalid""" + def __init__(self, message): + self.message = message + + +class HookMissing(Exception): + """Raised if a hook is missing and we are not executing the fallback""" + def __init__(self, hook_name=None): + super().__init__(hook_name) + self.hook_name = hook_name + + +def contained_in(filename, directory): + """Test if a file is located within the given directory.""" + filename = os.path.normcase(os.path.abspath(filename)) + directory = os.path.normcase(os.path.abspath(directory)) + return os.path.commonprefix([filename, directory]) == directory + + +def _build_backend(): + """Find and load the build backend""" + # Add in-tree backend directories to the front of sys.path. + backend_path = os.environ.get('PEP517_BACKEND_PATH') + if backend_path: + extra_pathitems = backend_path.split(os.pathsep) + sys.path[:0] = extra_pathitems + + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable(traceback.format_exc()) + + if backend_path: + if not any( + contained_in(obj.__file__, path) + for path in extra_pathitems + ): + raise BackendInvalid("Backend was not loaded from backend-path") + + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + + +def _supported_features(): + """Return the list of options features supported by the backend. + + Returns a list of strings. + The only possible value is 'build_editable'. + """ + backend = _build_backend() + features = [] + if hasattr(backend, "build_editable"): + features.append("build_editable") + return features + + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + + +def get_requires_for_build_editable(config_settings): + """Invoke the optional get_requires_for_build_editable hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_editable + except AttributeError: + return [] + else: + return hook(config_settings) + + +def prepare_metadata_for_build_wheel( + metadata_directory, config_settings, _allow_fallback): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined, + unless _allow_fallback is False in which case HookMissing is raised. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + if not _allow_fallback: + raise HookMissing() + else: + return hook(metadata_directory, config_settings) + # fallback to build_wheel outside the try block to avoid exception chaining + # which can be confusing to users and is not relevant + whl_basename = backend.build_wheel(metadata_directory, config_settings) + return _get_wheel_metadata_from_wheel(whl_basename, metadata_directory, + config_settings) + + +def prepare_metadata_for_build_editable( + metadata_directory, config_settings, _allow_fallback): + """Invoke optional prepare_metadata_for_build_editable + + Implements a fallback by building an editable wheel if the hook isn't + defined, unless _allow_fallback is False in which case HookMissing is + raised. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_editable + except AttributeError: + if not _allow_fallback: + raise HookMissing() + try: + build_hook = backend.build_editable + except AttributeError: + raise HookMissing(hook_name='build_editable') + else: + whl_basename = build_hook(metadata_directory, config_settings) + return _get_wheel_metadata_from_wheel(whl_basename, + metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + + +def _get_wheel_metadata_from_wheel( + whl_basename, metadata_directory, config_settings): + """Extract the metadata from a wheel. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. + """ + from zipfile import ZipFile + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def build_editable(wheel_directory, config_settings, metadata_directory=None): + """Invoke the optional build_editable hook. + + If a wheel was already built in the + prepare_metadata_for_build_editable fallback, this + will copy it rather than rebuilding the wheel. + """ + backend = _build_backend() + try: + hook = backend.build_editable + except AttributeError: + raise HookMissing() + else: + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return hook(wheel_directory, config_settings, metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + def __init__(self, traceback): + self.traceback = traceback + + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation(traceback.format_exc()) + + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_editable', + 'prepare_metadata_for_build_editable', + 'build_editable', + 'get_requires_for_build_sdist', + 'build_sdist', + '_supported_features', +} + + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable as e: + json_out['no_backend'] = True + json_out['traceback'] = e.traceback + except BackendInvalid as e: + json_out['backend_invalid'] = True + json_out['backend_error'] = e.message + except GotUnsupportedOperation as e: + json_out['unsupported'] = True + json_out['traceback'] = e.traceback + except HookMissing as e: + json_out['hook_missing'] = True + json_out['missing_hook_name'] = e.hook_name or hook_name + + write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + + +if __name__ == '__main__': + main() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..10ff67f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py @@ -0,0 +1,182 @@ +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. +Basic GET usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> b'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key1": "value1", + "key2": "value2" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import warnings + +from pip._vendor import urllib3 + +from .exceptions import RequestsDependencyWarning + +charset_normalizer_version = None + +try: + from pip._vendor.chardet import __version__ as chardet_version +except ImportError: + chardet_version = None + + +def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): + urllib3_version = urllib3_version.split(".") + assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append("0") + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1 + assert major >= 1 + if major == 1: + assert minor >= 21 + + # Check charset_normalizer for compatibility. + if chardet_version: + major, minor, patch = chardet_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet_version >= 3.0.2, < 6.0.0 + assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0) + elif charset_normalizer_version: + major, minor, patch = charset_normalizer_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # charset_normalizer >= 2.0.0 < 4.0.0 + assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) + else: + raise Exception("You need either charset_normalizer or chardet installed") + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split("."))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = "Old version of cryptography ({}) may cause slowdown.".format( + cryptography_version + ) + warnings.warn(warning, RequestsDependencyWarning) + + +# Check imported dependencies for compatibility. +try: + check_compatibility( + urllib3.__version__, chardet_version, charset_normalizer_version + ) +except (AssertionError, ValueError): + warnings.warn( + "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " + "version!".format( + urllib3.__version__, chardet_version, charset_normalizer_version + ), + RequestsDependencyWarning, + ) + +# Attempt to enable urllib3's fallback for SNI support +# if the standard library doesn't support SNI or the +# 'ssl' library isn't available. +try: + # Note: This logic prevents upgrading cryptography on Windows, if imported + # as part of pip. + from pip._internal.utils.compat import WINDOWS + if not WINDOWS: + raise ImportError("pip internals: don't import cryptography on Windows") + try: + import ssl + except ImportError: + ssl = None + + if not getattr(ssl, "HAS_SNI", False): + from pip._vendor.urllib3.contrib import pyopenssl + + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + + _check_cryptography(cryptography_version) +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from pip._vendor.urllib3.exceptions import DependencyWarning + +warnings.simplefilter("ignore", DependencyWarning) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +from . import packages, utils +from .__version__ import ( + __author__, + __author_email__, + __build__, + __cake__, + __copyright__, + __description__, + __license__, + __title__, + __url__, + __version__, +) +from .api import delete, get, head, options, patch, post, put, request +from .exceptions import ( + ConnectionError, + ConnectTimeout, + FileModeWarning, + HTTPError, + JSONDecodeError, + ReadTimeout, + RequestException, + Timeout, + TooManyRedirects, + URLRequired, +) +from .models import PreparedRequest, Request, Response +from .sessions import Session, session +from .status_codes import codes + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d9419e9391e93235a43e8d2c41fa3232c94adff GIT binary patch literal 5451 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ae6fedcdf293946fad2127466a3c15d87587591 GIT binary patch literal 589 zcmY*WF>ljA6h0?y;y860QA8w!gcl^D(z_cs z?B)f8kBB3RxJ4~qqcvWqb-qD2_$J-t4cg#M+T=F1d5gB@PQSgdmH3beZFJr{nVT?) zz2no<6Yo4x-f=edV~z8tp)si*5wg09mGHR<1y2HvWs*0B_+WtdB^uOF?!FOmEKKOV z6Vl}Q&Qu&t?ip1PI8o!=d6oJ>D7+!w&wH(du+d3E{KgXC@B zS+p24(nNx>#WrJH=s?NT$Rq}$$ylZ$NZO3egwppcRGeip;=ntM`5COJAn&eoG47A+v zcrYYd8nFkPPyDgaB$X+FL1Uh%wX)=&(Q!JzwO>vXo<-tNb)jwb&w2!IS+^`}=^(dP vw8{s&#dhiJ7R|ErsA!j44}o)^6i&JG{3q&`oyS0S`-NM!pIz9h1Lc1J>2<=7 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d060b17ee21c74de2f5098fe6ca4eddabd0868f8 GIT binary patch literal 2026 zcmah}&2JM&6rbJo=h}%ANZL{6xLfh_CYNxWvg>(0z3 zI7%y2aexyXDiNfrTu`M7sZyo>4?S?%DyVf=Jw&Q{;FdN$RGj)|{SlE8b)=n{_vZIL z=DpwSv%WqR!T7Q8^};Vvgnk!7cSJgy&7WcO5SgfqOv#jOsVtd_8L{QMQdT4+BO=uj zU8Aklj6RjxQaQRKCf38mcErScnD~yEL=Tf7F_M^<%SjR?aadK7A}UFfq$QX8%#@kD zBbED2^$sd$nsPS1{GCe4rygOPp7$Js zTdu<}uj(A@lwboSuTD(d^<_74rHMBWsa3SjTV;%UQr~rA7??E~aEbr>0F9!|puh%?1%V?op_? z4!Z^=j5u5uJphD?VT7IN_^})i33dRmNV?A3Zir*Jrii6OA578_ma2r3(2YY32&>a( z4$oFC2**TQ8J?W^;QV>)Ibl-VwV{a+f-YH%vl#ML^aF)O`s#^}h);#pe zg6{U(?>g|-;FWS6demvBQPrt#fDOy3VG|1tP}Buuu-Bl>JV;omV z7Z7?7R20;5T#l#1R^bVJ103FH)1*KJ4-2^Bx^`#~M0I9Z*6fGb2o={06aWXYkS8SA zb-8_uqM$7)QtDE8{)ujKOcWl|l&~AF>pU~FS8ndp1`fl8~^;48vP4N(V<^6yEhbAUot_CF9*lbH^~X*duc++ zN>uzuvI9X}(@fXUv_PgLh_!!IZQjR)VA&)X(LR~{`21PzTygSjv7}v`yin9iMeWR$ z*qYQn2sUBk*x~%Wj*`-k~tu(~T5{ot(W?n$d)Q?`!m7646Q%o*Es18wG=% zEVpdKml2lnTSWT+6IS|V;$+=5J)4}Shd?J_?LN2RgVudU&<; zxcsQ>A33!)dfG=Lt^MPxXC6;In(_~ySlfTnN5icHM^-D3YmaJv_T<`uQ$E_)+OjIF zjh+Cj^^v3gu}l8&w2$_*_8s$&m;8|#AMIU_B>mK(RwV8x4{k)2A=yWRn`u?bY>uR* Ip)lir0q-3wEC2ui literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b18c73952e7b56dd647b7e53bb2a3bd0f9785da9 GIT binary patch literal 21285 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 Y{qW|&UHTcF%HveLw0UqykNEt50G1zL6aWAK literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed2ea4930ae03fc6aa63012f291f73fbadfdee58 GIT binary patch literal 13928 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29b8962008642d87c239f146a3db77cf6b94e431 GIT binary patch literal 25251 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 O!2PJr`U9(o^8W(!YLvkM literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e057297d17c50454ddb969c63f1550a7522aa8c9 GIT binary patch literal 7052 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fff2c07868641023aff207d807de085496038b6c GIT binary patch literal 1057 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fd32722b3beaefa89d34a16945bdb280f9bccc9 GIT binary patch literal 777 zcmZuvF>ljA6uz^axHxGEv{3_6P#Xjy1GXRyLa6FeD23391y!UpmdPEB8`m*DCy-1a zmLNp}rfyX`0qPHce*lO9rx8*(MkcnV-7;}jY?Prl+`ad`_kHhs(tRHtl>j?mZfviA z;sE&LCBX^%!BL+DTL1wB4Uh+jy9w580P+y=7&cff&v5|rnA?K`2Frv!pN!!wix?8Z zU?b{-Lr=hAnhQ)x#3JU(mjEDfEN+|{YVmKAU?nlJPY#D@$;~F zhOv*Yp%9ilZO?IQQ2;GR0CkuS|7AH?PV-c(+J>P&&QL)|rbfkLNwX1l8c|EPWVMD( zRI%kglpE)U0UJN9V&V|l(u!qm9TPbnp**P*D*6bG4Y(Mo0V1iYzG+o#M^$Oqs1!AW zP{GiNL&ePssv4M3o&{7Qj%GXLneLP*Z(x&-RZYvrPxR+Zj5T}&N1pqBQF%bHO_VCT z6@+Vw!z@{4^8b~Yg_^>)Q>?mEs+bx1%2kEv4!#`NR@hRCzoil^r36*ks`p1`2j1rF zIGgGH2C~hr10F*78%PHdh{=aw1Qy_n+ug|vAH?>g;tCVL5-In5rjwX?x$tVSxzZNm zy)cMPyq(|5y~}k@P8|Y1RDeys8yRy?r}iVMo#K0Q*L1VDzVhvC?&rmO-Q?8n_)eiS zJ>yPi-Q>0Aa(C(ekJWFh?!!mzrM2e#o80T1o4EdYuAR8EAHCZXJ;h$cvto}ki~j&{ C)zZEI literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a931e14231fa1e48a7a504d750ffbc4ccb0c91e GIT binary patch literal 27762 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a53959902f2552ca75fc1dc5b4ca2f91fc5ac697 GIT binary patch literal 5964 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..357b02c006e9d9f832f8962bd1b57971daec6822 GIT binary patch literal 5622 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 Q0=|pCTkGHld4{R~U(aRn+W-In literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000..5063c3f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = "requests" +__description__ = "Python HTTP for Humans." +__url__ = "https://requests.readthedocs.io" +__version__ = "2.31.0" +__build__ = 0x023100 +__author__ = "Kenneth Reitz" +__author_email__ = "me@kennethreitz.org" +__license__ = "Apache 2.0" +__copyright__ = "Copyright Kenneth Reitz" +__cake__ = "\u2728 \U0001f370 \u2728" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000..f2cf635 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,50 @@ +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" +import re + +from .compat import builtin_str + +_VALID_HEADER_NAME_RE_BYTE = re.compile(rb"^[^:\s][^:\r\n]*$") +_VALID_HEADER_NAME_RE_STR = re.compile(r"^[^:\s][^:\r\n]*$") +_VALID_HEADER_VALUE_RE_BYTE = re.compile(rb"^\S[^\r\n]*$|^$") +_VALID_HEADER_VALUE_RE_STR = re.compile(r"^\S[^\r\n]*$|^$") + +_HEADER_VALIDATORS_STR = (_VALID_HEADER_NAME_RE_STR, _VALID_HEADER_VALUE_RE_STR) +_HEADER_VALIDATORS_BYTE = (_VALID_HEADER_NAME_RE_BYTE, _VALID_HEADER_VALUE_RE_BYTE) +HEADER_VALIDATORS = { + bytes: _HEADER_VALIDATORS_BYTE, + str: _HEADER_VALIDATORS_STR, +} + + +def to_native_string(string, encoding="ascii"): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode("ascii") + return True + except UnicodeEncodeError: + return False diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000..10c1767 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py @@ -0,0 +1,538 @@ +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket # noqa: F401 + +from pip._vendor.urllib3.exceptions import ClosedPoolError, ConnectTimeoutError +from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError +from pip._vendor.urllib3.exceptions import InvalidHeader as _InvalidHeader +from pip._vendor.urllib3.exceptions import ( + LocationValueError, + MaxRetryError, + NewConnectionError, + ProtocolError, +) +from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError +from pip._vendor.urllib3.exceptions import ReadTimeoutError, ResponseError +from pip._vendor.urllib3.exceptions import SSLError as _SSLError +from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url +from pip._vendor.urllib3.util import Timeout as TimeoutSauce +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.util.retry import Retry + +from .auth import _basic_auth_str +from .compat import basestring, urlparse +from .cookies import extract_cookies_to_jar +from .exceptions import ( + ConnectionError, + ConnectTimeout, + InvalidHeader, + InvalidProxyURL, + InvalidSchema, + InvalidURL, + ProxyError, + ReadTimeout, + RetryError, + SSLError, +) +from .models import Response +from .structures import CaseInsensitiveDict +from .utils import ( + DEFAULT_CA_BUNDLE_PATH, + extract_zipped_paths, + get_auth_from_url, + get_encoding_from_headers, + prepend_scheme_if_needed, + select_proxy, + urldefragauth, +) + +try: + from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter: + """The Base Transport Adapter""" + + def __init__(self): + super().__init__() + + def send( + self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None + ): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + + __attrs__ = [ + "max_retries", + "config", + "_pool_connections", + "_pool_maxsize", + "_pool_block", + ] + + def __init__( + self, + pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, + max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK, + ): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super().__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager( + self._pool_connections, self._pool_maxsize, block=self._pool_block + ) + + def init_poolmanager( + self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs + ): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + **pool_kwargs, + ) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith("socks"): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith("https") and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise OSError( + f"Could not find a suitable TLS CA certificate bundle, " + f"invalid path: {cert_loc}" + ) + + conn.cert_reqs = "CERT_REQUIRED" + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = "CERT_NONE" + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise OSError( + f"Could not find the TLS certificate file, " + f"invalid path: {conn.cert_file}" + ) + if conn.key_file and not os.path.exists(conn.key_file): + raise OSError( + f"Could not find the TLS key file, invalid path: {conn.key_file}" + ) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, "status", None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode("utf-8") + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = proxy and scheme != "https" + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith("socks") + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return headers + + def send( + self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None + ): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers( + request, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + ) + + chunked = not (request.body is None or "Content-Length" in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError: + raise ValueError( + f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " + f"or a single float to set both timeouts to the same value." + ) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout, + chunked=chunked, + ) + + except (ProtocolError, OSError) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + elif isinstance(e, _InvalidHeader): + raise InvalidHeader(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py new file mode 100644 index 0000000..cd0b3ee --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py @@ -0,0 +1,157 @@ +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + + :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + >>> req + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("get", url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("options", url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. If + `allow_redirects` is not provided, it will be set to `False` (as + opposed to the default :meth:`request` behavior). + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return request("head", url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("post", url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("put", url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("patch", url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("delete", url, **kwargs) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..9733686 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py @@ -0,0 +1,315 @@ +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import hashlib +import os +import re +import threading +import time +import warnings +from base64 import b64encode + +from ._internal_utils import to_native_string +from .compat import basestring, str, urlparse +from .cookies import extract_cookies_to_jar +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" +CONTENT_TYPE_MULTI_PART = "multipart/form-data" + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(type(password)), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode("latin1") + + if isinstance(password, str): + password = password.encode("latin1") + + authstr = "Basic " + to_native_string( + b64encode(b":".join((username, password))).strip() + ) + + return authstr + + +class AuthBase: + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError("Auth hooks must be callable.") + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers["Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, "init"): + self._thread_local.init = True + self._thread_local.last_nonce = "" + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal["realm"] + nonce = self._thread_local.chal["nonce"] + qop = self._thread_local.chal.get("qop") + algorithm = self._thread_local.chal.get("algorithm") + opaque = self._thread_local.chal.get("opaque") + hash_utf8 = None + + if algorithm is None: + _algorithm = "MD5" + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == "MD5" or _algorithm == "MD5-SESS": + + def md5_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.md5(x).hexdigest() + + hash_utf8 = md5_utf8 + elif _algorithm == "SHA": + + def sha_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha1(x).hexdigest() + + hash_utf8 = sha_utf8 + elif _algorithm == "SHA-256": + + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha256(x).hexdigest() + + hash_utf8 = sha256_utf8 + elif _algorithm == "SHA-512": + + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha512(x).hexdigest() + + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731 + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += f"?{p_parsed.query}" + + A1 = f"{self.username}:{realm}:{self.password}" + A2 = f"{method}:{path}" + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = f"{self._thread_local.nonce_count:08x}" + s = str(self._thread_local.nonce_count).encode("utf-8") + s += nonce.encode("utf-8") + s += time.ctime().encode("utf-8") + s += os.urandom(8) + + cnonce = hashlib.sha1(s).hexdigest()[:16] + if _algorithm == "MD5-SESS": + HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") + + if not qop: + respdig = KD(HA1, f"{nonce}:{HA2}") + elif qop == "auth" or "auth" in qop.split(","): + noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = ( + f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' + f'uri="{path}", response="{respdig}"' + ) + if opaque: + base += f', opaque="{opaque}"' + if algorithm: + base += f', algorithm="{algorithm}"' + if entdig: + base += f', digest="{entdig}"' + if qop: + base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' + + return f"Digest {base}" + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/psf/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get("www-authenticate", "") + + if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r"digest ", flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers["Authorization"] = self.build_digest_header( + prep.method, prep.url + ) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers["Authorization"] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook("response", self.handle_401) + r.register_hook("response", self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..38696a1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" + +import os + +if "_PIP_STANDALONE_CERT" not in os.environ: + from pip._vendor.certifi import where +else: + def where(): + return os.environ["_PIP_STANDALONE_CERT"] + +if __name__ == "__main__": + print(where()) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..9ab2bb4 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py @@ -0,0 +1,67 @@ +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module previously handled import compatibility issues +between Python 2 and Python 3. It remains for backwards +compatibility until the next major version. +""" + +from pip._vendor import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = _ver[0] == 2 + +#: Python 3.x? +is_py3 = _ver[0] == 3 + +# Note: We've patched out simplejson support in pip because it prevents +# upgrading simplejson on Windows. +import json +from json import JSONDecodeError + +# Keep OrderedDict for backwards compatibility. +from collections import OrderedDict +from collections.abc import Callable, Mapping, MutableMapping +from http import cookiejar as cookielib +from http.cookies import Morsel +from io import StringIO + +# -------------- +# Legacy Imports +# -------------- +from urllib.parse import ( + quote, + quote_plus, + unquote, + unquote_plus, + urldefrag, + urlencode, + urljoin, + urlparse, + urlsplit, + urlunparse, +) +from urllib.request import ( + getproxies, + getproxies_environment, + parse_http_list, + proxy_bypass, + proxy_bypass_environment, +) + +builtin_str = str +str = str +bytes = bytes +basestring = (str, bytes) +numeric_types = (int, float) +integer_types = (int,) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..bf54ab2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py @@ -0,0 +1,561 @@ +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import calendar +import copy +import time + +from ._internal_utils import to_native_string +from .compat import Morsel, MutableMapping, cookielib, urlparse, urlunparse + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest: + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get("Host"): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers["Host"], encoding="utf-8") + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse( + [ + parsed.scheme, + host, + parsed.path, + parsed.params, + parsed.query, + parsed.fragment, + ] + ) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError( + "Cookie headers should be added with add_unredirected_header()" + ) + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse: + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, "_original_response") and response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get("Cookie") + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name( + self, name, domain=kwargs.get("domain"), path=kwargs.get("path") + ) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if (domain is None or cookie.domain == domain) and ( + path is None or cookie.path == path + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super().__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if ( + hasattr(cookie.value, "startswith") + and cookie.value.startswith('"') + and cookie.value.endswith('"') + ): + cookie.value = cookie.value.replace('\\"', "") + return super().set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super().update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: + # if there are multiple cookies that meet passed in criteria + raise CookieConflictError( + f"There are multiple cookies with name, {name!r}" + ) + # we will eventually return this as long as no cookie conflict + toReturn = cookie.value + + if toReturn: + return toReturn + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop("_cookies_lock") + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if "_cookies_lock" not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, "copy"): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + "version": 0, + "name": name, + "value": value, + "port": None, + "domain": "", + "path": "/", + "secure": False, + "expires": None, + "discard": True, + "comment": None, + "comment_url": None, + "rest": {"HttpOnly": None}, + "rfc2109": False, + } + + badargs = set(kwargs) - set(result) + if badargs: + raise TypeError( + f"create_cookie() got unexpected keyword arguments: {list(badargs)}" + ) + + result.update(kwargs) + result["port_specified"] = bool(result["port"]) + result["domain_specified"] = bool(result["domain"]) + result["domain_initial_dot"] = result["domain"].startswith(".") + result["path_specified"] = bool(result["path"]) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel["max-age"]: + try: + expires = int(time.time() + int(morsel["max-age"])) + except ValueError: + raise TypeError(f"max-age: {morsel['max-age']} must be integer") + elif morsel["expires"]: + time_template = "%a, %d-%b-%Y %H:%M:%S GMT" + expires = calendar.timegm(time.strptime(morsel["expires"], time_template)) + return create_cookie( + comment=morsel["comment"], + comment_url=bool(morsel["comment"]), + discard=False, + domain=morsel["domain"], + expires=expires, + name=morsel.key, + path=morsel["path"], + port=None, + rest={"HttpOnly": morsel["httponly"]}, + rfc2109=False, + secure=bool(morsel["secure"]), + value=morsel.value, + version=morsel["version"] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError("You can only merge into CookieJar") + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict(cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..168d073 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py @@ -0,0 +1,141 @@ +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + +from .compat import JSONDecodeError as CompatJSONDecodeError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop("response", None) + self.response = response + self.request = kwargs.pop("request", None) + if response is not None and not self.request and hasattr(response, "request"): + self.request = self.response.request + super().__init__(*args, **kwargs) + + +class InvalidJSONError(RequestException): + """A JSON error occurred.""" + + +class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): + """Couldn't decode the text into json""" + + def __init__(self, *args, **kwargs): + """ + Construct the JSONDecodeError instance first with all + args. Then use it's args to construct the IOError so that + the json specific args aren't used as IOError specific args + and the error message from JSONDecodeError is preserved. + """ + CompatJSONDecodeError.__init__(self, *args) + InvalidJSONError.__init__(self, *self.args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL scheme (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """The URL scheme provided is either invalid or unsupported.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content.""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed.""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body.""" + + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py new file mode 100644 index 0000000..2d292c2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py @@ -0,0 +1,131 @@ +"""Module containing bug report helper(s).""" + +import json +import platform +import ssl +import sys + +from pip._vendor import idna +from pip._vendor import urllib3 + +from . import __version__ as requests_version + +charset_normalizer = None + +try: + from pip._vendor import chardet +except ImportError: + chardet = None + +try: + from pip._vendor.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import cryptography + import OpenSSL + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 3.10.3 it will return + {'name': 'CPython', 'version': '3.10.3'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == "CPython": + implementation_version = platform.python_version() + elif implementation == "PyPy": + implementation_version = "{}.{}.{}".format( + sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro, + ) + if sys.pypy_version_info.releaselevel != "final": + implementation_version = "".join( + [implementation_version, sys.pypy_version_info.releaselevel] + ) + elif implementation == "Jython": + implementation_version = platform.python_version() # Complete Guess + elif implementation == "IronPython": + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = "Unknown" + + return {"name": implementation, "version": implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + "system": platform.system(), + "release": platform.release(), + } + except OSError: + platform_info = { + "system": "Unknown", + "release": "Unknown", + } + + implementation_info = _implementation() + urllib3_info = {"version": urllib3.__version__} + charset_normalizer_info = {"version": None} + chardet_info = {"version": None} + if charset_normalizer: + charset_normalizer_info = {"version": charset_normalizer.__version__} + if chardet: + chardet_info = {"version": chardet.__version__} + + pyopenssl_info = { + "version": None, + "openssl_version": "", + } + if OpenSSL: + pyopenssl_info = { + "version": OpenSSL.__version__, + "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", + } + cryptography_info = { + "version": getattr(cryptography, "__version__", ""), + } + idna_info = { + "version": getattr(idna, "__version__", ""), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} + + return { + "platform": platform_info, + "implementation": implementation_info, + "system_ssl": system_ssl_info, + "using_pyopenssl": pyopenssl is not None, + "using_charset_normalizer": chardet is None, + "pyOpenSSL": pyopenssl_info, + "urllib3": urllib3_info, + "chardet": chardet_info, + "charset_normalizer": charset_normalizer_info, + "cryptography": cryptography_info, + "idna": idna_info, + "requests": { + "version": requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..d181ba2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py @@ -0,0 +1,33 @@ +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ["response"] + + +def default_hooks(): + return {event: [] for event in HOOKS} + + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, "__call__"): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py new file mode 100644 index 0000000..76e6f19 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py @@ -0,0 +1,1034 @@ +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. +import encodings.idna # noqa: F401 +from io import UnsupportedOperation + +from pip._vendor.urllib3.exceptions import ( + DecodeError, + LocationParseError, + ProtocolError, + ReadTimeoutError, + SSLError, +) +from pip._vendor.urllib3.fields import RequestField +from pip._vendor.urllib3.filepost import encode_multipart_formdata +from pip._vendor.urllib3.util import parse_url + +from ._internal_utils import to_native_string, unicode_is_ascii +from .auth import HTTPBasicAuth +from .compat import ( + Callable, + JSONDecodeError, + Mapping, + basestring, + builtin_str, + chardet, + cookielib, +) +from .compat import json as complexjson +from .compat import urlencode, urlsplit, urlunparse +from .cookies import _copy_cookie_jar, cookiejar_from_dict, get_cookie_header +from .exceptions import ( + ChunkedEncodingError, + ConnectionError, + ContentDecodingError, + HTTPError, + InvalidJSONError, + InvalidURL, +) +from .exceptions import JSONDecodeError as RequestsJSONDecodeError +from .exceptions import MissingSchema +from .exceptions import SSLError as RequestsSSLError +from .exceptions import StreamConsumedError +from .hooks import default_hooks +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( + check_header_validity, + get_auth_from_url, + guess_filename, + guess_json_utf, + iter_slices, + parse_header_links, + requote_uri, + stream_decode_response_unicode, + super_len, + to_key_val_list, +) + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin: + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = "/" + + url.append(path) + + query = p.query + if query: + url.append("?") + url.append(query) + + return "".join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, "read"): + return data + elif hasattr(data, "__iter__"): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): + vs = [vs] + for v in vs: + if v is not None: + result.append( + ( + k.encode("utf-8") if isinstance(k, str) else k, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if not files: + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, "__iter__"): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + ( + field.decode("utf-8") + if isinstance(field, bytes) + else field, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, "read"): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin: + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError(f'Unsupported event specified, with event name "{event}"') + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, "__iter__"): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return f"" + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Instances are generated from a :class:`Request ` object, and + should not be instantiated manually; doing so may produce undesirable + effects. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + >>> r + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return f"" + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + from pip._vendor import idna + + try: + host = idna.encode(host, uts46=True).decode("utf-8") + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/psf/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode("utf8") + else: + url = str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ":" in url and not url.lower().startswith("http"): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + raise MissingSchema( + f"Invalid URL {url!r}: No scheme supplied. " + f"Perhaps you meant https://{url}?" + ) + + if not host: + raise InvalidURL(f"Invalid URL {url!r}: No host supplied") + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL("URL has an invalid label.") + elif host.startswith(("*", ".")): + raise InvalidURL("URL has an invalid label.") + + # Carefully reconstruct the network location + netloc = auth or "" + if netloc: + netloc += "@" + netloc += host + if port: + netloc += f":{port}" + + # Bare domains aren't valid URLs. + if not path: + path = "/" + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = f"{query}&{enc_params}" + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = "application/json" + + try: + body = complexjson.dumps(json, allow_nan=False) + except ValueError as ve: + raise InvalidJSONError(ve, request=self) + + if not isinstance(body, bytes): + body = body.encode("utf-8") + + is_stream = all( + [ + hasattr(data, "__iter__"), + not isinstance(data, (basestring, list, tuple, Mapping)), + ] + ) + + if is_stream: + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + body = data + + if getattr(body, "tell", None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except OSError: + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError( + "Streamed bodies and files are mutually exclusive." + ) + + if length: + self.headers["Content-Length"] = builtin_str(length) + else: + self.headers["Transfer-Encoding"] = "chunked" + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, "read"): + content_type = None + else: + content_type = "application/x-www-form-urlencoded" + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ("content-type" not in self.headers): + self.headers["Content-Type"] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers["Content-Length"] = builtin_str(length) + elif ( + self.method not in ("GET", "HEAD") + and self.headers.get("Content-Length") is None + ): + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers["Content-Length"] = "0" + + def prepare_auth(self, auth, url=""): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers["Cookie"] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response: + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + "_content", + "status_code", + "headers", + "url", + "history", + "encoding", + "reason", + "cookies", + "elapsed", + "request", + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + #: This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, "_content_consumed", True) + setattr(self, "raw", None) + + def __repr__(self): + return f"" + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return "location" in self.headers and self.status_code in REDIRECT_STATI + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return "location" in self.headers and self.status_code in ( + codes.moved_permanently, + codes.permanent_redirect, + ) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" + return chardet.detect(self.content)["encoding"] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, "stream"): + try: + yield from self.raw.stream(chunk_size, decode_content=True) + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + except SSLError as e: + raise RequestsSSLError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError( + f"chunk_size must be an int, it is instead a {type(chunk_size)}." + ) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines( + self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None + ): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content( + chunk_size=chunk_size, decode_unicode=decode_unicode + ): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + yield from lines + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError("The content for this response was already consumed") + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``charset_normalizer`` or ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return "" + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors="replace") + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors="replace") + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises requests.exceptions.JSONDecodeError: If the response body does not + contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using charset_normalizer to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads(self.content.decode(encoding), **kwargs) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + except JSONDecodeError as e: + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + try: + return complexjson.loads(self.text, **kwargs) + except JSONDecodeError as e: + # Catch JSON-related errors and raise as requests.JSONDecodeError + # This aliases json.JSONDecodeError and simplejson.JSONDecodeError + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get("link") + + resolved_links = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get("rel") or link.get("url") + resolved_links[key] = link + + return resolved_links + + def raise_for_status(self): + """Raises :class:`HTTPError`, if one occurred.""" + + http_error_msg = "" + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode("utf-8") + except UnicodeDecodeError: + reason = self.reason.decode("iso-8859-1") + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = ( + f"{self.status_code} Client Error: {reason} for url: {self.url}" + ) + + elif 500 <= self.status_code < 600: + http_error_msg = ( + f"{self.status_code} Server Error: {reason} for url: {self.url}" + ) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, "release_conn", None) + if release_conn is not None: + release_conn() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..dbcf2a7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py @@ -0,0 +1,833 @@ +""" +requests.sessions +~~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from collections import OrderedDict +from datetime import timedelta + +from ._internal_utils import to_native_string +from .adapters import HTTPAdapter +from .auth import _basic_auth_str +from .compat import Mapping, cookielib, urljoin, urlparse +from .cookies import ( + RequestsCookieJar, + cookiejar_from_dict, + extract_cookies_to_jar, + merge_cookies, +) +from .exceptions import ( + ChunkedEncodingError, + ContentDecodingError, + InvalidSchema, + TooManyRedirects, +) +from .hooks import default_hooks, dispatch_hook + +# formerly defined here, reexposed here for backward compatibility +from .models import ( # noqa: F401 + DEFAULT_REDIRECT_LIMIT, + REDIRECT_STATI, + PreparedRequest, + Request, +) +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( # noqa: F401 + DEFAULT_PORTS, + default_headers, + get_auth_from_url, + get_environ_proxies, + get_netrc_auth, + requote_uri, + resolve_proxies, + rewind_body, + should_bypass_proxies, + to_key_val_list, +) + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == "win32": + preferred_clock = time.perf_counter +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get("response") == []: + return request_hooks + + if request_hooks is None or request_hooks.get("response") == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin: + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers["location"] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + location = location.encode("latin1") + return to_native_string(location, "utf8") + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if ( + old_parsed.scheme == "http" + and old_parsed.port in (80, None) + and new_parsed.scheme == "https" + and new_parsed.port in (443, None) + ): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if ( + not changed_scheme + and old_parsed.port in default_port + and new_parsed.port in default_port + ): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects( + self, + resp, + req, + stream=False, + timeout=None, + verify=True, + cert=None, + proxies=None, + yield_requests=False, + **adapter_kwargs, + ): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects( + f"Exceeded {self.max_redirects} redirects.", response=resp + ) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith("//"): + parsed_rurl = urlparse(resp.url) + url = ":".join([to_native_string(parsed_rurl.scheme), url]) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == "" and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/psf/requests/issues/1084 + if resp.status_code not in ( + codes.temporary_redirect, + codes.permanent_redirect, + ): + # https://github.com/psf/requests/issues/3490 + purged_headers = ("Content-Length", "Content-Type", "Transfer-Encoding") + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + headers.pop("Cookie", None) + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = prepared_request._body_position is not None and ( + "Content-Length" in headers or "Transfer-Encoding" in headers + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs, + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if "Authorization" in headers and self.should_strip_auth( + response.request.url, url + ): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers["Authorization"] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + headers = prepared_request.headers + scheme = urlparse(prepared_request.url).scheme + new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) + + if "Proxy-Authorization" in headers: + del headers["Proxy-Authorization"] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + # urllib3 handles proxy authorization for us in the standard adapter. + # Avoid appending this to TLS tunneled requests where it may be leaked. + if not scheme.startswith('https') and username and password: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != "HEAD": + method = "GET" + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != "HEAD": + method = "GET" + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == "POST": + method = "GET" + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + ... s.get('https://httpbin.org/get') + + """ + + __attrs__ = [ + "headers", + "cookies", + "auth", + "proxies", + "hooks", + "params", + "verify", + "cert", + "adapters", + "stream", + "trust_env", + "max_redirects", + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + #: Defaults to `True`, requiring requests to verify the TLS certificate at the + #: remote end. + #: If verify is set to `False`, requests will accept any TLS certificate + #: presented by the server, and will ignore hostname mismatches and/or + #: expired certificates, which will make your application vulnerable to + #: man-in-the-middle (MitM) attacks. + #: Only set this to `False` for testing. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount("https://", HTTPAdapter()) + self.mount("http://", HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies + ) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting( + request.headers, self.headers, dict_class=CaseInsensitiveDict + ), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request( + self, + method, + url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=True, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None, + json=None, + ): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. When set to + ``False``, requests will accept any TLS certificate presented by + the server, and will ignore hostname mismatches and/or expired + certificates, which will make your application vulnerable to + man-in-the-middle (MitM) attacks. Setting verify to ``False`` + may be useful during local development or testing. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + "timeout": timeout, + "allow_redirects": allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("GET", url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("OPTIONS", url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return self.request("HEAD", url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("POST", url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PUT", url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PATCH", url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("DELETE", url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault("stream", self.stream) + kwargs.setdefault("verify", self.verify) + kwargs.setdefault("cert", self.cert) + if "proxies" not in kwargs: + kwargs["proxies"] = resolve_proxies(request, self.proxies, self.trust_env) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError("You can only send PreparedRequests.") + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop("allow_redirects", True) + stream = kwargs.get("stream") + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook("response", hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Resolve redirects if allowed. + if allow_redirects: + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + history = [resp for resp in gen] + else: + history = [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next( + self.resolve_redirects(r, request, yield_requests=True, **kwargs) + ) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get("no_proxy") if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration + # and be compatible with cURL. + if verify is True or verify is None: + verify = ( + os.environ.get("REQUESTS_CA_BUNDLE") + or os.environ.get("CURL_CA_BUNDLE") + or verify + ) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {"proxies": proxies, "stream": stream, "verify": verify, "cert": cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema(f"No connection adapters were found for {url!r}") + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..4bd072b --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py @@ -0,0 +1,128 @@ +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +Example:: + + >>> import requests + >>> requests.codes['temporary_redirect'] + 307 + >>> requests.codes.teapot + 418 + >>> requests.codes['\o/'] + 200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + # Informational. + 100: ("continue",), + 101: ("switching_protocols",), + 102: ("processing",), + 103: ("checkpoint",), + 122: ("uri_too_long", "request_uri_too_long"), + 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), + 201: ("created",), + 202: ("accepted",), + 203: ("non_authoritative_info", "non_authoritative_information"), + 204: ("no_content",), + 205: ("reset_content", "reset"), + 206: ("partial_content", "partial"), + 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), + 208: ("already_reported",), + 226: ("im_used",), + # Redirection. + 300: ("multiple_choices",), + 301: ("moved_permanently", "moved", "\\o-"), + 302: ("found",), + 303: ("see_other", "other"), + 304: ("not_modified",), + 305: ("use_proxy",), + 306: ("switch_proxy",), + 307: ("temporary_redirect", "temporary_moved", "temporary"), + 308: ( + "permanent_redirect", + "resume_incomplete", + "resume", + ), # "resume" and "resume_incomplete" to be removed in 3.0 + # Client Error. + 400: ("bad_request", "bad"), + 401: ("unauthorized",), + 402: ("payment_required", "payment"), + 403: ("forbidden",), + 404: ("not_found", "-o-"), + 405: ("method_not_allowed", "not_allowed"), + 406: ("not_acceptable",), + 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), + 408: ("request_timeout", "timeout"), + 409: ("conflict",), + 410: ("gone",), + 411: ("length_required",), + 412: ("precondition_failed", "precondition"), + 413: ("request_entity_too_large",), + 414: ("request_uri_too_large",), + 415: ("unsupported_media_type", "unsupported_media", "media_type"), + 416: ( + "requested_range_not_satisfiable", + "requested_range", + "range_not_satisfiable", + ), + 417: ("expectation_failed",), + 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), + 421: ("misdirected_request",), + 422: ("unprocessable_entity", "unprocessable"), + 423: ("locked",), + 424: ("failed_dependency", "dependency"), + 425: ("unordered_collection", "unordered"), + 426: ("upgrade_required", "upgrade"), + 428: ("precondition_required", "precondition"), + 429: ("too_many_requests", "too_many"), + 431: ("header_fields_too_large", "fields_too_large"), + 444: ("no_response", "none"), + 449: ("retry_with", "retry"), + 450: ("blocked_by_windows_parental_controls", "parental_controls"), + 451: ("unavailable_for_legal_reasons", "legal_reasons"), + 499: ("client_closed_request",), + # Server Error. + 500: ("internal_server_error", "server_error", "/o\\", "✗"), + 501: ("not_implemented",), + 502: ("bad_gateway",), + 503: ("service_unavailable", "unavailable"), + 504: ("gateway_timeout",), + 505: ("http_version_not_supported", "http_version"), + 506: ("variant_also_negotiates",), + 507: ("insufficient_storage",), + 509: ("bandwidth_limit_exceeded", "bandwidth"), + 510: ("not_extended",), + 511: ("network_authentication_required", "network_auth", "network_authentication"), +} + +codes = LookupDict(name="status_codes") + + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(("\\", "/")): + setattr(codes, title.upper(), code) + + def doc(code): + names = ", ".join(f"``{n}``" for n in _codes[code]) + return "* %d: %s" % (code, names) + + global __doc__ + __doc__ = ( + __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) + if __doc__ is not None + else None + ) + + +_init() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..188e13e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py @@ -0,0 +1,99 @@ +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from collections import OrderedDict + +from .compat import Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super().__init__() + + def __repr__(self): + return f"" + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..36607ed --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py @@ -0,0 +1,1094 @@ +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile +from collections import OrderedDict + +from pip._vendor.urllib3.util import make_headers, parse_url + +from . import certs +from .__version__ import __version__ + +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import ( # noqa: F401 + _HEADER_VALIDATORS_BYTE, + _HEADER_VALIDATORS_STR, + HEADER_VALIDATORS, + to_native_string, +) +from .compat import ( + Mapping, + basestring, + bytes, + getproxies, + getproxies_environment, + integer_types, +) +from .compat import parse_http_list as _parse_list_header +from .compat import ( + proxy_bypass, + proxy_bypass_environment, + quote, + str, + unquote, + urlparse, + urlunparse, +) +from .cookies import cookiejar_from_dict +from .exceptions import ( + FileModeWarning, + InvalidHeader, + InvalidURL, + UnrewindableBodyError, +) +from .structures import CaseInsensitiveDict + +NETRC_FILES = (".netrc", "_netrc") + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {"http": 80, "https": 443} + +# Ensure that ', ' is used to preserve previous delimiter behavior. +DEFAULT_ACCEPT_ENCODING = ", ".join( + re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) +) + + +if sys.platform == "win32": + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + import winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey( + winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", + ) + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] + except (OSError, ValueError): + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(";") + # now check if we match one of the registry values. + for test in proxyOverride: + if test == "": + if "." not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, "items"): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, "__len__"): + total_length = len(o) + + elif hasattr(o, "len"): + total_length = o.len + + elif hasattr(o, "fileno"): + try: + fileno = o.fileno() + except (io.UnsupportedOperation, AttributeError): + # AttributeError is a surprising exception, seeing as how we've just checked + # that `hasattr(o, 'fileno')`. It happens for objects obtained via + # `Tarfile.extractfile()`, per issue 5229. + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if "b" not in o.mode: + warnings.warn( + ( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode." + ), + FileModeWarning, + ) + + if hasattr(o, "tell"): + try: + current_position = o.tell() + except OSError: + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, "seek") and total_length is None: + # StringIO and BytesIO have seek but no usable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except OSError: + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + netrc_file = os.environ.get("NETRC") + if netrc_file is not None: + netrc_locations = (netrc_file,) + else: + netrc_locations = (f"~/{f}" for f in NETRC_FILES) + + try: + from netrc import NetrcParseError, netrc + + netrc_path = None + + for f in netrc_locations: + try: + loc = os.path.expanduser(f) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/psf/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b":" + if isinstance(url, str): + splitstr = splitstr.decode("ascii") + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = 0 if _netrc[0] else 1 + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, OSError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # App Engine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, "name", None) + if name and isinstance(name, basestring) and name[0] != "<" and name[-1] != ">": + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + if not prefix: + # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), + # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users + break + member = "/".join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, member.split("/")[-1]) + if not os.path.exists(extracted_path): + # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition + with atomic_open(extracted_path) as file_handler: + file_handler.write(zip_file.read(member)) + return extracted_path + + +@contextlib.contextmanager +def atomic_open(filename): + """Write a file to the disk in an atomic fashion""" + tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) + try: + with os.fdopen(tmp_descriptor, "wb") as tmp_handler: + yield tmp_handler + os.replace(tmp_name, filename) + except BaseException: + os.remove(tmp_name) + raise + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if "=" not in item: + result[item] = None + continue + name, value = item.split("=", 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != "\\\\": + return value.replace("\\\\", "\\").replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn( + ( + "In requests 3.0, get_encodings_from_content will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return ( + charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content) + ) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(";") + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1 :].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get("content-type") + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if "charset" in params: + return params["charset"].strip("'\"") + + if "text" in content_type: + return "ISO-8859-1" + + if "application/json" in content_type: + # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset + return "utf-8" + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes an iterator.""" + + if r.encoding is None: + yield from iterator + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b"", final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos : pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn( + ( + "In requests 3.0, get_unicode_from_response will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors="replace") + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" +) + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split("%") + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = f"%{parts[i]}" + else: + parts[i] = f"%{parts[i]}" + return "".join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] + netaddr, bits = net.split("/") + netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack(">I", bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except OSError: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count("/") == 1: + try: + mask = int(string_network.split("/")[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split("/")[0]) + except OSError: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + def get_proxy(key): + return os.environ.get(key) or os.environ.get(key.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy("no_proxy") + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = (host for host in no_proxy.replace(" ", "").split(",") if host) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += f":{parsed.port}" + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ("no_proxy", no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get("all")) + + proxy_keys = [ + urlparts.scheme + "://" + urlparts.hostname, + urlparts.scheme, + "all://" + urlparts.hostname, + "all", + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def resolve_proxies(request, proxies, trust_env=True): + """This method takes proxy information from a request and configuration + input to resolve a mapping of target proxies. This will consider settings + such a NO_PROXY to strip proxy configurations. + + :param request: Request or PreparedRequest + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + :param trust_env: Boolean declaring whether to trust environment configs + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + url = request.url + scheme = urlparse(url).scheme + no_proxy = proxies.get("no_proxy") + new_proxies = proxies.copy() + + if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get("all")) + + if proxy: + new_proxies.setdefault(scheme, proxy) + return new_proxies + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return f"{name}/{__version__}" + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict( + { + "User-Agent": default_user_agent(), + "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, + "Accept": "*/*", + "Connection": "keep-alive", + } + ) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = " '\"" + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(", *<", value): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, "" + + link = {"url": url.strip("<> '\"")} + + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return "utf-32" # BOM included + if sample[:3] == codecs.BOM_UTF8: + return "utf-8-sig" # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return "utf-16" # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return "utf-8" + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return "utf-16-be" + if sample[1::2] == _null2: # 2nd and 4th are null + return "utf-16-le" + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return "utf-32-be" + if sample[1:] == _null3: + return "utf-32-le" + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + parsed = parse_url(url) + scheme, auth, host, port, path, query, fragment = parsed + + # A defect in urlparse determines that there isn't a netloc present in some + # urls. We previously assumed parsing was overly cautious, and swapped the + # netloc and path. Due to a lack of tests on the original defect, this is + # maintained with parse_url for backwards compatibility. + netloc = parsed.netloc + if not netloc: + netloc, path = path, netloc + + if auth: + # parse_url doesn't provide the netloc with auth + # so we'll add it ourselves. + netloc = "@".join([auth, netloc]) + if scheme is None: + scheme = new_scheme + if path is None: + path = "" + + return urlunparse((scheme, netloc, path, "", query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ("", "") + + return auth + + +def check_header_validity(header): + """Verifies that header parts don't contain leading whitespace + reserved characters, or return characters. + + :param header: tuple, in the format (name, value). + """ + name, value = header + _validate_header_part(header, name, 0) + _validate_header_part(header, value, 1) + + +def _validate_header_part(header, header_part, header_validator_index): + if isinstance(header_part, str): + validator = _HEADER_VALIDATORS_STR[header_validator_index] + elif isinstance(header_part, bytes): + validator = _HEADER_VALIDATORS_BYTE[header_validator_index] + else: + raise InvalidHeader( + f"Header part ({header_part!r}) from {header} " + f"must be of type str or bytes, not {type(header_part)}" + ) + + if not validator.match(header_part): + header_kind = "name" if header_validator_index == 0 else "value" + raise InvalidHeader( + f"Invalid leading whitespace, reserved character(s), or return" + f"character(s) in header {header_kind}: {header_part!r}" + ) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit("@", 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, "")) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, "seek", None) + if body_seek is not None and isinstance( + prepared_request._body_position, integer_types + ): + try: + body_seek(prepared_request._body_position) + except OSError: + raise UnrewindableBodyError( + "An error occurred when rewinding request body for redirect." + ) + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py new file mode 100644 index 0000000..d92acc7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py @@ -0,0 +1,26 @@ +__all__ = [ + "__version__", + "AbstractProvider", + "AbstractResolver", + "BaseReporter", + "InconsistentCandidate", + "Resolver", + "RequirementsConflicted", + "ResolutionError", + "ResolutionImpossible", + "ResolutionTooDeep", +] + +__version__ = "1.0.1" + + +from .providers import AbstractProvider, AbstractResolver +from .reporters import BaseReporter +from .resolvers import ( + InconsistentCandidate, + RequirementsConflicted, + ResolutionError, + ResolutionImpossible, + ResolutionTooDeep, + Resolver, +) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..838001ba6e933a3b25d1d374817776ac2dbfcfd5 GIT binary patch literal 639 zcmaJ;J&zMH5Vd!c{m3R9pyMQHse;6sKzBk&a8R6t5Q?C2V{Kv+tXqFzJ1d3i{skQc z9lwNve_)Aa=pL;3_3 zfPya&0}3&u2~FEXq&O8l+=C$SUfUNL&bD>G%|(F=QQ}ez@IX|!5<@%`BRqm&m5uZ9 zz*mHH%vi1@A^!T)nRTX_yVpi_oHDcTOqo?}Q2ODs#^DOiSTYulzi9nxntBHY!yov7QZk?8GpEMoC>Y1<+GOg8~g4XrJggU zKlUf}gL?7{1~pS4!=)Brw03QDUcQ;86lMM*4j$m#E`5!b}w21%! literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34aba9899ac2bd2bdd7ce47db2f73be5a9f7ccf3 GIT binary patch literal 6856 zcmc&(O^+N$8SdF{uh)(tIG999$}5C-mh~(l5{HFgEnpi<$qK~_kt{?{Pj}5su|3_B zs_t3O$_ESOzyT09OB}dI`~-dg2QD08q)13yxPiRpk`vEcRb5>@>$S{@kyEqN)%Di< z`Me+b^QBAc0X~1)`~BcwuLZ$B=tuQgwtt*{1AjaT7J|D$5_}RQEgt+~(d<2F>8A^L zy68P!m@c)K0cCL0;S&jZ;p1^W?Uaxoj`YmK0C>vujpYv=`b)vzRwb z%e@UUa>Dx}!-+_-&3iDA$c|`LzA>4#VUIf-S(PNLFQh6qJM0iXoaV>m3EG>rqfMf; z$k&c)nbNu_3z27P zk9`o0$08e$D79a*xRfwOkxm&lN!?%(*E$^#M^>e>!)`~om`n^aG-7oJKM|7Px6&*e z!d+7{M&u6hmfM0*Qx@l0KNWGojzux_?W(L+=q7Qie?W`n?!I291#9Fx;s2zp4@xJDDI0N?1xrcuSVtQQjgwdqRl zDv!Ax21o055AuwIG$lCXkC-wuWXN+;s?Nm(L!LGdAwmtRkdV@vxsmX85=oJl1Y4@) zKs=GfX_=7tTUlN>PBIuwDZC3T5E+<+{&R@}q218)J+eKvtmjs+p-(tXf>9(UjXd;c znHIO)J=^Su`7xfR(L-1klt^)&V7J(P7$`>Efq9^vg?Q+)7xloKhxLpd=kf?tAf<-; zTWsqdOY-an5>b{P1C`>UjM8-4Y0uq1iZVc+h69m`g3uNwC0=OFnF7|RK4Bp^Y;bot z%$09Hjahwu%u?PjDsEG8#5J$;9PY4tYydMTUm^SMX5xxC&m1NK0(G@D&&EgG-sJ>i zRJIu%ky=P8C?Ql8H_);U%sKL&AMNWD4kcG8?y@U1Kxq@2-qH#=7HJAYm_iH*j!f9? zA~AHkjvbvBxi({8ztAg1THJ)AP@zEX*Dte}5WQ`Zv>L%uHceL$yyM8x70o<-#x~?k zTcX1|`nvgB93{LJ(@lv16ao&^u!_HTCrT9puU#Xlq`JMmB3JP>TX&gR&Mwvtu4e0X z{+V6$P=0pBVV{LyMYWa5HSz+{ygcAVSjX}5{$XvC7*{DQju*!M)f~Y}_Dkrb3Xz*cz9r~~9mf9U%u@UE^F#xJ(p=(Ys z6XAgQ=3B^T4L0V=qn8&3wO)geFU;9n4L3H^R%Jqm?Wbvz$QgFGN!8l~GyEZCECj5s z22H-G%XkmL4hgL-Y84XboioIbZ$8(B7%H`M++f9Y%)N5(4q*2u-@m_u<^gbF3fxG> zLo_yiLa;3aQq@f)|C@OR*w=+R(8vi`IhCP8Hjdb)E^Rh_TBaL8X!3_!T(v7nyo^UN zh-?Z~Ks5A63FV0xIOZ`TC?ZbMg4qtv$vU!80^shCZg z61c+^Rd^vL2Goohn722Rwsr9j`$Bn+9DQH83E_OzfY(8^P5oI6@?0mM^Q$~+J(*lLWO*s7e(htODhluApF` z$VtW6iz-T!W|nlCku)`#ZTO%t`@)&1QUv#eOeT$NkSm0?KRkK!OcL?8Z{eh}egC)o z46<0I4}8BkgS?LIkE-zsjCHozhvF%44NeNmk+PlnUJ)vEstSA46L!Xeb8r0AGvXJ0Bfk6~?ss>A zj4sPi0SqTU&qg(@+VI7TjS%w0w8_*{rZZGEV1sJWk6@JI-#@Rx1rrailc;8XW}N*B zl|=r*lj~>HHUG*0L?qQsx>!1BUzn|hApvk0&ep?l1mH{Q?~O407!8BnSq;M^kHb(> zxX4#&`7$kU(DEjhPYpfImn4(wg@Q-DjpdWzZ%gk#U0PY*e0t>_EdACSSobb0Z=Sw} zhng3CBF4+^L&xcJ%CI!&yL<_AU7GQ(=o#-S&4%lV?uTX?C{Ny{phBTe9WK>!W6W(a zJ~4H=X^D^koHJ9m(20rt>O<mg+&L8sa(>C_c0kAuHnW4~Pb)g}G)>r1BSo%eRK z@N>t`(LcfPVRS^DbklLYs&)rM1A(@`ENpN)4MADRx*oRZLc?VrC=&@#p)1!DDhec> z!$cNQLFvd~uuKLJq4s$2|-9jr)I?m zV0jfTFha`S1s@;U0P5JCDS4kwmDfC!J!r4Vx3DKE$R(rYI+odm+ZB7W z%T0FW7QOU!S~h8+md&8XSLrWW#`sTt2@9dddw;+B*5iYxOAE`_PuDgosG!#l+KaQ5 zy!UgM(IAc{&?Nf#+II}1eOK<{2*s*mSpL1(YPFs%q^;KGZzs)_$}%H literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d397ce4fe2f2c2758389265c7663b78f1c2f6f7 GIT binary patch literal 2659 zcma)8OK&4Z5T5ZXj^iw76F|#D+Z+&hMLYtem55f$TPznNt(F71jN8-gq}lQGZ1>o~ zz9Hp`#BFbgE8>SB#4o^C{s4;MvM0Wp8Bb>7NZFB9Zg*GLfMe`muhR`C|1d7Ehg;^Q9x4Ge@}6`K_Lv9l7&buO6&#(6^iaSbdDeQ%5>Su5gZO z!ab^s+L?3I5Ov6=Xh60^6LL$mAlqUKa$B?^J7ODhXWr@UEW4j_D<8^On?#z$N1w}3 z9`i)9AmrAvM6=lFnG({_;@C)Rnp9gw$84+(OHL$qtPW?=^n-PHd6W(%vTCHE&fQ*Z zaqt-rLn+uu;;y{7JWZ627!Q&u&gaY~+$6R?_|@sT%Z8QV*pg-TZ0vnwrLo==(i3v# zCDJDGV_SUpXEK_3p&EJdJUP+P2mSZn_pD0fLCk~4{8(BqRzFnw<)Dn4dMr91?dE|Eqjie2%*N8$v}4)Pp}QmH1a+}@!1duD9o?` z09WUF%1(I%Wu4QLja9@$wctdoK6_pi>nVz+i*%Pw;0Ah8&ZtF(WjAx4BYCTWWcg?p zmr6KZ#}2QGW6@I?CsHKrGzidr<0<;1U#Yoy0nREFZ)Kq@_O6I;zZ%&!73M#p@ABYI zPb6AY5crI%P{-~Izo4jH|~M4bb{7S5z#uSSSdNNEXJTkdMaXL zqbD%+a6L`);q*>#IK0RvFMUSTM?iQ6RTm72Z+)3I-;vZ48B z_s(05X7{|?gt*~0@1M8YSna2KZu1Lw)pDB;+{_l48T4w)mL3uOnc1qVXYG4g4)@Jl c&`$mBVewDhb=`k!ciac=Pj~-w=sUIfKaE`5r2qf` literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2d3edeef4492dd806be53ab30f8bf82d8619130 GIT binary patch literal 25902 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 Q8u_NEr|xe#JlS&nA6bl9&Hw-a literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11414fa61b237260d029fe84ea715c56025d7669 GIT binary patch literal 10511 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 d#MUO>c)`G*7bn;qYvSv~*& literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89d912b3e4b54645616f04148ccfee3d1eed0d6e GIT binary patch literal 205 zcmX@j%ge<81jnuBrGx0lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdm7^b8oLW?@UkW7k zQ&P+HOHzwV3bKpgv|d?iUYUMQW|DqEWl2VUp0S>xk$!PzNvdu^Vsdt3dTOzLL1uw| zJWyFmevy7rYH@x}St>|Vu^lyd}dx|NqoFsLFF$Fo80`A(wtPgB37W~j6hrr OVtiy~WMnL22C@JolsL@* literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..669e175c52997b4e8dbecb7a235071727e71eff4 GIT binary patch literal 425 zcmYjLu};G<6trWPl!mGjVy_S^9U7~!A;bg&11yN4U7|F$LZ}lPJ5A}v#0nb=>du!i zu#~OJ!ob8<(FJwF5zz9aclVy|>~}BKY6X~j-W!FFhTn_juki0MJ2b-spn$^A>VQ>1 zEs8jdt&SC=4uW8aw*bT2KsoS7D=oFQQ3v1}wZQ;3O1XXFOBp3$UOr=2eU=35qqx$r zlx0XE1E-CZ-1a=5bI;3bf#944X(STu`rTk@%bnv`3Y8uyB~gVI9Cqm<^5RDK4%AN&18V4H8C(n5W*yO{t9QWw literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py new file mode 100644 index 0000000..1becc50 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py @@ -0,0 +1,6 @@ +__all__ = ["Mapping", "Sequence"] + +try: + from collections.abc import Mapping, Sequence +except ImportError: + from collections import Mapping, Sequence diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py new file mode 100644 index 0000000..e99d87e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py @@ -0,0 +1,133 @@ +class AbstractProvider(object): + """Delegate class to provide the required interface for the resolver.""" + + def identify(self, requirement_or_candidate): + """Given a requirement, return an identifier for it. + + This is used to identify a requirement, e.g. whether two requirements + should have their specifier parts merged. + """ + raise NotImplementedError + + def get_preference( + self, + identifier, + resolutions, + candidates, + information, + backtrack_causes, + ): + """Produce a sort key for given requirement based on preference. + + The preference is defined as "I think this requirement should be + resolved first". The lower the return value is, the more preferred + this group of arguments is. + + :param identifier: An identifier as returned by ``identify()``. This + identifies the dependency matches which should be returned. + :param resolutions: Mapping of candidates currently pinned by the + resolver. Each key is an identifier, and the value is a candidate. + The candidate may conflict with requirements from ``information``. + :param candidates: Mapping of each dependency's possible candidates. + Each value is an iterator of candidates. + :param information: Mapping of requirement information of each package. + Each value is an iterator of *requirement information*. + :param backtrack_causes: Sequence of requirement information that were + the requirements that caused the resolver to most recently backtrack. + + A *requirement information* instance is a named tuple with two members: + + * ``requirement`` specifies a requirement contributing to the current + list of candidates. + * ``parent`` specifies the candidate that provides (depended on) the + requirement, or ``None`` to indicate a root requirement. + + The preference could depend on various issues, including (not + necessarily in this order): + + * Is this package pinned in the current resolution result? + * How relaxed is the requirement? Stricter ones should probably be + worked on first? (I don't know, actually.) + * How many possibilities are there to satisfy this requirement? Those + with few left should likely be worked on first, I guess? + * Are there any known conflicts for this requirement? We should + probably work on those with the most known conflicts. + + A sortable value should be returned (this will be used as the ``key`` + parameter of the built-in sorting function). The smaller the value is, + the more preferred this requirement is (i.e. the sorting function + is called with ``reverse=False``). + """ + raise NotImplementedError + + def find_matches(self, identifier, requirements, incompatibilities): + """Find all possible candidates that satisfy the given constraints. + + :param identifier: An identifier as returned by ``identify()``. This + identifies the dependency matches of which should be returned. + :param requirements: A mapping of requirements that all returned + candidates must satisfy. Each key is an identifier, and the value + an iterator of requirements for that dependency. + :param incompatibilities: A mapping of known incompatibilities of + each dependency. Each key is an identifier, and the value an + iterator of incompatibilities known to the resolver. All + incompatibilities *must* be excluded from the return value. + + This should try to get candidates based on the requirements' types. + For VCS, local, and archive requirements, the one-and-only match is + returned, and for a "named" requirement, the index(es) should be + consulted to find concrete candidates for this requirement. + + The return value should produce candidates ordered by preference; the + most preferred candidate should come first. The return type may be one + of the following: + + * A callable that returns an iterator that yields candidates. + * An collection of candidates. + * An iterable of candidates. This will be consumed immediately into a + list of candidates. + """ + raise NotImplementedError + + def is_satisfied_by(self, requirement, candidate): + """Whether the given requirement can be satisfied by a candidate. + + The candidate is guaranteed to have been generated from the + requirement. + + A boolean should be returned to indicate whether ``candidate`` is a + viable solution to the requirement. + """ + raise NotImplementedError + + def get_dependencies(self, candidate): + """Get dependencies of a candidate. + + This should return a collection of requirements that `candidate` + specifies as its dependencies. + """ + raise NotImplementedError + + +class AbstractResolver(object): + """The thing that performs the actual resolution work.""" + + base_exception = Exception + + def __init__(self, provider, reporter): + self.provider = provider + self.reporter = reporter + + def resolve(self, requirements, **kwargs): + """Take a collection of constraints, spit out the resolution result. + + This returns a representation of the final resolution state, with one + guarenteed attribute ``mapping`` that contains resolved candidates as + values. The keys are their respective identifiers. + + :param requirements: A collection of constraints. + :param kwargs: Additional keyword arguments that subclasses may accept. + + :raises: ``self.base_exception`` or its subclass. + """ + raise NotImplementedError diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py new file mode 100644 index 0000000..688b5e1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py @@ -0,0 +1,43 @@ +class BaseReporter(object): + """Delegate class to provider progress reporting for the resolver.""" + + def starting(self): + """Called before the resolution actually starts.""" + + def starting_round(self, index): + """Called before each round of resolution starts. + + The index is zero-based. + """ + + def ending_round(self, index, state): + """Called before each round of resolution ends. + + This is NOT called if the resolution ends at this round. Use `ending` + if you want to report finalization. The index is zero-based. + """ + + def ending(self, state): + """Called before the resolution ends successfully.""" + + def adding_requirement(self, requirement, parent): + """Called when adding a new requirement into the resolve criteria. + + :param requirement: The additional requirement to be applied to filter + the available candidaites. + :param parent: The candidate that requires ``requirement`` as a + dependency, or None if ``requirement`` is one of the root + requirements passed in from ``Resolver.resolve()``. + """ + + def resolving_conflicts(self, causes): + """Called when starting to attempt requirement conflict resolution. + + :param causes: The information on the collision that caused the backtracking. + """ + + def rejecting_candidate(self, criterion, candidate): + """Called when rejecting a candidate during backtracking.""" + + def pinning(self, candidate): + """Called when adding a candidate to the potential solution.""" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py new file mode 100644 index 0000000..2c3d0e3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py @@ -0,0 +1,547 @@ +import collections +import itertools +import operator + +from .providers import AbstractResolver +from .structs import DirectedGraph, IteratorMapping, build_iter_view + +RequirementInformation = collections.namedtuple( + "RequirementInformation", ["requirement", "parent"] +) + + +class ResolverException(Exception): + """A base class for all exceptions raised by this module. + + Exceptions derived by this class should all be handled in this module. Any + bubbling pass the resolver should be treated as a bug. + """ + + +class RequirementsConflicted(ResolverException): + def __init__(self, criterion): + super(RequirementsConflicted, self).__init__(criterion) + self.criterion = criterion + + def __str__(self): + return "Requirements conflict: {}".format( + ", ".join(repr(r) for r in self.criterion.iter_requirement()), + ) + + +class InconsistentCandidate(ResolverException): + def __init__(self, candidate, criterion): + super(InconsistentCandidate, self).__init__(candidate, criterion) + self.candidate = candidate + self.criterion = criterion + + def __str__(self): + return "Provided candidate {!r} does not satisfy {}".format( + self.candidate, + ", ".join(repr(r) for r in self.criterion.iter_requirement()), + ) + + +class Criterion(object): + """Representation of possible resolution results of a package. + + This holds three attributes: + + * `information` is a collection of `RequirementInformation` pairs. + Each pair is a requirement contributing to this criterion, and the + candidate that provides the requirement. + * `incompatibilities` is a collection of all known not-to-work candidates + to exclude from consideration. + * `candidates` is a collection containing all possible candidates deducted + from the union of contributing requirements and known incompatibilities. + It should never be empty, except when the criterion is an attribute of a + raised `RequirementsConflicted` (in which case it is always empty). + + .. note:: + This class is intended to be externally immutable. **Do not** mutate + any of its attribute containers. + """ + + def __init__(self, candidates, information, incompatibilities): + self.candidates = candidates + self.information = information + self.incompatibilities = incompatibilities + + def __repr__(self): + requirements = ", ".join( + "({!r}, via={!r})".format(req, parent) + for req, parent in self.information + ) + return "Criterion({})".format(requirements) + + def iter_requirement(self): + return (i.requirement for i in self.information) + + def iter_parent(self): + return (i.parent for i in self.information) + + +class ResolutionError(ResolverException): + pass + + +class ResolutionImpossible(ResolutionError): + def __init__(self, causes): + super(ResolutionImpossible, self).__init__(causes) + # causes is a list of RequirementInformation objects + self.causes = causes + + +class ResolutionTooDeep(ResolutionError): + def __init__(self, round_count): + super(ResolutionTooDeep, self).__init__(round_count) + self.round_count = round_count + + +# Resolution state in a round. +State = collections.namedtuple("State", "mapping criteria backtrack_causes") + + +class Resolution(object): + """Stateful resolution object. + + This is designed as a one-off object that holds information to kick start + the resolution process, and holds the results afterwards. + """ + + def __init__(self, provider, reporter): + self._p = provider + self._r = reporter + self._states = [] + + @property + def state(self): + try: + return self._states[-1] + except IndexError: + raise AttributeError("state") + + def _push_new_state(self): + """Push a new state into history. + + This new state will be used to hold resolution results of the next + coming round. + """ + base = self._states[-1] + state = State( + mapping=base.mapping.copy(), + criteria=base.criteria.copy(), + backtrack_causes=base.backtrack_causes[:], + ) + self._states.append(state) + + def _add_to_criteria(self, criteria, requirement, parent): + self._r.adding_requirement(requirement=requirement, parent=parent) + + identifier = self._p.identify(requirement_or_candidate=requirement) + criterion = criteria.get(identifier) + if criterion: + incompatibilities = list(criterion.incompatibilities) + else: + incompatibilities = [] + + matches = self._p.find_matches( + identifier=identifier, + requirements=IteratorMapping( + criteria, + operator.methodcaller("iter_requirement"), + {identifier: [requirement]}, + ), + incompatibilities=IteratorMapping( + criteria, + operator.attrgetter("incompatibilities"), + {identifier: incompatibilities}, + ), + ) + + if criterion: + information = list(criterion.information) + information.append(RequirementInformation(requirement, parent)) + else: + information = [RequirementInformation(requirement, parent)] + + criterion = Criterion( + candidates=build_iter_view(matches), + information=information, + incompatibilities=incompatibilities, + ) + if not criterion.candidates: + raise RequirementsConflicted(criterion) + criteria[identifier] = criterion + + def _remove_information_from_criteria(self, criteria, parents): + """Remove information from parents of criteria. + + Concretely, removes all values from each criterion's ``information`` + field that have one of ``parents`` as provider of the requirement. + + :param criteria: The criteria to update. + :param parents: Identifiers for which to remove information from all criteria. + """ + if not parents: + return + for key, criterion in criteria.items(): + criteria[key] = Criterion( + criterion.candidates, + [ + information + for information in criterion.information + if ( + information.parent is None + or self._p.identify(information.parent) not in parents + ) + ], + criterion.incompatibilities, + ) + + def _get_preference(self, name): + return self._p.get_preference( + identifier=name, + resolutions=self.state.mapping, + candidates=IteratorMapping( + self.state.criteria, + operator.attrgetter("candidates"), + ), + information=IteratorMapping( + self.state.criteria, + operator.attrgetter("information"), + ), + backtrack_causes=self.state.backtrack_causes, + ) + + def _is_current_pin_satisfying(self, name, criterion): + try: + current_pin = self.state.mapping[name] + except KeyError: + return False + return all( + self._p.is_satisfied_by(requirement=r, candidate=current_pin) + for r in criterion.iter_requirement() + ) + + def _get_updated_criteria(self, candidate): + criteria = self.state.criteria.copy() + for requirement in self._p.get_dependencies(candidate=candidate): + self._add_to_criteria(criteria, requirement, parent=candidate) + return criteria + + def _attempt_to_pin_criterion(self, name): + criterion = self.state.criteria[name] + + causes = [] + for candidate in criterion.candidates: + try: + criteria = self._get_updated_criteria(candidate) + except RequirementsConflicted as e: + self._r.rejecting_candidate(e.criterion, candidate) + causes.append(e.criterion) + continue + + # Check the newly-pinned candidate actually works. This should + # always pass under normal circumstances, but in the case of a + # faulty provider, we will raise an error to notify the implementer + # to fix find_matches() and/or is_satisfied_by(). + satisfied = all( + self._p.is_satisfied_by(requirement=r, candidate=candidate) + for r in criterion.iter_requirement() + ) + if not satisfied: + raise InconsistentCandidate(candidate, criterion) + + self._r.pinning(candidate=candidate) + self.state.criteria.update(criteria) + + # Put newly-pinned candidate at the end. This is essential because + # backtracking looks at this mapping to get the last pin. + self.state.mapping.pop(name, None) + self.state.mapping[name] = candidate + + return [] + + # All candidates tried, nothing works. This criterion is a dead + # end, signal for backtracking. + return causes + + def _backjump(self, causes): + """Perform backjumping. + + When we enter here, the stack is like this:: + + [ state Z ] + [ state Y ] + [ state X ] + .... earlier states are irrelevant. + + 1. No pins worked for Z, so it does not have a pin. + 2. We want to reset state Y to unpinned, and pin another candidate. + 3. State X holds what state Y was before the pin, but does not + have the incompatibility information gathered in state Y. + + Each iteration of the loop will: + + 1. Identify Z. The incompatibility is not always caused by the latest + state. For example, given three requirements A, B and C, with + dependencies A1, B1 and C1, where A1 and B1 are incompatible: the + last state might be related to C, so we want to discard the + previous state. + 2. Discard Z. + 3. Discard Y but remember its incompatibility information gathered + previously, and the failure we're dealing with right now. + 4. Push a new state Y' based on X, and apply the incompatibility + information from Y to Y'. + 5a. If this causes Y' to conflict, we need to backtrack again. Make Y' + the new Z and go back to step 2. + 5b. If the incompatibilities apply cleanly, end backtracking. + """ + incompatible_reqs = itertools.chain( + (c.parent for c in causes if c.parent is not None), + (c.requirement for c in causes), + ) + incompatible_deps = {self._p.identify(r) for r in incompatible_reqs} + while len(self._states) >= 3: + # Remove the state that triggered backtracking. + del self._states[-1] + + # Ensure to backtrack to a state that caused the incompatibility + incompatible_state = False + while not incompatible_state: + # Retrieve the last candidate pin and known incompatibilities. + try: + broken_state = self._states.pop() + name, candidate = broken_state.mapping.popitem() + except (IndexError, KeyError): + raise ResolutionImpossible(causes) + current_dependencies = { + self._p.identify(d) + for d in self._p.get_dependencies(candidate) + } + incompatible_state = not current_dependencies.isdisjoint( + incompatible_deps + ) + + incompatibilities_from_broken = [ + (k, list(v.incompatibilities)) + for k, v in broken_state.criteria.items() + ] + + # Also mark the newly known incompatibility. + incompatibilities_from_broken.append((name, [candidate])) + + # Create a new state from the last known-to-work one, and apply + # the previously gathered incompatibility information. + def _patch_criteria(): + for k, incompatibilities in incompatibilities_from_broken: + if not incompatibilities: + continue + try: + criterion = self.state.criteria[k] + except KeyError: + continue + matches = self._p.find_matches( + identifier=k, + requirements=IteratorMapping( + self.state.criteria, + operator.methodcaller("iter_requirement"), + ), + incompatibilities=IteratorMapping( + self.state.criteria, + operator.attrgetter("incompatibilities"), + {k: incompatibilities}, + ), + ) + candidates = build_iter_view(matches) + if not candidates: + return False + incompatibilities.extend(criterion.incompatibilities) + self.state.criteria[k] = Criterion( + candidates=candidates, + information=list(criterion.information), + incompatibilities=incompatibilities, + ) + return True + + self._push_new_state() + success = _patch_criteria() + + # It works! Let's work on this new state. + if success: + return True + + # State does not work after applying known incompatibilities. + # Try the still previous state. + + # No way to backtrack anymore. + return False + + def resolve(self, requirements, max_rounds): + if self._states: + raise RuntimeError("already resolved") + + self._r.starting() + + # Initialize the root state. + self._states = [ + State( + mapping=collections.OrderedDict(), + criteria={}, + backtrack_causes=[], + ) + ] + for r in requirements: + try: + self._add_to_criteria(self.state.criteria, r, parent=None) + except RequirementsConflicted as e: + raise ResolutionImpossible(e.criterion.information) + + # The root state is saved as a sentinel so the first ever pin can have + # something to backtrack to if it fails. The root state is basically + # pinning the virtual "root" package in the graph. + self._push_new_state() + + for round_index in range(max_rounds): + self._r.starting_round(index=round_index) + + unsatisfied_names = [ + key + for key, criterion in self.state.criteria.items() + if not self._is_current_pin_satisfying(key, criterion) + ] + + # All criteria are accounted for. Nothing more to pin, we are done! + if not unsatisfied_names: + self._r.ending(state=self.state) + return self.state + + # keep track of satisfied names to calculate diff after pinning + satisfied_names = set(self.state.criteria.keys()) - set( + unsatisfied_names + ) + + # Choose the most preferred unpinned criterion to try. + name = min(unsatisfied_names, key=self._get_preference) + failure_causes = self._attempt_to_pin_criterion(name) + + if failure_causes: + causes = [i for c in failure_causes for i in c.information] + # Backjump if pinning fails. The backjump process puts us in + # an unpinned state, so we can work on it in the next round. + self._r.resolving_conflicts(causes=causes) + success = self._backjump(causes) + self.state.backtrack_causes[:] = causes + + # Dead ends everywhere. Give up. + if not success: + raise ResolutionImpossible(self.state.backtrack_causes) + else: + # discard as information sources any invalidated names + # (unsatisfied names that were previously satisfied) + newly_unsatisfied_names = { + key + for key, criterion in self.state.criteria.items() + if key in satisfied_names + and not self._is_current_pin_satisfying(key, criterion) + } + self._remove_information_from_criteria( + self.state.criteria, newly_unsatisfied_names + ) + # Pinning was successful. Push a new state to do another pin. + self._push_new_state() + + self._r.ending_round(index=round_index, state=self.state) + + raise ResolutionTooDeep(max_rounds) + + +def _has_route_to_root(criteria, key, all_keys, connected): + if key in connected: + return True + if key not in criteria: + return False + for p in criteria[key].iter_parent(): + try: + pkey = all_keys[id(p)] + except KeyError: + continue + if pkey in connected: + connected.add(key) + return True + if _has_route_to_root(criteria, pkey, all_keys, connected): + connected.add(key) + return True + return False + + +Result = collections.namedtuple("Result", "mapping graph criteria") + + +def _build_result(state): + mapping = state.mapping + all_keys = {id(v): k for k, v in mapping.items()} + all_keys[id(None)] = None + + graph = DirectedGraph() + graph.add(None) # Sentinel as root dependencies' parent. + + connected = {None} + for key, criterion in state.criteria.items(): + if not _has_route_to_root(state.criteria, key, all_keys, connected): + continue + if key not in graph: + graph.add(key) + for p in criterion.iter_parent(): + try: + pkey = all_keys[id(p)] + except KeyError: + continue + if pkey not in graph: + graph.add(pkey) + graph.connect(pkey, key) + + return Result( + mapping={k: v for k, v in mapping.items() if k in connected}, + graph=graph, + criteria=state.criteria, + ) + + +class Resolver(AbstractResolver): + """The thing that performs the actual resolution work.""" + + base_exception = ResolverException + + def resolve(self, requirements, max_rounds=100): + """Take a collection of constraints, spit out the resolution result. + + The return value is a representation to the final resolution result. It + is a tuple subclass with three public members: + + * `mapping`: A dict of resolved candidates. Each key is an identifier + of a requirement (as returned by the provider's `identify` method), + and the value is the resolved candidate. + * `graph`: A `DirectedGraph` instance representing the dependency tree. + The vertices are keys of `mapping`, and each edge represents *why* + a particular package is included. A special vertex `None` is + included to represent parents of user-supplied requirements. + * `criteria`: A dict of "criteria" that hold detailed information on + how edges in the graph are derived. Each key is an identifier of a + requirement, and the value is a `Criterion` instance. + + The following exceptions may be raised if a resolution cannot be found: + + * `ResolutionImpossible`: A resolution cannot be found for the given + combination of requirements. The `causes` attribute of the + exception is a list of (requirement, parent), giving the + requirements that could not be satisfied. + * `ResolutionTooDeep`: The dependency tree is too deeply nested and + the resolver gave up. This is usually caused by a circular + dependency, but you can try to resolve this by increasing the + `max_rounds` argument. + """ + resolution = Resolution(self.provider, self.reporter) + state = resolution.resolve(requirements, max_rounds=max_rounds) + return _build_result(state) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py new file mode 100644 index 0000000..359a34f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py @@ -0,0 +1,170 @@ +import itertools + +from .compat import collections_abc + + +class DirectedGraph(object): + """A graph structure with directed edges.""" + + def __init__(self): + self._vertices = set() + self._forwards = {} # -> Set[] + self._backwards = {} # -> Set[] + + def __iter__(self): + return iter(self._vertices) + + def __len__(self): + return len(self._vertices) + + def __contains__(self, key): + return key in self._vertices + + def copy(self): + """Return a shallow copy of this graph.""" + other = DirectedGraph() + other._vertices = set(self._vertices) + other._forwards = {k: set(v) for k, v in self._forwards.items()} + other._backwards = {k: set(v) for k, v in self._backwards.items()} + return other + + def add(self, key): + """Add a new vertex to the graph.""" + if key in self._vertices: + raise ValueError("vertex exists") + self._vertices.add(key) + self._forwards[key] = set() + self._backwards[key] = set() + + def remove(self, key): + """Remove a vertex from the graph, disconnecting all edges from/to it.""" + self._vertices.remove(key) + for f in self._forwards.pop(key): + self._backwards[f].remove(key) + for t in self._backwards.pop(key): + self._forwards[t].remove(key) + + def connected(self, f, t): + return f in self._backwards[t] and t in self._forwards[f] + + def connect(self, f, t): + """Connect two existing vertices. + + Nothing happens if the vertices are already connected. + """ + if t not in self._vertices: + raise KeyError(t) + self._forwards[f].add(t) + self._backwards[t].add(f) + + def iter_edges(self): + for f, children in self._forwards.items(): + for t in children: + yield f, t + + def iter_children(self, key): + return iter(self._forwards[key]) + + def iter_parents(self, key): + return iter(self._backwards[key]) + + +class IteratorMapping(collections_abc.Mapping): + def __init__(self, mapping, accessor, appends=None): + self._mapping = mapping + self._accessor = accessor + self._appends = appends or {} + + def __repr__(self): + return "IteratorMapping({!r}, {!r}, {!r})".format( + self._mapping, + self._accessor, + self._appends, + ) + + def __bool__(self): + return bool(self._mapping or self._appends) + + __nonzero__ = __bool__ # XXX: Python 2. + + def __contains__(self, key): + return key in self._mapping or key in self._appends + + def __getitem__(self, k): + try: + v = self._mapping[k] + except KeyError: + return iter(self._appends[k]) + return itertools.chain(self._accessor(v), self._appends.get(k, ())) + + def __iter__(self): + more = (k for k in self._appends if k not in self._mapping) + return itertools.chain(self._mapping, more) + + def __len__(self): + more = sum(1 for k in self._appends if k not in self._mapping) + return len(self._mapping) + more + + +class _FactoryIterableView(object): + """Wrap an iterator factory returned by `find_matches()`. + + Calling `iter()` on this class would invoke the underlying iterator + factory, making it a "collection with ordering" that can be iterated + through multiple times, but lacks random access methods presented in + built-in Python sequence types. + """ + + def __init__(self, factory): + self._factory = factory + self._iterable = None + + def __repr__(self): + return "{}({})".format(type(self).__name__, list(self)) + + def __bool__(self): + try: + next(iter(self)) + except StopIteration: + return False + return True + + __nonzero__ = __bool__ # XXX: Python 2. + + def __iter__(self): + iterable = ( + self._factory() if self._iterable is None else self._iterable + ) + self._iterable, current = itertools.tee(iterable) + return current + + +class _SequenceIterableView(object): + """Wrap an iterable returned by find_matches(). + + This is essentially just a proxy to the underlying sequence that provides + the same interface as `_FactoryIterableView`. + """ + + def __init__(self, sequence): + self._sequence = sequence + + def __repr__(self): + return "{}({})".format(type(self).__name__, self._sequence) + + def __bool__(self): + return bool(self._sequence) + + __nonzero__ = __bool__ # XXX: Python 2. + + def __iter__(self): + return iter(self._sequence) + + +def build_iter_view(matches): + """Build an iterable view from the value returned by `find_matches()`.""" + if callable(matches): + return _FactoryIterableView(matches) + if not isinstance(matches, collections_abc.Sequence): + matches = list(matches) + return _SequenceIterableView(matches) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py new file mode 100644 index 0000000..73f58d7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py @@ -0,0 +1,177 @@ +"""Rich text and beautiful formatting in the terminal.""" + +import os +from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union + +from ._extension import load_ipython_extension # noqa: F401 + +__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] + +if TYPE_CHECKING: + from .console import Console + +# Global console used by alternative print +_console: Optional["Console"] = None + +try: + _IMPORT_CWD = os.path.abspath(os.getcwd()) +except FileNotFoundError: + # Can happen if the cwd has been deleted + _IMPORT_CWD = "" + + +def get_console() -> "Console": + """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, + and hasn't been explicitly given one. + + Returns: + Console: A console instance. + """ + global _console + if _console is None: + from .console import Console + + _console = Console() + + return _console + + +def reconfigure(*args: Any, **kwargs: Any) -> None: + """Reconfigures the global console by replacing it with another. + + Args: + *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. + **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. + """ + from pip._vendor.rich.console import Console + + new_console = Console(*args, **kwargs) + _console = get_console() + _console.__dict__ = new_console.__dict__ + + +def print( + *objects: Any, + sep: str = " ", + end: str = "\n", + file: Optional[IO[str]] = None, + flush: bool = False, +) -> None: + r"""Print object(s) supplied via positional arguments. + This function has an identical signature to the built-in print. + For more advanced features, see the :class:`~rich.console.Console` class. + + Args: + sep (str, optional): Separator between printed objects. Defaults to " ". + end (str, optional): Character to write at end of output. Defaults to "\\n". + file (IO[str], optional): File to write to, or None for stdout. Defaults to None. + flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False. + + """ + from .console import Console + + write_console = get_console() if file is None else Console(file=file) + return write_console.print(*objects, sep=sep, end=end) + + +def print_json( + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = False, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, +) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (str): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (int, optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + + get_console().print_json( + json, + data=data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + + +def inspect( + obj: Any, + *, + console: Optional["Console"] = None, + title: Optional[str] = None, + help: bool = False, + methods: bool = False, + docs: bool = True, + private: bool = False, + dunder: bool = False, + sort: bool = True, + all: bool = False, + value: bool = True, +) -> None: + """Inspect any Python object. + + * inspect() to see summarized info. + * inspect(, methods=True) to see methods. + * inspect(, help=True) to see full (non-abbreviated) help. + * inspect(, private=True) to see private attributes (single underscore). + * inspect(, dunder=True) to see attributes beginning with double underscore. + * inspect(, all=True) to see all attributes. + + Args: + obj (Any): An object to inspect. + title (str, optional): Title to display over inspect result, or None use type. Defaults to None. + help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. + methods (bool, optional): Enable inspection of callables. Defaults to False. + docs (bool, optional): Also render doc strings. Defaults to True. + private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. + dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. + sort (bool, optional): Sort attributes alphabetically. Defaults to True. + all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value. Defaults to True. + """ + _console = console or get_console() + from pip._vendor.rich._inspect import Inspect + + # Special case for inspect(inspect) + is_inspect = obj is inspect + + _inspect = Inspect( + obj, + title=title, + help=is_inspect or help, + methods=is_inspect or methods, + docs=is_inspect or docs, + private=private, + dunder=dunder, + sort=sort, + all=all, + value=value, + ) + _console.print(_inspect) + + +if __name__ == "__main__": # pragma: no cover + print("Hello, **World**") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py new file mode 100644 index 0000000..270629f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py @@ -0,0 +1,274 @@ +import colorsys +import io +from time import process_time + +from pip._vendor.rich import box +from pip._vendor.rich.color import Color +from pip._vendor.rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult +from pip._vendor.rich.markdown import Markdown +from pip._vendor.rich.measure import Measurement +from pip._vendor.rich.pretty import Pretty +from pip._vendor.rich.segment import Segment +from pip._vendor.rich.style import Style +from pip._vendor.rich.syntax import Syntax +from pip._vendor.rich.table import Table +from pip._vendor.rich.text import Text + + +class ColorBox: + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + for y in range(0, 5): + for x in range(options.max_width): + h = x / options.max_width + l = 0.1 + ((y / 5) * 0.7) + r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) + r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) + bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) + color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) + yield Segment("â–„", Style(color=color, bgcolor=bgcolor)) + yield Segment.line() + + def __rich_measure__( + self, console: "Console", options: ConsoleOptions + ) -> Measurement: + return Measurement(1, options.max_width) + + +def make_test_card() -> Table: + """Get a renderable that demonstrates a number of features.""" + table = Table.grid(padding=1, pad_edge=True) + table.title = "Rich features" + table.add_column("Feature", no_wrap=True, justify="center", style="bold red") + table.add_column("Demonstration") + + color_table = Table( + box=None, + expand=False, + show_header=False, + show_edge=False, + pad_edge=False, + ) + color_table.add_row( + ( + "✓ [bold green]4-bit color[/]\n" + "✓ [bold blue]8-bit color[/]\n" + "✓ [bold magenta]Truecolor (16.7 million)[/]\n" + "✓ [bold yellow]Dumb terminals[/]\n" + "✓ [bold cyan]Automatic color conversion" + ), + ColorBox(), + ) + + table.add_row("Colors", color_table) + + table.add_row( + "Styles", + "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].", + ) + + lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus." + lorem_table = Table.grid(padding=1, collapse_padding=True) + lorem_table.pad_edge = False + lorem_table.add_row( + Text(lorem, justify="left", style="green"), + Text(lorem, justify="center", style="yellow"), + Text(lorem, justify="right", style="blue"), + Text(lorem, justify="full", style="red"), + ) + table.add_row( + "Text", + Group( + Text.from_markup( + """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" + ), + lorem_table, + ), + ) + + def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: + table = Table(show_header=False, pad_edge=False, box=None, expand=True) + table.add_column("1", ratio=1) + table.add_column("2", ratio=1) + table.add_row(renderable1, renderable2) + return table + + table.add_row( + "Asian\nlanguage\nsupport", + ":flag_for_china: 该库支æŒä¸­æ–‡ï¼Œæ—¥æ–‡å’ŒéŸ©æ–‡æ–‡æœ¬ï¼\n:flag_for_japan: ライブラリã¯ä¸­å›½èªžã€æ—¥æœ¬èªžã€éŸ“国語ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™\n:flag_for_south_korea: ì´ ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 중국어, ì¼ë³¸ì–´ ë° í•œêµ­ì–´ í…스트를 ì§€ì›í•©ë‹ˆë‹¤", + ) + + markup_example = ( + "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " + ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " + ) + table.add_row("Markup", markup_example) + + example_table = Table( + show_edge=False, + show_header=True, + expand=False, + row_styles=["none", "dim"], + box=box.SIMPLE, + ) + example_table.add_column("[green]Date", style="green", no_wrap=True) + example_table.add_column("[blue]Title", style="blue") + example_table.add_column( + "[cyan]Production Budget", + style="cyan", + justify="right", + no_wrap=True, + ) + example_table.add_column( + "[magenta]Box Office", + style="magenta", + justify="right", + no_wrap=True, + ) + example_table.add_row( + "Dec 20, 2019", + "Star Wars: The Rise of Skywalker", + "$275,000,000", + "$375,126,118", + ) + example_table.add_row( + "May 25, 2018", + "[b]Solo[/]: A Star Wars Story", + "$275,000,000", + "$393,151,347", + ) + example_table.add_row( + "Dec 15, 2017", + "Star Wars Ep. VIII: The Last Jedi", + "$262,000,000", + "[bold]$1,332,539,889[/bold]", + ) + example_table.add_row( + "May 19, 1999", + "Star Wars Ep. [b]I[/b]: [i]The phantom Menace", + "$115,000,000", + "$1,027,044,677", + ) + + table.add_row("Tables", example_table) + + code = '''\ +def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value''' + + pretty_data = { + "foo": [ + 3.1427, + ( + "Paul Atreides", + "Vladimir Harkonnen", + "Thufir Hawat", + ), + ], + "atomic": (False, True, None), + } + table.add_row( + "Syntax\nhighlighting\n&\npretty\nprinting", + comparison( + Syntax(code, "python3", line_numbers=True, indent_guides=True), + Pretty(pretty_data, indent_guides=True), + ), + ) + + markdown_example = """\ +# Markdown + +Supports much of the *markdown* __syntax__! + +- Headers +- Basic formatting: **bold**, *italic*, `code` +- Block quotes +- Lists, and more... + """ + table.add_row( + "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example)) + ) + + table.add_row( + "+more!", + """Progress bars, columns, styled logging handler, tracebacks, etc...""", + ) + return table + + +if __name__ == "__main__": # pragma: no cover + + console = Console( + file=io.StringIO(), + force_terminal=True, + ) + test_card = make_test_card() + + # Print once to warm cache + start = process_time() + console.print(test_card) + pre_cache_taken = round((process_time() - start) * 1000.0, 1) + + console.file = io.StringIO() + + start = process_time() + console.print(test_card) + taken = round((process_time() - start) * 1000.0, 1) + + c = Console(record=True) + c.print(test_card) + + print(f"rendered in {pre_cache_taken}ms (cold cache)") + print(f"rendered in {taken}ms (warm cache)") + + from pip._vendor.rich.panel import Panel + + console = Console() + + sponsor_message = Table.grid(padding=1) + sponsor_message.add_column(style="green", justify="right") + sponsor_message.add_column(no_wrap=True) + + sponsor_message.add_row( + "Textualize", + "[u blue link=https://github.com/textualize]https://github.com/textualize", + ) + sponsor_message.add_row( + "Twitter", + "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", + ) + + intro_message = Text.from_markup( + """\ +We hope you enjoy using Rich! + +Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/] + +- Will McGugan""" + ) + + message = Table.grid(padding=2) + message.add_column() + message.add_column(no_wrap=True) + message.add_row(intro_message, sponsor_message) + + console.print( + Panel.fit( + message, + box=box.ROUNDED, + padding=(1, 2), + title="[b red]Thanks for trying out Rich!", + border_style="bright_blue", + ), + justify="center", + ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff86739e31bd20f054f290f3af529c0bdc028630 GIT binary patch literal 7020 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e285d46b94d0162b62799033b08627d9f4d8c07 GIT binary patch literal 10309 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..893a586c9f7f2406e10643fdfb4ae308ff8e7307 GIT binary patch literal 205981 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 L@3{|9ZL9wQf?2QG literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8cb4142f5885fbf6642ad5521055af9b6d4bbe8 GIT binary patch literal 2326 zcmc&$O>f&a7`Bsa%M5hrnxeb1TCv2KCA#Uy3QrD}rb$;IUx?FU%|&1&+F~M$8cF#h zhL8IVyY0STvcoRjZOC?am1OErw>T4iK<8B(gom179T0p*r9R6 zYs=5*33-*G7KtU=;W1yX`8<|9BC@u;!BfGgK)bZRTtgt=H=qj)nN@5W0758$G8n6-3bh^_dFM0U$ww zR3h`OiVjptB6da{#*uC3Tk`;#bAHGJ)=o4`?Tih_I?PbGFtizEpr>VVfVsC(`jFo(65ur;g9Nn4FLSj@YrpZNSqZ#*dv< zr;hu)-Co7oh*=QFEL&BuRdk73vGVyxhrSy560lXBhQ*TzfFWj_#d(`f&IV~9D|wHB;dQ51egpsqcmner_^J?*oLYSY;f(h znB0mQnh?b$90@lMXigKPm*4PYFx81zOzmtPwDjyMEmKZCA{YTCqeLp3NEkOzJB=dS z5Xhv8-giPV6}^A8GsEsbnYG5?6s37Z&~g$*+LFAYp>7RgPV`w7PYBwG+<>-a&O3g@ zl6?Y1#e$|a8)+?=Qe>tL6ep;!kY-8?4NYsDg{=jfdKrCMC=24OWJ0Jo2ge0^HaFpx zg~geXnJ<1Qc$emq4pIW%3C%H0%M2sn+m)#WgK-T_XTx#T0^SF267aKWY1aGtT2HGv zmyf1zTw&4V^_bn96=bm~n-v~(3O8W@8R$WG_Jw&6CUttYXr3aF?N%4gmp1lxTYKA^ z-j9bn+uqjR!Or^O`K@BH_3C-CcGJryyNBM^`p%2(*XK)SWn+82)!J-%`v;p_FMj&H z^j7~%yrcM~q(b5pS{%?GR#d9wR8D%QN8_I6d7KPY$m0jj{Z%ZPq7X9wlys=X2}`gC zY5^Bmn~Xg=NVrg5M)giIe7ER!d62?ShWH#%^>2*42hGKNxm>=O`|_)WH>IVEZyw!& Z{?{lK2c1{{_$V%CZ0e literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8287b5baed13874302731a2369d3fed5a6173bc0 GIT binary patch literal 542 zcmZWmJx{|h5Vai>K1vZVfCNj{48#H!gb;!e39+$ssX}dv)ikkew;~cq4COb#gjf+j zgn?f`BnE^S*eaE&6Xz1jz)5-cF1~yB5r{S5qfvUZ_ttq0w6btBaRc) z#x;x)CjxVi(^JYPdbCDz8v38EJ;a5#pXLRTs_?b29i1LEKzJMkmnq7s3Lz=jzaH9J0aLMDN|$PBniD@SxFVuyCUV8jbN0J;zldf+pr)W|H2R9-A4SSK&MX34 zp%2Pl>E0Wy^bTI=-1XrA-oo!Fe48toHnnp+nt4FF>UafUIJMKxcqb9NdLBx59cC4v Y?_rEz(Nf>{@xra?BS`o5%carqH#5_UF8}}l literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d12764aecef80a2ea871713aefcb91e322b74871 GIT binary patch literal 860 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e7268fdcbf95e37571e10b36c98306efae8a1cd GIT binary patch literal 4152 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b32810663a83dc4b6f114c84aeb01fb7bf73c41 GIT binary patch literal 1890 zcmbW1UrZcD7{F(CX74ZD0i{(6g*CJ_2bHz{ixMb7D`~}$7>}CbpUc7S9T$$65qhQ|`4IbW2jiS3gQzVOEf+?W`n5Bjz(JdmajezSZ0Nu()ul9~PH z`@Wr-Z+_o5KUY@=5VW557|rVN@kaBydLhm%9JM^Tcsi>ZmWQckmSsjNr{=#Rh#j>;- zA7O~s+_4wXc7#*dk4yqCPAlLYy`TsMAt8K%uVIV|_$+!GZf{CZ$gcKEfTBEZMJC_N zX~z+RJG=Hr%nN&4LGBT&T!`p?d0dht-F-_Q zG*o8DSr}zS&B>-}nEIHp^XzQ zxG5TwS!!fdj-@qC@6hvBfD19_%&Zo6^guT*!0$~w+{!a3((2Z~4PVyb;#`~wiEd2E_Y2cuTlA40D*hOC;Q^J)h ziuR_%0aM|57u^9%Yo)K z+Pt+HydS3?;PfP#KhlHC{w{Ju=)vFPF7gBExeuog;bafPNfD-q!>Srs(E@SE5Vw34 z0yYZ7!W4mpbF5en$n3@c#mp^VUg>-3Mf+TO;x0XQ2!gdlw{#qGA}Bby3cB!aX~i6X zkAS@ex-kyJg8)|7&b;iD7TKmaI5)5yYFqWSt=Aj|t`1BuSZyB))|Bc?)60PqYxKm{ zX86B2kHe0$RlOqcd=AYwf$)vLS0FzMAl_G!P3K)imgJh=4C&H9^{mbzD-J->45l})Z@jc|^C E0kP@KdH?_b literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f04161018574e4f40d073b0ab5f50faab5134028 GIT binary patch literal 3625 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 gw%K{6SbcWs#4X;r+?AdAp!Xm7=5iCg#Z8m literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa5abc806955a060e72539432ab406fba8812558 GIT binary patch literal 13184 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e10344b5bef89bf802b9f51d46ecd61f23d9b99 GIT binary patch literal 970 zcmY*Xzi-n(6uvwENSZXX6$~^B$Aa)ctb)XVD#VXUU8)My!e9wmZhUD>{fj#%B2kA* zbZ95CwG%t)AHu-QfES9Gx<#ZcUEn=CMev62-aS9R@B5zpxzVT*h))kbY`c_@A9%S8 zbDB&ZL2^WV;?s~s)S(e`7$uAd=Cc!c3&YVEStY)Jx|g)X{|QGhuWXkmx7VHpc`y!)LzH z(S37YcPclhB;V=7gM0UY8n%MyD!-Z9m@hnMs(%}jzT4%o@J`#)Ox)NbW;Us?X%6_4QRCW*0_C?>$ zgv!z#_4jP`MclW;V9QPiSvQIAwU+MMD#*m06sCIHLfL7M+Ag&DiL_I^VddC4&NTkO`t$>9cD)BZ8UWmXs$4L3lcQ=`d|Cgu3dWh zWhog@u)h4Pr@GvWIS%AW3~S(7SCnhux4kq4sT?+2sN``HiMSnluwG%c)?q(p*L3T1IFQG2eZKrpP8t}wrX9SD2mv^x8~epnx^e5o$VIVf4xyz08K7YWzRYpxq5 zelNs))^*?Xym0!Y;<|p)hH^EPNh)MEkOsUhajLwEP)ERtg$P-}3;}EfYmLLYt;brWE$QA)oN{#~yhJbkyeN6*a~Z62(Q77kZ`5l9QdKNY{{zyJUM literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5867c79c43f58b867f8d081eea86cf5ca1dcfd0 GIT binary patch literal 870 zcmZWn&ubGw6rS0gY?`GhRIq53vQQ5$*j@Vr4VAWNM3Pj?n9w`!xn6l8}>r$LVs?ZG6sKyA* zo`+9!g!aA2Y^P1dY(q73(U^YU@fbI%fiKxJX?SJ7Tx0x-5%_Mys0&67$2Tae)N7Wm z|4cTUI3^M{6#(RBn9q1w20YG+dS!uCWvp=~>)bchLZMIvbv@Gnjlyb&;O-#|>SV9p zoog9W{2H%=($lpjjzH(K(p0DtWdNyC?Xow~CZcLnrDT)P%p08pWRV@)JNyXz&NRc&H(z|0^Ee#luI6h9}o14-tfSvpd%G?xmZ* PlBBI7*&jQbX>t^H2 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fbea05b42e6a7e3e3b4107b14a83930b0005e3e GIT binary patch literal 28972 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3346e05a0eaa33c41386410f3dae4d78e2fc57 GIT binary patch literal 2365 zcmah~U2Gf25#Ht9@%VS5B$A3`%aSY$j;Tgu?O1(C3#0x^;v}?_N={=|&VlBxq?3;1 zW$z@L!VzE!1Ca^=k$|G2;h} z-4xx!&F;?3&dlz9Gy9pM1Q4`8zVyqf@5%`MgHKw`mB3`D9V4`c2qIWVY2JHuob#kT zIUz0N#I%SJ5s0WuId9tQjwM~r`O?0eKkdiJgD9Gbwv2w$6YmDtSD=b3_mR+bDcw#xh%$QwA$AO6Y12D%k#xlM z9UMN~w; z7p~&C=RD&9#zjYFRJ~eY#F26tD?9Corjf}z(iAJq8F4S;aCCe|!PG3R00+ob)uyIo zS{Y_J0?iXgQ8Q_1Mp6YeQea7@Wv7$sRhBUlM$wU6ckDUv#{)Dcf&3HwtBh*l z_VTOS9o=gORu5FH>N{H9z?5X|A_lPFwf4|rqt@-8L6?7v z&;(d4$t7RO??JZL_J12|$TERV8uw@S-ft+_y8!9Qb%zO}wXv-}*Ms|ob<5OC^lC-?vmMvw^+MZ+qcqMsx zSVYV3eVeW3KA*62-Ih$e{DCb4{n@jg|4aL(Ej`V1{YlHWMPv(OC@$<~0+fkd=9+41 z3zT(0lyTYdW()(+$9yn#u?8i=w3ucveqfB}sv|&IiMP3F!n!$^mq$k?+Pp@n$$I%r z(X~8P_j1VZ79d`aScHp3l{<;?VbD!4kW2xh6kerKUtbe0S;H^2@boteo0z?=GL)J}_84e)A_^p)P4; z)7Jy3VXchUyZWo*?clG1x0J1}#A2`(?5=!&GkADCc0ZV?h4)o1-VYDfBhPIQCDyHv z>7OzWhTdFBZ68kFRkjYF_zKCf z^Q|9^jbD8G$M0N954cO6eg9+awc^4fx31zQhVXbi=6D!&yjIcB@>7i01I8Z}#xvZJ zRQ^siktDg#QWI<(UyhtDF(o zemJ}|yfU#B7%a;TuZ$BbLIXip@l|70bN%$)NVT+iaCEc#dpn%{INFONE7=Buu6oGr z*2mrMFF|@dFU+DR}IPgVVta9o>TR#9(41SP$KXtEj{DF9}F8Y^- Z@5PSZJ@yHH5IFT0@pL1I#C`5Y{sT`7Mz{a~ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b111bcf85535b6e44f34fc61b5c9188e70a20a4 GIT binary patch literal 1613 zcmZuwJ!l+96rR~X-K|eQ&JRXOP?or`RjXJ9eDHGJDNSQ808sl>yS#S{ofpjOIAmA$R?cNU(8rU~G^S<}q_kQNL z*;$*w`gQfY2YWgpf8$}itkKW#ANYApViMDYbZDJYqLGhDtnHInXY>f{aMd-Y$3}aZ z5b-%+&BW-KbrZ47JSriiZoz2=z6vv$cBGZpN3`4vY^k-**FsbaqRxyh>s9boop`q= z-tF`4%h++{JZ-PqtGf2TNX4bOzV^}WsH9a&b95N4z|UjCNS(%zb4=?xGh&UIPz!6@ zh>d+?!e^#ux>i27*@~K*ERC568wm?9L%M6J6E>t0VWgZ!D47!_p_I-x7Y?EwF@a0Z zwjEgOTro#ALj{5f=Cq`fawlahb`*Emt^x~C!FA#48p51biq`H=wFrq8xFViPo-i*Hz;kNlmVR@SW2U(!nCgl&8VyU)1_LCH-SB473^f`c zLcXFg9S_GYl{HFE=_Vt0kGT5Y&D-NzOzU>K5MtVkX%X^;AV5Vh;vWQgWpoq3JZaQ%#<}@7;LM zmo3GvXJOP1A28`>t;`Pq7IWbv4L@u|Ue-favfC({-{ia<1bc5|AE(v#&I0C<*%F9{ zoN@V^!W zUv|S}q?rkVm`8AZp!)5g1&|qQI9`2<)o74q~4iYZbFH zc#T*W2byNyrQdH22<|_`FN%GrgX*|Ym7dTE66}PnG{80(Tks}Mz2NbX3~PX$zTh6k zPTk>r-POecsKiASub{YuV#@SQJfe6DK8Yds$sd(kiNO0D>U1I3p(6svvrG+r=C4EB zyiwacY@4TmpIAg4Rk>Nbf!vbENgTZgy$_R2HkYI*$haISA(d1fsC kXHawYn4qvowf4vy8%z+T!RFyo-(LRRa0iRTc%!Jm|5wtPQUCw| literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27afbb7e7c14bbf28644a6117a1714980c66198a GIT binary patch literal 12327 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e62b7d2b540c04c4fd4cda166370c7e5b1e4ae2 GIT binary patch literal 9111 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 O3?ml%zCi@j0RI7?|J|Sf literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f40ea73b24daa95dd05fd6d628552f5cc9e4977a GIT binary patch literal 11863 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 J@NOE+{RdwpoY4RP literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a487303395ef1c4cb471de31b7d05f6b347c6f5e GIT binary patch literal 26530 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffabd22ad783f8a62e0fffe6c9129307edca0cec GIT binary patch literal 8592 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 E1IIHTMgRZ+ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a416c4da67ce2b3515d8174b0fbfef3709ff0eb6 GIT binary patch literal 113789 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 z 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7eba3db2cc69974bbec429be88495c8725c3a7d GIT binary patch literal 1492 zcmZux&2Jk;6rbH4uh(`yNNCd}0%{@%0+iToKO}&r&=gX!Ke=2?2{dXtzK3cg zCDLfdb$r)C^szc3+M4MY?wYUFT1ssZ>0|{XpWTU+bq84t$YqQOY1Z1o0~TeJl?e{t z5O_(1(bfr5*aU>zgR=p4+jaqvNT@yb6#nHYbUY1VQ``_Izz0%IG(k_4x zc5oU>h&p^j3M1SQ-yeox6S6y?k?44Yh;)aj(G#K$Cw(E_fMG;K{6gAoH#5`;;Qyl= zkUSbjXq*U9hlkbQ0!HMMjL)Wt1Y zxl+niE*98yl=5?h;tY-Cr;6Db+B-d0zRWzhbD-}I6)k(ubosJYzF5f?XSMRw1Ra>4 z$&@Ct+I+ThsWg+-@}*pEs+e0Jys~gL>#UmCb!@~6n%A+ZFIcTXBPOxXdfc;g!qb0s z!3ZtrlR#k$0;w}5fJiW>;sFt~)dQGzA zIv3KT&#S&k&^b@9E$emUtDfnp8gnyTtYWjaq#CAPcU&K(y(X1g-NYm8NxnAxZAP}h z?>#5qGq-a0VPZSC4^Q0hJ$twJ+}0$QC->pW1K8CkZ%rKxgY@{1@$oye+haHTcZRMH zeKdCC^mmEmUVMBj!^lrC@owR*!p*05QrA6ej;e5~x7b04O^C7dL5Y?ibSIovjqt+-8O7c7W zB{ym#JoySCECj1XV70gw7l;+)ttPKUMHYc|8_ecHi`G(T)mjVNv~8d-ZbTEHNNW?x z31T!}Bu0$3-;_MvS_hZLLE1!v>(Wk|Fq$X(V8!pj8vZ$3%&x+AZ9D9j7_H_GTt^@x zp)JO?U$or>t6p1ZxpsVAi=yhwmX>)#P^E{8I zyZw25{XJl_7vS& zsIQe(=X}OdtxSQY(n;A>bRBtJcO$x9C>m2H@=;xXeJW$tdqTQy6tlX1gRJ7(4_@g% zXH#bPPXX;W=ybnBZKpJ8uh*$*YEAc>x!3x^Zs&{EKSpwmnxN6J1oIT2QYR3$VKAHDnp0j@`r2y4$jN!kD=PI!2|&Q=U@jz zL^uAasL5dx2KO+6G+=}%P#PK+5gvv@6&mJT*a(a(M&x2Zi_iw60Y-*tU|cq$7iAyV zT9nH~a6wsXtn)G8W2oQ%8O=r zBGRVj_?GE5-aT50?c^$SJ!j<{U9ZGAj#GYHgWJNg#h2PN(?*>zw;CprXoicTC!oDCNcd^nwj0AKmq6j&;Y3pLmgZ#k9Ia_H>iC;rKyRO+I^CmW>Foq z3ptaP2lsSuKzNk<`xfYcxw!~1Jl~3Ph8BbuM#`Etx1NpG^RGTs zS5ay7Zob}p8iv?$AhTp`8)@3LU@XUb7L^_zptI{Hh5_s5M=(ON1u-cP+}850Xo&Ag za1m0v5<1E)qdpLhB?XSm8v@%0Gi+46fl1g4+l)!CJ&Xg}fXtGW=FWv}?2!)EXh>=2O6TY;w$?g4gEw^6-$5{E^Bz((S& zmn&~q7L|mzKCb5%47@$?U$uaoCc?uQC3(D!Eu|{t@k!iLVCU;We51?9xF33dB3uz5 z3nCv#7XrzR}rS5?bkNTxg(IIpau~@VlI=)%LV`h(?e+=E z?GJ!J%F=Xr_SC&j_4<*e_>;3IYZ0<{-^#w!XW@>()AwS{wE)x*5u4iP&n`SRuPw#Z zS_nl7Y3W)xu+-dJ!;vs85?gIR?g4+x0HLtc*N8i_VnTG4>p+slnfV3nyZYb}42r&GNbVIiH8Q}TQ9vq6Og5;UUFmMS7?%r#Rp}>t! zL(&YN74V>r7a2xScPFI5sd^fm^48Sh&7c;Jvp1og106BWj^VuU@JyESB*aUXIRFv+ zZs%r==z%Hkd^Q{Uf8E|!NYE}ahZ?RtNx=Z%_5AMLKnWf#$CXTKxpIb0OuJz_GfnmL zPQl#b1`m{@-Uq}n_A;!6!PUM81YT=F_?SdKA%~X8p-;)4yJW{*(s`HczDxGqlY)1o z)+MQRe)^WQ^DpwQPvyg(1&Q4JiF|BHK87CBG5?*Vc<*dC2X`6XD*ylh literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea4da8ccbbcb762a4d1a6576d0c5cd8e69222c7d GIT binary patch literal 1850 zcmb7^O>fgM7{{HoV}0E#FYDMUZ){_gMkCpha z;cwzb41P*+flTxYdFUK@20`C*daP|IYD$_*QB%>pq!Yv#&CMx#OVUYVj%Z%df~3XN z+zCZXl9p5SmZB9&t0_9E=#-?>DOyl;M$*|7Eyi<=d3X4Q@HB2-1~XDzAcES4huWrR zv~#i9$n`5PX~=0nb{V7WtiBUs0t)*fcJ&CR5n+z-Y1nLC=KBTP4xM9S+x?PlA5*Uz zfUel~N!JN(Mka0BqpodVq5*7w{oZ=V3FB5*M$02TOAs!iBR+aIdnD{xf#0#BSRB&u zY4hLi_EsA;9J;W*{V+_oJ0SMK! zfdy>NM<8&WT|37F^pl)=TYFqV^XsSZXhg!s6bE`4NxW{u&mj)#bv_%J_*4e{zOlT$zT^NS<9G`M4?=Mm?#4u7h4r uK7(EdT}!q>*Fdi(0q9lGYhRZ@uYul3wm@%yZX^}ZYR%1L>#x+hZTEw#vEshQgHYv)}1*@+iU zlylEL_uTu=Irn^A|0Nh~BLIK?_OGUYrV#QkoVXy@iRxt_mWfVunk8`@g)GepaUmzh z#hetEa&lazL>F}_tK>X!52xjijz=wBv7_IDY!nak&9r5IMnNh<9se=Y zN>3Qcylyaj#F8%EFZylLgLMzVHt4THHHsPf-tRvw;j=~IkhMAMex^KD80$`k1-vqQwO0+~YzJRDC zzzn_0VVb}U>Vns)?jBJVpL5#Hnvd|1wRi7qe?^*`4Vl#kax^X!M?y(E+S&cDz*)T81 zvgwPlLeajIH^-s}55+9-;x`J3!}!-^Hsg_s6ndY;8tI(aFEYH9_%o@k-ycr`6; zrfp4|?QGZ=b$MKwK~Uy8Dfg=L(#`gAPah2a^3Z-5f{&hy+|JEQfA#iPL5L(94u%QR z{5tx8fa@R`7+c{CMEPvTNyAoAp|qj%K#4{u>jKfcl=Z-1;ZZ8v4cO^G6S(#utf48h z{Y}09Z?PMO0bAIpqJ>_#P9BAN z7VYJ0OV?H>HbRj#Z=|lj4dq~){#XOJ{x8ADezM&HYBwx!wYCOrw#?RV&RXk6w(1<)a`#dkjqfnsP^i0k$Z8bMz+3H0@wQP1kHS@Om zl(sqBGaj>N4F0QAfIg(B;X9c3-`@u}Oc#Wm@;`&o+5$~$eomJuB{v5pQY60>uh4pq zv0bpk@z=_ymQ9;RM0AAcHysJ-TFJn3RrNYA8c%&krw!A%T43X|&o^_8n;1Qs%_kFC zYdqSJIRIO&5kO!5hkSXRd`^T&XLuI)X$(RpqyaIW03Yk6R4U|uQr56sIC+dIocBflB{X#D>0#?XuF0d;<2 zadc(kVQ6 zBB8FwVG`(o?z3zzne!*h9eW-VDfqQVy#p)y?Y=wvZtbh`dwTu!6TB3d^mQ&OQ1d(X z@S{?j;r(CuV8@d-67E_&{C;uGyXU4=C%*8vtUR>>VErG*j!Y=xCyG4L>)F=ZFuL%+ z`cpvgl%$zPrvOGBcJ3K&K102utRG}BdRidUc#t#~nppw$ZO3ke_2I|DE08M@VUi8Q z)`-Lo!oVY~7DTo3H!t!kU|unlqNeG7?05i|99Bz3kuvcI{8*WB+O^jQO1q7@Kb>Vy9L1=J2G`JBOTJsKZZNWj< z93~?nhVKBUP1ACDeFk1lniJ5pAIv1OwG?(dnx^NIkjrQf`#K{01>kt$HB&H{U1XR^ z44W)daY2L>W-sIPJBU!lyM%v~=Oe?YZ=eK?swil{=40r z{QXoFIh6oW+AD$}_pcsWO@8zuR4lo_D!R;ym&z}!iWLIG$6^(Siqb9jt_)QO468#` z9I6K-d7u)Y^6-lI1Z0M5TA@Nv*MxN5QJ{XM&FPx07_~LK@Xg^!_@L$QT!ux7SFGB5 zmcQED@Q2H(w_i)ZJC>Vx9EGso)e5xtXwAXn>yE?F-Cs)&@*zY*WxNo<3}{!Iox aB|ZNX!=Fm(6D3NA7X?i1{}LeiS^opF^Z(ia literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..823ce18b5cd245e23e3c5febea45a64ae923b6c3 GIT binary patch literal 3087 zcmZ`*O>7&-6`m!R%U_9BY}snnrc)t6L|G;E(-?(n3$WUxHBcvRB%`U&f?9Hi4JVx>b}11PalK1}>c7v3L?z>lePC@S2Pe!^ zCo;kkad1TFR3+hze_(E=zM|n}G80Y~GSlrdxe5DogR!?-UO8}mPw|Q`xfD%b2Ci4- z6}K*wyDL$TC0>V`;Eel_FKf=R)J^~nr(elZ$Zd_*W*FWRlMOlt-9c<=C|q&FZ(+};)CFhTd4>sydc$5f|qS26!(O1 za5V6FRd_<$f#5b*fh2QbxD*QfHaWxn3O!JbEgp*ID*1>1RA`ov2${wynZXiTQUopOm800uh+tZnv_JkB%YD|twb-7; z0izx1uufzfJaWQ`{)%+JFgonf;O#mKhB8^laLh*}8RLiSmlKTr0=vD~p4EwTV!H{@ zaY&AnWM%wr!eE|ZGAH(bHNb}57-ReKU3jr?b)p^fBkPgbm%h$&@wX)evR!MDm)e2Y zP2E|U-_xXeN;d4iiWm7iqiF3__U?@0wRdMv5@O^cp@rMju!AruyjDZkYAzuOGvqie zSz1owXt<%(4{~Vgnj{;jK4?5I7H%Tys(_my3y#<+1VRPPZ8du4cZ9c7sJkUxzM$rN z%lXBnf^q}#ou*yhwyQ!Fnr^dD1e@c_f^^HZg1)54Zob(L2_9PJfY|d6J#^(|3=uvyT(A|C)UD!R-$xjwUaD$)d4W z4wDDQ!KH5Y?7g2J-a0V5>FmANe*68uXC``aeC;JzX8w!x(v$R(mUlRPFL;ui?k2{& zuT10DOR~)JF^gra9*f1SV_3mP#YG!RlrF9f5cgRyDx!`tEFF}{g+Yl#_e_*XRF_B$ zB@*jIDEWgzIcLxtvl3Z{*!|ePrgFya+zq$9&4Dbs>N!w=Q`u{LBxtI-h@-}pe9n;P zU`Wn-F}0I;E6>vcTbQCdp>xUQ6v*&g6Do?7=_14z`Ws6GVGHqj)cBJ5pUSXh|n>(>TQCR7f{M*+At zfc-K_^9YRQ`PLS(^EG~jFY@iRt*rs?2K5L0f;OUM*XwQF82a~$<1Xk6Zg_#}_X#q{^#VRifSg<5S5HplwYm|*2${gO0S^H`CG=DT zVbC0Svu>9W0w{+m^_GJGIHF>=>H%c{nIc&H9zotb{QF3$c_AaeR(0jfQoy4^ycNK=BbqX4f4v;{Lpt_UYVJB zLEr)j)Dm-vFtWWCMy_N22y+AT2IiZXo0vaebN_>z)o&Sw2H#w?k0hhkpuoV83ym9+ zuCHF+0HHXRyX@IzmO0x^WV(s((W-IuS=u59wPKdO{%_|p!1$u$my1OrP}U$Ux>#OS z5~fPJ?vh|i5Ih3OY8b|U&6HvG zrdVe3;Nso*zuD3eTS7bG-|l{E=F743hSg1t^`dzGWBmL*b=c^|K=&+`9`D78O0hFj z52A;Ay)^AI!yTRMjWa8GoF!_>GNv9VIBHCN=zP5V(ADIp{WpJZeYXDi-J74i_m}-+ h;(#@M^~u);>hXlifucC=62l$wzz8e(EDcIK{Xd32OML(U literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b93662d5eb230c8b31ccacf65a36195d8cf51b2 GIT binary patch literal 9903 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 q^%2*)rmt!D^t<{O%U?G=k)n$L literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d0ea39361cc12cfc1546c4922ee320bfa9a6a39 GIT binary patch literal 6040 zcmcf_TWlN0agRKb$2TQWGDS-E#gY>-v7|VzgW5^c2(s)rtreq|ftW^0oOmngt__kPNCE%Rv4IxuM>}&z zQlv$@i4*h)?#=GZ&dl!2&dlClqtOt7=g$XzJ-gaP$miIpKSB+-^E(eAmxxScP9;Sy z$8iXIR8P^H^A`CW@ASQ@ujtSDi-BCADCC4VmKFeV80qEMsv|(EEnU5 zha4ty;2e>KYrr3$T%0E4;OQYk*vB9tq;}*woOfrg(?e*-{NpZNb1R3hN3L=1NG?f} z^G`KnU09CFF*$xcan0-YIr0Fy4!KkAqCIj_?!Ml0&EG^lx|Qp-+E6Y9I&M>Yi|Je% zS4GneOa^;$>UwWO!@eM)srdt2xyfl~-5J_B|NK_${P(wxHKd4|2y(dgeCv|u#~;Rl zX6BD<#RJzk6@l*$x8kmEuUie)x1$boq#P=T1_<3bNZ9vs1GKLlUpdoW*S9@#A02p` z{EDw@?d)gg{L5SA%l(@)C&5>81E&Vwl->6tw@A)zh$){2XBN?}ecF>0D+cqy7` zh)6jS3W@NHv03AQ17UC8&^2+$Fj@A1LnKnIpvzPiWyzFA8e|G^*GzH9vDK+bU8B22 zV7yy|nXl~@^_nq($>c(Dnle$J5est?lL}xvLo{`ub~sFzN5q44Mp{roD;R!eQ^s7~ z+Tzf(uB$CvCp2ei4H8A0ZRIn?7U(7`H6<|U(`C~X)|7zL?BMeuM@)3srjY;zMH%DON|3#ao1g%uW5iM3%q zjs)V2&cp^0qcarDUZ6%R>(;FRb@au&CV`c=?CKce#7SvVlr&j9qRl9p0zPv_QWqZ1 zRCX;W4%N?di?PPULhYD~=A2}T1zkHs8Q9xpTpI+9&;ZjA_*|E3I2-z&fdXbuQ zVC>B~K#$H`pVYc^bj&6%(3$x_F94h>`O?6yHf(p5=e?dSSL16bCCxMv3ZPk zcDP|yh*>BK9kKr0J2iU3fbr1rCDl>mXy+H9>`>!jWUSRqv%#6B}k0UtM5jv+&{Ozx&g zqWj|18$Vs){~k|Tk%ZONYjtn8dUsiwtktu_N@k$F+YwBJR`}aVvU}ez^^Kk5t500vF9gpAH-uiR|1lT-P)OeaIfOk1O?x-A0CNcq+;Bvk z;64@7)+M7l7uh{LEz~Q%&FtV-DvJtaObF|kG@$Un9Ov#B6bMfGkhEH& zfRm?4s;E{%6m@aM&B<36yXBEf- z_tn@e1EF+kG8?c1`MgFK^ZEOd9_t4JwjG-t&}5^wx1btM!2ZgaE{Yika*bh1P&v9; zawjk|Fsq{CjfV}uh#kb(m&bs%6mv3DqrVSlnb0hg>I>wt!QX~|6J8x(7oT2ZZgX`8woEF@CHs4-Nix{#;n|wh21ViIxGm5i52gvLp--*RCP{ zp$?ovB9busNwc9V>;z`_6a+H3xV2~;Td$p3Y1fB z*>3wmDqP}Rhjv`sadLE0H>Nq>jA3ZA!gqan1jcMZVzVWQ859mo*|1|!a4i(!bHp(m zW47PHF*_p3avn$>9NUXCLk&OTF;KcKIkl8 zNA5?Y&#{WlWf~&M^=_T z@b-Srcm0izeHtBHdG%&=a4kA`W6!~j=*03Nix1u8x2^HpEFoqkdaUSE)d2CO?h@YT zhtuK<*Rc^x=(G|kE1IyPyRAe=HR_NBfGj~Goj1dMYvI22@b=|{U+_$bx23;WOSzwG@WoUu}wcY<#P--*2yTTcz0Kk`|s@AA|;C*L~x zcKl{)&su8FdTQ^=5!4{^^P@jI`isGf<<;c7nX8$N&V7GKE+74nKU6);5kCDdNG_4? zFNp{E3*9$`%$kt7tgp)NDp!@&*WTOt-ih}P-{?EIAxv08V#RwwI4@l6ybw7b`FGU^ hbM6^61{|nV_A@=|P literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12bd2e1c174fa8bf19524291fb9e2ec90ef8c0c1 GIT binary patch literal 5214 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 RfocH~FsK%}ud%ZA`EUHL&%OWv literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e5c7d1b8dccaf5b89a8b0c6bccf4adb1a64e0d7 GIT binary patch literal 20225 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 E8#8MkPyhe` literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f44da7b7131139c661554a87ee8afb1fda5994a GIT binary patch literal 19145 zcmeHvdvIIlmEXmScn~B&5+uR*<(uGJ5+&IZMZHK-PfC$!Cx)ZI5bvb~3J>O9&=gt9 zkyB4sPUTvRor>OgH*_{z%e7`!Zl@D>cBhFQH_o(ahY*W&wsF!_1^kWgSUaj?Lj`&=xt=-qF_^~+1sq+^xP;X6u-m? z4$=6oK^>j9g{3-?S|Zkp74I5T>8)a$PgO)ZJH6tV3>txzY_-)cyYWdNx=1zu8)bvt$r1i9?h6Dl{VQP5JwTErW=o)P7;B zR%V#Ht~>iQ$9WHkyTt>@J1Fkf^5zRTj%x4@i@O=zUW7-)5pkH-OVVAl0ls7EnmUqf zSJYrris$s0>z`OcX*mMygsZuPRTHFYUR*s0fv>G)ZbGaQk?NehLOK9sS z?3l-%5=`>|nJ>g#>=B2>kx6}O9uA6owAykFNQ^or}aO(4>9vMEG*EdjA->Q6SdqV;x|JKN21 zU&kuY&wJ8)%KMf47%iR@Phs@U;#Y*h?;GLnVQZ%shQc~w@2!2>nr3kRTCb542dDmg zW9z7=cj}*QOc!@(v!nSs;OVskMslAqa#qj@`qSFdadWykT{E|ZlXbIt9rp~U!{40l zlHnO{R_EFOIW;lnF({^y=f!YTF`YghnYgGFj9-vMzu?g+MdOlxLOkc6xHvvHEqW}9 z{>Vwius=MfSPuGwLI1g+s2Gn20o_t=ECWDdL6Jqp2ghp9#Ws^@7f85cGmUFp5UvB$EYKxk;U1e#!1N2{ys< zlF?fL-wNM+mAj<#TF!8uLZ#SuTAY+b`GPvf^V|0GQ8wG~{81j=3(CBtf^>LzBuV1= znV?_d17Qs8d4EvuRg6IlizXg!X$sgkElNIF#Ow-6fh0y}r1028ip#JOP?&xXo`dr} z-3@L*x4`)jR=)*3Vkzp&aZ%6*_0x6&a?`a%En4o&h6V1Ga?ldpEqw+j=QxjHY@B9R z@Qa~H*i#_YqlCnhL$xSIArcl9lRSf7D;A$G5Dr9rKH!8=7K4)+XvOODO$7b2?DNUQ z8hM_-^7z@lr({u*`)1(w3F7m8QBjUgUzF2+FR=OfzF^>7AF$yNI#Ek!SzV;1+aamC{Pm8JCoz`2R^%pyY6ovp+Z2w)w!DfsKZ zsq}1TaxM#!#Jyw(9E`$Z zf7SZ3_0^)6i(YX^ok+{+Dxp8?>Le=uL%J#exu$5v)_ufoG(?dv14i3mS#VQn^vWb| z2jSXeqEO@dPn#&YdXpA3;WDeBRt5}|{bh*gChg`~pxKM+;74s9aEQd^hF(s%9Lm=J?O&=j2nsZ5=jeQaY$bp%R|lQIbBfBO>miE&TTXf(AgJ)Pv>y!5mtBt<0f(D8$b$T7)9_#rQe!bBb0R5saekJSUn|(UrlM3i`8LK@(OaxkJ|pRK8^LI)o0vjT|S0?JD>sLN(eb70ak@R(}oR zEGE<<JE8sW4uVj6o_V}zmxH0a=H+2}VDcyd7(DYJ)w+iK&QLb8O z5o^R+wRSCpKDHvSZcgv%lp4?>|9=BTQQ5i7`@_6{CK~CPnHK!fK=?dQ6r2|V@^sKY z$44dsFvp)qS{N);lPh{{Hn0$WzjR*S#X=OzWb++r?IePb*wM{LQeur~7e9VM%m$4{ za$4-=hs8<%OfV|*$VqjBx)qK@FTn3jHwP9?0ubMkl6rC)(Znb|l?k>lNB!XmFhK-sB9UND!y{oDH17{W$_V?TBA-X2kSdrz*)3j`$8nG;+p1HWNB0N`y1f zKuDB%2qnBKN>O*Tu|=`|**KQl>_BElqLM!>2Ov=AnT~@&5waXrm4$VYFfU#T0Q`bq z2EOp(-aXTrKKl9JZ>j{Nd_&O#oJ z%+iWo@P`H9a@Gv9sl*Hi2t^`%lrU@(XhjQ=+K;)tX#(>IOv?eeDKlC+y=2wdp&fyq zefDfOpG!E9kVQGto0>42Z8LNdwPp1%xAied$7;J{hsHlAF-oy$9Riayr@E{ZsMw*{ zvo|4=6%=b43l&H9GJzW8CSW0yk`2?X6z7gsv1LXs?L&v8{p1`VhbQMCIm6_PkaLKf zQF4g0Pmst}h=K+q(6~lNa?1`mi;cmbx@Z989#@ zxdj|YGRG8wV$>S@7R-pHk2MPx#L}{-0NK)K)*x9dErUkOwDhbNp$1Vu23x4b7L2IJ zuEkjUX-RXzAn65TShr9BnBp`HwM^n3`xZ=ykyN6_tcaDQV>ZM}wOEv-efB{*C2@b< zm+q_emPwOjQ65J%^}`XZU`(Qko3GD9BttWDlnB5O-+u@PIkudh3Z*a$|0U`tLj}d` zOW|Rm5Bx)mI02kPl9b#OLOcgxa3Yb!6xGU20E9&ACvAnJ*aFjYzS)2P#AJ8}SrM#J zii!e5K30_R7oU2fR`HS$5m~v|EV-#xLQja6MAK8_@)WXDlysP~_mT5^VmXs&NtQ@` zs-W418s>|RqyF>>avPH558+(llC_+(X?g!0N9&4ZbftZC%`%#(X{E!YJJIA>Y1+Ox z`&YaFau3dw_C#eJ^J;jOeUI-Wzb>KqTX#^rHj(oGb9wb^Uqu01!qWrKk*MvU{HjEK zGonSGG`7Fty7>%(#rK{>{Zuk_ioMskmE!e@1{6g4r?qVfyEATYh}j!f?Tstj4?Q&K z>ugtzzp_+qJS}2Bt2?_Ifz3{fP=n~^+Yeq4Cob}V$sCRf!Yu>qi0i2f+Y8h?jk-1* zZftb=QDNpCY=Sch&!T`#8w^uiz&Ty7UVi!VilugAcM1C$A^HXan|1d^CpH)jY~81A zuy7&r(*!63bQuKfl1_%!P0(S;`Y{ELG!6jiC>$JlXa_S)lc_kwP};@}Dd)@BkaBVM zIpoSu!buG)?r4rVnpYfsICT}3#O-{{&ac^3+TsY(~vrU=NYJE%cpk4q|nY?_f4f~Y$jtNtq;Id<>b?O=af_TI*!!vGGHmQpRmmva=6kQ7lliFeV`#qi8WjGi**ePKkx` zg~+ULVn&i9l2Yaq*1qDx` zGX!H|ln&H`Q4A`ULov=FVV-Hadl}#b0>GUp5ehq3T>7f_W$%5i!rGH?l)ZZSJC_sA zibp0ylavMuSyb}s@t2Rs?Ts;e<8sTIy**LOUmd=7g1{HPvyfo_o2U}2!wZ!Z#%TKM@yBMRO*qWV~hMMb%**!Or()Wp@BB{5ORFmT9_~P-` z$C6Ia=D35ugsPCN_9xwSAl#Xh|T~*%EWM#GRcnXXl!;`%#b9>)$@C z=G={6a0MmRpm60?q>6g|Si)76EJD)bM>QJYW2WADrFeLo;YSB5;C{Hb*i zA|I944ELKp>Nik$n`wB^oTL0C;=>5zw?R7oaKb469SLJ*q|)!%H->J|0Z?iBgUj^&NDAlX%emVG<%*mDMQMxb)R6&VMTd*E7fdL zTjRQ_5X~?~Mz)(aLP&d2Tb@?rZJV^xy0H#Gk_f!+`?BLo&KOBEyY73j9d+jGEsZ@7 z{8Z1n3J}d;%0|H@ADctX{~zD-V8Z_s_}20FiEpzIfHo6>aD%`1cL+zO`PwtMz1vJS z8at$zpAX0Z(p`Hh*Gn0|4Akhee6bRMJ^;4#Ht7E4s0lo}yT>cIsCpCh04bXqpH{aHG5K z9*cEx-pUR{ba(lW04k5^NxHcQ$%V-_HP-$FE}r&$cMp?o5KVIAWMrG>n7w(;-kPXw zB+2HUqf8Y%=+5iOSnHE3ts`0Dh9~CqtU0?9?OjX|x!2lzbr>frx)Q5hti8`Ui~5s# zM@fI8rXgO_b*HB5_VAC7zjr)7aO}>&v4p$!2lhAYZx-Kkx#O;$n5$>a)t3@_;;#Of ztAEY4HB-{~WBYsdc>m!${fAQ}<8DvP?OAhor3-b(T-`UvsaRzVF5vD|wx>b2#oXI& zkF2?O-NXId3*UX=rV#HPy3;$92I!8tQ8wN)6zds^_ne6JoLKESx#m7a_j%u1{MJh4 z*4xn^zwj?!paPCJ9C3F~%-!=Vci*E%jPg;XHkH3k@({EBFCGsL$xj^8VYrVUHDF|H z5g%v9_gE$@eWm#LcEgYM_rU$IM0dQy^kLc7(Lv+SOv7!6eB5P0#>a!hp5v|NU$z>M z^ve#@@vYWh_E5$zx0{X+VL#9N)H9yJ! zI18ME$21A+Hw>9f;O+s|AinwHl)5(3c>b7DPT$GCb9(`>OC7}3j&*sGQ)J|I0+_IPy(@??J=sS znr|XWlE{(aXto|HO9osD)BOkrq$$(X=sN^Tax6RPSc}M#;T5&>If6WiuB?Z<(AUib z`FyJ&S73Eec>R}8(3Act*~}#mydsW2?*(F z4M|2%E$E_YT}J-?e|fE1>zbc|&e5T`GCkKqQZVmW(|Q68F7H@RWZId^Qvzd6&)NUx zSo74XjZyP6eee}(y`9sme;&hp+xj~+=qA#4XnY@CrqRWgL_Hnz6iNHwO965w$vFWB zdTd#{)P?EJoQzu>c1bHy_oS2L5F$up1Wb9P20uk9>scdNZ_T^aJ-$)p@E&sIx8Z*S3$2to4k2+TQv0 z{9E&k`+Zv1xZH8;$Zg@r!S{k69sKy{2S-=CPp;OTdfo84?eA3ld$y#B>piJkakM0@ zT*uyx3RNmM+{h#ybXM9fPY?d#)Y4b`o|_U@8S?poag0;Qenm@aUsna&%lh4-6+hC;y!iVy*e|g#Fg(kF-wOi z3aSkVsSHmuJIO3l5H(S=79kUmT|AbFOiEyzkhucQTnc*(>NV$a3{4`vfaHafqo6yC zgw!oXriPCQicYNHUBz5Qb-cVIR^G8%-g(uQX!XQfx8G^qe(m||Q>%`~70bx`yWpt$ z`v}UU_4g!C5YNflCDF8uv7n2lB?}EZH$Aka)jOyy^<`$6tw|o7XSV`5s-gwGL<*eW zp&437JQ2E#D>}52N1C}(ujdxh z773u>Y3U8=M5XeS$>~|1{M6|4G8=fznNoJX7 z)aZnc3;!$BlCM2JQ==A=PHqC*q(NkS`N{mSshP>wVxAF3)9Oa;WRaPt4I?>)7TYpC z&_ePs(mS+R#+RS?Ki$LiJ)SeJr-;`|HRVt=t$fC<8$CSe|zcoSew!O-)7 zlQYrjnJ7IKkhWm{=R25S4BMU;a+h<|0TePFs%fW=mtZ*Lp+F(cFLue)z-d)Q0^(0(e`;eBjYJn z^C-#B;ml z$KCIB$G4umv-M;GH+5fM{Q7-PSF$y&-D-=u+I}?qXLD<=EsqSyNK!5;0qlwIp19fa z7rpbJgBBv3O#o>G)r}P9)8g z`uI_`*6ia)woEWx-D8_(S`C`=JKY&)oZUh<#MmGU_mW zw5JE*f7{tIT4VZou?69uH<%7}SbyGPrf^sNsNM9jRgdt;g*pn`4HR~mM%~trT?F%S zjcK&S`Z3SK?WWOwvr?GBZ8Zake$ zS+7q^k@Luwd&gjrb_iof2h|yeuvJ8z=ce5y}oKiC6$@w3sM*b-r9Ahk8-?n(~aIAOusxfY< zidm}GEL}J^s;Y;!JB4j9PP$ROSbd)>C>kX~;jUHn*$)j|d97*|08$jM>Wo!&#;bP4 zs&+w0g&|W(1+Mw|)|L80%l`n*?cw;qNNivP!Rv*OidbcC&RMf!sfH#2Z4`aCXjynW z{KN3Q>fKAnR;qX3bj3ZpVxC#>pGh*^B(2JM2`}!i2CE3LF4>v4}3J@TkOW(j{ga%$(z0@8nX-ZnDv<(xVEToW~tE@>DQK*=!Yf3sOp3!(ut=?dt&aPBsHC^=4{0eYAAF{ z#}yPO^?Fm?((o4?yaxs?A!#Wv@yo>zIC%G+wWgk>@gxWDrtpBg2ZME{{s%*PlZyad z_t5`=<)T+R0X+jF|uIi3HOi>G0QngeUbG9d~6tz(w3K4qXw3xo4d*Cvg zIxrsUjoEZaw>0(zM}De56h!Wb?x^ky&TeX0u1}KpKDq?&7w8ha2emb(t;t{ERse^0qHX6z+zQf3 z-p@w~Tz$vkXD>LIh(}HFtf^iUwc&)zC-@{_5zIa%6RGQ1Y;+dAj=L3-$ zS%n997;kwyvT9Jv-~t2oRy6C*berl6vll9|Vwj9X6vH{cM9#dT+oI^U zD!Og+FFu1uG!u9f6!KqGbtT$$EDy^x*houk4d~qig3xZrq6!uy2|dc*BwPpxBE5gs z9)B?57h12`3wUA8bQ>C5;?V&-z>>5l77&Mf=R1ys`AP7kZvNT8S-ib^wl8oti{+_L zd}brk#re83GZPnhnEE~&!dqM*-&xiH`Psg+y}iBjwWqKO(K$>Vu{i-cb!lb-@0mpz zxpWof4*`AVi*v#7+S|zPs*F*LVcx1@HPu%VPAi6y zr{Fww2GRXb!8v;B8O3mL?66`ud<@Zp`{5iJ1IX~PV~Sz)z$wLW`l$noVa$t+6JHxc z?l5x4zl!MiVPrf#HjKTtk9KM)Pz^6p&cnDIXpf8ZiRkA7GS2_;8}xm$_j97xpZ@|* zU?29}d@+bUE5M&d0hxAWG!Vs59cLml(uBw#oRJ_yOw7%@hG8|2%XZ@Mnbe}3^7Dq? zfl1;L_>y}S1GLPF2~q`n=nj*@Iqd#%i8RT0E5e?jV;R}&Y}MwTlriW4RG_j%yhkZO zm_SI&BhfKkw>V7KEl&&NdN;Tw=y_L%Dh)d%wJcv&u1mwWeF2zdp z055=ovh)VQ{V_S;CpeRz$ffiqC8+Ogr-@KXe?pl?3A9rBQwkQyj9f}TV1*dsO3M^B z`vt)#MP?P3woS4nD7s8#cq=Pb4KHNH#)hR<@)J}dy+95L4S2HP^M~*9?o-b88P^%(I`47~pK*ud+~HO3@ZWG%pK-@lxnp;^ z+PhpM{(Z*nzROkL%C|D3tt~nKRn2&aWD(er+uI zwb60c*zlRLBWCRQ8)NNVBY)S}be96vca8N3{HD149|x|C{-&rbskd31AaGbqa2kDB zQ(Rnd<UYwTD7-b8A%wee{|x-6W5!s%S#8>jC`^{XC2Y~#sZf7#H!`V zgrz-UDN0z{5+&6uEdw#j_JpM@VJZH^VqYn$TeU!_DXcA6F}m+pbI$UWa?h%x^UC2b zjINS`D@X2kLWsD2e$5JLpwYB*xihhQ52Vqh;pOsW`R2jpOK&yYZe3~I8LLH8dwx@1 zy|nE$?*p#hy7THtqQ3p6={>{kBmc5E)-e>T-+T4sy;}SS12siEuUisjHA~;RQ`Vbs z)h3+P*Nr!9i?*e0uR9WDjn{YF7+M@!Zd^XSTGnxM%bl|BgsbMpvBhI=8JEBIXT@Zo za$qD;-gN!x8)p~KzUEt&W96MU{V`YHeS`j>u5<rgXd2)5wf=PUp~+BH z{kLXwc}3EI(vUk#YU0kun6q)Yd%5-P?zg&c&a5_V|7+)tFLq)o@0&5%kIYycwnE91 fdd^t=XiTpqJZ2^bA2o~&9IZF}yL!{ncJu!Nh-hfc literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ca8692753fcba887b287c59b1e308cab4a7b961 GIT binary patch literal 4899 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 J5u|Lt{{qIjXu$vg literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b3fdee5ddcb87c16c0d381814767777966f277c GIT binary patch literal 13553 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5edf660900de488618a835836d9541feb12b6538 GIT binary patch literal 9303 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cde710ebf0b6c0a2df0ad7d1332023869532babe GIT binary patch literal 7139 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 CM`s!U literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54bf977033a069e5897e4c2335a6ab1474c350e9 GIT binary patch literal 1825 zcmZux%}*pn6tDiAo^RX_SadOsWS1F@Gq6Sz$;O0b4L4$f9(H2V>FFw9pr>c7YQUcC z0TT`o53DCR8IEr7pV*TJFDe?>&Jx#n+S{x{vWAoIb@z<0TAjRC@71gKRlnEY=kpl? z>${n+mv1YC{E0$;>B*+|H*EF^B~)@rQ>sZ#xh6{}%dXN?YpO(KGEbF|BxCq?HbK=Ee+lbnsGDDY%Po4SoSD(LTVY7SshJ;bBt!c z%^gXx;$0#UuzKy>ak2$Z>At7FHN?u}cO=I~5()A_eu7LBA#Flk_rM$KK3DFMO{rXX zhGu0sRA%qYg$27Vd~Q2_lldzxT9!cV1x^w!Vp<~f-h|CQVWcKeQj@7vQ#!S{MUlub136*{064Y6qG3Vltrr$E_%%ly` zcI|-C%HYnzL-J4#Rl(dPZa`##Ihp3!r`1mcNe`t zb^yKf-ln`qdmi5`X?ItHF%c3pEvN$#^RG?;FgdNW!8A4J(lIjzD zTyX=)Hu+5*f2v*X%9@rtnClW?hj;%%)>DXnx<5EwgxOdKwRQk~geiemH=6Ah_o3BV^jtg#cN0`Z z-3)arI_O+FS4Sn*T|wJxK(@$};^@KTaq*2`i=`inrEf-#i_V2R-!4k>Gvt77&EqbXS$M zTL(^;06TPg$hx|$jUg0)9o{`f76TA(<1{qwhG$vNusiVMDm3jiX5my?j?M8`mV#jy zEth=^dtLZ}%fv#t5Gr=v;n?JONOV7FH@xLI?PxHf6r=K9M=KLZ^sho+d>mEyYX&&* zhUdRDT4%=Xcr-uYlVF6oi47oKMUtf7$;1g6KGoAwZfEY406V>ANMjFfoDyK&VWQ@C zIzK6+Cu-?LHUB7F{j#w&|2RFgH?})=KzGKD(-Y63Go{ByaWB7{|H?ZazWK8;`9c95 ecCOUT67|&=nZ9@?5UY=hBePS=qbY6n{nS5fmXclo literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dca740fe54fcdec976922d25cd2175db8210794 GIT binary patch literal 5319 zcma)AeN0=|6~E8#!{69|4Tcaf%|~%dAVAo%EKQpbO41~>%}1BIX+7ij0F!5%y!S}K zvZZW_6esICP_*J`-9o2HB?^;>_Q%ryvcFbo|HLIz+&7{&t0pb`%Y;nbs!7{9_xV8} z(Y6ck+;i_e_ug|q&hMP-Ke*iv0_pd=elfJ)O~_YRFcVj1mMsh+(?ld9Ba;LZW*Fox zvL(TWS<16Am*B&ELI?{9YuE~PoXE?zggtC$h-6g+kQZb}!Wnil#6tRrXgyCv+jWaE zL)ay`Mf>R%LX^WG>5wbJ6_7h&R8QDLXK=~hL}j>=@@}~*Q5~*M_`*I~u8{qSns5!} zJ#uX#5Dt`Q@xm;XE3?#Dh*W*Oyr^)!R6p`+Xq&T}>k%Dm$ACTp^l_f&%$0{-6RuE&Zhb8Z zT53|dac^+cV1uc_VDxM>E~DDP7%oO_(*=Wxl@F9I0C^U^I@{H_CT$yy#!g3vB(;4sKH44uF)^jIEAiNHdwCsgqZ7I<5{W0{S|pP8 zmKWM))=)Lc{em?^f|G7nUimo~Lb*mwi zfRsglY$BZuJcNKXjltzIuGXzFk+2GN40n=soRI4LB>YiQ?84Q zjHz0Da3bvuu1jcI14GodfaO)Hhexjgb7(7@LmQey8x^67Jf)F#QyNii{}VkmTv8LZ zJvpj|=%6^Uk(H$+z0|s00^^aCs0NFQief}by{ogTrs$j^jViirP)Q{s%FsZ_rqJ6@ zcLyh@vlyfC#>hb&nKz)r2E4g?!%D!eacyhu+Nkk?usRLo9Jy!PPXF70-uL>8uIi$z z5^2?j#oGG(j;p(`>|UsCxm^>Qt-bB*DAv>$8#X=i*eV@4{!ta#xOGPSSpG;}Xy|%K zczeag!@1tcZW!VxM=l;&^j1&yUUn>ceUm3HJ3oi)1tPcRW3SL10(*#Qc#ff}?L3N@brbAh|SUl1-> zFW3-ePeJ`9+a>EIUV}CxUE-b&K_duR>(V7bWHi$Sft%NGe`y-za$Jtj2{~)dHpqj^ zab+zUo-s`t-eZIFnB3E6HLc0aGnP5dw5u$eVZoO8^xs|vI|)V&vk2nVfP(3RwBe{0 zOr%sT7?V@rHYS3Js0MCW1(~5ZpuN$p&EYUF#$IJe-L+D}T6%ecE!0=P6;EodL6f{4 z+7$%r1c}6GDk&v36`F!dG&v*%w+HtGJG;9d8~G@81nUNep>_oiqM@U|q)MuWj`8G> zshp{s5`_Iy5XROZGY=IA`pdrr@>6~qu=b)OL(E;nbIvkZOP0Op$}kuzh)fz$k)vh6 znk;|OnX#mi6E4~_Eaj{)icPd+IP8(((=dxcMK%roN8~aBt)rBV%7ZM7k+ITxN)1_T zHMM~=6VeTRk`~m4rJxvBwJ3x_K`mt-VcP=)$2cs4Jir_E0Iy#B-%z|pLTl=Ro?^hk8|YyGtbZVEYE)4iu|u^1i9(b3H|0eg2K9S986^>Oj7G>V@3?&#ME)>Y99D zYR}BELRHIbSD~tHzN1jNqgYivDNTj)QlV{?Z@F@0@yPMl1N9pA`$f&iONi z>YYoxrE=FY%lRrw1fYb%2OtM~TABbDg)3qN6bd>-orP<-@%-{=n34m1?UF!Lo9{nL|sP6jd5Nwnvfz9 z-4Tf-QsS75yekqpGZvN0E!IdxOvS))pxG&if65^w=rD}H47X6}MuJyYc@4>KBpA5R zwNqD438JEU8pwI_IoDF+7``z-KFiO>=DTjPvx!2>?n2WG%LJ-R0>gLBY$^fYHQS0+ zUCV->_b+WHf@e~@!#9*H8~D0>_e}LnY_@A=V_`#ki9pSK&qK_XSt4v)LJ>m`yz98& zL=;Xhf+4o;paxDC{V_&B5NKO_Qb{!hp+!ZRd6fnjDteq_(og~rPuU2fG5A(eIZh+X zTcPUlM~OrqB_fMY3f!VWLFDi;GQo!g-PVH-gng-T2xH2VT2sbs2H@chH4|Q@P4F!@ z0xBGW&0r)$sgi0+3@(w*o=qeT2r<){JFj#mSjHR^bffZyenIxd214iGaAdXD2%6fubiG_I%YVhe!|~VbyG+R5|A2xUIu!-|$&evgdQtff za1Z_sWDF(#{K0uZ1BzlUR$w+z8I0H4wc zJbVM43aUdDQ}OwSDEfFZz|>ogWXr|_5pA7mQSelyA?-@jaTrB)!Yl5t=#okTso6Mv zYU*k+X9n2BBq7XmGldl#EScbj(~r*?jNhud75iOaq4AZ; zzQu;-tNmB{XFKQFYdhzU-rRKKL- zXOLS5>u+Hl66~dJ26CR1EN=Uj;)Z8REauz3OY<+?{>h<&yYUeZl?EPTw@`!5fma-+ z{#dsUjwNGSDkZDbk?4XpF$z)PV~z*0R(I2j7}1PhiVPQoZj?GT!_&~^h*(GU4hXT-{HOvE#Jb)2#uL3+|D)=o+1WAy1YJLF009pUz-~a#s literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44c4f96d64c8c31aae4e1ded27d6022195f2173a GIT binary patch literal 12102 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 D=mdAs literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac75e9c658be05a70a53d18798fa32d37edd66ea GIT binary patch literal 40047 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 LM)hAAc$oh`M|!rG literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6dd4ada9f8ad8b974139c1c2e01f736718ff3a67 GIT binary patch literal 75080 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 X!u!I~aeCYKtT3QMB6rg2 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9ffdc559d4798d35f54d153012ff1ed9f7dd7f9 GIT binary patch literal 10394 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2bf50d9915e4d470035963039891d96b127a211 GIT binary patch literal 572 zcmX|;O=}b}7{`-&+p@N{mR>vva}ow|gGw)@cq$4Cdk}jWkT6c3&Vky|zNX zL2n*~;s^2I7pMV2@Z?Qcz4T-s zqga;^t6TzziNPNX?o9ZeGhLdf1YVSSnnY%eQehuVsTor`t65t)UZ?b3n^nuoh*DPP zcG>4bn@vhHA!?mzdyS&>5-nVZ*Kf$70;x!Al`xnS4N5o1Y85AQ5OY%Tx1{NGS&Ju= zM~{i(8Xh)Tew-DcNW&XKt&P=^NS>EuXlBxM(tS!VfdzHf%187)*!?*gpFX?l<<{-f z7gy_>XD{WQ8}BsnO{BYqi$b~&7*5%8)O)rqU9asAeLs~uHpO--2Y-Bw@eg$GZxrFJ L^YkCGq2Ki%I82u? literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1c64794517c5049230de42dac9f5e5c80f9830a GIT binary patch literal 6631 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ba2a419a40335f159133c728b252bbf654dfb80 GIT binary patch literal 6573 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fce2863de174e197a797058562cb6e403778975 GIT binary patch literal 28166 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1215bab081c0ef7c86da737bd057c18328c7f37a GIT binary patch literal 6069 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..500ecf9a4144caee3e7083408be65525a5988e5a GIT binary patch literal 6073 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14ab1f7cb34e20e9dd28893661063be42d1ba43e GIT binary patch literal 33519 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b361440caa74162351d1a30878aa8f84280b063d GIT binary patch literal 2144 zcmZuy-ES0C6u-0cx!>DvVWE()NGS};ZbVEJ4N#!L&y@f^IEk4odoS&lncelyEM}V} z^Z}DK(HP@H@kQ}T2r=r5@*nu%3)lzh#72nm0iTwX#Dpi$xihKgl0;~X%1+FcEm`o2qqwT23SM_szgQgUu&%SqR+CKi; z^zk=eubg~<{-901&8l9TGnX}d5cM-`CSv1f{EoxUc3R9-0{wWi;WZr=WFqFBmR|=| zkUGs8l=0KdYde0B38m_}(6JWg7*Z_~R*wR+NEopsN~{=_ESV;$az(L}I9dClDH;cz zN>!>+ofsWXHP{6G|v1sZ&Ye> zga>Ze0w}K*fh>}))Fn1>;p)afipot$hun}VW-LgoJt9y=Zl)Y49&^s~5%A-qKs<~I z?|uA!`CX53uiOS&rtD(bXP)1>;0^cEMb@}jcIxNKt&Tt2Y`jo<{y^EQ`)q%!TDwr4 zVP3gaZ$TakxRjP!oxrf|dZX^!_Iy^rLrVii9<#^+Ss=^f6FudV?DD4Z zp7Lp86?7!fYhhb)LrBfAsdyZu4fw!dhWK0q2Jx92;sJ_ib;(>bN&^kbvuam8LpZ+I)Pnd7^KAi=CyS}b`S-F1j`y)4w+&a0m{lsl! z>mT{?yZOmG`N`XRUb?k=DSxzQEN2V7EZ+=~HWUnj77cv@m__0b%k_UHf_8@%pTi~;W8JTb9SrshHb2s@h;qpw2SKY0m4-M)91}W)*WR(ELuT-k9N7xD&INh_rIHz}@=?eKeF&i$!WmXylBT0uG{JtRo`2Z@sE&HpBET~Q`il;`fJ hMn8Y?YT=8+*Ir&q?O&MwU5WR0fAm&ANtAJM=YQ+4`04-v literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bca69ae0e2b5c3c43815dcde5dc8699811ec7b16 GIT binary patch literal 39615 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 H+g$%&?YBQk literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd5347164b64c62cb497ba7e8164a3ba4c0d320b GIT binary patch literal 43589 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

    POG7&wq4iy`Qq~ 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab33927e896a8866e7aba499ed42f56613bfacb4 GIT binary patch literal 3353 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 K$X>(=lmh^id{rO- literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ad485050abea8176de16b8b90fd1357071f0214 GIT binary patch literal 31549 zcmeHwdvsg(ec#2Cct3~-Nq`UVO;CL3MZK-JD9MuOhZxI-qredFr9=uK=nK#iX)sY@ zr3M|RmeQo6T6Ll`pIV;PW2ehjcjs(#v+mSe+m$fX0Yd0SS>0{k*&mRp)QQ%u`+R>F z7XT^PNt&iR+vz3oyTAAQ_x*iezu*01v)RDm`J-+B==5tbj{6I8$WL>@viziqb!! zrieLUW^QfR60ruX5nI3(u?Ost>OghG5pYDD0cXS&a7Ek!ccdmz6R8c zVRl{E8>tV}M;ZbRk;Xt{q$$u8@dbR5=0GzG*CV_o(8}xv*xLea%x(;~M>+x>u$y>u zxHHlf=wfzD*dOT*bThj(ye85U=wWtSxHr-l=!^6R`Xg%tYa{Cd>mus|>sgpRydknN zu#wrT!vm2`flZOkfz8bA2ycmO4Qyq0XLws=dtf`WyTUsn4+S1#c6WGZWLIDpv+KjV zQQsD3uL<#Qya7s>4kN=81Fs1jK1uI{Bwu|Ee`}w-S0p1fB-U5V{ee0}q4_6+$;5bn^qDkFZj=AZ)9!=}pXQdIFC! z-)->SE~f}QCOppXpk5VwF+(1bMxTvDU$LIOJgozo?>hx6-^VLQ)%>oD>cH_b_ing{ z`Mvxeyg!F={G6Ox!A&ctmHvGnQ5F1(oHcYR77b6uh2U6ZGAhQ0{K}l355+?x;ZQ7= z(~OP@VIJ|S&V|BfgYi=cHXMucQ(<9vdQ!-lhsDr{a4Ix%mYjY=PPJ!ZI;Yzg3Wr0d z!a`2He{3Y4(;bcrqU1h07K8hd$@o}wA{5T)jtkFD2@@kiPBT0;NeNiCn$Jxj9L3h2 zo)TiQU|2XWh{4e)eq&)_A`}t)+FaGXXe1&`#B)_ggz0lpk;?DZ!USJvv`Ml*F2tt7@to$g7@eA=tSM$( z42?~oQ*Dn6r-k!}#!jCJO!nD zW4sXL(a&h!3cr}-XGUEypuy8qh#1T1VpEeC2uwo*m6_VEH_k>k)?RL|)z zD0$_CVov{(o>#}!a%fyD+ZZ&{l-#^Fu9L&!Y{w)Qi&e!dMs-PL(vZ|8^+|2ADrrh; zlE$PeX-_JW>QOVVyJ&jJ#_QuIIR~E7sFSu)1#h@$nl3y7Q<>F4+-NuQ&pO#|QI%g~88Pv;Z6V?&sQ`~Xx9Cu#z6n9SHH-=i! zF^922084x!pEx#h#)o++K^xzh&;%bA#6E+;hvyMM5Z{;-SKxbmp^52I+?em&7_vAe z_$DzM;{p$N{ERQgR*LV8yyP%Zk&c%N0;q|E;&J$)1Xjcz@pNn(vr&PCCFARoA=%S~ zWq-2A7cBrc|2AL2(-)8W&WU4j!6%#_5m+$1`h5F^(GWm_Zz?9lP<^a=z{FxA)*dvh zuUINupJint$;$Fh&;s^#jZOGQ&V6ap82{?MWf-BZJnUK z%12Q!Y{-wM1{xiX;?25XWzz=%3Cl*Q3_gB(=KNR;m712a1t|4B7ebX$Z0s}hegND) zI8w(#=f@&b5uXH(rNP3U0BA18un5o%f-iLHlqfuhE<(%DbkRrs%X(`fS{4|cD0LWh zabdm|rcNoWtX2}l|5<8Ph*_vnT%4L1Sydm*3v?58%E~_3QZ{KH+*vC0`5|m47(Lpt z00V^4vGXzz;Gp8`$!)q#f($Dl3N0{*1C#&7u`sVTE!INRw2G z=96|zT0*ok861;pyRzq2wnyGxeO)pZ_B6x0p2pDh_)1vb$&&zOGNALt3K$#BtO&yd zV>E*%L-8|gVgSU2r%;DcF&Zgb&=M4VoNc{jfKiThDG z@coFK~GSr}t!Z zO(|W|lF5}ZwWUmLS(}Uf*Ja(_Y<(x0o>sE7Y@q+vfu+{Y#jb7X*6rEGHQBo6thYVi z#F^WdIh)z?BUQEDu#C*PoN{b(q_h9*!;zdqEFt2c9+)L^?Zk!UWdR|iU ziqh=km1TA?K1Q`b{?wyNUJX=E!E1Q!HN}efRV4)TfwVfHiX2j_fFxR8QepOT!Q$FT zDBvpAC8+|ssK2O#UlC!&j5Q49)FB{5IqlhV^p@6FF%>MdTAJ`%_Q3d-5@@sHC6$t! zQzp>ngyJ>DuPQM26@KN+0or2OF3lIvp|Qz6+Cz&YOb9{@bR3}wqfxd^AxdyXoFQ=o z3i7MP<9La~FmkR!ek&v9s^X`DMBv7#K{QpxA&Ol+HaX2=28-p+?0aA;QKZsz3XX)M zu_ArA_NaqR9pU!}MdZpoEi(G($)5 zV-L-vVsHKrIKHII2k@7u$^-Or- z1mA#%g%<{~FPsWSM@M5qTx>u*ksIE`+Qrddt}S56~_CQgHjMv4jI92nWy zlua@{#g8-Ag))9Br<02kPf`sOLGckP;W08!z=#=P06?+_KvJ4}E}Aw4jIeC_4gRgB z-vjwvq;ltANIH#75wiSICIUV=>_}c#KKcIo_+Q6Z?C^)+LU$I&K+cPzBs{Av(f~wh2vX_ zD>OX-DtHC298*Z(;yCA54YBSYme#teGz{V>lEr9#V?nb%y|3F54neK62-sey;HW_w!}#k9T(;Vo ztjhXYGQPDb-`Yi8Ltd@cZ+LAa&*AmmDYl-}ES zviBXc{Syts^J}?=^-1L|UELjTFTHD*mC8m#Qu*gPkJMd8u^Hv(41jy%Q`q>?5q9!0 z?+wL-12Um35^F{zJ_zg1oRJnO8c%paP8FMuvHr>FiwXSIzc7nP3{!EmXmgfmm@k9) z(sDkAkQlK;e9x3USkt?AOAETHFbZM}k=9b|e-Gnt{uj1@#}(YVEpJ<|RV~E-yte1v z6N_qBUdNdmGp4ThOG_? zN#$)_5r#t0ZlQQ+(Qg4v*q?}fCJpn>` zmUqMWsa;Qlz`CAwyP6FL`LO{&cUGYrB)0Ma0#!L}VefnnnM(~n2U|`RiJcw-97~Y* zEE$CQh+ih-0vTT-gRr!+o}j%+B;y_YVqO^N3Dya$J6KOJr`~k&kd%&MS8gqV%ui`8 zO)oalcvV0nXa$CLz>l?-*92&asd+869nunmV7yr+lV|~xU=}Qdo*;&fO)-^UPb_!P zCOIA3|49_WFabt*4&_V|Xb&>jKA6)1#EpbN{s7Ih%2??r*mF^FI;WNR+J5Wmo@4!W z0p*HcBZEyW)?Y7^leQI+a4?$7n3%sxZenFivujm9Cnjeaka|8MyzFYwpM`^?)=8lvU+Hpjp3q5LoAF zq%{xWlM2EKqEm@%M<2#2%o^4ZR_P1KZ}qIXOnzh#RE?Qn(5$gZHLQ_pNWm*=NO&|o z%LKSfHRKhi6#*5imGx2ZFv=t@Gqqj29^Ju@MRxXe_xs6y3cJD1zBT?K5E?7zdCpK| zB*#`)_nRnCB;(KUixDILBKF+gMSI_uAC@Xhfh#K80uOqY|2L{#URg-Jm4vk8kBB}^ zK&|KaUS7xR!QVIV27pv8Z-mVV`Js+CUo-I*0U(ryfVaY?XEvLl=k0JAn5$Ya@(%o* z@O9zmhP?*ATKwt+n*RpDQUbNSN6?RYc<;rkfK{-4X4&x0L1Q=39jt$f;}jCZTRr%eOH(ba$|XW-UC+YQeCI{A>>Fr6J-P$~=_u6X%^IrzLJ)iDmp#MH!M1m$9#l zq6`uffclG;wQ&_sx{NdYnc|E+JU=FhpjXN?D08VRSGMy(=?3GGmWg^Ec@Dsy_{@_l zg&VBOD?}T`KKg%D2J!d6nJ#eJOH$>ZMW6s~!EwktkQq zhFe+6G+)Lz(G(r>7w%OLM>pGT@$%dBdT&z{=#@sOF<3; zQ&D|h5d#~NFY0F?ZAsri0~euU>`7?hG8SD%xTt5?lc<7=@KMR7gNsmc$)$&@AksmJ z2DpkfISoybpuHH=1m-9@Zq^=eFZ$Wz9kN|!tj2aH?BiXsZ|Qx(@GzIK|0WpzzonG> z|0{}kw;W@{fe=um;I+Xo<_gS?XMb| z+4=+t4cV&hWDBeln834BVJ+OrqIOd3l1PsTSV=8v7o`LDjq$3WXTk_{VuTRa z1dI)3G?r77ST|S2k3lnq7%CG`qL93xH^?kn=tn>-2l793Ufhi={f?YECWJ>&A8fAuJ#4t{f=!no=>~Bv*5ZGye!#5tZYL!#r9;I*VDVP_-@%q?xt+v zeW%lpWaeyB=f|90-&oWKn=_8ql%w^v zy{{j9_2BD|y!y!7`_pY((~fP){aKUkm1A?qGA3WjiO45paWNr{BEbxS$Uct#GEs6s&TiZvP3MFz#PRsa5zOEJNRwQE)R;FXX zie`3!tSf5cZu33LkPTmP?iXmgmFa)^q?pt?)KgL_eGr-d1;{bVo54L_*WUq2M!EeG z$ui2GBtHf9*-uyN`CF=oQT~4q_9g8$MhtH53b`yNN8G&hivl zS3|a@`JUHeGvqmo-XP%_-$8jJGGalbB#~$gvA6^mDfnOEPII$*UNLJR<~kiWn>B)P zEK}0w%hd95+(vs*J!^sjeUY35s$ohf#)||cN+>)sal>LLWmm#*Qzz@X%$nmR@=_Tu z5|=XRBA$p-hqEW4tfYotAas=ob;>bI??R{^p%o;kWoc_mX=Ga=)PS_4$hGRZX?(Ll znkUTVMDcjjs)%rc6e~zz6tIu`9*i+gqN7#Mtc5qlizH#ZO%5&{k|>eTWdaJ#&z}ZI zBdU@*Xw;dZQD=?&<&qLb_Q8JclHw!?+0QEpxtz5pY~w}pTaL|fl?ZVVw$*Uj@hs$QC*yEpVmJF$W}cGwfHdB2UtNBYp`ckbU0-eh&-qEbFVmFagM0Q zxDn+^%p*2Nj#+2I5#J}L9^Wt9O7Db|h=ZFpc`g2$@@1bIn!>ZrSqJpp>^G~6j42mt zXi2!_5;2P_*S1oBIZFK%Q(jWM++KMF@OIw*RpmpNXD@G3bMb?6Jrhda$=l^R&bkwB zu`%HuCuZQP2kbNVtP)`luL^*37TR{RhD*wqPhvG6tq@N6u31s43-u;Qi6{2AD-kdi zCH^{Kn4z=c}fpQ($#Y zutQmphmw{*j^|)8h6*xb;xIf@!e|F24O&Ic7(9IJ(MKL14(>a#KUWo$1j!O(r?B@k z7(lofvF(;=ySc&vHWWh>oD3P*(Za$W!*Ok#s8VoGL1VmlKu|feZhv&56SWG5A)hJo zXkrr2CKyDegF%wt(0Q=XX>fM>W@>j7<3Xid?DG3YL!=qJ)322Dlb%JD{0i}(;}xS? z`3j80SZGwB9A{cfxNU(SThjiPBYhnyW35OHG*_)MuV1S1%y0g+#GX}{{@=ME78ca+^Y9AfuCehqkVH)R+#>80PP)->PiUO+hh9YMG`6b3< zbh;B=^)KL=Qz5E!+NH?%juFa=g&`|n8;El*6*klU8G~Dj_Bsu35V`#LzmaC}T^(1q zCe^n)+ti(Lb}u@+vrbR8rT1e_V{gCw@TGn8uG=;K8zXN`yfN|4@U6bR*;-%8x6N{*D1e?zKkRUS{ z#OnA4^6+=%Y&ewDS2&c@M^zI48D&mHk+hhSWJ{3o8jPH=OpA~y{jHwPS12k?XG!CY zkUUAR%|tdL+n{{Nv{OWIYvCAW8vQxrNVIq{fcUQ{?r)Pp@`0R&P7p$nF&-V8fI?_t zq(vG&rYT3q-cDqk%W0TyoXGm%UGgw9fiwmr5(z z7pJA}RjElTa?ixsJoEn7p1x&Wx75Ba>ut+;*QC5_-uJG(@ocuCBh%2IYUqEzVbj|i zR)y8IkVf+Rb-g#%XKS0Uo3EPh8MPhNmo&F*EqNPfc90-qzWtWT2Z76#&tLw0#?_T_ zbtMP$YLmHrsiFNf;pV>Yx^Emwb!J^Xofa-SM{ZohQ?+gY&wq!iaM0v)(53ldblS zvmxX3r<{J4;M$3Wrxw=^zNfj>Ftjo;awsMBNl8ui4{fgbCvMr=lA5g5nKb=m`LF`5 zV5cJfsI&EmQquX)RY?k2u@UTO#fN|gZN|%g4WJ?Ie~={=gG-iKRYFzikd#bp&f+-L zIPIsap4qY^pJUihK`3fUH#f)#&9C7s3kxYSiONE7G!AK~rtB#TQL~UDQ>c=rLs@JM zi(OqIA1w#_VUH)g0`=8@YOM?`q#$VnIbKM&A~&P#Tgc7ysdY26 z5CT)|sl;lM^FpoYjtWiuXN_(Bxnh&duxuR0>*YF?-eonhv)DzpRar6@ebLy^sc0DBG*`cGv?R31;&bQ zR-e#UVt$Fk@m@J!tg%Y^Cwe(Y-knhMHPBkFy;=7rZRdDq4e@o7P12^R#0D$2+5nui zl4eNpIN|`X*@OX@tpdzk_9v%>zkYm^TvF-%<=_5U@+{SHMQdq$U-eWjMeYH#-$U(3 zPpw~-5YC%kxmPNO%WbLLzIc%hHBOlCst5I|z=r!xj<5eM+}<@xaH^_u-N$#Y$_h@o zJ;fR^%zokwa@hM|Y;nuqN!=>s{3-Ql`&*WWevosNXqALcB<9^$(XRa!+ErIp&ftUL zeB;X8kkdc;DJhyBNbzq#EnzcT2jcV`m}XC5hAW6&ct*N4r$UHE3SrchZ-`;H_sz17 zav!1e_pL>zL@?a97d=LCD+h7h%Hl{Gk~2o!!yxua!e+XHL4|V?Gdku;WU_(TP7(JG zfw+7i%omar(p#hmxRe06^pr4TExAYOK9w0g^O%5w`HYF(bJceW7qSSV?1F9<;?3x# zFwl83_M){fHYtpZg~D{M8fWp&2)KM_X7kfP>Lq4kAM}U9!pS1S>w6ltKiL(DLT5`9 zMxbBBbiJ7Nx_`!2N+(qT%mN_A96LRXQ=b}^8)59Ygezx~;(%E|F0F8W61NKFswP8F zIiEN^)37?TzVfp|pj-b7<@{gC_-|xtZFiI*zok&NxD5FbSnB> z`4vNSTL$UiLwk!9`WZz)I{8jDI+G;QHp#j@r-ufAL9^~_6cN;S;qovhqU=^7BfLvgUxBM-1Mh?+yTswcU3O5D^9&c4$m+2F zO2nW5#F{ZZfaBX;R}7a8z{tJ6jCUaA9Y}jOFY0P>X-3A~pK|vnjURfN@=Cke0_C`? zYhD{md)DSvaNe;sz3RRBxpeb}yarCns^!(~H=j$lZpv4YhmNziz54Wboxj)corZM# zuDqT+4P~*6hDHVO$YL33bAl@@6{tWwdwl)yp=p`oW0@d z*_-}!nZGu^T)?;>xv zRQ$P2|E^U3u5|0}d<}Wma`yVGPv5M`__wC~Thk5O@^$3x;p|PX8gC9}dUm9GcBFj| z<-O!xFL@tI`v&q2m92zV{J}Zn-{IUt797N?j=v_5@_3c zU#5N_RX^~yklA!7wdqj0{&2Qseb#>{+uE6J>&~`xyx#q4H)>Jm!HCs0TsK@bEISNd z_s5*U<^Dv4obJ_fHQprYztaCrS`i{@C5{!cq~WbfA;+p7Q5jbvwBw4$m%^5d%TW2EpF>|YWoT;jbKNe5*d zt6X}Dekvfw6-ZxRaTb6}oGi)X$BRUvoCjp$1btRLmGhGk9`RsFCt|!vMwPPQm6g-~ zCIzc@s0KHweGMGXu?(S=|33^};mA&`9&pOw|tDxHUGh z^S;6-{s8gbP~KN;6aN!z;t$Cn8`RrK(A{1D<=ts-4{f5xnvBtxGWr${zi;ea zvf5ucH+PP1XqXRY8aJdGH{7yrTmmGVy*!((shzLS)b*w6`W9>Z7hP)?*Y8_&?$0{A zms~8QCso&zcJ(gy6Nt=u{P*;l+UiScunPe^<7s!#`?j9j^_@3NnXav=uC1A_-KnnK z>8`!$`hAPKx@=n)%v-wVCA;%dfuVY1UCPySa|8vY`}U{p2f!BA)n#z}%6oZoa2cHR6&AmEM5-0h_J9w65tV zjHUOL{k8i&3O4LHHQm{>f}ckVl>pQ-uF`-kD-NslR646v@!GcHxg=ge2qy9UVtb$z zK_j{9DM`4%{lm2t4BTm;kb(0>9u7CYDrtF)lgwk)Q#yAfI(X=yR|0}Epm+{yG}AcA z4NAYr11x1XPI91CPf0Ba3O8=tx>`~ZL!IR1TM6(zaA&I|Sk)8-tJ>MHI$U50G#h8zG(-iSXM&fU22=%bQSH$KPab&uxFlvFS+97W41#sI zBI0++&K9*1W#m+piDg27S~STtSZ+DPDCBz(%)y7v32B9~1%~@5%C3c;ahI*MGXJBr z!d^v57q|~CwpUKioz7SqQ2}uHXIc z-uKrJ&O7I$^IycGdT)R7;jFbTV{J=W+ZKjzS-WqXe`i}}`;pZ4BkAqOQvJuWH9&J! zdQaBjzOwD|wkta??_6k2J38KXoVeA!_uVb;4X3*w&vc(ib)Q%?o%r#Rl|;aL&uvE? zM8JAa;Wm}d^?N?T3$C>6({nLJ=kiCd~w;Y#Jd82Q+W~`L8drH z{7tP$Cq}ebnJQjCTlKOnQ6;t}v=@{Qb2xWb-1K=vS-p##M{v@Nzonu({%>03%~;w( zsZI$UdIr1OtO1-P+5}fUFWE~7Leh?Yw$cTBl@Nvf4=BRT8skNN^tf+T#&C`k`nT$- zTno9s#V1Rx9dBEe6iz~oN--+u#oKP$<#Cbo<*Q34MUkrG!JLaR9YE2Xh(j2`s)u(W z%#GZ!BIublO>8gKrc!e7kJSxdag|ED{}amgP^4JwQ?@-M2cmI|S@{By-e(otpQ6lZX$WhEXv?}7iuQkk-i z*Ma+v^68niVtkkk0eJ&LtbRmyyvX@aSWh$QUuhh^t>Ei#Hpp`y_<~g$V<<&#C0;Hx zU;YetsBe>Vg`!jEtnH`F;KqcF5jy5F4z-G;98Y1?XKi1!A@?(q?Oah|ilOdJL(;yx z2j#6$6QXHM`}Fd|F!0%xit0Wky08*0Skm2+rw|U-DQAA~aUq0DM4)9ABc34-KIF(5 z0c=+K8Un5ko?u~gytGWMlXm+DRXfR7zS4^w_rlS*L1avcrJFlKeCc!^#jdFRMgbrY z*!Apjb`Lon_eVYk3Xva47V^Oo1PX1u*AZ|{vW;Hsq^TNX`Q#77ZD%)wYO za)h)(S&Lh~2IE_b&k}Hp+e;$|R1@)6KfGeDBApN40)Q<~0pB8mQ1ZvY$^uZ7rusCd zIh%aAzVUfPgF4b*;w62S;op$$56M>}-JjN745Br`KIH&*JGGjTX)(fTe1%I8&4rFF zXm9oX3|&s&o+#)5g{j*QAUjEoOJ1k_CNjSC+-K?bjmsdFxvFs-A0Hc?W)$>_;U^|NXyp0ORP!JWM48*@d8pcqVQA0`9C*C19@fK!q z>z+^i19DEo_~=O(ex1ZbH!&(g5;Nh`AeFLi!@fZ&PgIYLI>_Cvh_vBZJXP|B3=!6wpI9+I^%W^gGE$i%Im6@hl8*OqfU^ zLmqlcvzcu8UKQvr7&!|hJ#;gB;rJZ8Wq{l~NhWB>B{Ghd8h!T%)E6`=3+jIY&j>)# zNEsQV&+)Ju0kjfRB&T6BS8PEzyBzWv8H~zr>1IsvE^?o#`ILo9$ahQ!+WsdJSHvrG zLu^h-)R0%}^;=(4<#En^>rEBThUvHF-8y~sYpy(p*Uc@rHXcZ=8T=7Bz{p?IkJ~Ga z)>n4T?V1n0Z){p>Xvrcg>t*Z0x|FSL$>z9pfDZ4cZOse&*{SwtQ*B#Pwk_cNHd>NH zkU2Q(lDegqH8&2tb@Yv+>6Wd_++zy8J7sE29+`Lj(Au!D=IzE*%Pywn1Tn`Ctu@)2 z_Qe`xzYc8Xth@f&@rA~8!`j9Ab&Km5U#7k->sbSJteR?EvkB;7;Gi?5y93tsx|Fjm zc_7=+a{UWezmObSs;f`epLoytXAS?Z;a2^Lblr*M!ylG$f`sc6S0`>+dkcJ^+s?Mv zhHtdL)%Ql<;_k<8wLhMA9xpI~T-WQb)~8(^i(Ok6o!dw~73y)gsduq?ddr&f~XFMgk%(py>#7tV157HU6#7cs|1t1e-Z^qG+a`fCde#^1$_uFyR?>BVW zYWGVZpPj_J%2>Nn)~*{4)cLlz>xL^0MLJvmqOBk5Vc&N&d_k;Gi$b|@L#_jx@4<-@)}i}2PA)Y|6BEM)Zeg>%%ShqzHDoIwxc@(t-y{g z*`_uq#x=Sx4MIBOZTQ9^NNteMj^EgE&&t*L?)WUVU?6RWQg$Mz0kU^BD_}65#lW~!ZWil8zOp=XY$?Cfn z34ImGNaGh<4_I=MyQ_3)bon0WhvGU9EK>GgbJwV~XfF%`Otf_5HS08k3XGz!HS4X% z9-s9uK!TY&F1wi9|PyE%Nv;$ zx~@`)nK`jgYV%fRwQ+7w-p;JmTzymC!K_ZQx|r3?;hyOlX00V_9kY6{MDt!|t>+xx z`GEz;!uUc{%DXOAy*}T-0vb72?J}!oepCSz1?%%?X;|w%g~o8F+I=Z@*`L>t1EN`H zbH0jMb+~MJo?SMqXYNwVnA1XSwlb?tZnK>^fzsCI9n9*aHoKVBO%1JK)>^XGF{_6f z>Sfk?vNkYlBel7SS$z+-xtRsDpv`&K0!T>>u8-TvcUeWPSF#8=VaR#{dqCN+e(ai2 zXk66j*;F<3?#WeXHM5qrnz>EX0yDE(sM=O$wUO1%tkqO)2eUfK%JPTw*kJv*hI|WE zViC@(jw&?nY)xZcviLVkmOFaavW9~0Vn@^(UpSFhIyJtx>+>95@AiC5FUrTv{4uks zk!Fo&VPBrZ>qd;d-j01tu0nyZLD5&rOhncT19>o=HSQaq|Cqg5es`7RB@r65i0C$; z2tFOewEk&r<`kg^uu-frZkd)Vk&Uy8l0cDe@|rQ0cx;7_oyd3+wRswp8I39#!IRX4QuaObyh=C zg*{tuO78i(R_YBzEk4v9)*B)$bk3^$q*dv1Hfnz>2N43wk{))_s_-E;7D73(r?QBo z^a;H3lz#OPqlAXV-$GhYebgX)J}^9bc03m5&yJ2W^_QHLU6D}wRLyFTzJWT5jQ>uZ zLEIWTR;AT%0@K}GPe|OJZ)ty=S1Qc)Kd^cKCoK9+OD0Fg)S5E2zO7y~wf;xb!2OsL z312W;xmR>`;FZ*KS5@`gwc1T8Ou;<}8uC9uSAUOA;oE@Fgb}IZM11&FI!lt%$)6CD zZs;-=Kaq(q5>oH5tC+<>vJs&yeTgV0ZGyDN<+K=nXj4gBpMm0GWfb;H;_FLWDoJ|S zK^JMCqS&2*%g8kM9xMLcIowaP=b|3LHy8C?{tfwG(smNc?7Or1~crojI~2C-5_eEYUQ4P7B8qj88kiOZy?V>rNrFJ2xV z+W*LjrVTebJ{22Xqk!%d1U}(|@0{exEb^fb05zYxn`T<`bn+q5OoCjURb9 z#U8~ExDy%f#0T7#54fHWxD9{FIX~d)@&5yE_|LiF4>;csxNRSBwI6Uz%=CP~xna3u zs7rRe(m&UqHhAZ!Q--b!Rd<~3Mb4gOCTNS6j;yy4B4X0;!PkuFgh?O$1I6(}|EDp# zZbQ~x_i;l)p=i8gc3nE1GB@TmQ>1zF+EJDAl8y`H>_S=~VF7o1lu`5NY|B{ZRqSv{N;2U6ybFLcib zQ#HLQOJCm00-!(T%(J=zH`iK{@k{hkgoR^oZ+YifYQw{emLu;SU$i`$(mb}@#1ec_ z#VL)SC^d?WIH{!Ah)qsu%rmF05MZVNb1}f2mjgCYz@}orrb2*1QJd#r6arwor&B2U z7u_BA;NAa;E>Wd`4iB06FIqXZDLM1Ls_rkYFTBVLuVs%;v+1sr(-^*bFb~kFmOh*De*o8~Ald)` literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8203720517045495bc03562bd0f5304d9029cd4e GIT binary patch literal 11444 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py new file mode 100644 index 0000000..36286df --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py @@ -0,0 +1,451 @@ +# Auto generated by make_terminal_widths.py + +CELL_WIDTHS = [ + (0, 0, 0), + (1, 31, -1), + (127, 159, -1), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1552, 1562, 0), + (1611, 1631, 0), + (1648, 1648, 0), + (1750, 1756, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2259, 2273, 0), + (2275, 2306, 0), + (2362, 2362, 0), + (2364, 2364, 0), + (2369, 2376, 0), + (2381, 2381, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2433, 0), + (2492, 2492, 0), + (2497, 2500, 0), + (2509, 2509, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2562, 0), + (2620, 2620, 0), + (2625, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2690, 0), + (2748, 2748, 0), + (2753, 2757, 0), + (2759, 2760, 0), + (2765, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2817, 0), + (2876, 2876, 0), + (2879, 2879, 0), + (2881, 2884, 0), + (2893, 2893, 0), + (2901, 2902, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3008, 3008, 0), + (3021, 3021, 0), + (3072, 3072, 0), + (3076, 3076, 0), + (3134, 3136, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3201, 0), + (3260, 3260, 0), + (3263, 3263, 0), + (3270, 3270, 0), + (3276, 3277, 0), + (3298, 3299, 0), + (3328, 3329, 0), + (3387, 3388, 0), + (3393, 3396, 0), + (3405, 3405, 0), + (3426, 3427, 0), + (3457, 3457, 0), + (3530, 3530, 0), + (3538, 3540, 0), + (3542, 3542, 0), + (3633, 3633, 0), + (3636, 3642, 0), + (3655, 3662, 0), + (3761, 3761, 0), + (3764, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3953, 3966, 0), + (3968, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4141, 4144, 0), + (4146, 4151, 0), + (4153, 4154, 0), + (4157, 4158, 0), + (4184, 4185, 0), + (4190, 4192, 0), + (4209, 4212, 0), + (4226, 4226, 0), + (4229, 4230, 0), + (4237, 4237, 0), + (4253, 4253, 0), + (4352, 4447, 2), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6069, 0), + (6071, 6077, 0), + (6086, 6086, 0), + (6089, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6434, 0), + (6439, 6440, 0), + (6450, 6450, 0), + (6457, 6459, 0), + (6679, 6680, 0), + (6683, 6683, 0), + (6742, 6742, 0), + (6744, 6750, 0), + (6752, 6752, 0), + (6754, 6754, 0), + (6757, 6764, 0), + (6771, 6780, 0), + (6783, 6783, 0), + (6832, 6848, 0), + (6912, 6915, 0), + (6964, 6964, 0), + (6966, 6970, 0), + (6972, 6972, 0), + (6978, 6978, 0), + (7019, 7027, 0), + (7040, 7041, 0), + (7074, 7077, 0), + (7080, 7081, 0), + (7083, 7085, 0), + (7142, 7142, 0), + (7144, 7145, 0), + (7149, 7149, 0), + (7151, 7153, 0), + (7212, 7219, 0), + (7222, 7223, 0), + (7376, 7378, 0), + (7380, 7392, 0), + (7394, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7416, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8291, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12333, 0), + (12334, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12591, 2), + (12593, 12686, 2), + (12688, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43045, 43046, 0), + (43052, 43052, 0), + (43204, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43345, 0), + (43360, 43388, 2), + (43392, 43394, 0), + (43443, 43443, 0), + (43446, 43449, 0), + (43452, 43453, 0), + (43493, 43493, 0), + (43561, 43566, 0), + (43569, 43570, 0), + (43573, 43574, 0), + (43587, 43587, 0), + (43596, 43596, 0), + (43644, 43644, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 0), + (43756, 43757, 0), + (43766, 43766, 0), + (44005, 44005, 0), + (44008, 44008, 0), + (44013, 44013, 0), + (44032, 55203, 2), + (63744, 64255, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65071, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65281, 65376, 2), + (65504, 65510, 2), + (66045, 66045, 0), + (66272, 66272, 0), + (66422, 66426, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69291, 69292, 0), + (69446, 69456, 0), + (69633, 69633, 0), + (69688, 69702, 0), + (69759, 69761, 0), + (69811, 69814, 0), + (69817, 69818, 0), + (69888, 69890, 0), + (69927, 69931, 0), + (69933, 69940, 0), + (70003, 70003, 0), + (70016, 70017, 0), + (70070, 70078, 0), + (70089, 70092, 0), + (70095, 70095, 0), + (70191, 70193, 0), + (70196, 70196, 0), + (70198, 70199, 0), + (70206, 70206, 0), + (70367, 70367, 0), + (70371, 70378, 0), + (70400, 70401, 0), + (70459, 70460, 0), + (70464, 70464, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70712, 70719, 0), + (70722, 70724, 0), + (70726, 70726, 0), + (70750, 70750, 0), + (70835, 70840, 0), + (70842, 70842, 0), + (70847, 70848, 0), + (70850, 70851, 0), + (71090, 71093, 0), + (71100, 71101, 0), + (71103, 71104, 0), + (71132, 71133, 0), + (71219, 71226, 0), + (71229, 71229, 0), + (71231, 71232, 0), + (71339, 71339, 0), + (71341, 71341, 0), + (71344, 71349, 0), + (71351, 71351, 0), + (71453, 71455, 0), + (71458, 71461, 0), + (71463, 71467, 0), + (71727, 71735, 0), + (71737, 71738, 0), + (71995, 71996, 0), + (71998, 71998, 0), + (72003, 72003, 0), + (72148, 72151, 0), + (72154, 72155, 0), + (72160, 72160, 0), + (72193, 72202, 0), + (72243, 72248, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72278, 0), + (72281, 72283, 0), + (72330, 72342, 0), + (72344, 72345, 0), + (72752, 72758, 0), + (72760, 72765, 0), + (72767, 72767, 0), + (72850, 72871, 0), + (72874, 72880, 0), + (72882, 72883, 0), + (72885, 72886, 0), + (73009, 73014, 0), + (73018, 73018, 0), + (73020, 73021, 0), + (73023, 73029, 0), + (73031, 73031, 0), + (73104, 73105, 0), + (73109, 73109, 0), + (73111, 73111, 0), + (73459, 73460, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94180, 94180, 0), + (94192, 94193, 2), + (94208, 100343, 2), + (100352, 101589, 2), + (101632, 101640, 2), + (110592, 110878, 2), + (110928, 110930, 2), + (110948, 110951, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (119143, 119145, 0), + (119163, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123184, 123190, 0), + (123628, 123631, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128727, 2), + (128747, 128748, 2), + (128756, 128764, 2), + (128992, 129003, 2), + (129292, 129338, 2), + (129340, 129349, 2), + (129351, 129400, 2), + (129402, 129483, 2), + (129485, 129535, 2), + (129648, 129652, 2), + (129656, 129658, 2), + (129664, 129670, 2), + (129680, 129704, 2), + (129712, 129718, 2), + (129728, 129730, 2), + (129744, 129750, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917760, 917999, 0), +] diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py new file mode 100644 index 0000000..1f2877b --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py @@ -0,0 +1,3610 @@ +EMOJI = { + "1st_place_medal": "🥇", + "2nd_place_medal": "🥈", + "3rd_place_medal": "🥉", + "ab_button_(blood_type)": "🆎", + "atm_sign": "ðŸ§", + "a_button_(blood_type)": "🅰", + "afghanistan": "🇦🇫", + "albania": "🇦🇱", + "algeria": "🇩🇿", + "american_samoa": "🇦🇸", + "andorra": "🇦🇩", + "angola": "🇦🇴", + "anguilla": "🇦🇮", + "antarctica": "🇦🇶", + "antigua_&_barbuda": "🇦🇬", + "aquarius": "â™’", + "argentina": "🇦🇷", + "aries": "♈", + "armenia": "🇦🇲", + "aruba": "🇦🇼", + "ascension_island": "🇦🇨", + "australia": "🇦🇺", + "austria": "🇦🇹", + "azerbaijan": "🇦🇿", + "back_arrow": "🔙", + "b_button_(blood_type)": "🅱", + "bahamas": "🇧🇸", + "bahrain": "🇧🇭", + "bangladesh": "🇧🇩", + "barbados": "🇧🇧", + "belarus": "🇧🇾", + "belgium": "🇧🇪", + "belize": "🇧🇿", + "benin": "🇧🇯", + "bermuda": "🇧🇲", + "bhutan": "🇧🇹", + "bolivia": "🇧🇴", + "bosnia_&_herzegovina": "🇧🇦", + "botswana": "🇧🇼", + "bouvet_island": "🇧🇻", + "brazil": "🇧🇷", + "british_indian_ocean_territory": "🇮🇴", + "british_virgin_islands": "🇻🇬", + "brunei": "🇧🇳", + "bulgaria": "🇧🇬", + "burkina_faso": "🇧🇫", + "burundi": "🇧🇮", + "cl_button": "🆑", + "cool_button": "🆒", + "cambodia": "🇰🇭", + "cameroon": "🇨🇲", + "canada": "🇨🇦", + "canary_islands": "🇮🇨", + "cancer": "♋", + "cape_verde": "🇨🇻", + "capricorn": "♑", + "caribbean_netherlands": "🇧🇶", + "cayman_islands": "🇰🇾", + "central_african_republic": "🇨🇫", + "ceuta_&_melilla": "🇪🇦", + "chad": "🇹🇩", + "chile": "🇨🇱", + "china": "🇨🇳", + "christmas_island": "🇨🇽", + "christmas_tree": "🎄", + "clipperton_island": "🇨🇵", + "cocos_(keeling)_islands": "🇨🇨", + "colombia": "🇨🇴", + "comoros": "🇰🇲", + "congo_-_brazzaville": "🇨🇬", + "congo_-_kinshasa": "🇨🇩", + "cook_islands": "🇨🇰", + "costa_rica": "🇨🇷", + "croatia": "🇭🇷", + "cuba": "🇨🇺", + "curaçao": "🇨🇼", + "cyprus": "🇨🇾", + "czechia": "🇨🇿", + "côte_d’ivoire": "🇨🇮", + "denmark": "🇩🇰", + "diego_garcia": "🇩🇬", + "djibouti": "🇩🇯", + "dominica": "🇩🇲", + "dominican_republic": "🇩🇴", + "end_arrow": "🔚", + "ecuador": "🇪🇨", + "egypt": "🇪🇬", + "el_salvador": "🇸🇻", + "england": "ðŸ´\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", + "equatorial_guinea": "🇬🇶", + "eritrea": "🇪🇷", + "estonia": "🇪🇪", + "ethiopia": "🇪🇹", + "european_union": "🇪🇺", + "free_button": "🆓", + "falkland_islands": "🇫🇰", + "faroe_islands": "🇫🇴", + "fiji": "🇫🇯", + "finland": "🇫🇮", + "france": "🇫🇷", + "french_guiana": "🇬🇫", + "french_polynesia": "🇵🇫", + "french_southern_territories": "🇹🇫", + "gabon": "🇬🇦", + "gambia": "🇬🇲", + "gemini": "♊", + "georgia": "🇬🇪", + "germany": "🇩🇪", + "ghana": "🇬🇭", + "gibraltar": "🇬🇮", + "greece": "🇬🇷", + "greenland": "🇬🇱", + "grenada": "🇬🇩", + "guadeloupe": "🇬🇵", + "guam": "🇬🇺", + "guatemala": "🇬🇹", + "guernsey": "🇬🇬", + "guinea": "🇬🇳", + "guinea-bissau": "🇬🇼", + "guyana": "🇬🇾", + "haiti": "🇭🇹", + "heard_&_mcdonald_islands": "🇭🇲", + "honduras": "🇭🇳", + "hong_kong_sar_china": "🇭🇰", + "hungary": "🇭🇺", + "id_button": "🆔", + "iceland": "🇮🇸", + "india": "🇮🇳", + "indonesia": "🇮🇩", + "iran": "🇮🇷", + "iraq": "🇮🇶", + "ireland": "🇮🇪", + "isle_of_man": "🇮🇲", + "israel": "🇮🇱", + "italy": "🇮🇹", + "jamaica": "🇯🇲", + "japan": "🗾", + "japanese_acceptable_button": "🉑", + "japanese_application_button": "🈸", + "japanese_bargain_button": "ðŸ‰", + "japanese_castle": "ðŸ¯", + "japanese_congratulations_button": "㊗", + "japanese_discount_button": "🈹", + "japanese_dolls": "🎎", + "japanese_free_of_charge_button": "🈚", + "japanese_here_button": "ðŸˆ", + "japanese_monthly_amount_button": "🈷", + "japanese_no_vacancy_button": "🈵", + "japanese_not_free_of_charge_button": "🈶", + "japanese_open_for_business_button": "🈺", + "japanese_passing_grade_button": "🈴", + "japanese_post_office": "ðŸ£", + "japanese_prohibited_button": "🈲", + "japanese_reserved_button": "🈯", + "japanese_secret_button": "㊙", + "japanese_service_charge_button": "🈂", + "japanese_symbol_for_beginner": "🔰", + "japanese_vacancy_button": "🈳", + "jersey": "🇯🇪", + "jordan": "🇯🇴", + "kazakhstan": "🇰🇿", + "kenya": "🇰🇪", + "kiribati": "🇰🇮", + "kosovo": "🇽🇰", + "kuwait": "🇰🇼", + "kyrgyzstan": "🇰🇬", + "laos": "🇱🇦", + "latvia": "🇱🇻", + "lebanon": "🇱🇧", + "leo": "♌", + "lesotho": "🇱🇸", + "liberia": "🇱🇷", + "libra": "♎", + "libya": "🇱🇾", + "liechtenstein": "🇱🇮", + "lithuania": "🇱🇹", + "luxembourg": "🇱🇺", + "macau_sar_china": "🇲🇴", + "macedonia": "🇲🇰", + "madagascar": "🇲🇬", + "malawi": "🇲🇼", + "malaysia": "🇲🇾", + "maldives": "🇲🇻", + "mali": "🇲🇱", + "malta": "🇲🇹", + "marshall_islands": "🇲🇭", + "martinique": "🇲🇶", + "mauritania": "🇲🇷", + "mauritius": "🇲🇺", + "mayotte": "🇾🇹", + "mexico": "🇲🇽", + "micronesia": "🇫🇲", + "moldova": "🇲🇩", + "monaco": "🇲🇨", + "mongolia": "🇲🇳", + "montenegro": "🇲🇪", + "montserrat": "🇲🇸", + "morocco": "🇲🇦", + "mozambique": "🇲🇿", + "mrs._claus": "🤶", + "mrs._claus_dark_skin_tone": "🤶ðŸ¿", + "mrs._claus_light_skin_tone": "🤶ðŸ»", + "mrs._claus_medium-dark_skin_tone": "🤶ðŸ¾", + "mrs._claus_medium-light_skin_tone": "🤶ðŸ¼", + "mrs._claus_medium_skin_tone": "🤶ðŸ½", + "myanmar_(burma)": "🇲🇲", + "new_button": "🆕", + "ng_button": "🆖", + "namibia": "🇳🇦", + "nauru": "🇳🇷", + "nepal": "🇳🇵", + "netherlands": "🇳🇱", + "new_caledonia": "🇳🇨", + "new_zealand": "🇳🇿", + "nicaragua": "🇳🇮", + "niger": "🇳🇪", + "nigeria": "🇳🇬", + "niue": "🇳🇺", + "norfolk_island": "🇳🇫", + "north_korea": "🇰🇵", + "northern_mariana_islands": "🇲🇵", + "norway": "🇳🇴", + "ok_button": "🆗", + "ok_hand": "👌", + "ok_hand_dark_skin_tone": "👌ðŸ¿", + "ok_hand_light_skin_tone": "👌ðŸ»", + "ok_hand_medium-dark_skin_tone": "👌ðŸ¾", + "ok_hand_medium-light_skin_tone": "👌ðŸ¼", + "ok_hand_medium_skin_tone": "👌ðŸ½", + "on!_arrow": "🔛", + "o_button_(blood_type)": "🅾", + "oman": "🇴🇲", + "ophiuchus": "⛎", + "p_button": "🅿", + "pakistan": "🇵🇰", + "palau": "🇵🇼", + "palestinian_territories": "🇵🇸", + "panama": "🇵🇦", + "papua_new_guinea": "🇵🇬", + "paraguay": "🇵🇾", + "peru": "🇵🇪", + "philippines": "🇵🇭", + "pisces": "♓", + "pitcairn_islands": "🇵🇳", + "poland": "🇵🇱", + "portugal": "🇵🇹", + "puerto_rico": "🇵🇷", + "qatar": "🇶🇦", + "romania": "🇷🇴", + "russia": "🇷🇺", + "rwanda": "🇷🇼", + "réunion": "🇷🇪", + "soon_arrow": "🔜", + "sos_button": "🆘", + "sagittarius": "â™", + "samoa": "🇼🇸", + "san_marino": "🇸🇲", + "santa_claus": "🎅", + "santa_claus_dark_skin_tone": "🎅ðŸ¿", + "santa_claus_light_skin_tone": "🎅ðŸ»", + "santa_claus_medium-dark_skin_tone": "🎅ðŸ¾", + "santa_claus_medium-light_skin_tone": "🎅ðŸ¼", + "santa_claus_medium_skin_tone": "🎅ðŸ½", + "saudi_arabia": "🇸🇦", + "scorpio": "â™", + "scotland": "ðŸ´\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", + "senegal": "🇸🇳", + "serbia": "🇷🇸", + "seychelles": "🇸🇨", + "sierra_leone": "🇸🇱", + "singapore": "🇸🇬", + "sint_maarten": "🇸🇽", + "slovakia": "🇸🇰", + "slovenia": "🇸🇮", + "solomon_islands": "🇸🇧", + "somalia": "🇸🇴", + "south_africa": "🇿🇦", + "south_georgia_&_south_sandwich_islands": "🇬🇸", + "south_korea": "🇰🇷", + "south_sudan": "🇸🇸", + "spain": "🇪🇸", + "sri_lanka": "🇱🇰", + "st._barthélemy": "🇧🇱", + "st._helena": "🇸🇭", + "st._kitts_&_nevis": "🇰🇳", + "st._lucia": "🇱🇨", + "st._martin": "🇲🇫", + "st._pierre_&_miquelon": "🇵🇲", + "st._vincent_&_grenadines": "🇻🇨", + "statue_of_liberty": "🗽", + "sudan": "🇸🇩", + "suriname": "🇸🇷", + "svalbard_&_jan_mayen": "🇸🇯", + "swaziland": "🇸🇿", + "sweden": "🇸🇪", + "switzerland": "🇨🇭", + "syria": "🇸🇾", + "são_tomé_&_príncipe": "🇸🇹", + "t-rex": "🦖", + "top_arrow": "ðŸ”", + "taiwan": "🇹🇼", + "tajikistan": "🇹🇯", + "tanzania": "🇹🇿", + "taurus": "♉", + "thailand": "🇹🇭", + "timor-leste": "🇹🇱", + "togo": "🇹🇬", + "tokelau": "🇹🇰", + "tokyo_tower": "🗼", + "tonga": "🇹🇴", + "trinidad_&_tobago": "🇹🇹", + "tristan_da_cunha": "🇹🇦", + "tunisia": "🇹🇳", + "turkey": "🦃", + "turkmenistan": "🇹🇲", + "turks_&_caicos_islands": "🇹🇨", + "tuvalu": "🇹🇻", + "u.s._outlying_islands": "🇺🇲", + "u.s._virgin_islands": "🇻🇮", + "up!_button": "🆙", + "uganda": "🇺🇬", + "ukraine": "🇺🇦", + "united_arab_emirates": "🇦🇪", + "united_kingdom": "🇬🇧", + "united_nations": "🇺🇳", + "united_states": "🇺🇸", + "uruguay": "🇺🇾", + "uzbekistan": "🇺🇿", + "vs_button": "🆚", + "vanuatu": "🇻🇺", + "vatican_city": "🇻🇦", + "venezuela": "🇻🇪", + "vietnam": "🇻🇳", + "virgo": "â™", + "wales": "ðŸ´\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", + "wallis_&_futuna": "🇼🇫", + "western_sahara": "🇪🇭", + "yemen": "🇾🇪", + "zambia": "🇿🇲", + "zimbabwe": "🇿🇼", + "abacus": "🧮", + "adhesive_bandage": "🩹", + "admission_tickets": "🎟", + "adult": "🧑", + "adult_dark_skin_tone": "🧑ðŸ¿", + "adult_light_skin_tone": "🧑ðŸ»", + "adult_medium-dark_skin_tone": "🧑ðŸ¾", + "adult_medium-light_skin_tone": "🧑ðŸ¼", + "adult_medium_skin_tone": "🧑ðŸ½", + "aerial_tramway": "🚡", + "airplane": "✈", + "airplane_arrival": "🛬", + "airplane_departure": "🛫", + "alarm_clock": "â°", + "alembic": "âš—", + "alien": "👽", + "alien_monster": "👾", + "ambulance": "🚑", + "american_football": "ðŸˆ", + "amphora": "ðŸº", + "anchor": "âš“", + "anger_symbol": "💢", + "angry_face": "😠", + "angry_face_with_horns": "👿", + "anguished_face": "😧", + "ant": "ðŸœ", + "antenna_bars": "📶", + "anxious_face_with_sweat": "😰", + "articulated_lorry": "🚛", + "artist_palette": "🎨", + "astonished_face": "😲", + "atom_symbol": "âš›", + "auto_rickshaw": "🛺", + "automobile": "🚗", + "avocado": "🥑", + "axe": "🪓", + "baby": "👶", + "baby_angel": "👼", + "baby_angel_dark_skin_tone": "👼ðŸ¿", + "baby_angel_light_skin_tone": "👼ðŸ»", + "baby_angel_medium-dark_skin_tone": "👼ðŸ¾", + "baby_angel_medium-light_skin_tone": "👼ðŸ¼", + "baby_angel_medium_skin_tone": "👼ðŸ½", + "baby_bottle": "ðŸ¼", + "baby_chick": "ðŸ¤", + "baby_dark_skin_tone": "👶ðŸ¿", + "baby_light_skin_tone": "👶ðŸ»", + "baby_medium-dark_skin_tone": "👶ðŸ¾", + "baby_medium-light_skin_tone": "👶ðŸ¼", + "baby_medium_skin_tone": "👶ðŸ½", + "baby_symbol": "🚼", + "backhand_index_pointing_down": "👇", + "backhand_index_pointing_down_dark_skin_tone": "👇ðŸ¿", + "backhand_index_pointing_down_light_skin_tone": "👇ðŸ»", + "backhand_index_pointing_down_medium-dark_skin_tone": "👇ðŸ¾", + "backhand_index_pointing_down_medium-light_skin_tone": "👇ðŸ¼", + "backhand_index_pointing_down_medium_skin_tone": "👇ðŸ½", + "backhand_index_pointing_left": "👈", + "backhand_index_pointing_left_dark_skin_tone": "👈ðŸ¿", + "backhand_index_pointing_left_light_skin_tone": "👈ðŸ»", + "backhand_index_pointing_left_medium-dark_skin_tone": "👈ðŸ¾", + "backhand_index_pointing_left_medium-light_skin_tone": "👈ðŸ¼", + "backhand_index_pointing_left_medium_skin_tone": "👈ðŸ½", + "backhand_index_pointing_right": "👉", + "backhand_index_pointing_right_dark_skin_tone": "👉ðŸ¿", + "backhand_index_pointing_right_light_skin_tone": "👉ðŸ»", + "backhand_index_pointing_right_medium-dark_skin_tone": "👉ðŸ¾", + "backhand_index_pointing_right_medium-light_skin_tone": "👉ðŸ¼", + "backhand_index_pointing_right_medium_skin_tone": "👉ðŸ½", + "backhand_index_pointing_up": "👆", + "backhand_index_pointing_up_dark_skin_tone": "👆ðŸ¿", + "backhand_index_pointing_up_light_skin_tone": "👆ðŸ»", + "backhand_index_pointing_up_medium-dark_skin_tone": "👆ðŸ¾", + "backhand_index_pointing_up_medium-light_skin_tone": "👆ðŸ¼", + "backhand_index_pointing_up_medium_skin_tone": "👆ðŸ½", + "bacon": "🥓", + "badger": "🦡", + "badminton": "ðŸ¸", + "bagel": "🥯", + "baggage_claim": "🛄", + "baguette_bread": "🥖", + "balance_scale": "âš–", + "bald": "🦲", + "bald_man": "👨\u200d🦲", + "bald_woman": "👩\u200d🦲", + "ballet_shoes": "🩰", + "balloon": "🎈", + "ballot_box_with_ballot": "🗳", + "ballot_box_with_check": "☑", + "banana": "ðŸŒ", + "banjo": "🪕", + "bank": "ðŸ¦", + "bar_chart": "📊", + "barber_pole": "💈", + "baseball": "âš¾", + "basket": "🧺", + "basketball": "ðŸ€", + "bat": "🦇", + "bathtub": "ðŸ›", + "battery": "🔋", + "beach_with_umbrella": "ðŸ–", + "beaming_face_with_smiling_eyes": "ðŸ˜", + "bear_face": "ðŸ»", + "bearded_person": "🧔", + "bearded_person_dark_skin_tone": "🧔ðŸ¿", + "bearded_person_light_skin_tone": "🧔ðŸ»", + "bearded_person_medium-dark_skin_tone": "🧔ðŸ¾", + "bearded_person_medium-light_skin_tone": "🧔ðŸ¼", + "bearded_person_medium_skin_tone": "🧔ðŸ½", + "beating_heart": "💓", + "bed": "ðŸ›", + "beer_mug": "ðŸº", + "bell": "🔔", + "bell_with_slash": "🔕", + "bellhop_bell": "🛎", + "bento_box": "ðŸ±", + "beverage_box": "🧃", + "bicycle": "🚲", + "bikini": "👙", + "billed_cap": "🧢", + "biohazard": "☣", + "bird": "ðŸ¦", + "birthday_cake": "🎂", + "black_circle": "âš«", + "black_flag": "ðŸ´", + "black_heart": "🖤", + "black_large_square": "⬛", + "black_medium-small_square": "â—¾", + "black_medium_square": "â—¼", + "black_nib": "✒", + "black_small_square": "â–ª", + "black_square_button": "🔲", + "blond-haired_man": "👱\u200d♂ï¸", + "blond-haired_man_dark_skin_tone": "👱ðŸ¿\u200d♂ï¸", + "blond-haired_man_light_skin_tone": "👱ðŸ»\u200d♂ï¸", + "blond-haired_man_medium-dark_skin_tone": "👱ðŸ¾\u200d♂ï¸", + "blond-haired_man_medium-light_skin_tone": "👱ðŸ¼\u200d♂ï¸", + "blond-haired_man_medium_skin_tone": "👱ðŸ½\u200d♂ï¸", + "blond-haired_person": "👱", + "blond-haired_person_dark_skin_tone": "👱ðŸ¿", + "blond-haired_person_light_skin_tone": "👱ðŸ»", + "blond-haired_person_medium-dark_skin_tone": "👱ðŸ¾", + "blond-haired_person_medium-light_skin_tone": "👱ðŸ¼", + "blond-haired_person_medium_skin_tone": "👱ðŸ½", + "blond-haired_woman": "👱\u200d♀ï¸", + "blond-haired_woman_dark_skin_tone": "👱ðŸ¿\u200d♀ï¸", + "blond-haired_woman_light_skin_tone": "👱ðŸ»\u200d♀ï¸", + "blond-haired_woman_medium-dark_skin_tone": "👱ðŸ¾\u200d♀ï¸", + "blond-haired_woman_medium-light_skin_tone": "👱ðŸ¼\u200d♀ï¸", + "blond-haired_woman_medium_skin_tone": "👱ðŸ½\u200d♀ï¸", + "blossom": "🌼", + "blowfish": "ðŸ¡", + "blue_book": "📘", + "blue_circle": "🔵", + "blue_heart": "💙", + "blue_square": "🟦", + "boar": "ðŸ—", + "bomb": "💣", + "bone": "🦴", + "bookmark": "🔖", + "bookmark_tabs": "📑", + "books": "📚", + "bottle_with_popping_cork": "ðŸ¾", + "bouquet": "ðŸ’", + "bow_and_arrow": "ðŸ¹", + "bowl_with_spoon": "🥣", + "bowling": "🎳", + "boxing_glove": "🥊", + "boy": "👦", + "boy_dark_skin_tone": "👦ðŸ¿", + "boy_light_skin_tone": "👦ðŸ»", + "boy_medium-dark_skin_tone": "👦ðŸ¾", + "boy_medium-light_skin_tone": "👦ðŸ¼", + "boy_medium_skin_tone": "👦ðŸ½", + "brain": "🧠", + "bread": "ðŸž", + "breast-feeding": "🤱", + "breast-feeding_dark_skin_tone": "🤱ðŸ¿", + "breast-feeding_light_skin_tone": "🤱ðŸ»", + "breast-feeding_medium-dark_skin_tone": "🤱ðŸ¾", + "breast-feeding_medium-light_skin_tone": "🤱ðŸ¼", + "breast-feeding_medium_skin_tone": "🤱ðŸ½", + "brick": "🧱", + "bride_with_veil": "👰", + "bride_with_veil_dark_skin_tone": "👰ðŸ¿", + "bride_with_veil_light_skin_tone": "👰ðŸ»", + "bride_with_veil_medium-dark_skin_tone": "👰ðŸ¾", + "bride_with_veil_medium-light_skin_tone": "👰ðŸ¼", + "bride_with_veil_medium_skin_tone": "👰ðŸ½", + "bridge_at_night": "🌉", + "briefcase": "💼", + "briefs": "🩲", + "bright_button": "🔆", + "broccoli": "🥦", + "broken_heart": "💔", + "broom": "🧹", + "brown_circle": "🟤", + "brown_heart": "🤎", + "brown_square": "🟫", + "bug": "ðŸ›", + "building_construction": "ðŸ—", + "bullet_train": "🚅", + "burrito": "🌯", + "bus": "🚌", + "bus_stop": "ðŸš", + "bust_in_silhouette": "👤", + "busts_in_silhouette": "👥", + "butter": "🧈", + "butterfly": "🦋", + "cactus": "🌵", + "calendar": "📆", + "call_me_hand": "🤙", + "call_me_hand_dark_skin_tone": "🤙ðŸ¿", + "call_me_hand_light_skin_tone": "🤙ðŸ»", + "call_me_hand_medium-dark_skin_tone": "🤙ðŸ¾", + "call_me_hand_medium-light_skin_tone": "🤙ðŸ¼", + "call_me_hand_medium_skin_tone": "🤙ðŸ½", + "camel": "ðŸ«", + "camera": "📷", + "camera_with_flash": "📸", + "camping": "ðŸ•", + "candle": "🕯", + "candy": "ðŸ¬", + "canned_food": "🥫", + "canoe": "🛶", + "card_file_box": "🗃", + "card_index": "📇", + "card_index_dividers": "🗂", + "carousel_horse": "🎠", + "carp_streamer": "ðŸŽ", + "carrot": "🥕", + "castle": "ðŸ°", + "cat": "ðŸ±", + "cat_face": "ðŸ±", + "cat_face_with_tears_of_joy": "😹", + "cat_face_with_wry_smile": "😼", + "chains": "⛓", + "chair": "🪑", + "chart_decreasing": "📉", + "chart_increasing": "📈", + "chart_increasing_with_yen": "💹", + "cheese_wedge": "🧀", + "chequered_flag": "ðŸ", + "cherries": "ðŸ’", + "cherry_blossom": "🌸", + "chess_pawn": "♟", + "chestnut": "🌰", + "chicken": "ðŸ”", + "child": "🧒", + "child_dark_skin_tone": "🧒ðŸ¿", + "child_light_skin_tone": "🧒ðŸ»", + "child_medium-dark_skin_tone": "🧒ðŸ¾", + "child_medium-light_skin_tone": "🧒ðŸ¼", + "child_medium_skin_tone": "🧒ðŸ½", + "children_crossing": "🚸", + "chipmunk": "ðŸ¿", + "chocolate_bar": "ðŸ«", + "chopsticks": "🥢", + "church": "⛪", + "cigarette": "🚬", + "cinema": "🎦", + "circled_m": "â“‚", + "circus_tent": "🎪", + "cityscape": "ðŸ™", + "cityscape_at_dusk": "🌆", + "clamp": "🗜", + "clapper_board": "🎬", + "clapping_hands": "ðŸ‘", + "clapping_hands_dark_skin_tone": "ðŸ‘ðŸ¿", + "clapping_hands_light_skin_tone": "ðŸ‘ðŸ»", + "clapping_hands_medium-dark_skin_tone": "ðŸ‘ðŸ¾", + "clapping_hands_medium-light_skin_tone": "ðŸ‘ðŸ¼", + "clapping_hands_medium_skin_tone": "ðŸ‘ðŸ½", + "classical_building": "ðŸ›", + "clinking_beer_mugs": "ðŸ»", + "clinking_glasses": "🥂", + "clipboard": "📋", + "clockwise_vertical_arrows": "🔃", + "closed_book": "📕", + "closed_mailbox_with_lowered_flag": "📪", + "closed_mailbox_with_raised_flag": "📫", + "closed_umbrella": "🌂", + "cloud": "â˜", + "cloud_with_lightning": "🌩", + "cloud_with_lightning_and_rain": "⛈", + "cloud_with_rain": "🌧", + "cloud_with_snow": "🌨", + "clown_face": "🤡", + "club_suit": "♣", + "clutch_bag": "ðŸ‘", + "coat": "🧥", + "cocktail_glass": "ðŸ¸", + "coconut": "🥥", + "coffin": "âš°", + "cold_face": "🥶", + "collision": "💥", + "comet": "☄", + "compass": "🧭", + "computer_disk": "💽", + "computer_mouse": "🖱", + "confetti_ball": "🎊", + "confounded_face": "😖", + "confused_face": "😕", + "construction": "🚧", + "construction_worker": "👷", + "construction_worker_dark_skin_tone": "👷ðŸ¿", + "construction_worker_light_skin_tone": "👷ðŸ»", + "construction_worker_medium-dark_skin_tone": "👷ðŸ¾", + "construction_worker_medium-light_skin_tone": "👷ðŸ¼", + "construction_worker_medium_skin_tone": "👷ðŸ½", + "control_knobs": "🎛", + "convenience_store": "ðŸª", + "cooked_rice": "ðŸš", + "cookie": "ðŸª", + "cooking": "ðŸ³", + "copyright": "©", + "couch_and_lamp": "🛋", + "counterclockwise_arrows_button": "🔄", + "couple_with_heart": "💑", + "couple_with_heart_man_man": "👨\u200dâ¤ï¸\u200d👨", + "couple_with_heart_woman_man": "👩\u200dâ¤ï¸\u200d👨", + "couple_with_heart_woman_woman": "👩\u200dâ¤ï¸\u200d👩", + "cow": "ðŸ®", + "cow_face": "ðŸ®", + "cowboy_hat_face": "🤠", + "crab": "🦀", + "crayon": "ðŸ–", + "credit_card": "💳", + "crescent_moon": "🌙", + "cricket": "🦗", + "cricket_game": "ðŸ", + "crocodile": "ðŸŠ", + "croissant": "ðŸ¥", + "cross_mark": "âŒ", + "cross_mark_button": "âŽ", + "crossed_fingers": "🤞", + "crossed_fingers_dark_skin_tone": "🤞ðŸ¿", + "crossed_fingers_light_skin_tone": "🤞ðŸ»", + "crossed_fingers_medium-dark_skin_tone": "🤞ðŸ¾", + "crossed_fingers_medium-light_skin_tone": "🤞ðŸ¼", + "crossed_fingers_medium_skin_tone": "🤞ðŸ½", + "crossed_flags": "🎌", + "crossed_swords": "âš”", + "crown": "👑", + "crying_cat_face": "😿", + "crying_face": "😢", + "crystal_ball": "🔮", + "cucumber": "🥒", + "cupcake": "ðŸ§", + "cup_with_straw": "🥤", + "curling_stone": "🥌", + "curly_hair": "🦱", + "curly-haired_man": "👨\u200d🦱", + "curly-haired_woman": "👩\u200d🦱", + "curly_loop": "âž°", + "currency_exchange": "💱", + "curry_rice": "ðŸ›", + "custard": "ðŸ®", + "customs": "🛃", + "cut_of_meat": "🥩", + "cyclone": "🌀", + "dagger": "🗡", + "dango": "ðŸ¡", + "dashing_away": "💨", + "deaf_person": "ðŸ§", + "deciduous_tree": "🌳", + "deer": "🦌", + "delivery_truck": "🚚", + "department_store": "ðŸ¬", + "derelict_house": "ðŸš", + "desert": "ðŸœ", + "desert_island": "ðŸ", + "desktop_computer": "🖥", + "detective": "🕵", + "detective_dark_skin_tone": "🕵ðŸ¿", + "detective_light_skin_tone": "🕵ðŸ»", + "detective_medium-dark_skin_tone": "🕵ðŸ¾", + "detective_medium-light_skin_tone": "🕵ðŸ¼", + "detective_medium_skin_tone": "🕵ðŸ½", + "diamond_suit": "♦", + "diamond_with_a_dot": "💠", + "dim_button": "🔅", + "direct_hit": "🎯", + "disappointed_face": "😞", + "diving_mask": "🤿", + "diya_lamp": "🪔", + "dizzy": "💫", + "dizzy_face": "😵", + "dna": "🧬", + "dog": "ðŸ¶", + "dog_face": "ðŸ¶", + "dollar_banknote": "💵", + "dolphin": "ðŸ¬", + "door": "🚪", + "dotted_six-pointed_star": "🔯", + "double_curly_loop": "âž¿", + "double_exclamation_mark": "‼", + "doughnut": "ðŸ©", + "dove": "🕊", + "down-left_arrow": "↙", + "down-right_arrow": "↘", + "down_arrow": "⬇", + "downcast_face_with_sweat": "😓", + "downwards_button": "🔽", + "dragon": "ðŸ‰", + "dragon_face": "ðŸ²", + "dress": "👗", + "drooling_face": "🤤", + "drop_of_blood": "🩸", + "droplet": "💧", + "drum": "ðŸ¥", + "duck": "🦆", + "dumpling": "🥟", + "dvd": "📀", + "e-mail": "📧", + "eagle": "🦅", + "ear": "👂", + "ear_dark_skin_tone": "👂ðŸ¿", + "ear_light_skin_tone": "👂ðŸ»", + "ear_medium-dark_skin_tone": "👂ðŸ¾", + "ear_medium-light_skin_tone": "👂ðŸ¼", + "ear_medium_skin_tone": "👂ðŸ½", + "ear_of_corn": "🌽", + "ear_with_hearing_aid": "🦻", + "egg": "ðŸ³", + "eggplant": "ðŸ†", + "eight-pointed_star": "✴", + "eight-spoked_asterisk": "✳", + "eight-thirty": "🕣", + "eight_o’clock": "🕗", + "eject_button": "â", + "electric_plug": "🔌", + "elephant": "ðŸ˜", + "eleven-thirty": "🕦", + "eleven_o’clock": "🕚", + "elf": "ðŸ§", + "elf_dark_skin_tone": "ðŸ§ðŸ¿", + "elf_light_skin_tone": "ðŸ§ðŸ»", + "elf_medium-dark_skin_tone": "ðŸ§ðŸ¾", + "elf_medium-light_skin_tone": "ðŸ§ðŸ¼", + "elf_medium_skin_tone": "ðŸ§ðŸ½", + "envelope": "✉", + "envelope_with_arrow": "📩", + "euro_banknote": "💶", + "evergreen_tree": "🌲", + "ewe": "ðŸ‘", + "exclamation_mark": "â—", + "exclamation_question_mark": "â‰", + "exploding_head": "🤯", + "expressionless_face": "😑", + "eye": "ðŸ‘", + "eye_in_speech_bubble": "ðŸ‘ï¸\u200d🗨ï¸", + "eyes": "👀", + "face_blowing_a_kiss": "😘", + "face_savoring_food": "😋", + "face_screaming_in_fear": "😱", + "face_vomiting": "🤮", + "face_with_hand_over_mouth": "🤭", + "face_with_head-bandage": "🤕", + "face_with_medical_mask": "😷", + "face_with_monocle": "ðŸ§", + "face_with_open_mouth": "😮", + "face_with_raised_eyebrow": "🤨", + "face_with_rolling_eyes": "🙄", + "face_with_steam_from_nose": "😤", + "face_with_symbols_on_mouth": "🤬", + "face_with_tears_of_joy": "😂", + "face_with_thermometer": "🤒", + "face_with_tongue": "😛", + "face_without_mouth": "😶", + "factory": "ðŸ­", + "fairy": "🧚", + "fairy_dark_skin_tone": "🧚ðŸ¿", + "fairy_light_skin_tone": "🧚ðŸ»", + "fairy_medium-dark_skin_tone": "🧚ðŸ¾", + "fairy_medium-light_skin_tone": "🧚ðŸ¼", + "fairy_medium_skin_tone": "🧚ðŸ½", + "falafel": "🧆", + "fallen_leaf": "ðŸ‚", + "family": "👪", + "family_man_boy": "👨\u200d👦", + "family_man_boy_boy": "👨\u200d👦\u200d👦", + "family_man_girl": "👨\u200d👧", + "family_man_girl_boy": "👨\u200d👧\u200d👦", + "family_man_girl_girl": "👨\u200d👧\u200d👧", + "family_man_man_boy": "👨\u200d👨\u200d👦", + "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦", + "family_man_man_girl": "👨\u200d👨\u200d👧", + "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦", + "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧", + "family_man_woman_boy": "👨\u200d👩\u200d👦", + "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦", + "family_man_woman_girl": "👨\u200d👩\u200d👧", + "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦", + "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧", + "family_woman_boy": "👩\u200d👦", + "family_woman_boy_boy": "👩\u200d👦\u200d👦", + "family_woman_girl": "👩\u200d👧", + "family_woman_girl_boy": "👩\u200d👧\u200d👦", + "family_woman_girl_girl": "👩\u200d👧\u200d👧", + "family_woman_woman_boy": "👩\u200d👩\u200d👦", + "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦", + "family_woman_woman_girl": "👩\u200d👩\u200d👧", + "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦", + "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧", + "fast-forward_button": "â©", + "fast_down_button": "â¬", + "fast_reverse_button": "âª", + "fast_up_button": "â«", + "fax_machine": "📠", + "fearful_face": "😨", + "female_sign": "♀", + "ferris_wheel": "🎡", + "ferry": "â›´", + "field_hockey": "ðŸ‘", + "file_cabinet": "🗄", + "file_folder": "ðŸ“", + "film_frames": "🎞", + "film_projector": "📽", + "fire": "🔥", + "fire_extinguisher": "🧯", + "firecracker": "🧨", + "fire_engine": "🚒", + "fireworks": "🎆", + "first_quarter_moon": "🌓", + "first_quarter_moon_face": "🌛", + "fish": "ðŸŸ", + "fish_cake_with_swirl": "ðŸ¥", + "fishing_pole": "🎣", + "five-thirty": "🕠", + "five_o’clock": "🕔", + "flag_in_hole": "⛳", + "flamingo": "🦩", + "flashlight": "🔦", + "flat_shoe": "🥿", + "fleur-de-lis": "âšœ", + "flexed_biceps": "💪", + "flexed_biceps_dark_skin_tone": "💪ðŸ¿", + "flexed_biceps_light_skin_tone": "💪ðŸ»", + "flexed_biceps_medium-dark_skin_tone": "💪ðŸ¾", + "flexed_biceps_medium-light_skin_tone": "💪ðŸ¼", + "flexed_biceps_medium_skin_tone": "💪ðŸ½", + "floppy_disk": "💾", + "flower_playing_cards": "🎴", + "flushed_face": "😳", + "flying_disc": "ðŸ¥", + "flying_saucer": "🛸", + "fog": "🌫", + "foggy": "ðŸŒ", + "folded_hands": "ðŸ™", + "folded_hands_dark_skin_tone": "ðŸ™ðŸ¿", + "folded_hands_light_skin_tone": "ðŸ™ðŸ»", + "folded_hands_medium-dark_skin_tone": "ðŸ™ðŸ¾", + "folded_hands_medium-light_skin_tone": "ðŸ™ðŸ¼", + "folded_hands_medium_skin_tone": "ðŸ™ðŸ½", + "foot": "🦶", + "footprints": "👣", + "fork_and_knife": "ðŸ´", + "fork_and_knife_with_plate": "ðŸ½", + "fortune_cookie": "🥠", + "fountain": "⛲", + "fountain_pen": "🖋", + "four-thirty": "🕟", + "four_leaf_clover": "ðŸ€", + "four_o’clock": "🕓", + "fox_face": "🦊", + "framed_picture": "🖼", + "french_fries": "ðŸŸ", + "fried_shrimp": "ðŸ¤", + "frog_face": "ðŸ¸", + "front-facing_baby_chick": "ðŸ¥", + "frowning_face": "☹", + "frowning_face_with_open_mouth": "😦", + "fuel_pump": "⛽", + "full_moon": "🌕", + "full_moon_face": "ðŸŒ", + "funeral_urn": "âš±", + "game_die": "🎲", + "garlic": "🧄", + "gear": "âš™", + "gem_stone": "💎", + "genie": "🧞", + "ghost": "👻", + "giraffe": "🦒", + "girl": "👧", + "girl_dark_skin_tone": "👧ðŸ¿", + "girl_light_skin_tone": "👧ðŸ»", + "girl_medium-dark_skin_tone": "👧ðŸ¾", + "girl_medium-light_skin_tone": "👧ðŸ¼", + "girl_medium_skin_tone": "👧ðŸ½", + "glass_of_milk": "🥛", + "glasses": "👓", + "globe_showing_americas": "🌎", + "globe_showing_asia-australia": "ðŸŒ", + "globe_showing_europe-africa": "ðŸŒ", + "globe_with_meridians": "ðŸŒ", + "gloves": "🧤", + "glowing_star": "🌟", + "goal_net": "🥅", + "goat": "ðŸ", + "goblin": "👺", + "goggles": "🥽", + "gorilla": "ðŸ¦", + "graduation_cap": "🎓", + "grapes": "ðŸ‡", + "green_apple": "ðŸ", + "green_book": "📗", + "green_circle": "🟢", + "green_heart": "💚", + "green_salad": "🥗", + "green_square": "🟩", + "grimacing_face": "😬", + "grinning_cat_face": "😺", + "grinning_cat_face_with_smiling_eyes": "😸", + "grinning_face": "😀", + "grinning_face_with_big_eyes": "😃", + "grinning_face_with_smiling_eyes": "😄", + "grinning_face_with_sweat": "😅", + "grinning_squinting_face": "😆", + "growing_heart": "💗", + "guard": "💂", + "guard_dark_skin_tone": "💂ðŸ¿", + "guard_light_skin_tone": "💂ðŸ»", + "guard_medium-dark_skin_tone": "💂ðŸ¾", + "guard_medium-light_skin_tone": "💂ðŸ¼", + "guard_medium_skin_tone": "💂ðŸ½", + "guide_dog": "🦮", + "guitar": "🎸", + "hamburger": "ðŸ”", + "hammer": "🔨", + "hammer_and_pick": "âš’", + "hammer_and_wrench": "🛠", + "hamster_face": "ðŸ¹", + "hand_with_fingers_splayed": "ðŸ–", + "hand_with_fingers_splayed_dark_skin_tone": "ðŸ–ðŸ¿", + "hand_with_fingers_splayed_light_skin_tone": "ðŸ–ðŸ»", + "hand_with_fingers_splayed_medium-dark_skin_tone": "ðŸ–ðŸ¾", + "hand_with_fingers_splayed_medium-light_skin_tone": "ðŸ–ðŸ¼", + "hand_with_fingers_splayed_medium_skin_tone": "ðŸ–ðŸ½", + "handbag": "👜", + "handshake": "ðŸ¤", + "hatching_chick": "ðŸ£", + "headphone": "🎧", + "hear-no-evil_monkey": "🙉", + "heart_decoration": "💟", + "heart_suit": "♥", + "heart_with_arrow": "💘", + "heart_with_ribbon": "ðŸ’", + "heavy_check_mark": "✔", + "heavy_division_sign": "âž—", + "heavy_dollar_sign": "💲", + "heavy_heart_exclamation": "â£", + "heavy_large_circle": "â­•", + "heavy_minus_sign": "âž–", + "heavy_multiplication_x": "✖", + "heavy_plus_sign": "âž•", + "hedgehog": "🦔", + "helicopter": "ðŸš", + "herb": "🌿", + "hibiscus": "🌺", + "high-heeled_shoe": "👠", + "high-speed_train": "🚄", + "high_voltage": "âš¡", + "hiking_boot": "🥾", + "hindu_temple": "🛕", + "hippopotamus": "🦛", + "hole": "🕳", + "honey_pot": "ðŸ¯", + "honeybee": "ðŸ", + "horizontal_traffic_light": "🚥", + "horse": "ðŸ´", + "horse_face": "ðŸ´", + "horse_racing": "ðŸ‡", + "horse_racing_dark_skin_tone": "ðŸ‡ðŸ¿", + "horse_racing_light_skin_tone": "ðŸ‡ðŸ»", + "horse_racing_medium-dark_skin_tone": "ðŸ‡ðŸ¾", + "horse_racing_medium-light_skin_tone": "ðŸ‡ðŸ¼", + "horse_racing_medium_skin_tone": "ðŸ‡ðŸ½", + "hospital": "ðŸ¥", + "hot_beverage": "☕", + "hot_dog": "🌭", + "hot_face": "🥵", + "hot_pepper": "🌶", + "hot_springs": "♨", + "hotel": "ðŸ¨", + "hourglass_done": "⌛", + "hourglass_not_done": "â³", + "house": "ðŸ ", + "house_with_garden": "ðŸ¡", + "houses": "ðŸ˜", + "hugging_face": "🤗", + "hundred_points": "💯", + "hushed_face": "😯", + "ice": "🧊", + "ice_cream": "ðŸ¨", + "ice_hockey": "ðŸ’", + "ice_skate": "⛸", + "inbox_tray": "📥", + "incoming_envelope": "📨", + "index_pointing_up": "â˜", + "index_pointing_up_dark_skin_tone": "â˜ðŸ¿", + "index_pointing_up_light_skin_tone": "â˜ðŸ»", + "index_pointing_up_medium-dark_skin_tone": "â˜ðŸ¾", + "index_pointing_up_medium-light_skin_tone": "â˜ðŸ¼", + "index_pointing_up_medium_skin_tone": "â˜ðŸ½", + "infinity": "♾", + "information": "ℹ", + "input_latin_letters": "🔤", + "input_latin_lowercase": "🔡", + "input_latin_uppercase": "🔠", + "input_numbers": "🔢", + "input_symbols": "🔣", + "jack-o-lantern": "🎃", + "jeans": "👖", + "jigsaw": "🧩", + "joker": "ðŸƒ", + "joystick": "🕹", + "kaaba": "🕋", + "kangaroo": "🦘", + "key": "🔑", + "keyboard": "⌨", + "keycap_#": "#ï¸âƒ£", + "keycap_*": "*ï¸âƒ£", + "keycap_0": "0ï¸âƒ£", + "keycap_1": "1ï¸âƒ£", + "keycap_10": "🔟", + "keycap_2": "2ï¸âƒ£", + "keycap_3": "3ï¸âƒ£", + "keycap_4": "4ï¸âƒ£", + "keycap_5": "5ï¸âƒ£", + "keycap_6": "6ï¸âƒ£", + "keycap_7": "7ï¸âƒ£", + "keycap_8": "8ï¸âƒ£", + "keycap_9": "9ï¸âƒ£", + "kick_scooter": "🛴", + "kimono": "👘", + "kiss": "💋", + "kiss_man_man": "👨\u200dâ¤ï¸\u200d💋\u200d👨", + "kiss_mark": "💋", + "kiss_woman_man": "👩\u200dâ¤ï¸\u200d💋\u200d👨", + "kiss_woman_woman": "👩\u200dâ¤ï¸\u200d💋\u200d👩", + "kissing_cat_face": "😽", + "kissing_face": "😗", + "kissing_face_with_closed_eyes": "😚", + "kissing_face_with_smiling_eyes": "😙", + "kitchen_knife": "🔪", + "kite": "ðŸª", + "kiwi_fruit": "ðŸ¥", + "koala": "ðŸ¨", + "lab_coat": "🥼", + "label": "ðŸ·", + "lacrosse": "ðŸ¥", + "lady_beetle": "ðŸž", + "laptop_computer": "💻", + "large_blue_diamond": "🔷", + "large_orange_diamond": "🔶", + "last_quarter_moon": "🌗", + "last_quarter_moon_face": "🌜", + "last_track_button": "â®", + "latin_cross": "âœ", + "leaf_fluttering_in_wind": "ðŸƒ", + "leafy_green": "🥬", + "ledger": "📒", + "left-facing_fist": "🤛", + "left-facing_fist_dark_skin_tone": "🤛ðŸ¿", + "left-facing_fist_light_skin_tone": "🤛ðŸ»", + "left-facing_fist_medium-dark_skin_tone": "🤛ðŸ¾", + "left-facing_fist_medium-light_skin_tone": "🤛ðŸ¼", + "left-facing_fist_medium_skin_tone": "🤛ðŸ½", + "left-right_arrow": "↔", + "left_arrow": "⬅", + "left_arrow_curving_right": "↪", + "left_luggage": "🛅", + "left_speech_bubble": "🗨", + "leg": "🦵", + "lemon": "ðŸ‹", + "leopard": "ðŸ†", + "level_slider": "🎚", + "light_bulb": "💡", + "light_rail": "🚈", + "link": "🔗", + "linked_paperclips": "🖇", + "lion_face": "ðŸ¦", + "lipstick": "💄", + "litter_in_bin_sign": "🚮", + "lizard": "🦎", + "llama": "🦙", + "lobster": "🦞", + "locked": "🔒", + "locked_with_key": "ðŸ”", + "locked_with_pen": "ðŸ”", + "locomotive": "🚂", + "lollipop": "ðŸ­", + "lotion_bottle": "🧴", + "loudly_crying_face": "😭", + "loudspeaker": "📢", + "love-you_gesture": "🤟", + "love-you_gesture_dark_skin_tone": "🤟ðŸ¿", + "love-you_gesture_light_skin_tone": "🤟ðŸ»", + "love-you_gesture_medium-dark_skin_tone": "🤟ðŸ¾", + "love-you_gesture_medium-light_skin_tone": "🤟ðŸ¼", + "love-you_gesture_medium_skin_tone": "🤟ðŸ½", + "love_hotel": "ðŸ©", + "love_letter": "💌", + "luggage": "🧳", + "lying_face": "🤥", + "mage": "🧙", + "mage_dark_skin_tone": "🧙ðŸ¿", + "mage_light_skin_tone": "🧙ðŸ»", + "mage_medium-dark_skin_tone": "🧙ðŸ¾", + "mage_medium-light_skin_tone": "🧙ðŸ¼", + "mage_medium_skin_tone": "🧙ðŸ½", + "magnet": "🧲", + "magnifying_glass_tilted_left": "ðŸ”", + "magnifying_glass_tilted_right": "🔎", + "mahjong_red_dragon": "🀄", + "male_sign": "♂", + "man": "👨", + "man_and_woman_holding_hands": "👫", + "man_artist": "👨\u200d🎨", + "man_artist_dark_skin_tone": "👨ðŸ¿\u200d🎨", + "man_artist_light_skin_tone": "👨ðŸ»\u200d🎨", + "man_artist_medium-dark_skin_tone": "👨ðŸ¾\u200d🎨", + "man_artist_medium-light_skin_tone": "👨ðŸ¼\u200d🎨", + "man_artist_medium_skin_tone": "👨ðŸ½\u200d🎨", + "man_astronaut": "👨\u200d🚀", + "man_astronaut_dark_skin_tone": "👨ðŸ¿\u200d🚀", + "man_astronaut_light_skin_tone": "👨ðŸ»\u200d🚀", + "man_astronaut_medium-dark_skin_tone": "👨ðŸ¾\u200d🚀", + "man_astronaut_medium-light_skin_tone": "👨ðŸ¼\u200d🚀", + "man_astronaut_medium_skin_tone": "👨ðŸ½\u200d🚀", + "man_biking": "🚴\u200d♂ï¸", + "man_biking_dark_skin_tone": "🚴ðŸ¿\u200d♂ï¸", + "man_biking_light_skin_tone": "🚴ðŸ»\u200d♂ï¸", + "man_biking_medium-dark_skin_tone": "🚴ðŸ¾\u200d♂ï¸", + "man_biking_medium-light_skin_tone": "🚴ðŸ¼\u200d♂ï¸", + "man_biking_medium_skin_tone": "🚴ðŸ½\u200d♂ï¸", + "man_bouncing_ball": "⛹ï¸\u200d♂ï¸", + "man_bouncing_ball_dark_skin_tone": "⛹ðŸ¿\u200d♂ï¸", + "man_bouncing_ball_light_skin_tone": "⛹ðŸ»\u200d♂ï¸", + "man_bouncing_ball_medium-dark_skin_tone": "⛹ðŸ¾\u200d♂ï¸", + "man_bouncing_ball_medium-light_skin_tone": "⛹ðŸ¼\u200d♂ï¸", + "man_bouncing_ball_medium_skin_tone": "⛹ðŸ½\u200d♂ï¸", + "man_bowing": "🙇\u200d♂ï¸", + "man_bowing_dark_skin_tone": "🙇ðŸ¿\u200d♂ï¸", + "man_bowing_light_skin_tone": "🙇ðŸ»\u200d♂ï¸", + "man_bowing_medium-dark_skin_tone": "🙇ðŸ¾\u200d♂ï¸", + "man_bowing_medium-light_skin_tone": "🙇ðŸ¼\u200d♂ï¸", + "man_bowing_medium_skin_tone": "🙇ðŸ½\u200d♂ï¸", + "man_cartwheeling": "🤸\u200d♂ï¸", + "man_cartwheeling_dark_skin_tone": "🤸ðŸ¿\u200d♂ï¸", + "man_cartwheeling_light_skin_tone": "🤸ðŸ»\u200d♂ï¸", + "man_cartwheeling_medium-dark_skin_tone": "🤸ðŸ¾\u200d♂ï¸", + "man_cartwheeling_medium-light_skin_tone": "🤸ðŸ¼\u200d♂ï¸", + "man_cartwheeling_medium_skin_tone": "🤸ðŸ½\u200d♂ï¸", + "man_climbing": "🧗\u200d♂ï¸", + "man_climbing_dark_skin_tone": "🧗ðŸ¿\u200d♂ï¸", + "man_climbing_light_skin_tone": "🧗ðŸ»\u200d♂ï¸", + "man_climbing_medium-dark_skin_tone": "🧗ðŸ¾\u200d♂ï¸", + "man_climbing_medium-light_skin_tone": "🧗ðŸ¼\u200d♂ï¸", + "man_climbing_medium_skin_tone": "🧗ðŸ½\u200d♂ï¸", + "man_construction_worker": "👷\u200d♂ï¸", + "man_construction_worker_dark_skin_tone": "👷ðŸ¿\u200d♂ï¸", + "man_construction_worker_light_skin_tone": "👷ðŸ»\u200d♂ï¸", + "man_construction_worker_medium-dark_skin_tone": "👷ðŸ¾\u200d♂ï¸", + "man_construction_worker_medium-light_skin_tone": "👷ðŸ¼\u200d♂ï¸", + "man_construction_worker_medium_skin_tone": "👷ðŸ½\u200d♂ï¸", + "man_cook": "👨\u200dðŸ³", + "man_cook_dark_skin_tone": "👨ðŸ¿\u200dðŸ³", + "man_cook_light_skin_tone": "👨ðŸ»\u200dðŸ³", + "man_cook_medium-dark_skin_tone": "👨ðŸ¾\u200dðŸ³", + "man_cook_medium-light_skin_tone": "👨ðŸ¼\u200dðŸ³", + "man_cook_medium_skin_tone": "👨ðŸ½\u200dðŸ³", + "man_dancing": "🕺", + "man_dancing_dark_skin_tone": "🕺ðŸ¿", + "man_dancing_light_skin_tone": "🕺ðŸ»", + "man_dancing_medium-dark_skin_tone": "🕺ðŸ¾", + "man_dancing_medium-light_skin_tone": "🕺ðŸ¼", + "man_dancing_medium_skin_tone": "🕺ðŸ½", + "man_dark_skin_tone": "👨ðŸ¿", + "man_detective": "🕵ï¸\u200d♂ï¸", + "man_detective_dark_skin_tone": "🕵ðŸ¿\u200d♂ï¸", + "man_detective_light_skin_tone": "🕵ðŸ»\u200d♂ï¸", + "man_detective_medium-dark_skin_tone": "🕵ðŸ¾\u200d♂ï¸", + "man_detective_medium-light_skin_tone": "🕵ðŸ¼\u200d♂ï¸", + "man_detective_medium_skin_tone": "🕵ðŸ½\u200d♂ï¸", + "man_elf": "ðŸ§\u200d♂ï¸", + "man_elf_dark_skin_tone": "ðŸ§ðŸ¿\u200d♂ï¸", + "man_elf_light_skin_tone": "ðŸ§ðŸ»\u200d♂ï¸", + "man_elf_medium-dark_skin_tone": "ðŸ§ðŸ¾\u200d♂ï¸", + "man_elf_medium-light_skin_tone": "ðŸ§ðŸ¼\u200d♂ï¸", + "man_elf_medium_skin_tone": "ðŸ§ðŸ½\u200d♂ï¸", + "man_facepalming": "🤦\u200d♂ï¸", + "man_facepalming_dark_skin_tone": "🤦ðŸ¿\u200d♂ï¸", + "man_facepalming_light_skin_tone": "🤦ðŸ»\u200d♂ï¸", + "man_facepalming_medium-dark_skin_tone": "🤦ðŸ¾\u200d♂ï¸", + "man_facepalming_medium-light_skin_tone": "🤦ðŸ¼\u200d♂ï¸", + "man_facepalming_medium_skin_tone": "🤦ðŸ½\u200d♂ï¸", + "man_factory_worker": "👨\u200dðŸ­", + "man_factory_worker_dark_skin_tone": "👨ðŸ¿\u200dðŸ­", + "man_factory_worker_light_skin_tone": "👨ðŸ»\u200dðŸ­", + "man_factory_worker_medium-dark_skin_tone": "👨ðŸ¾\u200dðŸ­", + "man_factory_worker_medium-light_skin_tone": "👨ðŸ¼\u200dðŸ­", + "man_factory_worker_medium_skin_tone": "👨ðŸ½\u200dðŸ­", + "man_fairy": "🧚\u200d♂ï¸", + "man_fairy_dark_skin_tone": "🧚ðŸ¿\u200d♂ï¸", + "man_fairy_light_skin_tone": "🧚ðŸ»\u200d♂ï¸", + "man_fairy_medium-dark_skin_tone": "🧚ðŸ¾\u200d♂ï¸", + "man_fairy_medium-light_skin_tone": "🧚ðŸ¼\u200d♂ï¸", + "man_fairy_medium_skin_tone": "🧚ðŸ½\u200d♂ï¸", + "man_farmer": "👨\u200d🌾", + "man_farmer_dark_skin_tone": "👨ðŸ¿\u200d🌾", + "man_farmer_light_skin_tone": "👨ðŸ»\u200d🌾", + "man_farmer_medium-dark_skin_tone": "👨ðŸ¾\u200d🌾", + "man_farmer_medium-light_skin_tone": "👨ðŸ¼\u200d🌾", + "man_farmer_medium_skin_tone": "👨ðŸ½\u200d🌾", + "man_firefighter": "👨\u200d🚒", + "man_firefighter_dark_skin_tone": "👨ðŸ¿\u200d🚒", + "man_firefighter_light_skin_tone": "👨ðŸ»\u200d🚒", + "man_firefighter_medium-dark_skin_tone": "👨ðŸ¾\u200d🚒", + "man_firefighter_medium-light_skin_tone": "👨ðŸ¼\u200d🚒", + "man_firefighter_medium_skin_tone": "👨ðŸ½\u200d🚒", + "man_frowning": "ðŸ™\u200d♂ï¸", + "man_frowning_dark_skin_tone": "ðŸ™ðŸ¿\u200d♂ï¸", + "man_frowning_light_skin_tone": "ðŸ™ðŸ»\u200d♂ï¸", + "man_frowning_medium-dark_skin_tone": "ðŸ™ðŸ¾\u200d♂ï¸", + "man_frowning_medium-light_skin_tone": "ðŸ™ðŸ¼\u200d♂ï¸", + "man_frowning_medium_skin_tone": "ðŸ™ðŸ½\u200d♂ï¸", + "man_genie": "🧞\u200d♂ï¸", + "man_gesturing_no": "🙅\u200d♂ï¸", + "man_gesturing_no_dark_skin_tone": "🙅ðŸ¿\u200d♂ï¸", + "man_gesturing_no_light_skin_tone": "🙅ðŸ»\u200d♂ï¸", + "man_gesturing_no_medium-dark_skin_tone": "🙅ðŸ¾\u200d♂ï¸", + "man_gesturing_no_medium-light_skin_tone": "🙅ðŸ¼\u200d♂ï¸", + "man_gesturing_no_medium_skin_tone": "🙅ðŸ½\u200d♂ï¸", + "man_gesturing_ok": "🙆\u200d♂ï¸", + "man_gesturing_ok_dark_skin_tone": "🙆ðŸ¿\u200d♂ï¸", + "man_gesturing_ok_light_skin_tone": "🙆ðŸ»\u200d♂ï¸", + "man_gesturing_ok_medium-dark_skin_tone": "🙆ðŸ¾\u200d♂ï¸", + "man_gesturing_ok_medium-light_skin_tone": "🙆ðŸ¼\u200d♂ï¸", + "man_gesturing_ok_medium_skin_tone": "🙆ðŸ½\u200d♂ï¸", + "man_getting_haircut": "💇\u200d♂ï¸", + "man_getting_haircut_dark_skin_tone": "💇ðŸ¿\u200d♂ï¸", + "man_getting_haircut_light_skin_tone": "💇ðŸ»\u200d♂ï¸", + "man_getting_haircut_medium-dark_skin_tone": "💇ðŸ¾\u200d♂ï¸", + "man_getting_haircut_medium-light_skin_tone": "💇ðŸ¼\u200d♂ï¸", + "man_getting_haircut_medium_skin_tone": "💇ðŸ½\u200d♂ï¸", + "man_getting_massage": "💆\u200d♂ï¸", + "man_getting_massage_dark_skin_tone": "💆ðŸ¿\u200d♂ï¸", + "man_getting_massage_light_skin_tone": "💆ðŸ»\u200d♂ï¸", + "man_getting_massage_medium-dark_skin_tone": "💆ðŸ¾\u200d♂ï¸", + "man_getting_massage_medium-light_skin_tone": "💆ðŸ¼\u200d♂ï¸", + "man_getting_massage_medium_skin_tone": "💆ðŸ½\u200d♂ï¸", + "man_golfing": "ðŸŒï¸\u200d♂ï¸", + "man_golfing_dark_skin_tone": "ðŸŒðŸ¿\u200d♂ï¸", + "man_golfing_light_skin_tone": "ðŸŒðŸ»\u200d♂ï¸", + "man_golfing_medium-dark_skin_tone": "ðŸŒðŸ¾\u200d♂ï¸", + "man_golfing_medium-light_skin_tone": "ðŸŒðŸ¼\u200d♂ï¸", + "man_golfing_medium_skin_tone": "ðŸŒðŸ½\u200d♂ï¸", + "man_guard": "💂\u200d♂ï¸", + "man_guard_dark_skin_tone": "💂ðŸ¿\u200d♂ï¸", + "man_guard_light_skin_tone": "💂ðŸ»\u200d♂ï¸", + "man_guard_medium-dark_skin_tone": "💂ðŸ¾\u200d♂ï¸", + "man_guard_medium-light_skin_tone": "💂ðŸ¼\u200d♂ï¸", + "man_guard_medium_skin_tone": "💂ðŸ½\u200d♂ï¸", + "man_health_worker": "👨\u200dâš•ï¸", + "man_health_worker_dark_skin_tone": "👨ðŸ¿\u200dâš•ï¸", + "man_health_worker_light_skin_tone": "👨ðŸ»\u200dâš•ï¸", + "man_health_worker_medium-dark_skin_tone": "👨ðŸ¾\u200dâš•ï¸", + "man_health_worker_medium-light_skin_tone": "👨ðŸ¼\u200dâš•ï¸", + "man_health_worker_medium_skin_tone": "👨ðŸ½\u200dâš•ï¸", + "man_in_lotus_position": "🧘\u200d♂ï¸", + "man_in_lotus_position_dark_skin_tone": "🧘ðŸ¿\u200d♂ï¸", + "man_in_lotus_position_light_skin_tone": "🧘ðŸ»\u200d♂ï¸", + "man_in_lotus_position_medium-dark_skin_tone": "🧘ðŸ¾\u200d♂ï¸", + "man_in_lotus_position_medium-light_skin_tone": "🧘ðŸ¼\u200d♂ï¸", + "man_in_lotus_position_medium_skin_tone": "🧘ðŸ½\u200d♂ï¸", + "man_in_manual_wheelchair": "👨\u200d🦽", + "man_in_motorized_wheelchair": "👨\u200d🦼", + "man_in_steamy_room": "🧖\u200d♂ï¸", + "man_in_steamy_room_dark_skin_tone": "🧖ðŸ¿\u200d♂ï¸", + "man_in_steamy_room_light_skin_tone": "🧖ðŸ»\u200d♂ï¸", + "man_in_steamy_room_medium-dark_skin_tone": "🧖ðŸ¾\u200d♂ï¸", + "man_in_steamy_room_medium-light_skin_tone": "🧖ðŸ¼\u200d♂ï¸", + "man_in_steamy_room_medium_skin_tone": "🧖ðŸ½\u200d♂ï¸", + "man_in_suit_levitating": "🕴", + "man_in_suit_levitating_dark_skin_tone": "🕴ðŸ¿", + "man_in_suit_levitating_light_skin_tone": "🕴ðŸ»", + "man_in_suit_levitating_medium-dark_skin_tone": "🕴ðŸ¾", + "man_in_suit_levitating_medium-light_skin_tone": "🕴ðŸ¼", + "man_in_suit_levitating_medium_skin_tone": "🕴ðŸ½", + "man_in_tuxedo": "🤵", + "man_in_tuxedo_dark_skin_tone": "🤵ðŸ¿", + "man_in_tuxedo_light_skin_tone": "🤵ðŸ»", + "man_in_tuxedo_medium-dark_skin_tone": "🤵ðŸ¾", + "man_in_tuxedo_medium-light_skin_tone": "🤵ðŸ¼", + "man_in_tuxedo_medium_skin_tone": "🤵ðŸ½", + "man_judge": "👨\u200dâš–ï¸", + "man_judge_dark_skin_tone": "👨ðŸ¿\u200dâš–ï¸", + "man_judge_light_skin_tone": "👨ðŸ»\u200dâš–ï¸", + "man_judge_medium-dark_skin_tone": "👨ðŸ¾\u200dâš–ï¸", + "man_judge_medium-light_skin_tone": "👨ðŸ¼\u200dâš–ï¸", + "man_judge_medium_skin_tone": "👨ðŸ½\u200dâš–ï¸", + "man_juggling": "🤹\u200d♂ï¸", + "man_juggling_dark_skin_tone": "🤹ðŸ¿\u200d♂ï¸", + "man_juggling_light_skin_tone": "🤹ðŸ»\u200d♂ï¸", + "man_juggling_medium-dark_skin_tone": "🤹ðŸ¾\u200d♂ï¸", + "man_juggling_medium-light_skin_tone": "🤹ðŸ¼\u200d♂ï¸", + "man_juggling_medium_skin_tone": "🤹ðŸ½\u200d♂ï¸", + "man_lifting_weights": "ðŸ‹ï¸\u200d♂ï¸", + "man_lifting_weights_dark_skin_tone": "ðŸ‹ðŸ¿\u200d♂ï¸", + "man_lifting_weights_light_skin_tone": "ðŸ‹ðŸ»\u200d♂ï¸", + "man_lifting_weights_medium-dark_skin_tone": "ðŸ‹ðŸ¾\u200d♂ï¸", + "man_lifting_weights_medium-light_skin_tone": "ðŸ‹ðŸ¼\u200d♂ï¸", + "man_lifting_weights_medium_skin_tone": "ðŸ‹ðŸ½\u200d♂ï¸", + "man_light_skin_tone": "👨ðŸ»", + "man_mage": "🧙\u200d♂ï¸", + "man_mage_dark_skin_tone": "🧙ðŸ¿\u200d♂ï¸", + "man_mage_light_skin_tone": "🧙ðŸ»\u200d♂ï¸", + "man_mage_medium-dark_skin_tone": "🧙ðŸ¾\u200d♂ï¸", + "man_mage_medium-light_skin_tone": "🧙ðŸ¼\u200d♂ï¸", + "man_mage_medium_skin_tone": "🧙ðŸ½\u200d♂ï¸", + "man_mechanic": "👨\u200d🔧", + "man_mechanic_dark_skin_tone": "👨ðŸ¿\u200d🔧", + "man_mechanic_light_skin_tone": "👨ðŸ»\u200d🔧", + "man_mechanic_medium-dark_skin_tone": "👨ðŸ¾\u200d🔧", + "man_mechanic_medium-light_skin_tone": "👨ðŸ¼\u200d🔧", + "man_mechanic_medium_skin_tone": "👨ðŸ½\u200d🔧", + "man_medium-dark_skin_tone": "👨ðŸ¾", + "man_medium-light_skin_tone": "👨ðŸ¼", + "man_medium_skin_tone": "👨ðŸ½", + "man_mountain_biking": "🚵\u200d♂ï¸", + "man_mountain_biking_dark_skin_tone": "🚵ðŸ¿\u200d♂ï¸", + "man_mountain_biking_light_skin_tone": "🚵ðŸ»\u200d♂ï¸", + "man_mountain_biking_medium-dark_skin_tone": "🚵ðŸ¾\u200d♂ï¸", + "man_mountain_biking_medium-light_skin_tone": "🚵ðŸ¼\u200d♂ï¸", + "man_mountain_biking_medium_skin_tone": "🚵ðŸ½\u200d♂ï¸", + "man_office_worker": "👨\u200d💼", + "man_office_worker_dark_skin_tone": "👨ðŸ¿\u200d💼", + "man_office_worker_light_skin_tone": "👨ðŸ»\u200d💼", + "man_office_worker_medium-dark_skin_tone": "👨ðŸ¾\u200d💼", + "man_office_worker_medium-light_skin_tone": "👨ðŸ¼\u200d💼", + "man_office_worker_medium_skin_tone": "👨ðŸ½\u200d💼", + "man_pilot": "👨\u200d✈ï¸", + "man_pilot_dark_skin_tone": "👨ðŸ¿\u200d✈ï¸", + "man_pilot_light_skin_tone": "👨ðŸ»\u200d✈ï¸", + "man_pilot_medium-dark_skin_tone": "👨ðŸ¾\u200d✈ï¸", + "man_pilot_medium-light_skin_tone": "👨ðŸ¼\u200d✈ï¸", + "man_pilot_medium_skin_tone": "👨ðŸ½\u200d✈ï¸", + "man_playing_handball": "🤾\u200d♂ï¸", + "man_playing_handball_dark_skin_tone": "🤾ðŸ¿\u200d♂ï¸", + "man_playing_handball_light_skin_tone": "🤾ðŸ»\u200d♂ï¸", + "man_playing_handball_medium-dark_skin_tone": "🤾ðŸ¾\u200d♂ï¸", + "man_playing_handball_medium-light_skin_tone": "🤾ðŸ¼\u200d♂ï¸", + "man_playing_handball_medium_skin_tone": "🤾ðŸ½\u200d♂ï¸", + "man_playing_water_polo": "🤽\u200d♂ï¸", + "man_playing_water_polo_dark_skin_tone": "🤽ðŸ¿\u200d♂ï¸", + "man_playing_water_polo_light_skin_tone": "🤽ðŸ»\u200d♂ï¸", + "man_playing_water_polo_medium-dark_skin_tone": "🤽ðŸ¾\u200d♂ï¸", + "man_playing_water_polo_medium-light_skin_tone": "🤽ðŸ¼\u200d♂ï¸", + "man_playing_water_polo_medium_skin_tone": "🤽ðŸ½\u200d♂ï¸", + "man_police_officer": "👮\u200d♂ï¸", + "man_police_officer_dark_skin_tone": "👮ðŸ¿\u200d♂ï¸", + "man_police_officer_light_skin_tone": "👮ðŸ»\u200d♂ï¸", + "man_police_officer_medium-dark_skin_tone": "👮ðŸ¾\u200d♂ï¸", + "man_police_officer_medium-light_skin_tone": "👮ðŸ¼\u200d♂ï¸", + "man_police_officer_medium_skin_tone": "👮ðŸ½\u200d♂ï¸", + "man_pouting": "🙎\u200d♂ï¸", + "man_pouting_dark_skin_tone": "🙎ðŸ¿\u200d♂ï¸", + "man_pouting_light_skin_tone": "🙎ðŸ»\u200d♂ï¸", + "man_pouting_medium-dark_skin_tone": "🙎ðŸ¾\u200d♂ï¸", + "man_pouting_medium-light_skin_tone": "🙎ðŸ¼\u200d♂ï¸", + "man_pouting_medium_skin_tone": "🙎ðŸ½\u200d♂ï¸", + "man_raising_hand": "🙋\u200d♂ï¸", + "man_raising_hand_dark_skin_tone": "🙋ðŸ¿\u200d♂ï¸", + "man_raising_hand_light_skin_tone": "🙋ðŸ»\u200d♂ï¸", + "man_raising_hand_medium-dark_skin_tone": "🙋ðŸ¾\u200d♂ï¸", + "man_raising_hand_medium-light_skin_tone": "🙋ðŸ¼\u200d♂ï¸", + "man_raising_hand_medium_skin_tone": "🙋ðŸ½\u200d♂ï¸", + "man_rowing_boat": "🚣\u200d♂ï¸", + "man_rowing_boat_dark_skin_tone": "🚣ðŸ¿\u200d♂ï¸", + "man_rowing_boat_light_skin_tone": "🚣ðŸ»\u200d♂ï¸", + "man_rowing_boat_medium-dark_skin_tone": "🚣ðŸ¾\u200d♂ï¸", + "man_rowing_boat_medium-light_skin_tone": "🚣ðŸ¼\u200d♂ï¸", + "man_rowing_boat_medium_skin_tone": "🚣ðŸ½\u200d♂ï¸", + "man_running": "ðŸƒ\u200d♂ï¸", + "man_running_dark_skin_tone": "ðŸƒðŸ¿\u200d♂ï¸", + "man_running_light_skin_tone": "ðŸƒðŸ»\u200d♂ï¸", + "man_running_medium-dark_skin_tone": "ðŸƒðŸ¾\u200d♂ï¸", + "man_running_medium-light_skin_tone": "ðŸƒðŸ¼\u200d♂ï¸", + "man_running_medium_skin_tone": "ðŸƒðŸ½\u200d♂ï¸", + "man_scientist": "👨\u200d🔬", + "man_scientist_dark_skin_tone": "👨ðŸ¿\u200d🔬", + "man_scientist_light_skin_tone": "👨ðŸ»\u200d🔬", + "man_scientist_medium-dark_skin_tone": "👨ðŸ¾\u200d🔬", + "man_scientist_medium-light_skin_tone": "👨ðŸ¼\u200d🔬", + "man_scientist_medium_skin_tone": "👨ðŸ½\u200d🔬", + "man_shrugging": "🤷\u200d♂ï¸", + "man_shrugging_dark_skin_tone": "🤷ðŸ¿\u200d♂ï¸", + "man_shrugging_light_skin_tone": "🤷ðŸ»\u200d♂ï¸", + "man_shrugging_medium-dark_skin_tone": "🤷ðŸ¾\u200d♂ï¸", + "man_shrugging_medium-light_skin_tone": "🤷ðŸ¼\u200d♂ï¸", + "man_shrugging_medium_skin_tone": "🤷ðŸ½\u200d♂ï¸", + "man_singer": "👨\u200d🎤", + "man_singer_dark_skin_tone": "👨ðŸ¿\u200d🎤", + "man_singer_light_skin_tone": "👨ðŸ»\u200d🎤", + "man_singer_medium-dark_skin_tone": "👨ðŸ¾\u200d🎤", + "man_singer_medium-light_skin_tone": "👨ðŸ¼\u200d🎤", + "man_singer_medium_skin_tone": "👨ðŸ½\u200d🎤", + "man_student": "👨\u200d🎓", + "man_student_dark_skin_tone": "👨ðŸ¿\u200d🎓", + "man_student_light_skin_tone": "👨ðŸ»\u200d🎓", + "man_student_medium-dark_skin_tone": "👨ðŸ¾\u200d🎓", + "man_student_medium-light_skin_tone": "👨ðŸ¼\u200d🎓", + "man_student_medium_skin_tone": "👨ðŸ½\u200d🎓", + "man_surfing": "ðŸ„\u200d♂ï¸", + "man_surfing_dark_skin_tone": "ðŸ„ðŸ¿\u200d♂ï¸", + "man_surfing_light_skin_tone": "ðŸ„ðŸ»\u200d♂ï¸", + "man_surfing_medium-dark_skin_tone": "ðŸ„ðŸ¾\u200d♂ï¸", + "man_surfing_medium-light_skin_tone": "ðŸ„ðŸ¼\u200d♂ï¸", + "man_surfing_medium_skin_tone": "ðŸ„ðŸ½\u200d♂ï¸", + "man_swimming": "ðŸŠ\u200d♂ï¸", + "man_swimming_dark_skin_tone": "ðŸŠðŸ¿\u200d♂ï¸", + "man_swimming_light_skin_tone": "ðŸŠðŸ»\u200d♂ï¸", + "man_swimming_medium-dark_skin_tone": "ðŸŠðŸ¾\u200d♂ï¸", + "man_swimming_medium-light_skin_tone": "ðŸŠðŸ¼\u200d♂ï¸", + "man_swimming_medium_skin_tone": "ðŸŠðŸ½\u200d♂ï¸", + "man_teacher": "👨\u200dðŸ«", + "man_teacher_dark_skin_tone": "👨ðŸ¿\u200dðŸ«", + "man_teacher_light_skin_tone": "👨ðŸ»\u200dðŸ«", + "man_teacher_medium-dark_skin_tone": "👨ðŸ¾\u200dðŸ«", + "man_teacher_medium-light_skin_tone": "👨ðŸ¼\u200dðŸ«", + "man_teacher_medium_skin_tone": "👨ðŸ½\u200dðŸ«", + "man_technologist": "👨\u200d💻", + "man_technologist_dark_skin_tone": "👨ðŸ¿\u200d💻", + "man_technologist_light_skin_tone": "👨ðŸ»\u200d💻", + "man_technologist_medium-dark_skin_tone": "👨ðŸ¾\u200d💻", + "man_technologist_medium-light_skin_tone": "👨ðŸ¼\u200d💻", + "man_technologist_medium_skin_tone": "👨ðŸ½\u200d💻", + "man_tipping_hand": "ðŸ’\u200d♂ï¸", + "man_tipping_hand_dark_skin_tone": "ðŸ’ðŸ¿\u200d♂ï¸", + "man_tipping_hand_light_skin_tone": "ðŸ’ðŸ»\u200d♂ï¸", + "man_tipping_hand_medium-dark_skin_tone": "ðŸ’ðŸ¾\u200d♂ï¸", + "man_tipping_hand_medium-light_skin_tone": "ðŸ’ðŸ¼\u200d♂ï¸", + "man_tipping_hand_medium_skin_tone": "ðŸ’ðŸ½\u200d♂ï¸", + "man_vampire": "🧛\u200d♂ï¸", + "man_vampire_dark_skin_tone": "🧛ðŸ¿\u200d♂ï¸", + "man_vampire_light_skin_tone": "🧛ðŸ»\u200d♂ï¸", + "man_vampire_medium-dark_skin_tone": "🧛ðŸ¾\u200d♂ï¸", + "man_vampire_medium-light_skin_tone": "🧛ðŸ¼\u200d♂ï¸", + "man_vampire_medium_skin_tone": "🧛ðŸ½\u200d♂ï¸", + "man_walking": "🚶\u200d♂ï¸", + "man_walking_dark_skin_tone": "🚶ðŸ¿\u200d♂ï¸", + "man_walking_light_skin_tone": "🚶ðŸ»\u200d♂ï¸", + "man_walking_medium-dark_skin_tone": "🚶ðŸ¾\u200d♂ï¸", + "man_walking_medium-light_skin_tone": "🚶ðŸ¼\u200d♂ï¸", + "man_walking_medium_skin_tone": "🚶ðŸ½\u200d♂ï¸", + "man_wearing_turban": "👳\u200d♂ï¸", + "man_wearing_turban_dark_skin_tone": "👳ðŸ¿\u200d♂ï¸", + "man_wearing_turban_light_skin_tone": "👳ðŸ»\u200d♂ï¸", + "man_wearing_turban_medium-dark_skin_tone": "👳ðŸ¾\u200d♂ï¸", + "man_wearing_turban_medium-light_skin_tone": "👳ðŸ¼\u200d♂ï¸", + "man_wearing_turban_medium_skin_tone": "👳ðŸ½\u200d♂ï¸", + "man_with_probing_cane": "👨\u200d🦯", + "man_with_chinese_cap": "👲", + "man_with_chinese_cap_dark_skin_tone": "👲ðŸ¿", + "man_with_chinese_cap_light_skin_tone": "👲ðŸ»", + "man_with_chinese_cap_medium-dark_skin_tone": "👲ðŸ¾", + "man_with_chinese_cap_medium-light_skin_tone": "👲ðŸ¼", + "man_with_chinese_cap_medium_skin_tone": "👲ðŸ½", + "man_zombie": "🧟\u200d♂ï¸", + "mango": "🥭", + "mantelpiece_clock": "🕰", + "manual_wheelchair": "🦽", + "man’s_shoe": "👞", + "map_of_japan": "🗾", + "maple_leaf": "ðŸ", + "martial_arts_uniform": "🥋", + "mate": "🧉", + "meat_on_bone": "ðŸ–", + "mechanical_arm": "🦾", + "mechanical_leg": "🦿", + "medical_symbol": "âš•", + "megaphone": "📣", + "melon": "ðŸˆ", + "memo": "ðŸ“", + "men_with_bunny_ears": "👯\u200d♂ï¸", + "men_wrestling": "🤼\u200d♂ï¸", + "menorah": "🕎", + "men’s_room": "🚹", + "mermaid": "🧜\u200d♀ï¸", + "mermaid_dark_skin_tone": "🧜ðŸ¿\u200d♀ï¸", + "mermaid_light_skin_tone": "🧜ðŸ»\u200d♀ï¸", + "mermaid_medium-dark_skin_tone": "🧜ðŸ¾\u200d♀ï¸", + "mermaid_medium-light_skin_tone": "🧜ðŸ¼\u200d♀ï¸", + "mermaid_medium_skin_tone": "🧜ðŸ½\u200d♀ï¸", + "merman": "🧜\u200d♂ï¸", + "merman_dark_skin_tone": "🧜ðŸ¿\u200d♂ï¸", + "merman_light_skin_tone": "🧜ðŸ»\u200d♂ï¸", + "merman_medium-dark_skin_tone": "🧜ðŸ¾\u200d♂ï¸", + "merman_medium-light_skin_tone": "🧜ðŸ¼\u200d♂ï¸", + "merman_medium_skin_tone": "🧜ðŸ½\u200d♂ï¸", + "merperson": "🧜", + "merperson_dark_skin_tone": "🧜ðŸ¿", + "merperson_light_skin_tone": "🧜ðŸ»", + "merperson_medium-dark_skin_tone": "🧜ðŸ¾", + "merperson_medium-light_skin_tone": "🧜ðŸ¼", + "merperson_medium_skin_tone": "🧜ðŸ½", + "metro": "🚇", + "microbe": "🦠", + "microphone": "🎤", + "microscope": "🔬", + "middle_finger": "🖕", + "middle_finger_dark_skin_tone": "🖕ðŸ¿", + "middle_finger_light_skin_tone": "🖕ðŸ»", + "middle_finger_medium-dark_skin_tone": "🖕ðŸ¾", + "middle_finger_medium-light_skin_tone": "🖕ðŸ¼", + "middle_finger_medium_skin_tone": "🖕ðŸ½", + "military_medal": "🎖", + "milky_way": "🌌", + "minibus": "ðŸš", + "moai": "🗿", + "mobile_phone": "📱", + "mobile_phone_off": "📴", + "mobile_phone_with_arrow": "📲", + "money-mouth_face": "🤑", + "money_bag": "💰", + "money_with_wings": "💸", + "monkey": "ðŸ’", + "monkey_face": "ðŸµ", + "monorail": "ðŸš", + "moon_cake": "🥮", + "moon_viewing_ceremony": "🎑", + "mosque": "🕌", + "mosquito": "🦟", + "motor_boat": "🛥", + "motor_scooter": "🛵", + "motorcycle": "ðŸ", + "motorized_wheelchair": "🦼", + "motorway": "🛣", + "mount_fuji": "🗻", + "mountain": "â›°", + "mountain_cableway": "🚠", + "mountain_railway": "🚞", + "mouse": "ðŸ­", + "mouse_face": "ðŸ­", + "mouth": "👄", + "movie_camera": "🎥", + "mushroom": "ðŸ„", + "musical_keyboard": "🎹", + "musical_note": "🎵", + "musical_notes": "🎶", + "musical_score": "🎼", + "muted_speaker": "🔇", + "nail_polish": "💅", + "nail_polish_dark_skin_tone": "💅ðŸ¿", + "nail_polish_light_skin_tone": "💅ðŸ»", + "nail_polish_medium-dark_skin_tone": "💅ðŸ¾", + "nail_polish_medium-light_skin_tone": "💅ðŸ¼", + "nail_polish_medium_skin_tone": "💅ðŸ½", + "name_badge": "📛", + "national_park": "ðŸž", + "nauseated_face": "🤢", + "nazar_amulet": "🧿", + "necktie": "👔", + "nerd_face": "🤓", + "neutral_face": "ðŸ˜", + "new_moon": "🌑", + "new_moon_face": "🌚", + "newspaper": "📰", + "next_track_button": "â­", + "night_with_stars": "🌃", + "nine-thirty": "🕤", + "nine_o’clock": "🕘", + "no_bicycles": "🚳", + "no_entry": "â›”", + "no_littering": "🚯", + "no_mobile_phones": "📵", + "no_one_under_eighteen": "🔞", + "no_pedestrians": "🚷", + "no_smoking": "🚭", + "non-potable_water": "🚱", + "nose": "👃", + "nose_dark_skin_tone": "👃ðŸ¿", + "nose_light_skin_tone": "👃ðŸ»", + "nose_medium-dark_skin_tone": "👃ðŸ¾", + "nose_medium-light_skin_tone": "👃ðŸ¼", + "nose_medium_skin_tone": "👃ðŸ½", + "notebook": "📓", + "notebook_with_decorative_cover": "📔", + "nut_and_bolt": "🔩", + "octopus": "ðŸ™", + "oden": "ðŸ¢", + "office_building": "ðŸ¢", + "ogre": "👹", + "oil_drum": "🛢", + "old_key": "ðŸ—", + "old_man": "👴", + "old_man_dark_skin_tone": "👴ðŸ¿", + "old_man_light_skin_tone": "👴ðŸ»", + "old_man_medium-dark_skin_tone": "👴ðŸ¾", + "old_man_medium-light_skin_tone": "👴ðŸ¼", + "old_man_medium_skin_tone": "👴ðŸ½", + "old_woman": "👵", + "old_woman_dark_skin_tone": "👵ðŸ¿", + "old_woman_light_skin_tone": "👵ðŸ»", + "old_woman_medium-dark_skin_tone": "👵ðŸ¾", + "old_woman_medium-light_skin_tone": "👵ðŸ¼", + "old_woman_medium_skin_tone": "👵ðŸ½", + "older_adult": "🧓", + "older_adult_dark_skin_tone": "🧓ðŸ¿", + "older_adult_light_skin_tone": "🧓ðŸ»", + "older_adult_medium-dark_skin_tone": "🧓ðŸ¾", + "older_adult_medium-light_skin_tone": "🧓ðŸ¼", + "older_adult_medium_skin_tone": "🧓ðŸ½", + "om": "🕉", + "oncoming_automobile": "🚘", + "oncoming_bus": "ðŸš", + "oncoming_fist": "👊", + "oncoming_fist_dark_skin_tone": "👊ðŸ¿", + "oncoming_fist_light_skin_tone": "👊ðŸ»", + "oncoming_fist_medium-dark_skin_tone": "👊ðŸ¾", + "oncoming_fist_medium-light_skin_tone": "👊ðŸ¼", + "oncoming_fist_medium_skin_tone": "👊ðŸ½", + "oncoming_police_car": "🚔", + "oncoming_taxi": "🚖", + "one-piece_swimsuit": "🩱", + "one-thirty": "🕜", + "one_o’clock": "ðŸ•", + "onion": "🧅", + "open_book": "📖", + "open_file_folder": "📂", + "open_hands": "ðŸ‘", + "open_hands_dark_skin_tone": "ðŸ‘ðŸ¿", + "open_hands_light_skin_tone": "ðŸ‘ðŸ»", + "open_hands_medium-dark_skin_tone": "ðŸ‘ðŸ¾", + "open_hands_medium-light_skin_tone": "ðŸ‘ðŸ¼", + "open_hands_medium_skin_tone": "ðŸ‘ðŸ½", + "open_mailbox_with_lowered_flag": "📭", + "open_mailbox_with_raised_flag": "📬", + "optical_disk": "💿", + "orange_book": "📙", + "orange_circle": "🟠", + "orange_heart": "🧡", + "orange_square": "🟧", + "orangutan": "🦧", + "orthodox_cross": "☦", + "otter": "🦦", + "outbox_tray": "📤", + "owl": "🦉", + "ox": "ðŸ‚", + "oyster": "🦪", + "package": "📦", + "page_facing_up": "📄", + "page_with_curl": "📃", + "pager": "📟", + "paintbrush": "🖌", + "palm_tree": "🌴", + "palms_up_together": "🤲", + "palms_up_together_dark_skin_tone": "🤲ðŸ¿", + "palms_up_together_light_skin_tone": "🤲ðŸ»", + "palms_up_together_medium-dark_skin_tone": "🤲ðŸ¾", + "palms_up_together_medium-light_skin_tone": "🤲ðŸ¼", + "palms_up_together_medium_skin_tone": "🤲ðŸ½", + "pancakes": "🥞", + "panda_face": "ðŸ¼", + "paperclip": "📎", + "parrot": "🦜", + "part_alternation_mark": "〽", + "party_popper": "🎉", + "partying_face": "🥳", + "passenger_ship": "🛳", + "passport_control": "🛂", + "pause_button": "â¸", + "paw_prints": "ðŸ¾", + "peace_symbol": "☮", + "peach": "ðŸ‘", + "peacock": "🦚", + "peanuts": "🥜", + "pear": "ðŸ", + "pen": "🖊", + "pencil": "ðŸ“", + "penguin": "ðŸ§", + "pensive_face": "😔", + "people_holding_hands": "🧑\u200dðŸ¤\u200d🧑", + "people_with_bunny_ears": "👯", + "people_wrestling": "🤼", + "performing_arts": "🎭", + "persevering_face": "😣", + "person_biking": "🚴", + "person_biking_dark_skin_tone": "🚴ðŸ¿", + "person_biking_light_skin_tone": "🚴ðŸ»", + "person_biking_medium-dark_skin_tone": "🚴ðŸ¾", + "person_biking_medium-light_skin_tone": "🚴ðŸ¼", + "person_biking_medium_skin_tone": "🚴ðŸ½", + "person_bouncing_ball": "⛹", + "person_bouncing_ball_dark_skin_tone": "⛹ðŸ¿", + "person_bouncing_ball_light_skin_tone": "⛹ðŸ»", + "person_bouncing_ball_medium-dark_skin_tone": "⛹ðŸ¾", + "person_bouncing_ball_medium-light_skin_tone": "⛹ðŸ¼", + "person_bouncing_ball_medium_skin_tone": "⛹ðŸ½", + "person_bowing": "🙇", + "person_bowing_dark_skin_tone": "🙇ðŸ¿", + "person_bowing_light_skin_tone": "🙇ðŸ»", + "person_bowing_medium-dark_skin_tone": "🙇ðŸ¾", + "person_bowing_medium-light_skin_tone": "🙇ðŸ¼", + "person_bowing_medium_skin_tone": "🙇ðŸ½", + "person_cartwheeling": "🤸", + "person_cartwheeling_dark_skin_tone": "🤸ðŸ¿", + "person_cartwheeling_light_skin_tone": "🤸ðŸ»", + "person_cartwheeling_medium-dark_skin_tone": "🤸ðŸ¾", + "person_cartwheeling_medium-light_skin_tone": "🤸ðŸ¼", + "person_cartwheeling_medium_skin_tone": "🤸ðŸ½", + "person_climbing": "🧗", + "person_climbing_dark_skin_tone": "🧗ðŸ¿", + "person_climbing_light_skin_tone": "🧗ðŸ»", + "person_climbing_medium-dark_skin_tone": "🧗ðŸ¾", + "person_climbing_medium-light_skin_tone": "🧗ðŸ¼", + "person_climbing_medium_skin_tone": "🧗ðŸ½", + "person_facepalming": "🤦", + "person_facepalming_dark_skin_tone": "🤦ðŸ¿", + "person_facepalming_light_skin_tone": "🤦ðŸ»", + "person_facepalming_medium-dark_skin_tone": "🤦ðŸ¾", + "person_facepalming_medium-light_skin_tone": "🤦ðŸ¼", + "person_facepalming_medium_skin_tone": "🤦ðŸ½", + "person_fencing": "🤺", + "person_frowning": "ðŸ™", + "person_frowning_dark_skin_tone": "ðŸ™ðŸ¿", + "person_frowning_light_skin_tone": "ðŸ™ðŸ»", + "person_frowning_medium-dark_skin_tone": "ðŸ™ðŸ¾", + "person_frowning_medium-light_skin_tone": "ðŸ™ðŸ¼", + "person_frowning_medium_skin_tone": "ðŸ™ðŸ½", + "person_gesturing_no": "🙅", + "person_gesturing_no_dark_skin_tone": "🙅ðŸ¿", + "person_gesturing_no_light_skin_tone": "🙅ðŸ»", + "person_gesturing_no_medium-dark_skin_tone": "🙅ðŸ¾", + "person_gesturing_no_medium-light_skin_tone": "🙅ðŸ¼", + "person_gesturing_no_medium_skin_tone": "🙅ðŸ½", + "person_gesturing_ok": "🙆", + "person_gesturing_ok_dark_skin_tone": "🙆ðŸ¿", + "person_gesturing_ok_light_skin_tone": "🙆ðŸ»", + "person_gesturing_ok_medium-dark_skin_tone": "🙆ðŸ¾", + "person_gesturing_ok_medium-light_skin_tone": "🙆ðŸ¼", + "person_gesturing_ok_medium_skin_tone": "🙆ðŸ½", + "person_getting_haircut": "💇", + "person_getting_haircut_dark_skin_tone": "💇ðŸ¿", + "person_getting_haircut_light_skin_tone": "💇ðŸ»", + "person_getting_haircut_medium-dark_skin_tone": "💇ðŸ¾", + "person_getting_haircut_medium-light_skin_tone": "💇ðŸ¼", + "person_getting_haircut_medium_skin_tone": "💇ðŸ½", + "person_getting_massage": "💆", + "person_getting_massage_dark_skin_tone": "💆ðŸ¿", + "person_getting_massage_light_skin_tone": "💆ðŸ»", + "person_getting_massage_medium-dark_skin_tone": "💆ðŸ¾", + "person_getting_massage_medium-light_skin_tone": "💆ðŸ¼", + "person_getting_massage_medium_skin_tone": "💆ðŸ½", + "person_golfing": "ðŸŒ", + "person_golfing_dark_skin_tone": "ðŸŒðŸ¿", + "person_golfing_light_skin_tone": "ðŸŒðŸ»", + "person_golfing_medium-dark_skin_tone": "ðŸŒðŸ¾", + "person_golfing_medium-light_skin_tone": "ðŸŒðŸ¼", + "person_golfing_medium_skin_tone": "ðŸŒðŸ½", + "person_in_bed": "🛌", + "person_in_bed_dark_skin_tone": "🛌ðŸ¿", + "person_in_bed_light_skin_tone": "🛌ðŸ»", + "person_in_bed_medium-dark_skin_tone": "🛌ðŸ¾", + "person_in_bed_medium-light_skin_tone": "🛌ðŸ¼", + "person_in_bed_medium_skin_tone": "🛌ðŸ½", + "person_in_lotus_position": "🧘", + "person_in_lotus_position_dark_skin_tone": "🧘ðŸ¿", + "person_in_lotus_position_light_skin_tone": "🧘ðŸ»", + "person_in_lotus_position_medium-dark_skin_tone": "🧘ðŸ¾", + "person_in_lotus_position_medium-light_skin_tone": "🧘ðŸ¼", + "person_in_lotus_position_medium_skin_tone": "🧘ðŸ½", + "person_in_steamy_room": "🧖", + "person_in_steamy_room_dark_skin_tone": "🧖ðŸ¿", + "person_in_steamy_room_light_skin_tone": "🧖ðŸ»", + "person_in_steamy_room_medium-dark_skin_tone": "🧖ðŸ¾", + "person_in_steamy_room_medium-light_skin_tone": "🧖ðŸ¼", + "person_in_steamy_room_medium_skin_tone": "🧖ðŸ½", + "person_juggling": "🤹", + "person_juggling_dark_skin_tone": "🤹ðŸ¿", + "person_juggling_light_skin_tone": "🤹ðŸ»", + "person_juggling_medium-dark_skin_tone": "🤹ðŸ¾", + "person_juggling_medium-light_skin_tone": "🤹ðŸ¼", + "person_juggling_medium_skin_tone": "🤹ðŸ½", + "person_kneeling": "🧎", + "person_lifting_weights": "ðŸ‹", + "person_lifting_weights_dark_skin_tone": "ðŸ‹ðŸ¿", + "person_lifting_weights_light_skin_tone": "ðŸ‹ðŸ»", + "person_lifting_weights_medium-dark_skin_tone": "ðŸ‹ðŸ¾", + "person_lifting_weights_medium-light_skin_tone": "ðŸ‹ðŸ¼", + "person_lifting_weights_medium_skin_tone": "ðŸ‹ðŸ½", + "person_mountain_biking": "🚵", + "person_mountain_biking_dark_skin_tone": "🚵ðŸ¿", + "person_mountain_biking_light_skin_tone": "🚵ðŸ»", + "person_mountain_biking_medium-dark_skin_tone": "🚵ðŸ¾", + "person_mountain_biking_medium-light_skin_tone": "🚵ðŸ¼", + "person_mountain_biking_medium_skin_tone": "🚵ðŸ½", + "person_playing_handball": "🤾", + "person_playing_handball_dark_skin_tone": "🤾ðŸ¿", + "person_playing_handball_light_skin_tone": "🤾ðŸ»", + "person_playing_handball_medium-dark_skin_tone": "🤾ðŸ¾", + "person_playing_handball_medium-light_skin_tone": "🤾ðŸ¼", + "person_playing_handball_medium_skin_tone": "🤾ðŸ½", + "person_playing_water_polo": "🤽", + "person_playing_water_polo_dark_skin_tone": "🤽ðŸ¿", + "person_playing_water_polo_light_skin_tone": "🤽ðŸ»", + "person_playing_water_polo_medium-dark_skin_tone": "🤽ðŸ¾", + "person_playing_water_polo_medium-light_skin_tone": "🤽ðŸ¼", + "person_playing_water_polo_medium_skin_tone": "🤽ðŸ½", + "person_pouting": "🙎", + "person_pouting_dark_skin_tone": "🙎ðŸ¿", + "person_pouting_light_skin_tone": "🙎ðŸ»", + "person_pouting_medium-dark_skin_tone": "🙎ðŸ¾", + "person_pouting_medium-light_skin_tone": "🙎ðŸ¼", + "person_pouting_medium_skin_tone": "🙎ðŸ½", + "person_raising_hand": "🙋", + "person_raising_hand_dark_skin_tone": "🙋ðŸ¿", + "person_raising_hand_light_skin_tone": "🙋ðŸ»", + "person_raising_hand_medium-dark_skin_tone": "🙋ðŸ¾", + "person_raising_hand_medium-light_skin_tone": "🙋ðŸ¼", + "person_raising_hand_medium_skin_tone": "🙋ðŸ½", + "person_rowing_boat": "🚣", + "person_rowing_boat_dark_skin_tone": "🚣ðŸ¿", + "person_rowing_boat_light_skin_tone": "🚣ðŸ»", + "person_rowing_boat_medium-dark_skin_tone": "🚣ðŸ¾", + "person_rowing_boat_medium-light_skin_tone": "🚣ðŸ¼", + "person_rowing_boat_medium_skin_tone": "🚣ðŸ½", + "person_running": "ðŸƒ", + "person_running_dark_skin_tone": "ðŸƒðŸ¿", + "person_running_light_skin_tone": "ðŸƒðŸ»", + "person_running_medium-dark_skin_tone": "ðŸƒðŸ¾", + "person_running_medium-light_skin_tone": "ðŸƒðŸ¼", + "person_running_medium_skin_tone": "ðŸƒðŸ½", + "person_shrugging": "🤷", + "person_shrugging_dark_skin_tone": "🤷ðŸ¿", + "person_shrugging_light_skin_tone": "🤷ðŸ»", + "person_shrugging_medium-dark_skin_tone": "🤷ðŸ¾", + "person_shrugging_medium-light_skin_tone": "🤷ðŸ¼", + "person_shrugging_medium_skin_tone": "🤷ðŸ½", + "person_standing": "ðŸ§", + "person_surfing": "ðŸ„", + "person_surfing_dark_skin_tone": "ðŸ„ðŸ¿", + "person_surfing_light_skin_tone": "ðŸ„ðŸ»", + "person_surfing_medium-dark_skin_tone": "ðŸ„ðŸ¾", + "person_surfing_medium-light_skin_tone": "ðŸ„ðŸ¼", + "person_surfing_medium_skin_tone": "ðŸ„ðŸ½", + "person_swimming": "ðŸŠ", + "person_swimming_dark_skin_tone": "ðŸŠðŸ¿", + "person_swimming_light_skin_tone": "ðŸŠðŸ»", + "person_swimming_medium-dark_skin_tone": "ðŸŠðŸ¾", + "person_swimming_medium-light_skin_tone": "ðŸŠðŸ¼", + "person_swimming_medium_skin_tone": "ðŸŠðŸ½", + "person_taking_bath": "🛀", + "person_taking_bath_dark_skin_tone": "🛀ðŸ¿", + "person_taking_bath_light_skin_tone": "🛀ðŸ»", + "person_taking_bath_medium-dark_skin_tone": "🛀ðŸ¾", + "person_taking_bath_medium-light_skin_tone": "🛀ðŸ¼", + "person_taking_bath_medium_skin_tone": "🛀ðŸ½", + "person_tipping_hand": "ðŸ’", + "person_tipping_hand_dark_skin_tone": "ðŸ’ðŸ¿", + "person_tipping_hand_light_skin_tone": "ðŸ’ðŸ»", + "person_tipping_hand_medium-dark_skin_tone": "ðŸ’ðŸ¾", + "person_tipping_hand_medium-light_skin_tone": "ðŸ’ðŸ¼", + "person_tipping_hand_medium_skin_tone": "ðŸ’ðŸ½", + "person_walking": "🚶", + "person_walking_dark_skin_tone": "🚶ðŸ¿", + "person_walking_light_skin_tone": "🚶ðŸ»", + "person_walking_medium-dark_skin_tone": "🚶ðŸ¾", + "person_walking_medium-light_skin_tone": "🚶ðŸ¼", + "person_walking_medium_skin_tone": "🚶ðŸ½", + "person_wearing_turban": "👳", + "person_wearing_turban_dark_skin_tone": "👳ðŸ¿", + "person_wearing_turban_light_skin_tone": "👳ðŸ»", + "person_wearing_turban_medium-dark_skin_tone": "👳ðŸ¾", + "person_wearing_turban_medium-light_skin_tone": "👳ðŸ¼", + "person_wearing_turban_medium_skin_tone": "👳ðŸ½", + "petri_dish": "🧫", + "pick": "â›", + "pie": "🥧", + "pig": "ðŸ·", + "pig_face": "ðŸ·", + "pig_nose": "ðŸ½", + "pile_of_poo": "💩", + "pill": "💊", + "pinching_hand": "ðŸ¤", + "pine_decoration": "ðŸŽ", + "pineapple": "ðŸ", + "ping_pong": "ðŸ“", + "pirate_flag": "ðŸ´\u200d☠ï¸", + "pistol": "🔫", + "pizza": "ðŸ•", + "place_of_worship": "ðŸ›", + "play_button": "â–¶", + "play_or_pause_button": "â¯", + "pleading_face": "🥺", + "police_car": "🚓", + "police_car_light": "🚨", + "police_officer": "👮", + "police_officer_dark_skin_tone": "👮ðŸ¿", + "police_officer_light_skin_tone": "👮ðŸ»", + "police_officer_medium-dark_skin_tone": "👮ðŸ¾", + "police_officer_medium-light_skin_tone": "👮ðŸ¼", + "police_officer_medium_skin_tone": "👮ðŸ½", + "poodle": "ðŸ©", + "pool_8_ball": "🎱", + "popcorn": "ðŸ¿", + "post_office": "ðŸ£", + "postal_horn": "📯", + "postbox": "📮", + "pot_of_food": "ðŸ²", + "potable_water": "🚰", + "potato": "🥔", + "poultry_leg": "ðŸ—", + "pound_banknote": "💷", + "pouting_cat_face": "😾", + "pouting_face": "😡", + "prayer_beads": "📿", + "pregnant_woman": "🤰", + "pregnant_woman_dark_skin_tone": "🤰ðŸ¿", + "pregnant_woman_light_skin_tone": "🤰ðŸ»", + "pregnant_woman_medium-dark_skin_tone": "🤰ðŸ¾", + "pregnant_woman_medium-light_skin_tone": "🤰ðŸ¼", + "pregnant_woman_medium_skin_tone": "🤰ðŸ½", + "pretzel": "🥨", + "probing_cane": "🦯", + "prince": "🤴", + "prince_dark_skin_tone": "🤴ðŸ¿", + "prince_light_skin_tone": "🤴ðŸ»", + "prince_medium-dark_skin_tone": "🤴ðŸ¾", + "prince_medium-light_skin_tone": "🤴ðŸ¼", + "prince_medium_skin_tone": "🤴ðŸ½", + "princess": "👸", + "princess_dark_skin_tone": "👸ðŸ¿", + "princess_light_skin_tone": "👸ðŸ»", + "princess_medium-dark_skin_tone": "👸ðŸ¾", + "princess_medium-light_skin_tone": "👸ðŸ¼", + "princess_medium_skin_tone": "👸ðŸ½", + "printer": "🖨", + "prohibited": "🚫", + "purple_circle": "🟣", + "purple_heart": "💜", + "purple_square": "🟪", + "purse": "👛", + "pushpin": "📌", + "question_mark": "â“", + "rabbit": "ðŸ°", + "rabbit_face": "ðŸ°", + "raccoon": "ðŸ¦", + "racing_car": "ðŸŽ", + "radio": "📻", + "radio_button": "🔘", + "radioactive": "☢", + "railway_car": "🚃", + "railway_track": "🛤", + "rainbow": "🌈", + "rainbow_flag": "ðŸ³ï¸\u200d🌈", + "raised_back_of_hand": "🤚", + "raised_back_of_hand_dark_skin_tone": "🤚ðŸ¿", + "raised_back_of_hand_light_skin_tone": "🤚ðŸ»", + "raised_back_of_hand_medium-dark_skin_tone": "🤚ðŸ¾", + "raised_back_of_hand_medium-light_skin_tone": "🤚ðŸ¼", + "raised_back_of_hand_medium_skin_tone": "🤚ðŸ½", + "raised_fist": "✊", + "raised_fist_dark_skin_tone": "✊ðŸ¿", + "raised_fist_light_skin_tone": "✊ðŸ»", + "raised_fist_medium-dark_skin_tone": "✊ðŸ¾", + "raised_fist_medium-light_skin_tone": "✊ðŸ¼", + "raised_fist_medium_skin_tone": "✊ðŸ½", + "raised_hand": "✋", + "raised_hand_dark_skin_tone": "✋ðŸ¿", + "raised_hand_light_skin_tone": "✋ðŸ»", + "raised_hand_medium-dark_skin_tone": "✋ðŸ¾", + "raised_hand_medium-light_skin_tone": "✋ðŸ¼", + "raised_hand_medium_skin_tone": "✋ðŸ½", + "raising_hands": "🙌", + "raising_hands_dark_skin_tone": "🙌ðŸ¿", + "raising_hands_light_skin_tone": "🙌ðŸ»", + "raising_hands_medium-dark_skin_tone": "🙌ðŸ¾", + "raising_hands_medium-light_skin_tone": "🙌ðŸ¼", + "raising_hands_medium_skin_tone": "🙌ðŸ½", + "ram": "ðŸ", + "rat": "ðŸ€", + "razor": "🪒", + "ringed_planet": "ðŸª", + "receipt": "🧾", + "record_button": "âº", + "recycling_symbol": "â™»", + "red_apple": "ðŸŽ", + "red_circle": "🔴", + "red_envelope": "🧧", + "red_hair": "🦰", + "red-haired_man": "👨\u200d🦰", + "red-haired_woman": "👩\u200d🦰", + "red_heart": "â¤", + "red_paper_lantern": "ðŸ®", + "red_square": "🟥", + "red_triangle_pointed_down": "🔻", + "red_triangle_pointed_up": "🔺", + "registered": "®", + "relieved_face": "😌", + "reminder_ribbon": "🎗", + "repeat_button": "ðŸ”", + "repeat_single_button": "🔂", + "rescue_worker’s_helmet": "⛑", + "restroom": "🚻", + "reverse_button": "â—€", + "revolving_hearts": "💞", + "rhinoceros": "ðŸ¦", + "ribbon": "🎀", + "rice_ball": "ðŸ™", + "rice_cracker": "ðŸ˜", + "right-facing_fist": "🤜", + "right-facing_fist_dark_skin_tone": "🤜ðŸ¿", + "right-facing_fist_light_skin_tone": "🤜ðŸ»", + "right-facing_fist_medium-dark_skin_tone": "🤜ðŸ¾", + "right-facing_fist_medium-light_skin_tone": "🤜ðŸ¼", + "right-facing_fist_medium_skin_tone": "🤜ðŸ½", + "right_anger_bubble": "🗯", + "right_arrow": "âž¡", + "right_arrow_curving_down": "⤵", + "right_arrow_curving_left": "↩", + "right_arrow_curving_up": "⤴", + "ring": "ðŸ’", + "roasted_sweet_potato": "ðŸ ", + "robot_face": "🤖", + "rocket": "🚀", + "roll_of_paper": "🧻", + "rolled-up_newspaper": "🗞", + "roller_coaster": "🎢", + "rolling_on_the_floor_laughing": "🤣", + "rooster": "ðŸ“", + "rose": "🌹", + "rosette": "ðŸµ", + "round_pushpin": "ðŸ“", + "rugby_football": "ðŸ‰", + "running_shirt": "🎽", + "running_shoe": "👟", + "sad_but_relieved_face": "😥", + "safety_pin": "🧷", + "safety_vest": "🦺", + "salt": "🧂", + "sailboat": "⛵", + "sake": "ðŸ¶", + "sandwich": "🥪", + "sari": "🥻", + "satellite": "📡", + "satellite_antenna": "📡", + "sauropod": "🦕", + "saxophone": "🎷", + "scarf": "🧣", + "school": "ðŸ«", + "school_backpack": "🎒", + "scissors": "✂", + "scorpion": "🦂", + "scroll": "📜", + "seat": "💺", + "see-no-evil_monkey": "🙈", + "seedling": "🌱", + "selfie": "🤳", + "selfie_dark_skin_tone": "🤳ðŸ¿", + "selfie_light_skin_tone": "🤳ðŸ»", + "selfie_medium-dark_skin_tone": "🤳ðŸ¾", + "selfie_medium-light_skin_tone": "🤳ðŸ¼", + "selfie_medium_skin_tone": "🤳ðŸ½", + "service_dog": "ðŸ•\u200d🦺", + "seven-thirty": "🕢", + "seven_o’clock": "🕖", + "shallow_pan_of_food": "🥘", + "shamrock": "☘", + "shark": "🦈", + "shaved_ice": "ðŸ§", + "sheaf_of_rice": "🌾", + "shield": "🛡", + "shinto_shrine": "⛩", + "ship": "🚢", + "shooting_star": "🌠", + "shopping_bags": "ðŸ›", + "shopping_cart": "🛒", + "shortcake": "ðŸ°", + "shorts": "🩳", + "shower": "🚿", + "shrimp": "ðŸ¦", + "shuffle_tracks_button": "🔀", + "shushing_face": "🤫", + "sign_of_the_horns": "🤘", + "sign_of_the_horns_dark_skin_tone": "🤘ðŸ¿", + "sign_of_the_horns_light_skin_tone": "🤘ðŸ»", + "sign_of_the_horns_medium-dark_skin_tone": "🤘ðŸ¾", + "sign_of_the_horns_medium-light_skin_tone": "🤘ðŸ¼", + "sign_of_the_horns_medium_skin_tone": "🤘ðŸ½", + "six-thirty": "🕡", + "six_o’clock": "🕕", + "skateboard": "🛹", + "skier": "â›·", + "skis": "🎿", + "skull": "💀", + "skull_and_crossbones": "☠", + "skunk": "🦨", + "sled": "🛷", + "sleeping_face": "😴", + "sleepy_face": "😪", + "slightly_frowning_face": "ðŸ™", + "slightly_smiling_face": "🙂", + "slot_machine": "🎰", + "sloth": "🦥", + "small_airplane": "🛩", + "small_blue_diamond": "🔹", + "small_orange_diamond": "🔸", + "smiling_cat_face_with_heart-eyes": "😻", + "smiling_face": "☺", + "smiling_face_with_halo": "😇", + "smiling_face_with_3_hearts": "🥰", + "smiling_face_with_heart-eyes": "ðŸ˜", + "smiling_face_with_horns": "😈", + "smiling_face_with_smiling_eyes": "😊", + "smiling_face_with_sunglasses": "😎", + "smirking_face": "ðŸ˜", + "snail": "ðŸŒ", + "snake": "ðŸ", + "sneezing_face": "🤧", + "snow-capped_mountain": "ðŸ”", + "snowboarder": "ðŸ‚", + "snowboarder_dark_skin_tone": "ðŸ‚ðŸ¿", + "snowboarder_light_skin_tone": "ðŸ‚ðŸ»", + "snowboarder_medium-dark_skin_tone": "ðŸ‚ðŸ¾", + "snowboarder_medium-light_skin_tone": "ðŸ‚ðŸ¼", + "snowboarder_medium_skin_tone": "ðŸ‚ðŸ½", + "snowflake": "â„", + "snowman": "☃", + "snowman_without_snow": "⛄", + "soap": "🧼", + "soccer_ball": "âš½", + "socks": "🧦", + "softball": "🥎", + "soft_ice_cream": "ðŸ¦", + "spade_suit": "â™ ", + "spaghetti": "ðŸ", + "sparkle": "â‡", + "sparkler": "🎇", + "sparkles": "✨", + "sparkling_heart": "💖", + "speak-no-evil_monkey": "🙊", + "speaker_high_volume": "🔊", + "speaker_low_volume": "🔈", + "speaker_medium_volume": "🔉", + "speaking_head": "🗣", + "speech_balloon": "💬", + "speedboat": "🚤", + "spider": "🕷", + "spider_web": "🕸", + "spiral_calendar": "🗓", + "spiral_notepad": "🗒", + "spiral_shell": "ðŸš", + "spoon": "🥄", + "sponge": "🧽", + "sport_utility_vehicle": "🚙", + "sports_medal": "ðŸ…", + "spouting_whale": "ðŸ³", + "squid": "🦑", + "squinting_face_with_tongue": "ðŸ˜", + "stadium": "ðŸŸ", + "star-struck": "🤩", + "star_and_crescent": "☪", + "star_of_david": "✡", + "station": "🚉", + "steaming_bowl": "ðŸœ", + "stethoscope": "🩺", + "stop_button": "â¹", + "stop_sign": "🛑", + "stopwatch": "â±", + "straight_ruler": "ðŸ“", + "strawberry": "ðŸ“", + "studio_microphone": "🎙", + "stuffed_flatbread": "🥙", + "sun": "☀", + "sun_behind_cloud": "â›…", + "sun_behind_large_cloud": "🌥", + "sun_behind_rain_cloud": "🌦", + "sun_behind_small_cloud": "🌤", + "sun_with_face": "🌞", + "sunflower": "🌻", + "sunglasses": "😎", + "sunrise": "🌅", + "sunrise_over_mountains": "🌄", + "sunset": "🌇", + "superhero": "🦸", + "supervillain": "🦹", + "sushi": "ðŸ£", + "suspension_railway": "🚟", + "swan": "🦢", + "sweat_droplets": "💦", + "synagogue": "ðŸ•", + "syringe": "💉", + "t-shirt": "👕", + "taco": "🌮", + "takeout_box": "🥡", + "tanabata_tree": "🎋", + "tangerine": "ðŸŠ", + "taxi": "🚕", + "teacup_without_handle": "ðŸµ", + "tear-off_calendar": "📆", + "teddy_bear": "🧸", + "telephone": "☎", + "telephone_receiver": "📞", + "telescope": "🔭", + "television": "📺", + "ten-thirty": "🕥", + "ten_o’clock": "🕙", + "tennis": "🎾", + "tent": "⛺", + "test_tube": "🧪", + "thermometer": "🌡", + "thinking_face": "🤔", + "thought_balloon": "💭", + "thread": "🧵", + "three-thirty": "🕞", + "three_o’clock": "🕒", + "thumbs_down": "👎", + "thumbs_down_dark_skin_tone": "👎ðŸ¿", + "thumbs_down_light_skin_tone": "👎ðŸ»", + "thumbs_down_medium-dark_skin_tone": "👎ðŸ¾", + "thumbs_down_medium-light_skin_tone": "👎ðŸ¼", + "thumbs_down_medium_skin_tone": "👎ðŸ½", + "thumbs_up": "ðŸ‘", + "thumbs_up_dark_skin_tone": "ðŸ‘ðŸ¿", + "thumbs_up_light_skin_tone": "ðŸ‘ðŸ»", + "thumbs_up_medium-dark_skin_tone": "ðŸ‘ðŸ¾", + "thumbs_up_medium-light_skin_tone": "ðŸ‘ðŸ¼", + "thumbs_up_medium_skin_tone": "ðŸ‘ðŸ½", + "ticket": "🎫", + "tiger": "ðŸ¯", + "tiger_face": "ðŸ¯", + "timer_clock": "â²", + "tired_face": "😫", + "toolbox": "🧰", + "toilet": "🚽", + "tomato": "ðŸ…", + "tongue": "👅", + "tooth": "🦷", + "top_hat": "🎩", + "tornado": "🌪", + "trackball": "🖲", + "tractor": "🚜", + "trade_mark": "â„¢", + "train": "🚋", + "tram": "🚊", + "tram_car": "🚋", + "triangular_flag": "🚩", + "triangular_ruler": "ðŸ“", + "trident_emblem": "🔱", + "trolleybus": "🚎", + "trophy": "ðŸ†", + "tropical_drink": "ðŸ¹", + "tropical_fish": "ðŸ ", + "trumpet": "🎺", + "tulip": "🌷", + "tumbler_glass": "🥃", + "turtle": "ðŸ¢", + "twelve-thirty": "🕧", + "twelve_o’clock": "🕛", + "two-hump_camel": "ðŸ«", + "two-thirty": "ðŸ•", + "two_hearts": "💕", + "two_men_holding_hands": "👬", + "two_o’clock": "🕑", + "two_women_holding_hands": "👭", + "umbrella": "☂", + "umbrella_on_ground": "â›±", + "umbrella_with_rain_drops": "☔", + "unamused_face": "😒", + "unicorn_face": "🦄", + "unlocked": "🔓", + "up-down_arrow": "↕", + "up-left_arrow": "↖", + "up-right_arrow": "↗", + "up_arrow": "⬆", + "upside-down_face": "🙃", + "upwards_button": "🔼", + "vampire": "🧛", + "vampire_dark_skin_tone": "🧛ðŸ¿", + "vampire_light_skin_tone": "🧛ðŸ»", + "vampire_medium-dark_skin_tone": "🧛ðŸ¾", + "vampire_medium-light_skin_tone": "🧛ðŸ¼", + "vampire_medium_skin_tone": "🧛ðŸ½", + "vertical_traffic_light": "🚦", + "vibration_mode": "📳", + "victory_hand": "✌", + "victory_hand_dark_skin_tone": "✌ðŸ¿", + "victory_hand_light_skin_tone": "✌ðŸ»", + "victory_hand_medium-dark_skin_tone": "✌ðŸ¾", + "victory_hand_medium-light_skin_tone": "✌ðŸ¼", + "victory_hand_medium_skin_tone": "✌ðŸ½", + "video_camera": "📹", + "video_game": "🎮", + "videocassette": "📼", + "violin": "🎻", + "volcano": "🌋", + "volleyball": "ðŸ", + "vulcan_salute": "🖖", + "vulcan_salute_dark_skin_tone": "🖖ðŸ¿", + "vulcan_salute_light_skin_tone": "🖖ðŸ»", + "vulcan_salute_medium-dark_skin_tone": "🖖ðŸ¾", + "vulcan_salute_medium-light_skin_tone": "🖖ðŸ¼", + "vulcan_salute_medium_skin_tone": "🖖ðŸ½", + "waffle": "🧇", + "waning_crescent_moon": "🌘", + "waning_gibbous_moon": "🌖", + "warning": "âš ", + "wastebasket": "🗑", + "watch": "⌚", + "water_buffalo": "ðŸƒ", + "water_closet": "🚾", + "water_wave": "🌊", + "watermelon": "ðŸ‰", + "waving_hand": "👋", + "waving_hand_dark_skin_tone": "👋ðŸ¿", + "waving_hand_light_skin_tone": "👋ðŸ»", + "waving_hand_medium-dark_skin_tone": "👋ðŸ¾", + "waving_hand_medium-light_skin_tone": "👋ðŸ¼", + "waving_hand_medium_skin_tone": "👋ðŸ½", + "wavy_dash": "〰", + "waxing_crescent_moon": "🌒", + "waxing_gibbous_moon": "🌔", + "weary_cat_face": "🙀", + "weary_face": "😩", + "wedding": "💒", + "whale": "ðŸ³", + "wheel_of_dharma": "☸", + "wheelchair_symbol": "♿", + "white_circle": "⚪", + "white_exclamation_mark": "â•", + "white_flag": "ðŸ³", + "white_flower": "💮", + "white_hair": "🦳", + "white-haired_man": "👨\u200d🦳", + "white-haired_woman": "👩\u200d🦳", + "white_heart": "ðŸ¤", + "white_heavy_check_mark": "✅", + "white_large_square": "⬜", + "white_medium-small_square": "â—½", + "white_medium_square": "â—»", + "white_medium_star": "â­", + "white_question_mark": "â”", + "white_small_square": "â–«", + "white_square_button": "🔳", + "wilted_flower": "🥀", + "wind_chime": "ðŸŽ", + "wind_face": "🌬", + "wine_glass": "ðŸ·", + "winking_face": "😉", + "winking_face_with_tongue": "😜", + "wolf_face": "ðŸº", + "woman": "👩", + "woman_artist": "👩\u200d🎨", + "woman_artist_dark_skin_tone": "👩ðŸ¿\u200d🎨", + "woman_artist_light_skin_tone": "👩ðŸ»\u200d🎨", + "woman_artist_medium-dark_skin_tone": "👩ðŸ¾\u200d🎨", + "woman_artist_medium-light_skin_tone": "👩ðŸ¼\u200d🎨", + "woman_artist_medium_skin_tone": "👩ðŸ½\u200d🎨", + "woman_astronaut": "👩\u200d🚀", + "woman_astronaut_dark_skin_tone": "👩ðŸ¿\u200d🚀", + "woman_astronaut_light_skin_tone": "👩ðŸ»\u200d🚀", + "woman_astronaut_medium-dark_skin_tone": "👩ðŸ¾\u200d🚀", + "woman_astronaut_medium-light_skin_tone": "👩ðŸ¼\u200d🚀", + "woman_astronaut_medium_skin_tone": "👩ðŸ½\u200d🚀", + "woman_biking": "🚴\u200d♀ï¸", + "woman_biking_dark_skin_tone": "🚴ðŸ¿\u200d♀ï¸", + "woman_biking_light_skin_tone": "🚴ðŸ»\u200d♀ï¸", + "woman_biking_medium-dark_skin_tone": "🚴ðŸ¾\u200d♀ï¸", + "woman_biking_medium-light_skin_tone": "🚴ðŸ¼\u200d♀ï¸", + "woman_biking_medium_skin_tone": "🚴ðŸ½\u200d♀ï¸", + "woman_bouncing_ball": "⛹ï¸\u200d♀ï¸", + "woman_bouncing_ball_dark_skin_tone": "⛹ðŸ¿\u200d♀ï¸", + "woman_bouncing_ball_light_skin_tone": "⛹ðŸ»\u200d♀ï¸", + "woman_bouncing_ball_medium-dark_skin_tone": "⛹ðŸ¾\u200d♀ï¸", + "woman_bouncing_ball_medium-light_skin_tone": "⛹ðŸ¼\u200d♀ï¸", + "woman_bouncing_ball_medium_skin_tone": "⛹ðŸ½\u200d♀ï¸", + "woman_bowing": "🙇\u200d♀ï¸", + "woman_bowing_dark_skin_tone": "🙇ðŸ¿\u200d♀ï¸", + "woman_bowing_light_skin_tone": "🙇ðŸ»\u200d♀ï¸", + "woman_bowing_medium-dark_skin_tone": "🙇ðŸ¾\u200d♀ï¸", + "woman_bowing_medium-light_skin_tone": "🙇ðŸ¼\u200d♀ï¸", + "woman_bowing_medium_skin_tone": "🙇ðŸ½\u200d♀ï¸", + "woman_cartwheeling": "🤸\u200d♀ï¸", + "woman_cartwheeling_dark_skin_tone": "🤸ðŸ¿\u200d♀ï¸", + "woman_cartwheeling_light_skin_tone": "🤸ðŸ»\u200d♀ï¸", + "woman_cartwheeling_medium-dark_skin_tone": "🤸ðŸ¾\u200d♀ï¸", + "woman_cartwheeling_medium-light_skin_tone": "🤸ðŸ¼\u200d♀ï¸", + "woman_cartwheeling_medium_skin_tone": "🤸ðŸ½\u200d♀ï¸", + "woman_climbing": "🧗\u200d♀ï¸", + "woman_climbing_dark_skin_tone": "🧗ðŸ¿\u200d♀ï¸", + "woman_climbing_light_skin_tone": "🧗ðŸ»\u200d♀ï¸", + "woman_climbing_medium-dark_skin_tone": "🧗ðŸ¾\u200d♀ï¸", + "woman_climbing_medium-light_skin_tone": "🧗ðŸ¼\u200d♀ï¸", + "woman_climbing_medium_skin_tone": "🧗ðŸ½\u200d♀ï¸", + "woman_construction_worker": "👷\u200d♀ï¸", + "woman_construction_worker_dark_skin_tone": "👷ðŸ¿\u200d♀ï¸", + "woman_construction_worker_light_skin_tone": "👷ðŸ»\u200d♀ï¸", + "woman_construction_worker_medium-dark_skin_tone": "👷ðŸ¾\u200d♀ï¸", + "woman_construction_worker_medium-light_skin_tone": "👷ðŸ¼\u200d♀ï¸", + "woman_construction_worker_medium_skin_tone": "👷ðŸ½\u200d♀ï¸", + "woman_cook": "👩\u200dðŸ³", + "woman_cook_dark_skin_tone": "👩ðŸ¿\u200dðŸ³", + "woman_cook_light_skin_tone": "👩ðŸ»\u200dðŸ³", + "woman_cook_medium-dark_skin_tone": "👩ðŸ¾\u200dðŸ³", + "woman_cook_medium-light_skin_tone": "👩ðŸ¼\u200dðŸ³", + "woman_cook_medium_skin_tone": "👩ðŸ½\u200dðŸ³", + "woman_dancing": "💃", + "woman_dancing_dark_skin_tone": "💃ðŸ¿", + "woman_dancing_light_skin_tone": "💃ðŸ»", + "woman_dancing_medium-dark_skin_tone": "💃ðŸ¾", + "woman_dancing_medium-light_skin_tone": "💃ðŸ¼", + "woman_dancing_medium_skin_tone": "💃ðŸ½", + "woman_dark_skin_tone": "👩ðŸ¿", + "woman_detective": "🕵ï¸\u200d♀ï¸", + "woman_detective_dark_skin_tone": "🕵ðŸ¿\u200d♀ï¸", + "woman_detective_light_skin_tone": "🕵ðŸ»\u200d♀ï¸", + "woman_detective_medium-dark_skin_tone": "🕵ðŸ¾\u200d♀ï¸", + "woman_detective_medium-light_skin_tone": "🕵ðŸ¼\u200d♀ï¸", + "woman_detective_medium_skin_tone": "🕵ðŸ½\u200d♀ï¸", + "woman_elf": "ðŸ§\u200d♀ï¸", + "woman_elf_dark_skin_tone": "ðŸ§ðŸ¿\u200d♀ï¸", + "woman_elf_light_skin_tone": "ðŸ§ðŸ»\u200d♀ï¸", + "woman_elf_medium-dark_skin_tone": "ðŸ§ðŸ¾\u200d♀ï¸", + "woman_elf_medium-light_skin_tone": "ðŸ§ðŸ¼\u200d♀ï¸", + "woman_elf_medium_skin_tone": "ðŸ§ðŸ½\u200d♀ï¸", + "woman_facepalming": "🤦\u200d♀ï¸", + "woman_facepalming_dark_skin_tone": "🤦ðŸ¿\u200d♀ï¸", + "woman_facepalming_light_skin_tone": "🤦ðŸ»\u200d♀ï¸", + "woman_facepalming_medium-dark_skin_tone": "🤦ðŸ¾\u200d♀ï¸", + "woman_facepalming_medium-light_skin_tone": "🤦ðŸ¼\u200d♀ï¸", + "woman_facepalming_medium_skin_tone": "🤦ðŸ½\u200d♀ï¸", + "woman_factory_worker": "👩\u200dðŸ­", + "woman_factory_worker_dark_skin_tone": "👩ðŸ¿\u200dðŸ­", + "woman_factory_worker_light_skin_tone": "👩ðŸ»\u200dðŸ­", + "woman_factory_worker_medium-dark_skin_tone": "👩ðŸ¾\u200dðŸ­", + "woman_factory_worker_medium-light_skin_tone": "👩ðŸ¼\u200dðŸ­", + "woman_factory_worker_medium_skin_tone": "👩ðŸ½\u200dðŸ­", + "woman_fairy": "🧚\u200d♀ï¸", + "woman_fairy_dark_skin_tone": "🧚ðŸ¿\u200d♀ï¸", + "woman_fairy_light_skin_tone": "🧚ðŸ»\u200d♀ï¸", + "woman_fairy_medium-dark_skin_tone": "🧚ðŸ¾\u200d♀ï¸", + "woman_fairy_medium-light_skin_tone": "🧚ðŸ¼\u200d♀ï¸", + "woman_fairy_medium_skin_tone": "🧚ðŸ½\u200d♀ï¸", + "woman_farmer": "👩\u200d🌾", + "woman_farmer_dark_skin_tone": "👩ðŸ¿\u200d🌾", + "woman_farmer_light_skin_tone": "👩ðŸ»\u200d🌾", + "woman_farmer_medium-dark_skin_tone": "👩ðŸ¾\u200d🌾", + "woman_farmer_medium-light_skin_tone": "👩ðŸ¼\u200d🌾", + "woman_farmer_medium_skin_tone": "👩ðŸ½\u200d🌾", + "woman_firefighter": "👩\u200d🚒", + "woman_firefighter_dark_skin_tone": "👩ðŸ¿\u200d🚒", + "woman_firefighter_light_skin_tone": "👩ðŸ»\u200d🚒", + "woman_firefighter_medium-dark_skin_tone": "👩ðŸ¾\u200d🚒", + "woman_firefighter_medium-light_skin_tone": "👩ðŸ¼\u200d🚒", + "woman_firefighter_medium_skin_tone": "👩ðŸ½\u200d🚒", + "woman_frowning": "ðŸ™\u200d♀ï¸", + "woman_frowning_dark_skin_tone": "ðŸ™ðŸ¿\u200d♀ï¸", + "woman_frowning_light_skin_tone": "ðŸ™ðŸ»\u200d♀ï¸", + "woman_frowning_medium-dark_skin_tone": "ðŸ™ðŸ¾\u200d♀ï¸", + "woman_frowning_medium-light_skin_tone": "ðŸ™ðŸ¼\u200d♀ï¸", + "woman_frowning_medium_skin_tone": "ðŸ™ðŸ½\u200d♀ï¸", + "woman_genie": "🧞\u200d♀ï¸", + "woman_gesturing_no": "🙅\u200d♀ï¸", + "woman_gesturing_no_dark_skin_tone": "🙅ðŸ¿\u200d♀ï¸", + "woman_gesturing_no_light_skin_tone": "🙅ðŸ»\u200d♀ï¸", + "woman_gesturing_no_medium-dark_skin_tone": "🙅ðŸ¾\u200d♀ï¸", + "woman_gesturing_no_medium-light_skin_tone": "🙅ðŸ¼\u200d♀ï¸", + "woman_gesturing_no_medium_skin_tone": "🙅ðŸ½\u200d♀ï¸", + "woman_gesturing_ok": "🙆\u200d♀ï¸", + "woman_gesturing_ok_dark_skin_tone": "🙆ðŸ¿\u200d♀ï¸", + "woman_gesturing_ok_light_skin_tone": "🙆ðŸ»\u200d♀ï¸", + "woman_gesturing_ok_medium-dark_skin_tone": "🙆ðŸ¾\u200d♀ï¸", + "woman_gesturing_ok_medium-light_skin_tone": "🙆ðŸ¼\u200d♀ï¸", + "woman_gesturing_ok_medium_skin_tone": "🙆ðŸ½\u200d♀ï¸", + "woman_getting_haircut": "💇\u200d♀ï¸", + "woman_getting_haircut_dark_skin_tone": "💇ðŸ¿\u200d♀ï¸", + "woman_getting_haircut_light_skin_tone": "💇ðŸ»\u200d♀ï¸", + "woman_getting_haircut_medium-dark_skin_tone": "💇ðŸ¾\u200d♀ï¸", + "woman_getting_haircut_medium-light_skin_tone": "💇ðŸ¼\u200d♀ï¸", + "woman_getting_haircut_medium_skin_tone": "💇ðŸ½\u200d♀ï¸", + "woman_getting_massage": "💆\u200d♀ï¸", + "woman_getting_massage_dark_skin_tone": "💆ðŸ¿\u200d♀ï¸", + "woman_getting_massage_light_skin_tone": "💆ðŸ»\u200d♀ï¸", + "woman_getting_massage_medium-dark_skin_tone": "💆ðŸ¾\u200d♀ï¸", + "woman_getting_massage_medium-light_skin_tone": "💆ðŸ¼\u200d♀ï¸", + "woman_getting_massage_medium_skin_tone": "💆ðŸ½\u200d♀ï¸", + "woman_golfing": "ðŸŒï¸\u200d♀ï¸", + "woman_golfing_dark_skin_tone": "ðŸŒðŸ¿\u200d♀ï¸", + "woman_golfing_light_skin_tone": "ðŸŒðŸ»\u200d♀ï¸", + "woman_golfing_medium-dark_skin_tone": "ðŸŒðŸ¾\u200d♀ï¸", + "woman_golfing_medium-light_skin_tone": "ðŸŒðŸ¼\u200d♀ï¸", + "woman_golfing_medium_skin_tone": "ðŸŒðŸ½\u200d♀ï¸", + "woman_guard": "💂\u200d♀ï¸", + "woman_guard_dark_skin_tone": "💂ðŸ¿\u200d♀ï¸", + "woman_guard_light_skin_tone": "💂ðŸ»\u200d♀ï¸", + "woman_guard_medium-dark_skin_tone": "💂ðŸ¾\u200d♀ï¸", + "woman_guard_medium-light_skin_tone": "💂ðŸ¼\u200d♀ï¸", + "woman_guard_medium_skin_tone": "💂ðŸ½\u200d♀ï¸", + "woman_health_worker": "👩\u200dâš•ï¸", + "woman_health_worker_dark_skin_tone": "👩ðŸ¿\u200dâš•ï¸", + "woman_health_worker_light_skin_tone": "👩ðŸ»\u200dâš•ï¸", + "woman_health_worker_medium-dark_skin_tone": "👩ðŸ¾\u200dâš•ï¸", + "woman_health_worker_medium-light_skin_tone": "👩ðŸ¼\u200dâš•ï¸", + "woman_health_worker_medium_skin_tone": "👩ðŸ½\u200dâš•ï¸", + "woman_in_lotus_position": "🧘\u200d♀ï¸", + "woman_in_lotus_position_dark_skin_tone": "🧘ðŸ¿\u200d♀ï¸", + "woman_in_lotus_position_light_skin_tone": "🧘ðŸ»\u200d♀ï¸", + "woman_in_lotus_position_medium-dark_skin_tone": "🧘ðŸ¾\u200d♀ï¸", + "woman_in_lotus_position_medium-light_skin_tone": "🧘ðŸ¼\u200d♀ï¸", + "woman_in_lotus_position_medium_skin_tone": "🧘ðŸ½\u200d♀ï¸", + "woman_in_manual_wheelchair": "👩\u200d🦽", + "woman_in_motorized_wheelchair": "👩\u200d🦼", + "woman_in_steamy_room": "🧖\u200d♀ï¸", + "woman_in_steamy_room_dark_skin_tone": "🧖ðŸ¿\u200d♀ï¸", + "woman_in_steamy_room_light_skin_tone": "🧖ðŸ»\u200d♀ï¸", + "woman_in_steamy_room_medium-dark_skin_tone": "🧖ðŸ¾\u200d♀ï¸", + "woman_in_steamy_room_medium-light_skin_tone": "🧖ðŸ¼\u200d♀ï¸", + "woman_in_steamy_room_medium_skin_tone": "🧖ðŸ½\u200d♀ï¸", + "woman_judge": "👩\u200dâš–ï¸", + "woman_judge_dark_skin_tone": "👩ðŸ¿\u200dâš–ï¸", + "woman_judge_light_skin_tone": "👩ðŸ»\u200dâš–ï¸", + "woman_judge_medium-dark_skin_tone": "👩ðŸ¾\u200dâš–ï¸", + "woman_judge_medium-light_skin_tone": "👩ðŸ¼\u200dâš–ï¸", + "woman_judge_medium_skin_tone": "👩ðŸ½\u200dâš–ï¸", + "woman_juggling": "🤹\u200d♀ï¸", + "woman_juggling_dark_skin_tone": "🤹ðŸ¿\u200d♀ï¸", + "woman_juggling_light_skin_tone": "🤹ðŸ»\u200d♀ï¸", + "woman_juggling_medium-dark_skin_tone": "🤹ðŸ¾\u200d♀ï¸", + "woman_juggling_medium-light_skin_tone": "🤹ðŸ¼\u200d♀ï¸", + "woman_juggling_medium_skin_tone": "🤹ðŸ½\u200d♀ï¸", + "woman_lifting_weights": "ðŸ‹ï¸\u200d♀ï¸", + "woman_lifting_weights_dark_skin_tone": "ðŸ‹ðŸ¿\u200d♀ï¸", + "woman_lifting_weights_light_skin_tone": "ðŸ‹ðŸ»\u200d♀ï¸", + "woman_lifting_weights_medium-dark_skin_tone": "ðŸ‹ðŸ¾\u200d♀ï¸", + "woman_lifting_weights_medium-light_skin_tone": "ðŸ‹ðŸ¼\u200d♀ï¸", + "woman_lifting_weights_medium_skin_tone": "ðŸ‹ðŸ½\u200d♀ï¸", + "woman_light_skin_tone": "👩ðŸ»", + "woman_mage": "🧙\u200d♀ï¸", + "woman_mage_dark_skin_tone": "🧙ðŸ¿\u200d♀ï¸", + "woman_mage_light_skin_tone": "🧙ðŸ»\u200d♀ï¸", + "woman_mage_medium-dark_skin_tone": "🧙ðŸ¾\u200d♀ï¸", + "woman_mage_medium-light_skin_tone": "🧙ðŸ¼\u200d♀ï¸", + "woman_mage_medium_skin_tone": "🧙ðŸ½\u200d♀ï¸", + "woman_mechanic": "👩\u200d🔧", + "woman_mechanic_dark_skin_tone": "👩ðŸ¿\u200d🔧", + "woman_mechanic_light_skin_tone": "👩ðŸ»\u200d🔧", + "woman_mechanic_medium-dark_skin_tone": "👩ðŸ¾\u200d🔧", + "woman_mechanic_medium-light_skin_tone": "👩ðŸ¼\u200d🔧", + "woman_mechanic_medium_skin_tone": "👩ðŸ½\u200d🔧", + "woman_medium-dark_skin_tone": "👩ðŸ¾", + "woman_medium-light_skin_tone": "👩ðŸ¼", + "woman_medium_skin_tone": "👩ðŸ½", + "woman_mountain_biking": "🚵\u200d♀ï¸", + "woman_mountain_biking_dark_skin_tone": "🚵ðŸ¿\u200d♀ï¸", + "woman_mountain_biking_light_skin_tone": "🚵ðŸ»\u200d♀ï¸", + "woman_mountain_biking_medium-dark_skin_tone": "🚵ðŸ¾\u200d♀ï¸", + "woman_mountain_biking_medium-light_skin_tone": "🚵ðŸ¼\u200d♀ï¸", + "woman_mountain_biking_medium_skin_tone": "🚵ðŸ½\u200d♀ï¸", + "woman_office_worker": "👩\u200d💼", + "woman_office_worker_dark_skin_tone": "👩ðŸ¿\u200d💼", + "woman_office_worker_light_skin_tone": "👩ðŸ»\u200d💼", + "woman_office_worker_medium-dark_skin_tone": "👩ðŸ¾\u200d💼", + "woman_office_worker_medium-light_skin_tone": "👩ðŸ¼\u200d💼", + "woman_office_worker_medium_skin_tone": "👩ðŸ½\u200d💼", + "woman_pilot": "👩\u200d✈ï¸", + "woman_pilot_dark_skin_tone": "👩ðŸ¿\u200d✈ï¸", + "woman_pilot_light_skin_tone": "👩ðŸ»\u200d✈ï¸", + "woman_pilot_medium-dark_skin_tone": "👩ðŸ¾\u200d✈ï¸", + "woman_pilot_medium-light_skin_tone": "👩ðŸ¼\u200d✈ï¸", + "woman_pilot_medium_skin_tone": "👩ðŸ½\u200d✈ï¸", + "woman_playing_handball": "🤾\u200d♀ï¸", + "woman_playing_handball_dark_skin_tone": "🤾ðŸ¿\u200d♀ï¸", + "woman_playing_handball_light_skin_tone": "🤾ðŸ»\u200d♀ï¸", + "woman_playing_handball_medium-dark_skin_tone": "🤾ðŸ¾\u200d♀ï¸", + "woman_playing_handball_medium-light_skin_tone": "🤾ðŸ¼\u200d♀ï¸", + "woman_playing_handball_medium_skin_tone": "🤾ðŸ½\u200d♀ï¸", + "woman_playing_water_polo": "🤽\u200d♀ï¸", + "woman_playing_water_polo_dark_skin_tone": "🤽ðŸ¿\u200d♀ï¸", + "woman_playing_water_polo_light_skin_tone": "🤽ðŸ»\u200d♀ï¸", + "woman_playing_water_polo_medium-dark_skin_tone": "🤽ðŸ¾\u200d♀ï¸", + "woman_playing_water_polo_medium-light_skin_tone": "🤽ðŸ¼\u200d♀ï¸", + "woman_playing_water_polo_medium_skin_tone": "🤽ðŸ½\u200d♀ï¸", + "woman_police_officer": "👮\u200d♀ï¸", + "woman_police_officer_dark_skin_tone": "👮ðŸ¿\u200d♀ï¸", + "woman_police_officer_light_skin_tone": "👮ðŸ»\u200d♀ï¸", + "woman_police_officer_medium-dark_skin_tone": "👮ðŸ¾\u200d♀ï¸", + "woman_police_officer_medium-light_skin_tone": "👮ðŸ¼\u200d♀ï¸", + "woman_police_officer_medium_skin_tone": "👮ðŸ½\u200d♀ï¸", + "woman_pouting": "🙎\u200d♀ï¸", + "woman_pouting_dark_skin_tone": "🙎ðŸ¿\u200d♀ï¸", + "woman_pouting_light_skin_tone": "🙎ðŸ»\u200d♀ï¸", + "woman_pouting_medium-dark_skin_tone": "🙎ðŸ¾\u200d♀ï¸", + "woman_pouting_medium-light_skin_tone": "🙎ðŸ¼\u200d♀ï¸", + "woman_pouting_medium_skin_tone": "🙎ðŸ½\u200d♀ï¸", + "woman_raising_hand": "🙋\u200d♀ï¸", + "woman_raising_hand_dark_skin_tone": "🙋ðŸ¿\u200d♀ï¸", + "woman_raising_hand_light_skin_tone": "🙋ðŸ»\u200d♀ï¸", + "woman_raising_hand_medium-dark_skin_tone": "🙋ðŸ¾\u200d♀ï¸", + "woman_raising_hand_medium-light_skin_tone": "🙋ðŸ¼\u200d♀ï¸", + "woman_raising_hand_medium_skin_tone": "🙋ðŸ½\u200d♀ï¸", + "woman_rowing_boat": "🚣\u200d♀ï¸", + "woman_rowing_boat_dark_skin_tone": "🚣ðŸ¿\u200d♀ï¸", + "woman_rowing_boat_light_skin_tone": "🚣ðŸ»\u200d♀ï¸", + "woman_rowing_boat_medium-dark_skin_tone": "🚣ðŸ¾\u200d♀ï¸", + "woman_rowing_boat_medium-light_skin_tone": "🚣ðŸ¼\u200d♀ï¸", + "woman_rowing_boat_medium_skin_tone": "🚣ðŸ½\u200d♀ï¸", + "woman_running": "ðŸƒ\u200d♀ï¸", + "woman_running_dark_skin_tone": "ðŸƒðŸ¿\u200d♀ï¸", + "woman_running_light_skin_tone": "ðŸƒðŸ»\u200d♀ï¸", + "woman_running_medium-dark_skin_tone": "ðŸƒðŸ¾\u200d♀ï¸", + "woman_running_medium-light_skin_tone": "ðŸƒðŸ¼\u200d♀ï¸", + "woman_running_medium_skin_tone": "ðŸƒðŸ½\u200d♀ï¸", + "woman_scientist": "👩\u200d🔬", + "woman_scientist_dark_skin_tone": "👩ðŸ¿\u200d🔬", + "woman_scientist_light_skin_tone": "👩ðŸ»\u200d🔬", + "woman_scientist_medium-dark_skin_tone": "👩ðŸ¾\u200d🔬", + "woman_scientist_medium-light_skin_tone": "👩ðŸ¼\u200d🔬", + "woman_scientist_medium_skin_tone": "👩ðŸ½\u200d🔬", + "woman_shrugging": "🤷\u200d♀ï¸", + "woman_shrugging_dark_skin_tone": "🤷ðŸ¿\u200d♀ï¸", + "woman_shrugging_light_skin_tone": "🤷ðŸ»\u200d♀ï¸", + "woman_shrugging_medium-dark_skin_tone": "🤷ðŸ¾\u200d♀ï¸", + "woman_shrugging_medium-light_skin_tone": "🤷ðŸ¼\u200d♀ï¸", + "woman_shrugging_medium_skin_tone": "🤷ðŸ½\u200d♀ï¸", + "woman_singer": "👩\u200d🎤", + "woman_singer_dark_skin_tone": "👩ðŸ¿\u200d🎤", + "woman_singer_light_skin_tone": "👩ðŸ»\u200d🎤", + "woman_singer_medium-dark_skin_tone": "👩ðŸ¾\u200d🎤", + "woman_singer_medium-light_skin_tone": "👩ðŸ¼\u200d🎤", + "woman_singer_medium_skin_tone": "👩ðŸ½\u200d🎤", + "woman_student": "👩\u200d🎓", + "woman_student_dark_skin_tone": "👩ðŸ¿\u200d🎓", + "woman_student_light_skin_tone": "👩ðŸ»\u200d🎓", + "woman_student_medium-dark_skin_tone": "👩ðŸ¾\u200d🎓", + "woman_student_medium-light_skin_tone": "👩ðŸ¼\u200d🎓", + "woman_student_medium_skin_tone": "👩ðŸ½\u200d🎓", + "woman_surfing": "ðŸ„\u200d♀ï¸", + "woman_surfing_dark_skin_tone": "ðŸ„ðŸ¿\u200d♀ï¸", + "woman_surfing_light_skin_tone": "ðŸ„ðŸ»\u200d♀ï¸", + "woman_surfing_medium-dark_skin_tone": "ðŸ„ðŸ¾\u200d♀ï¸", + "woman_surfing_medium-light_skin_tone": "ðŸ„ðŸ¼\u200d♀ï¸", + "woman_surfing_medium_skin_tone": "ðŸ„ðŸ½\u200d♀ï¸", + "woman_swimming": "ðŸŠ\u200d♀ï¸", + "woman_swimming_dark_skin_tone": "ðŸŠðŸ¿\u200d♀ï¸", + "woman_swimming_light_skin_tone": "ðŸŠðŸ»\u200d♀ï¸", + "woman_swimming_medium-dark_skin_tone": "ðŸŠðŸ¾\u200d♀ï¸", + "woman_swimming_medium-light_skin_tone": "ðŸŠðŸ¼\u200d♀ï¸", + "woman_swimming_medium_skin_tone": "ðŸŠðŸ½\u200d♀ï¸", + "woman_teacher": "👩\u200dðŸ«", + "woman_teacher_dark_skin_tone": "👩ðŸ¿\u200dðŸ«", + "woman_teacher_light_skin_tone": "👩ðŸ»\u200dðŸ«", + "woman_teacher_medium-dark_skin_tone": "👩ðŸ¾\u200dðŸ«", + "woman_teacher_medium-light_skin_tone": "👩ðŸ¼\u200dðŸ«", + "woman_teacher_medium_skin_tone": "👩ðŸ½\u200dðŸ«", + "woman_technologist": "👩\u200d💻", + "woman_technologist_dark_skin_tone": "👩ðŸ¿\u200d💻", + "woman_technologist_light_skin_tone": "👩ðŸ»\u200d💻", + "woman_technologist_medium-dark_skin_tone": "👩ðŸ¾\u200d💻", + "woman_technologist_medium-light_skin_tone": "👩ðŸ¼\u200d💻", + "woman_technologist_medium_skin_tone": "👩ðŸ½\u200d💻", + "woman_tipping_hand": "ðŸ’\u200d♀ï¸", + "woman_tipping_hand_dark_skin_tone": "ðŸ’ðŸ¿\u200d♀ï¸", + "woman_tipping_hand_light_skin_tone": "ðŸ’ðŸ»\u200d♀ï¸", + "woman_tipping_hand_medium-dark_skin_tone": "ðŸ’ðŸ¾\u200d♀ï¸", + "woman_tipping_hand_medium-light_skin_tone": "ðŸ’ðŸ¼\u200d♀ï¸", + "woman_tipping_hand_medium_skin_tone": "ðŸ’ðŸ½\u200d♀ï¸", + "woman_vampire": "🧛\u200d♀ï¸", + "woman_vampire_dark_skin_tone": "🧛ðŸ¿\u200d♀ï¸", + "woman_vampire_light_skin_tone": "🧛ðŸ»\u200d♀ï¸", + "woman_vampire_medium-dark_skin_tone": "🧛ðŸ¾\u200d♀ï¸", + "woman_vampire_medium-light_skin_tone": "🧛ðŸ¼\u200d♀ï¸", + "woman_vampire_medium_skin_tone": "🧛ðŸ½\u200d♀ï¸", + "woman_walking": "🚶\u200d♀ï¸", + "woman_walking_dark_skin_tone": "🚶ðŸ¿\u200d♀ï¸", + "woman_walking_light_skin_tone": "🚶ðŸ»\u200d♀ï¸", + "woman_walking_medium-dark_skin_tone": "🚶ðŸ¾\u200d♀ï¸", + "woman_walking_medium-light_skin_tone": "🚶ðŸ¼\u200d♀ï¸", + "woman_walking_medium_skin_tone": "🚶ðŸ½\u200d♀ï¸", + "woman_wearing_turban": "👳\u200d♀ï¸", + "woman_wearing_turban_dark_skin_tone": "👳ðŸ¿\u200d♀ï¸", + "woman_wearing_turban_light_skin_tone": "👳ðŸ»\u200d♀ï¸", + "woman_wearing_turban_medium-dark_skin_tone": "👳ðŸ¾\u200d♀ï¸", + "woman_wearing_turban_medium-light_skin_tone": "👳ðŸ¼\u200d♀ï¸", + "woman_wearing_turban_medium_skin_tone": "👳ðŸ½\u200d♀ï¸", + "woman_with_headscarf": "🧕", + "woman_with_headscarf_dark_skin_tone": "🧕ðŸ¿", + "woman_with_headscarf_light_skin_tone": "🧕ðŸ»", + "woman_with_headscarf_medium-dark_skin_tone": "🧕ðŸ¾", + "woman_with_headscarf_medium-light_skin_tone": "🧕ðŸ¼", + "woman_with_headscarf_medium_skin_tone": "🧕ðŸ½", + "woman_with_probing_cane": "👩\u200d🦯", + "woman_zombie": "🧟\u200d♀ï¸", + "woman’s_boot": "👢", + "woman’s_clothes": "👚", + "woman’s_hat": "👒", + "woman’s_sandal": "👡", + "women_with_bunny_ears": "👯\u200d♀ï¸", + "women_wrestling": "🤼\u200d♀ï¸", + "women’s_room": "🚺", + "woozy_face": "🥴", + "world_map": "🗺", + "worried_face": "😟", + "wrapped_gift": "ðŸŽ", + "wrench": "🔧", + "writing_hand": "âœ", + "writing_hand_dark_skin_tone": "âœðŸ¿", + "writing_hand_light_skin_tone": "âœðŸ»", + "writing_hand_medium-dark_skin_tone": "âœðŸ¾", + "writing_hand_medium-light_skin_tone": "âœðŸ¼", + "writing_hand_medium_skin_tone": "âœðŸ½", + "yarn": "🧶", + "yawning_face": "🥱", + "yellow_circle": "🟡", + "yellow_heart": "💛", + "yellow_square": "🟨", + "yen_banknote": "💴", + "yo-yo": "🪀", + "yin_yang": "☯", + "zany_face": "🤪", + "zebra": "🦓", + "zipper-mouth_face": "ðŸ¤", + "zombie": "🧟", + "zzz": "💤", + "Ã¥land_islands": "🇦🇽", + "keycap_asterisk": "*⃣", + "keycap_digit_eight": "8⃣", + "keycap_digit_five": "5⃣", + "keycap_digit_four": "4⃣", + "keycap_digit_nine": "9⃣", + "keycap_digit_one": "1⃣", + "keycap_digit_seven": "7⃣", + "keycap_digit_six": "6⃣", + "keycap_digit_three": "3⃣", + "keycap_digit_two": "2⃣", + "keycap_digit_zero": "0⃣", + "keycap_number_sign": "#⃣", + "light_skin_tone": "ðŸ»", + "medium_light_skin_tone": "ðŸ¼", + "medium_skin_tone": "ðŸ½", + "medium_dark_skin_tone": "ðŸ¾", + "dark_skin_tone": "ðŸ¿", + "regional_indicator_symbol_letter_a": "🇦", + "regional_indicator_symbol_letter_b": "🇧", + "regional_indicator_symbol_letter_c": "🇨", + "regional_indicator_symbol_letter_d": "🇩", + "regional_indicator_symbol_letter_e": "🇪", + "regional_indicator_symbol_letter_f": "🇫", + "regional_indicator_symbol_letter_g": "🇬", + "regional_indicator_symbol_letter_h": "🇭", + "regional_indicator_symbol_letter_i": "🇮", + "regional_indicator_symbol_letter_j": "🇯", + "regional_indicator_symbol_letter_k": "🇰", + "regional_indicator_symbol_letter_l": "🇱", + "regional_indicator_symbol_letter_m": "🇲", + "regional_indicator_symbol_letter_n": "🇳", + "regional_indicator_symbol_letter_o": "🇴", + "regional_indicator_symbol_letter_p": "🇵", + "regional_indicator_symbol_letter_q": "🇶", + "regional_indicator_symbol_letter_r": "🇷", + "regional_indicator_symbol_letter_s": "🇸", + "regional_indicator_symbol_letter_t": "🇹", + "regional_indicator_symbol_letter_u": "🇺", + "regional_indicator_symbol_letter_v": "🇻", + "regional_indicator_symbol_letter_w": "🇼", + "regional_indicator_symbol_letter_x": "🇽", + "regional_indicator_symbol_letter_y": "🇾", + "regional_indicator_symbol_letter_z": "🇿", + "airplane_arriving": "🛬", + "space_invader": "👾", + "football": "ðŸˆ", + "anger": "💢", + "angry": "😠", + "anguished": "😧", + "signal_strength": "📶", + "arrows_counterclockwise": "🔄", + "arrow_heading_down": "⤵", + "arrow_heading_up": "⤴", + "art": "🎨", + "astonished": "😲", + "athletic_shoe": "👟", + "atm": "ðŸ§", + "car": "🚗", + "red_car": "🚗", + "angel": "👼", + "back": "🔙", + "badminton_racquet_and_shuttlecock": "ðŸ¸", + "dollar": "💵", + "euro": "💶", + "pound": "💷", + "yen": "💴", + "barber": "💈", + "bath": "🛀", + "bear": "ðŸ»", + "heartbeat": "💓", + "beer": "ðŸº", + "no_bell": "🔕", + "bento": "ðŸ±", + "bike": "🚲", + "bicyclist": "🚴", + "8ball": "🎱", + "biohazard_sign": "☣", + "birthday": "🎂", + "black_circle_for_record": "âº", + "clubs": "♣", + "diamonds": "♦", + "arrow_double_down": "â¬", + "hearts": "♥", + "rewind": "âª", + "black_left__pointing_double_triangle_with_vertical_bar": "â®", + "arrow_backward": "â—€", + "black_medium_small_square": "â—¾", + "question": "â“", + "fast_forward": "â©", + "black_right__pointing_double_triangle_with_vertical_bar": "â­", + "arrow_forward": "â–¶", + "black_right__pointing_triangle_with_double_vertical_bar": "â¯", + "arrow_right": "âž¡", + "spades": "â™ ", + "black_square_for_stop": "â¹", + "sunny": "☀", + "phone": "☎", + "recycle": "â™»", + "arrow_double_up": "â«", + "busstop": "ðŸš", + "date": "📅", + "flags": "ðŸŽ", + "cat2": "ðŸˆ", + "joy_cat": "😹", + "smirk_cat": "😼", + "chart_with_downwards_trend": "📉", + "chart_with_upwards_trend": "📈", + "chart": "💹", + "mega": "📣", + "checkered_flag": "ðŸ", + "accept": "🉑", + "ideograph_advantage": "ðŸ‰", + "congratulations": "㊗", + "secret": "㊙", + "m": "â“‚", + "city_sunset": "🌆", + "clapper": "🎬", + "clap": "ðŸ‘", + "beers": "ðŸ»", + "clock830": "🕣", + "clock8": "🕗", + "clock1130": "🕦", + "clock11": "🕚", + "clock530": "🕠", + "clock5": "🕔", + "clock430": "🕟", + "clock4": "🕓", + "clock930": "🕤", + "clock9": "🕘", + "clock130": "🕜", + "clock1": "ðŸ•", + "clock730": "🕢", + "clock7": "🕖", + "clock630": "🕡", + "clock6": "🕕", + "clock1030": "🕥", + "clock10": "🕙", + "clock330": "🕞", + "clock3": "🕒", + "clock1230": "🕧", + "clock12": "🕛", + "clock230": "ðŸ•", + "clock2": "🕑", + "arrows_clockwise": "🔃", + "repeat": "ðŸ”", + "repeat_one": "🔂", + "closed_lock_with_key": "ðŸ”", + "mailbox_closed": "📪", + "mailbox": "📫", + "cloud_with_tornado": "🌪", + "cocktail": "ðŸ¸", + "boom": "💥", + "compression": "🗜", + "confounded": "😖", + "confused": "😕", + "rice": "ðŸš", + "cow2": "ðŸ„", + "cricket_bat_and_ball": "ðŸ", + "x": "âŒ", + "cry": "😢", + "curry": "ðŸ›", + "dagger_knife": "🗡", + "dancer": "💃", + "dark_sunglasses": "🕶", + "dash": "💨", + "truck": "🚚", + "derelict_house_building": "ðŸš", + "diamond_shape_with_a_dot_inside": "💠", + "dart": "🎯", + "disappointed_relieved": "😥", + "disappointed": "😞", + "do_not_litter": "🚯", + "dog2": "ðŸ•", + "flipper": "ðŸ¬", + "loop": "âž¿", + "bangbang": "‼", + "double_vertical_bar": "â¸", + "dove_of_peace": "🕊", + "small_red_triangle_down": "🔻", + "arrow_down_small": "🔽", + "arrow_down": "⬇", + "dromedary_camel": "ðŸª", + "e__mail": "📧", + "corn": "🌽", + "ear_of_rice": "🌾", + "earth_americas": "🌎", + "earth_asia": "ðŸŒ", + "earth_africa": "ðŸŒ", + "eight_pointed_black_star": "✴", + "eight_spoked_asterisk": "✳", + "eject_symbol": "â", + "bulb": "💡", + "emoji_modifier_fitzpatrick_type__1__2": "ðŸ»", + "emoji_modifier_fitzpatrick_type__3": "ðŸ¼", + "emoji_modifier_fitzpatrick_type__4": "ðŸ½", + "emoji_modifier_fitzpatrick_type__5": "ðŸ¾", + "emoji_modifier_fitzpatrick_type__6": "ðŸ¿", + "end": "🔚", + "email": "✉", + "european_castle": "ðŸ°", + "european_post_office": "ðŸ¤", + "interrobang": "â‰", + "expressionless": "😑", + "eyeglasses": "👓", + "massage": "💆", + "yum": "😋", + "scream": "😱", + "kissing_heart": "😘", + "sweat": "😓", + "face_with_head__bandage": "🤕", + "triumph": "😤", + "mask": "😷", + "no_good": "🙅", + "ok_woman": "🙆", + "open_mouth": "😮", + "cold_sweat": "😰", + "stuck_out_tongue": "😛", + "stuck_out_tongue_closed_eyes": "ðŸ˜", + "stuck_out_tongue_winking_eye": "😜", + "joy": "😂", + "no_mouth": "😶", + "santa": "🎅", + "fax": "📠", + "fearful": "😨", + "field_hockey_stick_and_ball": "ðŸ‘", + "first_quarter_moon_with_face": "🌛", + "fish_cake": "ðŸ¥", + "fishing_pole_and_fish": "🎣", + "facepunch": "👊", + "punch": "👊", + "flag_for_afghanistan": "🇦🇫", + "flag_for_albania": "🇦🇱", + "flag_for_algeria": "🇩🇿", + "flag_for_american_samoa": "🇦🇸", + "flag_for_andorra": "🇦🇩", + "flag_for_angola": "🇦🇴", + "flag_for_anguilla": "🇦🇮", + "flag_for_antarctica": "🇦🇶", + "flag_for_antigua_&_barbuda": "🇦🇬", + "flag_for_argentina": "🇦🇷", + "flag_for_armenia": "🇦🇲", + "flag_for_aruba": "🇦🇼", + "flag_for_ascension_island": "🇦🇨", + "flag_for_australia": "🇦🇺", + "flag_for_austria": "🇦🇹", + "flag_for_azerbaijan": "🇦🇿", + "flag_for_bahamas": "🇧🇸", + "flag_for_bahrain": "🇧🇭", + "flag_for_bangladesh": "🇧🇩", + "flag_for_barbados": "🇧🇧", + "flag_for_belarus": "🇧🇾", + "flag_for_belgium": "🇧🇪", + "flag_for_belize": "🇧🇿", + "flag_for_benin": "🇧🇯", + "flag_for_bermuda": "🇧🇲", + "flag_for_bhutan": "🇧🇹", + "flag_for_bolivia": "🇧🇴", + "flag_for_bosnia_&_herzegovina": "🇧🇦", + "flag_for_botswana": "🇧🇼", + "flag_for_bouvet_island": "🇧🇻", + "flag_for_brazil": "🇧🇷", + "flag_for_british_indian_ocean_territory": "🇮🇴", + "flag_for_british_virgin_islands": "🇻🇬", + "flag_for_brunei": "🇧🇳", + "flag_for_bulgaria": "🇧🇬", + "flag_for_burkina_faso": "🇧🇫", + "flag_for_burundi": "🇧🇮", + "flag_for_cambodia": "🇰🇭", + "flag_for_cameroon": "🇨🇲", + "flag_for_canada": "🇨🇦", + "flag_for_canary_islands": "🇮🇨", + "flag_for_cape_verde": "🇨🇻", + "flag_for_caribbean_netherlands": "🇧🇶", + "flag_for_cayman_islands": "🇰🇾", + "flag_for_central_african_republic": "🇨🇫", + "flag_for_ceuta_&_melilla": "🇪🇦", + "flag_for_chad": "🇹🇩", + "flag_for_chile": "🇨🇱", + "flag_for_china": "🇨🇳", + "flag_for_christmas_island": "🇨🇽", + "flag_for_clipperton_island": "🇨🇵", + "flag_for_cocos__islands": "🇨🇨", + "flag_for_colombia": "🇨🇴", + "flag_for_comoros": "🇰🇲", + "flag_for_congo____brazzaville": "🇨🇬", + "flag_for_congo____kinshasa": "🇨🇩", + "flag_for_cook_islands": "🇨🇰", + "flag_for_costa_rica": "🇨🇷", + "flag_for_croatia": "🇭🇷", + "flag_for_cuba": "🇨🇺", + "flag_for_curaçao": "🇨🇼", + "flag_for_cyprus": "🇨🇾", + "flag_for_czech_republic": "🇨🇿", + "flag_for_côte_d’ivoire": "🇨🇮", + "flag_for_denmark": "🇩🇰", + "flag_for_diego_garcia": "🇩🇬", + "flag_for_djibouti": "🇩🇯", + "flag_for_dominica": "🇩🇲", + "flag_for_dominican_republic": "🇩🇴", + "flag_for_ecuador": "🇪🇨", + "flag_for_egypt": "🇪🇬", + "flag_for_el_salvador": "🇸🇻", + "flag_for_equatorial_guinea": "🇬🇶", + "flag_for_eritrea": "🇪🇷", + "flag_for_estonia": "🇪🇪", + "flag_for_ethiopia": "🇪🇹", + "flag_for_european_union": "🇪🇺", + "flag_for_falkland_islands": "🇫🇰", + "flag_for_faroe_islands": "🇫🇴", + "flag_for_fiji": "🇫🇯", + "flag_for_finland": "🇫🇮", + "flag_for_france": "🇫🇷", + "flag_for_french_guiana": "🇬🇫", + "flag_for_french_polynesia": "🇵🇫", + "flag_for_french_southern_territories": "🇹🇫", + "flag_for_gabon": "🇬🇦", + "flag_for_gambia": "🇬🇲", + "flag_for_georgia": "🇬🇪", + "flag_for_germany": "🇩🇪", + "flag_for_ghana": "🇬🇭", + "flag_for_gibraltar": "🇬🇮", + "flag_for_greece": "🇬🇷", + "flag_for_greenland": "🇬🇱", + "flag_for_grenada": "🇬🇩", + "flag_for_guadeloupe": "🇬🇵", + "flag_for_guam": "🇬🇺", + "flag_for_guatemala": "🇬🇹", + "flag_for_guernsey": "🇬🇬", + "flag_for_guinea": "🇬🇳", + "flag_for_guinea__bissau": "🇬🇼", + "flag_for_guyana": "🇬🇾", + "flag_for_haiti": "🇭🇹", + "flag_for_heard_&_mcdonald_islands": "🇭🇲", + "flag_for_honduras": "🇭🇳", + "flag_for_hong_kong": "🇭🇰", + "flag_for_hungary": "🇭🇺", + "flag_for_iceland": "🇮🇸", + "flag_for_india": "🇮🇳", + "flag_for_indonesia": "🇮🇩", + "flag_for_iran": "🇮🇷", + "flag_for_iraq": "🇮🇶", + "flag_for_ireland": "🇮🇪", + "flag_for_isle_of_man": "🇮🇲", + "flag_for_israel": "🇮🇱", + "flag_for_italy": "🇮🇹", + "flag_for_jamaica": "🇯🇲", + "flag_for_japan": "🇯🇵", + "flag_for_jersey": "🇯🇪", + "flag_for_jordan": "🇯🇴", + "flag_for_kazakhstan": "🇰🇿", + "flag_for_kenya": "🇰🇪", + "flag_for_kiribati": "🇰🇮", + "flag_for_kosovo": "🇽🇰", + "flag_for_kuwait": "🇰🇼", + "flag_for_kyrgyzstan": "🇰🇬", + "flag_for_laos": "🇱🇦", + "flag_for_latvia": "🇱🇻", + "flag_for_lebanon": "🇱🇧", + "flag_for_lesotho": "🇱🇸", + "flag_for_liberia": "🇱🇷", + "flag_for_libya": "🇱🇾", + "flag_for_liechtenstein": "🇱🇮", + "flag_for_lithuania": "🇱🇹", + "flag_for_luxembourg": "🇱🇺", + "flag_for_macau": "🇲🇴", + "flag_for_macedonia": "🇲🇰", + "flag_for_madagascar": "🇲🇬", + "flag_for_malawi": "🇲🇼", + "flag_for_malaysia": "🇲🇾", + "flag_for_maldives": "🇲🇻", + "flag_for_mali": "🇲🇱", + "flag_for_malta": "🇲🇹", + "flag_for_marshall_islands": "🇲🇭", + "flag_for_martinique": "🇲🇶", + "flag_for_mauritania": "🇲🇷", + "flag_for_mauritius": "🇲🇺", + "flag_for_mayotte": "🇾🇹", + "flag_for_mexico": "🇲🇽", + "flag_for_micronesia": "🇫🇲", + "flag_for_moldova": "🇲🇩", + "flag_for_monaco": "🇲🇨", + "flag_for_mongolia": "🇲🇳", + "flag_for_montenegro": "🇲🇪", + "flag_for_montserrat": "🇲🇸", + "flag_for_morocco": "🇲🇦", + "flag_for_mozambique": "🇲🇿", + "flag_for_myanmar": "🇲🇲", + "flag_for_namibia": "🇳🇦", + "flag_for_nauru": "🇳🇷", + "flag_for_nepal": "🇳🇵", + "flag_for_netherlands": "🇳🇱", + "flag_for_new_caledonia": "🇳🇨", + "flag_for_new_zealand": "🇳🇿", + "flag_for_nicaragua": "🇳🇮", + "flag_for_niger": "🇳🇪", + "flag_for_nigeria": "🇳🇬", + "flag_for_niue": "🇳🇺", + "flag_for_norfolk_island": "🇳🇫", + "flag_for_north_korea": "🇰🇵", + "flag_for_northern_mariana_islands": "🇲🇵", + "flag_for_norway": "🇳🇴", + "flag_for_oman": "🇴🇲", + "flag_for_pakistan": "🇵🇰", + "flag_for_palau": "🇵🇼", + "flag_for_palestinian_territories": "🇵🇸", + "flag_for_panama": "🇵🇦", + "flag_for_papua_new_guinea": "🇵🇬", + "flag_for_paraguay": "🇵🇾", + "flag_for_peru": "🇵🇪", + "flag_for_philippines": "🇵🇭", + "flag_for_pitcairn_islands": "🇵🇳", + "flag_for_poland": "🇵🇱", + "flag_for_portugal": "🇵🇹", + "flag_for_puerto_rico": "🇵🇷", + "flag_for_qatar": "🇶🇦", + "flag_for_romania": "🇷🇴", + "flag_for_russia": "🇷🇺", + "flag_for_rwanda": "🇷🇼", + "flag_for_réunion": "🇷🇪", + "flag_for_samoa": "🇼🇸", + "flag_for_san_marino": "🇸🇲", + "flag_for_saudi_arabia": "🇸🇦", + "flag_for_senegal": "🇸🇳", + "flag_for_serbia": "🇷🇸", + "flag_for_seychelles": "🇸🇨", + "flag_for_sierra_leone": "🇸🇱", + "flag_for_singapore": "🇸🇬", + "flag_for_sint_maarten": "🇸🇽", + "flag_for_slovakia": "🇸🇰", + "flag_for_slovenia": "🇸🇮", + "flag_for_solomon_islands": "🇸🇧", + "flag_for_somalia": "🇸🇴", + "flag_for_south_africa": "🇿🇦", + "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸", + "flag_for_south_korea": "🇰🇷", + "flag_for_south_sudan": "🇸🇸", + "flag_for_spain": "🇪🇸", + "flag_for_sri_lanka": "🇱🇰", + "flag_for_st._barthélemy": "🇧🇱", + "flag_for_st._helena": "🇸🇭", + "flag_for_st._kitts_&_nevis": "🇰🇳", + "flag_for_st._lucia": "🇱🇨", + "flag_for_st._martin": "🇲🇫", + "flag_for_st._pierre_&_miquelon": "🇵🇲", + "flag_for_st._vincent_&_grenadines": "🇻🇨", + "flag_for_sudan": "🇸🇩", + "flag_for_suriname": "🇸🇷", + "flag_for_svalbard_&_jan_mayen": "🇸🇯", + "flag_for_swaziland": "🇸🇿", + "flag_for_sweden": "🇸🇪", + "flag_for_switzerland": "🇨🇭", + "flag_for_syria": "🇸🇾", + "flag_for_são_tomé_&_príncipe": "🇸🇹", + "flag_for_taiwan": "🇹🇼", + "flag_for_tajikistan": "🇹🇯", + "flag_for_tanzania": "🇹🇿", + "flag_for_thailand": "🇹🇭", + "flag_for_timor__leste": "🇹🇱", + "flag_for_togo": "🇹🇬", + "flag_for_tokelau": "🇹🇰", + "flag_for_tonga": "🇹🇴", + "flag_for_trinidad_&_tobago": "🇹🇹", + "flag_for_tristan_da_cunha": "🇹🇦", + "flag_for_tunisia": "🇹🇳", + "flag_for_turkey": "🇹🇷", + "flag_for_turkmenistan": "🇹🇲", + "flag_for_turks_&_caicos_islands": "🇹🇨", + "flag_for_tuvalu": "🇹🇻", + "flag_for_u.s._outlying_islands": "🇺🇲", + "flag_for_u.s._virgin_islands": "🇻🇮", + "flag_for_uganda": "🇺🇬", + "flag_for_ukraine": "🇺🇦", + "flag_for_united_arab_emirates": "🇦🇪", + "flag_for_united_kingdom": "🇬🇧", + "flag_for_united_states": "🇺🇸", + "flag_for_uruguay": "🇺🇾", + "flag_for_uzbekistan": "🇺🇿", + "flag_for_vanuatu": "🇻🇺", + "flag_for_vatican_city": "🇻🇦", + "flag_for_venezuela": "🇻🇪", + "flag_for_vietnam": "🇻🇳", + "flag_for_wallis_&_futuna": "🇼🇫", + "flag_for_western_sahara": "🇪🇭", + "flag_for_yemen": "🇾🇪", + "flag_for_zambia": "🇿🇲", + "flag_for_zimbabwe": "🇿🇼", + "flag_for_Ã¥land_islands": "🇦🇽", + "golf": "⛳", + "fleur__de__lis": "âšœ", + "muscle": "💪", + "flushed": "😳", + "frame_with_picture": "🖼", + "fries": "ðŸŸ", + "frog": "ðŸ¸", + "hatched_chick": "ðŸ¥", + "frowning": "😦", + "fuelpump": "⛽", + "full_moon_with_face": "ðŸŒ", + "gem": "💎", + "star2": "🌟", + "golfer": "ðŸŒ", + "mortar_board": "🎓", + "grimacing": "😬", + "smile_cat": "😸", + "grinning": "😀", + "grin": "ðŸ˜", + "heartpulse": "💗", + "guardsman": "💂", + "haircut": "💇", + "hamster": "ðŸ¹", + "raising_hand": "🙋", + "headphones": "🎧", + "hear_no_evil": "🙉", + "cupid": "💘", + "gift_heart": "ðŸ’", + "heart": "â¤", + "exclamation": "â—", + "heavy_exclamation_mark": "â—", + "heavy_heart_exclamation_mark_ornament": "â£", + "o": "â­•", + "helm_symbol": "⎈", + "helmet_with_white_cross": "⛑", + "high_heel": "👠", + "bullettrain_side": "🚄", + "bullettrain_front": "🚅", + "high_brightness": "🔆", + "zap": "âš¡", + "hocho": "🔪", + "knife": "🔪", + "bee": "ðŸ", + "traffic_light": "🚥", + "racehorse": "ðŸŽ", + "coffee": "☕", + "hotsprings": "♨", + "hourglass": "⌛", + "hourglass_flowing_sand": "â³", + "house_buildings": "ðŸ˜", + "100": "💯", + "hushed": "😯", + "ice_hockey_stick_and_puck": "ðŸ’", + "imp": "👿", + "information_desk_person": "ðŸ’", + "information_source": "ℹ", + "capital_abcd": "🔠", + "abc": "🔤", + "abcd": "🔡", + "1234": "🔢", + "symbols": "🔣", + "izakaya_lantern": "ðŸ®", + "lantern": "ðŸ®", + "jack_o_lantern": "🎃", + "dolls": "🎎", + "japanese_goblin": "👺", + "japanese_ogre": "👹", + "beginner": "🔰", + "zero": "0ï¸âƒ£", + "one": "1ï¸âƒ£", + "ten": "🔟", + "two": "2ï¸âƒ£", + "three": "3ï¸âƒ£", + "four": "4ï¸âƒ£", + "five": "5ï¸âƒ£", + "six": "6ï¸âƒ£", + "seven": "7ï¸âƒ£", + "eight": "8ï¸âƒ£", + "nine": "9ï¸âƒ£", + "couplekiss": "ðŸ’", + "kissing_cat": "😽", + "kissing": "😗", + "kissing_closed_eyes": "😚", + "kissing_smiling_eyes": "😙", + "beetle": "ðŸž", + "large_blue_circle": "🔵", + "last_quarter_moon_with_face": "🌜", + "leaves": "ðŸƒ", + "mag": "ðŸ”", + "left_right_arrow": "↔", + "leftwards_arrow_with_hook": "↩", + "arrow_left": "⬅", + "lock": "🔒", + "lock_with_ink_pen": "ðŸ”", + "sob": "😭", + "low_brightness": "🔅", + "lower_left_ballpoint_pen": "🖊", + "lower_left_crayon": "ðŸ–", + "lower_left_fountain_pen": "🖋", + "lower_left_paintbrush": "🖌", + "mahjong": "🀄", + "couple": "👫", + "man_in_business_suit_levitating": "🕴", + "man_with_gua_pi_mao": "👲", + "man_with_turban": "👳", + "mans_shoe": "👞", + "shoe": "👞", + "menorah_with_nine_branches": "🕎", + "mens": "🚹", + "minidisc": "💽", + "iphone": "📱", + "calling": "📲", + "money__mouth_face": "🤑", + "moneybag": "💰", + "rice_scene": "🎑", + "mountain_bicyclist": "🚵", + "mouse2": "ðŸ", + "lips": "👄", + "moyai": "🗿", + "notes": "🎶", + "nail_care": "💅", + "ab": "🆎", + "negative_squared_cross_mark": "âŽ", + "a": "🅰", + "b": "🅱", + "o2": "🅾", + "parking": "🅿", + "new_moon_with_face": "🌚", + "no_entry_sign": "🚫", + "underage": "🔞", + "non__potable_water": "🚱", + "arrow_upper_right": "↗", + "arrow_upper_left": "↖", + "office": "ðŸ¢", + "older_man": "👴", + "older_woman": "👵", + "om_symbol": "🕉", + "on": "🔛", + "book": "📖", + "unlock": "🔓", + "mailbox_with_no_mail": "📭", + "mailbox_with_mail": "📬", + "cd": "💿", + "tada": "🎉", + "feet": "ðŸ¾", + "walking": "🚶", + "pencil2": "âœ", + "pensive": "😔", + "persevere": "😣", + "bow": "🙇", + "raised_hands": "🙌", + "person_with_ball": "⛹", + "person_with_blond_hair": "👱", + "pray": "ðŸ™", + "person_with_pouting_face": "🙎", + "computer": "💻", + "pig2": "ðŸ–", + "hankey": "💩", + "poop": "💩", + "shit": "💩", + "bamboo": "ðŸŽ", + "gun": "🔫", + "black_joker": "ðŸƒ", + "rotating_light": "🚨", + "cop": "👮", + "stew": "ðŸ²", + "pouch": "ðŸ‘", + "pouting_cat": "😾", + "rage": "😡", + "put_litter_in_its_place": "🚮", + "rabbit2": "ðŸ‡", + "racing_motorcycle": "ðŸ", + "radioactive_sign": "☢", + "fist": "✊", + "hand": "✋", + "raised_hand_with_fingers_splayed": "ðŸ–", + "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", + "blue_car": "🚙", + "apple": "ðŸŽ", + "relieved": "😌", + "reversed_hand_with_middle_finger_extended": "🖕", + "mag_right": "🔎", + "arrow_right_hook": "↪", + "sweet_potato": "ðŸ ", + "robot": "🤖", + "rolled__up_newspaper": "🗞", + "rowboat": "🚣", + "runner": "ðŸƒ", + "running": "ðŸƒ", + "running_shirt_with_sash": "🎽", + "boat": "⛵", + "scales": "âš–", + "school_satchel": "🎒", + "scorpius": "â™", + "see_no_evil": "🙈", + "sheep": "ðŸ‘", + "stars": "🌠", + "cake": "ðŸ°", + "six_pointed_star": "🔯", + "ski": "🎿", + "sleeping_accommodation": "🛌", + "sleeping": "😴", + "sleepy": "😪", + "sleuth_or_spy": "🕵", + "heart_eyes_cat": "😻", + "smiley_cat": "😺", + "innocent": "😇", + "heart_eyes": "ðŸ˜", + "smiling_imp": "😈", + "smiley": "😃", + "sweat_smile": "😅", + "smile": "😄", + "laughing": "😆", + "satisfied": "😆", + "blush": "😊", + "smirk": "ðŸ˜", + "smoking": "🚬", + "snow_capped_mountain": "ðŸ”", + "soccer": "âš½", + "icecream": "ðŸ¦", + "soon": "🔜", + "arrow_lower_right": "↘", + "arrow_lower_left": "↙", + "speak_no_evil": "🙊", + "speaker": "🔈", + "mute": "🔇", + "sound": "🔉", + "loud_sound": "🔊", + "speaking_head_in_silhouette": "🗣", + "spiral_calendar_pad": "🗓", + "spiral_note_pad": "🗒", + "shell": "ðŸš", + "sweat_drops": "💦", + "u5272": "🈹", + "u5408": "🈴", + "u55b6": "🈺", + "u6307": "🈯", + "u6708": "🈷", + "u6709": "🈶", + "u6e80": "🈵", + "u7121": "🈚", + "u7533": "🈸", + "u7981": "🈲", + "u7a7a": "🈳", + "cl": "🆑", + "cool": "🆒", + "free": "🆓", + "id": "🆔", + "koko": "ðŸˆ", + "sa": "🈂", + "new": "🆕", + "ng": "🆖", + "ok": "🆗", + "sos": "🆘", + "up": "🆙", + "vs": "🆚", + "steam_locomotive": "🚂", + "ramen": "ðŸœ", + "partly_sunny": "â›…", + "city_sunrise": "🌇", + "surfer": "ðŸ„", + "swimmer": "ðŸŠ", + "shirt": "👕", + "tshirt": "👕", + "table_tennis_paddle_and_ball": "ðŸ“", + "tea": "ðŸµ", + "tv": "📺", + "three_button_mouse": "🖱", + "+1": "ðŸ‘", + "thumbsup": "ðŸ‘", + "__1": "👎", + "-1": "👎", + "thumbsdown": "👎", + "thunder_cloud_and_rain": "⛈", + "tiger2": "ðŸ…", + "tophat": "🎩", + "top": "ðŸ”", + "tm": "â„¢", + "train2": "🚆", + "triangular_flag_on_post": "🚩", + "trident": "🔱", + "twisted_rightwards_arrows": "🔀", + "unamused": "😒", + "small_red_triangle": "🔺", + "arrow_up_small": "🔼", + "arrow_up_down": "↕", + "upside__down_face": "🙃", + "arrow_up": "⬆", + "v": "✌", + "vhs": "📼", + "wc": "🚾", + "ocean": "🌊", + "waving_black_flag": "ðŸ´", + "wave": "👋", + "waving_white_flag": "ðŸ³", + "moon": "🌔", + "scream_cat": "🙀", + "weary": "😩", + "weight_lifter": "ðŸ‹", + "whale2": "ðŸ‹", + "wheelchair": "♿", + "point_down": "👇", + "grey_exclamation": "â•", + "white_frowning_face": "☹", + "white_check_mark": "✅", + "point_left": "👈", + "white_medium_small_square": "â—½", + "star": "â­", + "grey_question": "â”", + "point_right": "👉", + "relaxed": "☺", + "white_sun_behind_cloud": "🌥", + "white_sun_behind_cloud_with_rain": "🌦", + "white_sun_with_small_cloud": "🌤", + "point_up_2": "👆", + "point_up": "â˜", + "wind_blowing_face": "🌬", + "wink": "😉", + "wolf": "ðŸº", + "dancers": "👯", + "boot": "👢", + "womans_clothes": "👚", + "womans_hat": "👒", + "sandal": "👡", + "womens": "🚺", + "worried": "😟", + "gift": "ðŸŽ", + "zipper__mouth_face": "ðŸ¤", + "regional_indicator_a": "🇦", + "regional_indicator_b": "🇧", + "regional_indicator_c": "🇨", + "regional_indicator_d": "🇩", + "regional_indicator_e": "🇪", + "regional_indicator_f": "🇫", + "regional_indicator_g": "🇬", + "regional_indicator_h": "🇭", + "regional_indicator_i": "🇮", + "regional_indicator_j": "🇯", + "regional_indicator_k": "🇰", + "regional_indicator_l": "🇱", + "regional_indicator_m": "🇲", + "regional_indicator_n": "🇳", + "regional_indicator_o": "🇴", + "regional_indicator_p": "🇵", + "regional_indicator_q": "🇶", + "regional_indicator_r": "🇷", + "regional_indicator_s": "🇸", + "regional_indicator_t": "🇹", + "regional_indicator_u": "🇺", + "regional_indicator_v": "🇻", + "regional_indicator_w": "🇼", + "regional_indicator_x": "🇽", + "regional_indicator_y": "🇾", + "regional_indicator_z": "🇿", +} diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py new file mode 100644 index 0000000..bb2cafa --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py @@ -0,0 +1,32 @@ +from typing import Callable, Match, Optional +import re + +from ._emoji_codes import EMOJI + + +_ReStringMatch = Match[str] # regex match object +_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub +_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re + + +def _emoji_replace( + text: str, + default_variant: Optional[str] = None, + _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, +) -> str: + """Replace emoji code in text.""" + get_emoji = EMOJI.__getitem__ + variants = {"text": "\uFE0E", "emoji": "\uFE0F"} + get_variant = variants.get + default_variant_code = variants.get(default_variant, "") if default_variant else "" + + def do_replace(match: Match[str]) -> str: + emoji_code, emoji_name, variant = match.groups() + try: + return get_emoji(emoji_name.lower()) + get_variant( + variant, default_variant_code + ) + except KeyError: + return emoji_code + + return _emoji_sub(do_replace, text) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py new file mode 100644 index 0000000..094d2dc --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py @@ -0,0 +1,76 @@ +CONSOLE_HTML_FORMAT = """\ + + + + + + + +

    {code}
    + + +""" + +CONSOLE_SVG_FORMAT = """\ + + + + + + + + + {lines} + + + {chrome} + + {backgrounds} + + {matrix} + + + +""" + +_SVG_FONT_FAMILY = "Rich Fira Code" +_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py new file mode 100644 index 0000000..cbd6da9 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py @@ -0,0 +1,10 @@ +from typing import Any + + +def load_ipython_extension(ip: Any) -> None: # pragma: no cover + # prevent circular import + from pip._vendor.rich.pretty import install + from pip._vendor.rich.traceback import install as tr_install + + install() + tr_install() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py new file mode 100644 index 0000000..b17ee65 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import IO, Callable + + +def get_fileno(file_like: IO[str]) -> int | None: + """Get fileno() from a file, accounting for poorly implemented file-like objects. + + Args: + file_like (IO): A file-like object. + + Returns: + int | None: The result of fileno if available, or None if operation failed. + """ + fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) + if fileno is not None: + try: + return fileno() + except Exception: + # `fileno` is documented as potentially raising a OSError + # Alas, from the issues, there are so many poorly implemented file-like objects, + # that `fileno()` can raise just about anything. + return None + return None diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py new file mode 100644 index 0000000..30446ce --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py @@ -0,0 +1,270 @@ +from __future__ import absolute_import + +import inspect +from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature +from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union + +from .console import Group, RenderableType +from .control import escape_control_codes +from .highlighter import ReprHighlighter +from .jupyter import JupyterMixin +from .panel import Panel +from .pretty import Pretty +from .table import Table +from .text import Text, TextType + + +def _first_paragraph(doc: str) -> str: + """Get the first paragraph from a docstring.""" + paragraph, _, _ = doc.partition("\n\n") + return paragraph + + +class Inspect(JupyterMixin): + """A renderable to inspect any Python Object. + + Args: + obj (Any): An object to inspect. + title (str, optional): Title to display over inspect result, or None use type. Defaults to None. + help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. + methods (bool, optional): Enable inspection of callables. Defaults to False. + docs (bool, optional): Also render doc strings. Defaults to True. + private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. + dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. + sort (bool, optional): Sort attributes alphabetically. Defaults to True. + all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value of object. Defaults to True. + """ + + def __init__( + self, + obj: Any, + *, + title: Optional[TextType] = None, + help: bool = False, + methods: bool = False, + docs: bool = True, + private: bool = False, + dunder: bool = False, + sort: bool = True, + all: bool = True, + value: bool = True, + ) -> None: + self.highlighter = ReprHighlighter() + self.obj = obj + self.title = title or self._make_title(obj) + if all: + methods = private = dunder = True + self.help = help + self.methods = methods + self.docs = docs or help + self.private = private or dunder + self.dunder = dunder + self.sort = sort + self.value = value + + def _make_title(self, obj: Any) -> Text: + """Make a default title.""" + title_str = ( + str(obj) + if (isclass(obj) or callable(obj) or ismodule(obj)) + else str(type(obj)) + ) + title_text = self.highlighter(title_str) + return title_text + + def __rich__(self) -> Panel: + return Panel.fit( + Group(*self._render()), + title=self.title, + border_style="scope.border", + padding=(0, 1), + ) + + def _get_signature(self, name: str, obj: Any) -> Optional[Text]: + """Get a signature for a callable.""" + try: + _signature = str(signature(obj)) + ":" + except ValueError: + _signature = "(...)" + except TypeError: + return None + + source_filename: Optional[str] = None + try: + source_filename = getfile(obj) + except (OSError, TypeError): + # OSError is raised if obj has no source file, e.g. when defined in REPL. + pass + + callable_name = Text(name, style="inspect.callable") + if source_filename: + callable_name.stylize(f"link file://{source_filename}") + signature_text = self.highlighter(_signature) + + qualname = name or getattr(obj, "__qualname__", name) + + # If obj is a module, there may be classes (which are callable) to display + if inspect.isclass(obj): + prefix = "class" + elif inspect.iscoroutinefunction(obj): + prefix = "async def" + else: + prefix = "def" + + qual_signature = Text.assemble( + (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), + (qualname, "inspect.callable"), + signature_text, + ) + + return qual_signature + + def _render(self) -> Iterable[RenderableType]: + """Render object.""" + + def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: + key, (_error, value) = item + return (callable(value), key.strip("_").lower()) + + def safe_getattr(attr_name: str) -> Tuple[Any, Any]: + """Get attribute or any exception.""" + try: + return (None, getattr(obj, attr_name)) + except Exception as error: + return (error, None) + + obj = self.obj + keys = dir(obj) + total_items = len(keys) + if not self.dunder: + keys = [key for key in keys if not key.startswith("__")] + if not self.private: + keys = [key for key in keys if not key.startswith("_")] + not_shown_count = total_items - len(keys) + items = [(key, safe_getattr(key)) for key in keys] + if self.sort: + items.sort(key=sort_items) + + items_table = Table.grid(padding=(0, 1), expand=False) + items_table.add_column(justify="right") + add_row = items_table.add_row + highlighter = self.highlighter + + if callable(obj): + signature = self._get_signature("", obj) + if signature is not None: + yield signature + yield "" + + if self.docs: + _doc = self._get_formatted_doc(obj) + if _doc is not None: + doc_text = Text(_doc, style="inspect.help") + doc_text = highlighter(doc_text) + yield doc_text + yield "" + + if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): + yield Panel( + Pretty(obj, indent_guides=True, max_length=10, max_string=60), + border_style="inspect.value.border", + ) + yield "" + + for key, (error, value) in items: + key_text = Text.assemble( + ( + key, + "inspect.attr.dunder" if key.startswith("__") else "inspect.attr", + ), + (" =", "inspect.equals"), + ) + if error is not None: + warning = key_text.copy() + warning.stylize("inspect.error") + add_row(warning, highlighter(repr(error))) + continue + + if callable(value): + if not self.methods: + continue + + _signature_text = self._get_signature(key, value) + if _signature_text is None: + add_row(key_text, Pretty(value, highlighter=highlighter)) + else: + if self.docs: + docs = self._get_formatted_doc(value) + if docs is not None: + _signature_text.append("\n" if "\n" in docs else " ") + doc = highlighter(docs) + doc.stylize("inspect.doc") + _signature_text.append(doc) + + add_row(key_text, _signature_text) + else: + add_row(key_text, Pretty(value, highlighter=highlighter)) + if items_table.row_count: + yield items_table + elif not_shown_count: + yield Text.from_markup( + f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " + f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." + ) + + def _get_formatted_doc(self, object_: Any) -> Optional[str]: + """ + Extract the docstring of an object, process it and returns it. + The processing consists in cleaning up the doctring's indentation, + taking only its 1st paragraph if `self.help` is not True, + and escape its control codes. + + Args: + object_ (Any): the object to get the docstring from. + + Returns: + Optional[str]: the processed docstring, or None if no docstring was found. + """ + docs = getdoc(object_) + if docs is None: + return None + docs = cleandoc(docs).strip() + if not self.help: + docs = _first_paragraph(docs) + return escape_control_codes(docs) + + +def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]: + """Returns the MRO of an object's class, or of the object itself if it's a class.""" + if not hasattr(obj, "__mro__"): + # N.B. we cannot use `if type(obj) is type` here because it doesn't work with + # some types of classes, such as the ones that use abc.ABCMeta. + obj = type(obj) + return getattr(obj, "__mro__", ()) + + +def get_object_types_mro_as_strings(obj: object) -> Collection[str]: + """ + Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class. + + Examples: + `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']` + """ + return [ + f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}' + for type_ in get_object_types_mro(obj) + ] + + +def is_object_one_of_types( + obj: object, fully_qualified_types_names: Collection[str] +) -> bool: + """ + Returns `True` if the given object's class (or the object itself, if it's a class) has one of the + fully qualified names in its MRO. + """ + for type_name in get_object_types_mro_as_strings(obj): + if type_name in fully_qualified_types_names: + return True + return False diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py new file mode 100644 index 0000000..fc16c84 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py @@ -0,0 +1,94 @@ +from datetime import datetime +from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable + + +from .text import Text, TextType + +if TYPE_CHECKING: + from .console import Console, ConsoleRenderable, RenderableType + from .table import Table + +FormatTimeCallable = Callable[[datetime], Text] + + +class LogRender: + def __init__( + self, + show_time: bool = True, + show_level: bool = False, + show_path: bool = True, + time_format: Union[str, FormatTimeCallable] = "[%x %X]", + omit_repeated_times: bool = True, + level_width: Optional[int] = 8, + ) -> None: + self.show_time = show_time + self.show_level = show_level + self.show_path = show_path + self.time_format = time_format + self.omit_repeated_times = omit_repeated_times + self.level_width = level_width + self._last_time: Optional[Text] = None + + def __call__( + self, + console: "Console", + renderables: Iterable["ConsoleRenderable"], + log_time: Optional[datetime] = None, + time_format: Optional[Union[str, FormatTimeCallable]] = None, + level: TextType = "", + path: Optional[str] = None, + line_no: Optional[int] = None, + link_path: Optional[str] = None, + ) -> "Table": + from .containers import Renderables + from .table import Table + + output = Table.grid(padding=(0, 1)) + output.expand = True + if self.show_time: + output.add_column(style="log.time") + if self.show_level: + output.add_column(style="log.level", width=self.level_width) + output.add_column(ratio=1, style="log.message", overflow="fold") + if self.show_path and path: + output.add_column(style="log.path") + row: List["RenderableType"] = [] + if self.show_time: + log_time = log_time or console.get_datetime() + time_format = time_format or self.time_format + if callable(time_format): + log_time_display = time_format(log_time) + else: + log_time_display = Text(log_time.strftime(time_format)) + if log_time_display == self._last_time and self.omit_repeated_times: + row.append(Text(" " * len(log_time_display))) + else: + row.append(log_time_display) + self._last_time = log_time_display + if self.show_level: + row.append(level) + + row.append(Renderables(renderables)) + if self.show_path and path: + path_text = Text() + path_text.append( + path, style=f"link file://{link_path}" if link_path else "" + ) + if line_no: + path_text.append(":") + path_text.append( + f"{line_no}", + style=f"link file://{link_path}#{line_no}" if link_path else "", + ) + row.append(path_text) + + output.add_row(*row) + return output + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + c = Console() + c.print("[on blue]Hello", justify="right") + c.log("[on blue]hello", justify="right") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py new file mode 100644 index 0000000..01c6caf --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py @@ -0,0 +1,43 @@ +from typing import Iterable, Tuple, TypeVar + +T = TypeVar("T") + + +def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for first value.""" + iter_values = iter(values) + try: + value = next(iter_values) + except StopIteration: + return + yield True, value + for value in iter_values: + yield False, value + + +def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value + + +def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py new file mode 100644 index 0000000..b659673 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py @@ -0,0 +1,69 @@ +from types import TracebackType +from typing import IO, Iterable, Iterator, List, Optional, Type + + +class NullFile(IO[str]): + def close(self) -> None: + pass + + def isatty(self) -> bool: + return False + + def read(self, __n: int = 1) -> str: + return "" + + def readable(self) -> bool: + return False + + def readline(self, __limit: int = 1) -> str: + return "" + + def readlines(self, __hint: int = 1) -> List[str]: + return [] + + def seek(self, __offset: int, __whence: int = 1) -> int: + return 0 + + def seekable(self) -> bool: + return False + + def tell(self) -> int: + return 0 + + def truncate(self, __size: Optional[int] = 1) -> int: + return 0 + + def writable(self) -> bool: + return False + + def writelines(self, __lines: Iterable[str]) -> None: + pass + + def __next__(self) -> str: + return "" + + def __iter__(self) -> Iterator[str]: + return iter([""]) + + def __enter__(self) -> IO[str]: + pass + + def __exit__( + self, + __t: Optional[Type[BaseException]], + __value: Optional[BaseException], + __traceback: Optional[TracebackType], + ) -> None: + pass + + def write(self, text: str) -> int: + return 0 + + def flush(self) -> None: + pass + + def fileno(self) -> int: + return -1 + + +NULL_FILE = NullFile() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py new file mode 100644 index 0000000..3c748d3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py @@ -0,0 +1,309 @@ +from .palette import Palette + + +# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) +WINDOWS_PALETTE = Palette( + [ + (12, 12, 12), + (197, 15, 31), + (19, 161, 14), + (193, 156, 0), + (0, 55, 218), + (136, 23, 152), + (58, 150, 221), + (204, 204, 204), + (118, 118, 118), + (231, 72, 86), + (22, 198, 12), + (249, 241, 165), + (59, 120, 255), + (180, 0, 158), + (97, 214, 214), + (242, 242, 242), + ] +) + +# # The standard ansi colors (including bright variants) +STANDARD_PALETTE = Palette( + [ + (0, 0, 0), + (170, 0, 0), + (0, 170, 0), + (170, 85, 0), + (0, 0, 170), + (170, 0, 170), + (0, 170, 170), + (170, 170, 170), + (85, 85, 85), + (255, 85, 85), + (85, 255, 85), + (255, 255, 85), + (85, 85, 255), + (255, 85, 255), + (85, 255, 255), + (255, 255, 255), + ] +) + + +# The 256 color palette +EIGHT_BIT_PALETTE = Palette( + [ + (0, 0, 0), + (128, 0, 0), + (0, 128, 0), + (128, 128, 0), + (0, 0, 128), + (128, 0, 128), + (0, 128, 128), + (192, 192, 192), + (128, 128, 128), + (255, 0, 0), + (0, 255, 0), + (255, 255, 0), + (0, 0, 255), + (255, 0, 255), + (0, 255, 255), + (255, 255, 255), + (0, 0, 0), + (0, 0, 95), + (0, 0, 135), + (0, 0, 175), + (0, 0, 215), + (0, 0, 255), + (0, 95, 0), + (0, 95, 95), + (0, 95, 135), + (0, 95, 175), + (0, 95, 215), + (0, 95, 255), + (0, 135, 0), + (0, 135, 95), + (0, 135, 135), + (0, 135, 175), + (0, 135, 215), + (0, 135, 255), + (0, 175, 0), + (0, 175, 95), + (0, 175, 135), + (0, 175, 175), + (0, 175, 215), + (0, 175, 255), + (0, 215, 0), + (0, 215, 95), + (0, 215, 135), + (0, 215, 175), + (0, 215, 215), + (0, 215, 255), + (0, 255, 0), + (0, 255, 95), + (0, 255, 135), + (0, 255, 175), + (0, 255, 215), + (0, 255, 255), + (95, 0, 0), + (95, 0, 95), + (95, 0, 135), + (95, 0, 175), + (95, 0, 215), + (95, 0, 255), + (95, 95, 0), + (95, 95, 95), + (95, 95, 135), + (95, 95, 175), + (95, 95, 215), + (95, 95, 255), + (95, 135, 0), + (95, 135, 95), + (95, 135, 135), + (95, 135, 175), + (95, 135, 215), + (95, 135, 255), + (95, 175, 0), + (95, 175, 95), + (95, 175, 135), + (95, 175, 175), + (95, 175, 215), + (95, 175, 255), + (95, 215, 0), + (95, 215, 95), + (95, 215, 135), + (95, 215, 175), + (95, 215, 215), + (95, 215, 255), + (95, 255, 0), + (95, 255, 95), + (95, 255, 135), + (95, 255, 175), + (95, 255, 215), + (95, 255, 255), + (135, 0, 0), + (135, 0, 95), + (135, 0, 135), + (135, 0, 175), + (135, 0, 215), + (135, 0, 255), + (135, 95, 0), + (135, 95, 95), + (135, 95, 135), + (135, 95, 175), + (135, 95, 215), + (135, 95, 255), + (135, 135, 0), + (135, 135, 95), + (135, 135, 135), + (135, 135, 175), + (135, 135, 215), + (135, 135, 255), + (135, 175, 0), + (135, 175, 95), + (135, 175, 135), + (135, 175, 175), + (135, 175, 215), + (135, 175, 255), + (135, 215, 0), + (135, 215, 95), + (135, 215, 135), + (135, 215, 175), + (135, 215, 215), + (135, 215, 255), + (135, 255, 0), + (135, 255, 95), + (135, 255, 135), + (135, 255, 175), + (135, 255, 215), + (135, 255, 255), + (175, 0, 0), + (175, 0, 95), + (175, 0, 135), + (175, 0, 175), + (175, 0, 215), + (175, 0, 255), + (175, 95, 0), + (175, 95, 95), + (175, 95, 135), + (175, 95, 175), + (175, 95, 215), + (175, 95, 255), + (175, 135, 0), + (175, 135, 95), + (175, 135, 135), + (175, 135, 175), + (175, 135, 215), + (175, 135, 255), + (175, 175, 0), + (175, 175, 95), + (175, 175, 135), + (175, 175, 175), + (175, 175, 215), + (175, 175, 255), + (175, 215, 0), + (175, 215, 95), + (175, 215, 135), + (175, 215, 175), + (175, 215, 215), + (175, 215, 255), + (175, 255, 0), + (175, 255, 95), + (175, 255, 135), + (175, 255, 175), + (175, 255, 215), + (175, 255, 255), + (215, 0, 0), + (215, 0, 95), + (215, 0, 135), + (215, 0, 175), + (215, 0, 215), + (215, 0, 255), + (215, 95, 0), + (215, 95, 95), + (215, 95, 135), + (215, 95, 175), + (215, 95, 215), + (215, 95, 255), + (215, 135, 0), + (215, 135, 95), + (215, 135, 135), + (215, 135, 175), + (215, 135, 215), + (215, 135, 255), + (215, 175, 0), + (215, 175, 95), + (215, 175, 135), + (215, 175, 175), + (215, 175, 215), + (215, 175, 255), + (215, 215, 0), + (215, 215, 95), + (215, 215, 135), + (215, 215, 175), + (215, 215, 215), + (215, 215, 255), + (215, 255, 0), + (215, 255, 95), + (215, 255, 135), + (215, 255, 175), + (215, 255, 215), + (215, 255, 255), + (255, 0, 0), + (255, 0, 95), + (255, 0, 135), + (255, 0, 175), + (255, 0, 215), + (255, 0, 255), + (255, 95, 0), + (255, 95, 95), + (255, 95, 135), + (255, 95, 175), + (255, 95, 215), + (255, 95, 255), + (255, 135, 0), + (255, 135, 95), + (255, 135, 135), + (255, 135, 175), + (255, 135, 215), + (255, 135, 255), + (255, 175, 0), + (255, 175, 95), + (255, 175, 135), + (255, 175, 175), + (255, 175, 215), + (255, 175, 255), + (255, 215, 0), + (255, 215, 95), + (255, 215, 135), + (255, 215, 175), + (255, 215, 215), + (255, 215, 255), + (255, 255, 0), + (255, 255, 95), + (255, 255, 135), + (255, 255, 175), + (255, 255, 215), + (255, 255, 255), + (8, 8, 8), + (18, 18, 18), + (28, 28, 28), + (38, 38, 38), + (48, 48, 48), + (58, 58, 58), + (68, 68, 68), + (78, 78, 78), + (88, 88, 88), + (98, 98, 98), + (108, 108, 108), + (118, 118, 118), + (128, 128, 128), + (138, 138, 138), + (148, 148, 148), + (158, 158, 158), + (168, 168, 168), + (178, 178, 178), + (188, 188, 188), + (198, 198, 198), + (208, 208, 208), + (218, 218, 218), + (228, 228, 228), + (238, 238, 238), + ] +) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py new file mode 100644 index 0000000..4f6d8b2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py @@ -0,0 +1,17 @@ +from typing import Optional + + +def pick_bool(*values: Optional[bool]) -> bool: + """Pick the first non-none bool or return the last value. + + Args: + *values (bool): Any number of boolean or None values. + + Returns: + bool: First non-none boolean. + """ + assert values, "1 or more values required" + for value in values: + if value is not None: + return value + return bool(value) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py new file mode 100644 index 0000000..e8a3a67 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py @@ -0,0 +1,160 @@ +import sys +from fractions import Fraction +from math import ceil +from typing import cast, List, Optional, Sequence + +if sys.version_info >= (3, 8): + from typing import Protocol +else: + from pip._vendor.typing_extensions import Protocol # pragma: no cover + + +class Edge(Protocol): + """Any object that defines an edge (such as Layout).""" + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + +def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: + """Divide total space to satisfy size, ratio, and minimum_size, constraints. + + The returned list of integers should add up to total in most cases, unless it is + impossible to satisfy all the constraints. For instance, if there are two edges + with a minimum size of 20 each and `total` is 30 then the returned list will be + greater than total. In practice, this would mean that a Layout object would + clip the rows that would overflow the screen height. + + Args: + total (int): Total number of characters. + edges (List[Edge]): Edges within total space. + + Returns: + List[int]: Number of characters for each edge. + """ + # Size of edge or None for yet to be determined + sizes = [(edge.size or None) for edge in edges] + + _Fraction = Fraction + + # While any edges haven't been calculated + while None in sizes: + # Get flexible edges and index to map these back on to sizes list + flexible_edges = [ + (index, edge) + for index, (size, edge) in enumerate(zip(sizes, edges)) + if size is None + ] + # Remaining space in total + remaining = total - sum(size or 0 for size in sizes) + if remaining <= 0: + # No room for flexible edges + return [ + ((edge.minimum_size or 1) if size is None else size) + for size, edge in zip(sizes, edges) + ] + # Calculate number of characters in a ratio portion + portion = _Fraction( + remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) + ) + + # If any edges will be less than their minimum, replace size with the minimum + for index, edge in flexible_edges: + if portion * edge.ratio <= edge.minimum_size: + sizes[index] = edge.minimum_size + # New fixed size will invalidate calculations, so we need to repeat the process + break + else: + # Distribute flexible space and compensate for rounding error + # Since edge sizes can only be integers we need to add the remainder + # to the following line + remainder = _Fraction(0) + for index, edge in flexible_edges: + size, remainder = divmod(portion * edge.ratio + remainder, 1) + sizes[index] = size + break + # Sizes now contains integers only + return cast(List[int], sizes) + + +def ratio_reduce( + total: int, ratios: List[int], maximums: List[int], values: List[int] +) -> List[int]: + """Divide an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + maximums (List[int]): List of maximums values for each slot. + values (List[int]): List of values + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] + total_ratio = sum(ratios) + if not total_ratio: + return values[:] + total_remaining = total + result: List[int] = [] + append = result.append + for ratio, maximum, value in zip(ratios, maximums, values): + if ratio and total_ratio > 0: + distributed = min(maximum, round(ratio * total_remaining / total_ratio)) + append(value - distributed) + total_remaining -= distributed + total_ratio -= ratio + else: + append(value) + return result + + +def ratio_distribute( + total: int, ratios: List[int], minimums: Optional[List[int]] = None +) -> List[int]: + """Distribute an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + minimums (List[int]): List of minimum values for each slot. + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + if minimums: + ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] + total_ratio = sum(ratios) + assert total_ratio > 0, "Sum of ratios must be > 0" + + total_remaining = total + distributed_total: List[int] = [] + append = distributed_total.append + if minimums is None: + _minimums = [0] * len(ratios) + else: + _minimums = minimums + for ratio, minimum in zip(ratios, _minimums): + if total_ratio > 0: + distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) + else: + distributed = total_remaining + append(distributed) + total_ratio -= ratio + total_remaining -= distributed + return distributed_total + + +if __name__ == "__main__": + from dataclasses import dataclass + + @dataclass + class E: + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) + print(sum(resolved)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py new file mode 100644 index 0000000..d0bb1fe --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py @@ -0,0 +1,482 @@ +""" +Spinners are from: +* cli-spinners: + MIT License + Copyright (c) Sindre Sorhus (sindresorhus.com) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +""" + +SPINNERS = { + "dots": { + "interval": 80, + "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇â ", + }, + "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, + "dots3": { + "interval": 80, + "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", + }, + "dots4": { + "interval": 80, + "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", + }, + "dots5": { + "interval": 80, + "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒â â â ’â “â ‹", + }, + "dots6": { + "interval": 80, + "frames": "â â ‰â ™â šâ ’⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉â ", + }, + "dots7": { + "interval": 80, + "frames": "⠈⠉⠋⠓⠒â â â ’⠖⠦⠤⠠⠠⠤⠦⠖⠒â â â ’⠓⠋⠉⠈", + }, + "dots8": { + "interval": 80, + "frames": "â â â ‰â ™â šâ ’⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒â â â ’⠓⠋⠉⠈⠈", + }, + "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗â¡"}, + "dots10": {"interval": 80, "frames": "⢄⢂â¢â¡â¡ˆâ¡â¡ "}, + "dots11": {"interval": 100, "frames": "â â ‚⠄⡀⢀⠠â â ˆ"}, + "dots12": { + "interval": 80, + "frames": [ + "⢀⠀", + "⡀⠀", + "â „â €", + "⢂⠀", + "â¡‚â €", + "â …â €", + "⢃⠀", + "⡃⠀", + "â â €", + "⢋⠀", + "â¡‹â €", + "â â ", + "⢋â ", + "â¡‹â ", + "â â ‰", + "â ‹â ‰", + "â ‹â ‰", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⢈⠩", + "⡀⢙", + "â „â¡™", + "⢂⠩", + "⡂⢘", + "⠅⡘", + "⢃⠨", + "⡃â¢", + "â â¡", + "⢋⠠", + "⡋⢀", + "â â¡", + "⢋â ", + "â¡‹â ", + "â â ‰", + "â ‹â ‰", + "â ‹â ‰", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⠈⠩", + "⠀⢙", + "⠀⡙", + "⠀⠩", + "⠀⢘", + "⠀⡘", + "⠀⠨", + "â €â¢", + "â €â¡", + "⠀⠠", + "⠀⢀", + "⠀⡀", + ], + }, + "dots8Bit": { + "interval": 80, + "frames": "â €â â ‚⠃⠄⠅⠆⠇⡀â¡â¡‚⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌â â Žâ â¡ˆâ¡‰â¡Šâ¡‹â¡Œâ¡â¡Žâ¡â â ‘⠒⠓⠔⠕⠖⠗â¡â¡‘⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜â â žâ Ÿâ¡˜â¡™" + "⡚⡛⡜â¡â¡žâ¡Ÿâ  â ¡â ¢â £â ¤â ¥â ¦â §â¡ â¡¡â¡¢â¡£â¡¤â¡¥â¡¦â¡§â ¨â ©â ªâ «â ¬â ­â ®â ¯â¡¨â¡©â¡ªâ¡«â¡¬â¡­â¡®â¡¯â °â ±â ²â ³â ´â µâ ¶â ·â¡°â¡±â¡²â¡³â¡´â¡µâ¡¶â¡·â ¸â ¹â ºâ »" + "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀â¢â¢‚⢃⢄⢅⢆⢇⣀â£â£‚⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌â¢â¢Žâ¢â£ˆâ£‰â£Šâ£‹â£Œâ£â£Žâ£â¢â¢‘⢒⢓⢔⢕⢖⢗â£â£‘⣒⣓⣔⣕" + "⣖⣗⢘⢙⢚⢛⢜â¢â¢žâ¢Ÿâ£˜â£™â£šâ£›â£œâ£â£žâ£Ÿâ¢ â¢¡â¢¢â¢£â¢¤â¢¥â¢¦â¢§â£ â£¡â£¢â££â£¤â£¥â£¦â£§â¢¨â¢©â¢ªâ¢«â¢¬â¢­â¢®â¢¯â£¨â£©â£ªâ£«â£¬â£­â£®â£¯â¢°â¢±â¢²â¢³â¢´â¢µâ¢¶â¢·" + "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", + }, + "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, + "line2": {"interval": 100, "frames": "â ‚-–—–-"}, + "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬â”"}, + "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, + "simpleDotsScrolling": { + "interval": 200, + "frames": [". ", ".. ", "...", " ..", " .", " "], + }, + "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, + "star2": {"interval": 80, "frames": "+x*"}, + "flip": { + "interval": 70, + "frames": "___-``'´-___", + }, + "hamburger": {"interval": 100, "frames": "☱☲☴"}, + "growVertical": { + "interval": 120, + "frames": "â–▃▄▅▆▇▆▅▄▃", + }, + "growHorizontal": { + "interval": 120, + "frames": "â–â–Žâ–▌▋▊▉▊▋▌â–â–Ž", + }, + "balloon": {"interval": 140, "frames": " .oO@* "}, + "balloon2": {"interval": 120, "frames": ".oO°Oo."}, + "noise": {"interval": 100, "frames": "â–“â–’â–‘"}, + "bounce": {"interval": 120, "frames": "â â ‚â „â ‚"}, + "boxBounce": {"interval": 120, "frames": "â––â–˜â–â–—"}, + "boxBounce2": {"interval": 100, "frames": "▌▀â–â–„"}, + "triangle": {"interval": 50, "frames": "◢◣◤◥"}, + "arc": {"interval": 100, "frames": "◜◠â—â—žâ—¡â—Ÿ"}, + "circle": {"interval": 120, "frames": "◡⊙◠"}, + "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, + "circleQuarters": {"interval": 120, "frames": "â—´â—·â—¶â—µ"}, + "circleHalves": {"interval": 50, "frames": "â—â—“â—‘â—’"}, + "squish": {"interval": 100, "frames": "╫╪"}, + "toggle": {"interval": 250, "frames": "⊶⊷"}, + "toggle2": {"interval": 80, "frames": "â–«â–ª"}, + "toggle3": {"interval": 120, "frames": "â–¡â– "}, + "toggle4": {"interval": 100, "frames": "■□▪▫"}, + "toggle5": {"interval": 100, "frames": "▮▯"}, + "toggle6": {"interval": 300, "frames": "á€á€"}, + "toggle7": {"interval": 80, "frames": "⦾⦿"}, + "toggle8": {"interval": 100, "frames": "â—â—Œ"}, + "toggle9": {"interval": 100, "frames": "◉◎"}, + "toggle10": {"interval": 100, "frames": "㊂㊀ãŠ"}, + "toggle11": {"interval": 50, "frames": "⧇⧆"}, + "toggle12": {"interval": 120, "frames": "☗☖"}, + "toggle13": {"interval": 80, "frames": "=*-"}, + "arrow": {"interval": 100, "frames": "â†â†–↑↗→↘↓↙"}, + "arrow2": { + "interval": 80, + "frames": ["â¬†ï¸ ", "â†—ï¸ ", "âž¡ï¸ ", "â†˜ï¸ ", "â¬‡ï¸ ", "â†™ï¸ ", "â¬…ï¸ ", "â†–ï¸ "], + }, + "arrow3": { + "interval": 120, + "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], + }, + "bouncingBar": { + "interval": 80, + "frames": [ + "[ ]", + "[= ]", + "[== ]", + "[=== ]", + "[ ===]", + "[ ==]", + "[ =]", + "[ ]", + "[ =]", + "[ ==]", + "[ ===]", + "[====]", + "[=== ]", + "[== ]", + "[= ]", + ], + }, + "bouncingBall": { + "interval": 80, + "frames": [ + "( â— )", + "( â— )", + "( â— )", + "( â— )", + "( â—)", + "( â— )", + "( â— )", + "( â— )", + "( â— )", + "(â— )", + ], + }, + "smiley": {"interval": 200, "frames": ["😄 ", "😠"]}, + "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, + "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "â¤ï¸ "]}, + "clock": { + "interval": 100, + "frames": [ + "🕛 ", + "🕠", + "🕑 ", + "🕒 ", + "🕓 ", + "🕔 ", + "🕕 ", + "🕖 ", + "🕗 ", + "🕘 ", + "🕙 ", + "🕚 ", + ], + }, + "earth": {"interval": 180, "frames": ["🌠", "🌎 ", "🌠"]}, + "material": { + "interval": 17, + "frames": [ + "â–ˆâ–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "██â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "███â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "████â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "██████â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "██████â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "███████â–â–â–â–â–â–â–â–â–â–â–â–â–", + "████████â–â–â–â–â–â–â–â–â–â–â–â–", + "█████████â–â–â–â–â–â–â–â–â–â–â–", + "█████████â–â–â–â–â–â–â–â–â–â–â–", + "██████████â–â–â–â–â–â–â–â–â–â–", + "███████████â–â–â–â–â–â–â–â–â–", + "█████████████â–â–â–â–â–â–â–", + "██████████████â–â–â–â–â–â–", + "██████████████â–â–â–â–â–â–", + "â–██████████████â–â–â–â–â–", + "â–██████████████â–â–â–â–â–", + "â–██████████████â–â–â–â–â–", + "â–â–██████████████â–â–â–â–", + "â–â–â–██████████████â–â–â–", + "â–â–â–â–█████████████â–â–â–", + "â–â–â–â–██████████████â–â–", + "â–â–â–â–██████████████â–â–", + "â–â–â–â–â–██████████████â–", + "â–â–â–â–â–██████████████â–", + "â–â–â–â–â–██████████████â–", + "â–â–â–â–â–â–██████████████", + "â–â–â–â–â–â–██████████████", + "â–â–â–â–â–â–â–█████████████", + "â–â–â–â–â–â–â–█████████████", + "â–â–â–â–â–â–â–â–████████████", + "â–â–â–â–â–â–â–â–████████████", + "â–â–â–â–â–â–â–â–â–███████████", + "â–â–â–â–â–â–â–â–â–███████████", + "â–â–â–â–â–â–â–â–â–â–██████████", + "â–â–â–â–â–â–â–â–â–â–██████████", + "â–â–â–â–â–â–â–â–â–â–â–â–████████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–███████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–██████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–█████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–█████", + "â–ˆâ–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", + "██â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", + "██â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", + "███â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", + "████â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", + "█████â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", + "█████â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", + "██████â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", + "████████â–â–â–â–â–â–â–â–â–â–â–â–", + "█████████â–â–â–â–â–â–â–â–â–â–â–", + "█████████â–â–â–â–â–â–â–â–â–â–â–", + "█████████â–â–â–â–â–â–â–â–â–â–â–", + "█████████â–â–â–â–â–â–â–â–â–â–â–", + "███████████â–â–â–â–â–â–â–â–â–", + "████████████â–â–â–â–â–â–â–â–", + "████████████â–â–â–â–â–â–â–â–", + "██████████████â–â–â–â–â–â–", + "██████████████â–â–â–â–â–â–", + "â–██████████████â–â–â–â–â–", + "â–██████████████â–â–â–â–â–", + "â–â–â–█████████████â–â–â–â–", + "â–â–â–â–â–████████████â–â–â–", + "â–â–â–â–â–████████████â–â–â–", + "â–â–â–â–â–â–███████████â–â–â–", + "â–â–â–â–â–â–â–â–█████████â–â–â–", + "â–â–â–â–â–â–â–â–█████████â–â–â–", + "â–â–â–â–â–â–â–â–â–█████████â–â–", + "â–â–â–â–â–â–â–â–â–█████████â–â–", + "â–â–â–â–â–â–â–â–â–â–█████████â–", + "â–â–â–â–â–â–â–â–â–â–â–████████â–", + "â–â–â–â–â–â–â–â–â–â–â–████████â–", + "â–â–â–â–â–â–â–â–â–â–â–â–███████â–", + "â–â–â–â–â–â–â–â–â–â–â–â–███████â–", + "â–â–â–â–â–â–â–â–â–â–â–â–â–███████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–███████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–█████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", + ], + }, + "moon": { + "interval": 80, + "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], + }, + "runner": {"interval": 140, "frames": ["🚶 ", "🃠"]}, + "pong": { + "interval": 80, + "frames": [ + "â–â ‚ â–Œ", + "â–â ˆ â–Œ", + "â– â ‚ â–Œ", + "â– â   â–Œ", + "â– â¡€ â–Œ", + "â– â   â–Œ", + "â– â ‚ â–Œ", + "â– â ˆ â–Œ", + "â– â ‚ â–Œ", + "â– â   â–Œ", + "â– â¡€ â–Œ", + "â– â   â–Œ", + "â– â ‚ â–Œ", + "â– â ˆ â–Œ", + "â– â ‚â–Œ", + "â– â  â–Œ", + "■⡀▌", + "â– â   â–Œ", + "â– â ‚ â–Œ", + "â– â ˆ â–Œ", + "â– â ‚ â–Œ", + "â– â   â–Œ", + "â– â¡€ â–Œ", + "â– â   â–Œ", + "â– â ‚ â–Œ", + "â– â ˆ â–Œ", + "â– â ‚ â–Œ", + "â– â   â–Œ", + "â– â¡€ â–Œ", + "â–â   â–Œ", + ], + }, + "shark": { + "interval": 120, + "frames": [ + "â–|\\____________â–Œ", + "â–_|\\___________â–Œ", + "â–__|\\__________â–Œ", + "â–___|\\_________â–Œ", + "â–____|\\________â–Œ", + "â–_____|\\_______â–Œ", + "â–______|\\______â–Œ", + "â–_______|\\_____â–Œ", + "â–________|\\____â–Œ", + "â–_________|\\___â–Œ", + "â–__________|\\__â–Œ", + "â–___________|\\_â–Œ", + "â–____________|\\â–Œ", + "â–____________/|â–Œ", + "â–___________/|_â–Œ", + "â–__________/|__â–Œ", + "â–_________/|___â–Œ", + "â–________/|____â–Œ", + "â–_______/|_____â–Œ", + "â–______/|______â–Œ", + "â–_____/|_______â–Œ", + "â–____/|________â–Œ", + "â–___/|_________â–Œ", + "â–__/|__________â–Œ", + "â–_/|___________â–Œ", + "â–/|____________â–Œ", + ], + }, + "dqpb": {"interval": 100, "frames": "dqpb"}, + "weather": { + "interval": 100, + "frames": [ + "â˜€ï¸ ", + "â˜€ï¸ ", + "â˜€ï¸ ", + "🌤 ", + "â›…ï¸ ", + "🌥 ", + "â˜ï¸ ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "⛈ ", + "🌨 ", + "🌧 ", + "🌨 ", + "â˜ï¸ ", + "🌥 ", + "â›…ï¸ ", + "🌤 ", + "â˜€ï¸ ", + "â˜€ï¸ ", + ], + }, + "christmas": {"interval": 400, "frames": "🌲🎄"}, + "grenade": { + "interval": 80, + "frames": [ + "ØŒ ", + "′ ", + " ´ ", + " ‾ ", + " ⸌", + " ⸊", + " |", + " âŽ", + " â•", + " à·´ ", + " â“", + " ", + " ", + " ", + ], + }, + "point": {"interval": 125, "frames": ["∙∙∙", "â—∙∙", "∙â—∙", "∙∙â—", "∙∙∙"]}, + "layer": {"interval": 150, "frames": "-=≡"}, + "betaWave": { + "interval": 80, + "frames": [ + "Ïββββββ", + "βÏβββββ", + "ββÏββββ", + "βββÏβββ", + "ββββÏββ", + "βββββÏβ", + "ββββββÏ", + ], + }, + "aesthetic": { + "interval": 80, + "frames": [ + "▰▱▱▱▱▱▱", + "▰▰▱▱▱▱▱", + "▰▰▰▱▱▱▱", + "▰▰▰▰▱▱▱", + "▰▰▰▰▰▱▱", + "â–°â–°â–°â–°â–°â–°â–±", + "â–°â–°â–°â–°â–°â–°â–°", + "▰▱▱▱▱▱▱", + ], + }, +} diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py new file mode 100644 index 0000000..194564e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py @@ -0,0 +1,16 @@ +from typing import List, TypeVar + +T = TypeVar("T") + + +class Stack(List[T]): + """A small shim over builtin list.""" + + @property + def top(self) -> T: + """Get top of stack.""" + return self[-1] + + def push(self, item: T) -> None: + """Push an item on to the stack (append in stack nomenclature).""" + self.append(item) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py new file mode 100644 index 0000000..a2ca6be --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py @@ -0,0 +1,19 @@ +""" +Timer context manager, only used in debug. + +""" + +from time import time + +import contextlib +from typing import Generator + + +@contextlib.contextmanager +def timer(subject: str = "time") -> Generator[None, None, None]: + """print the elapsed time. (only used in debugging)""" + start = time() + yield + elapsed = time() - start + elapsed_ms = elapsed * 1000 + print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py new file mode 100644 index 0000000..81b1082 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py @@ -0,0 +1,662 @@ +"""Light wrapper around the Win32 Console API - this module should only be imported on Windows + +The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions +""" +import ctypes +import sys +from typing import Any + +windll: Any = None +if sys.platform == "win32": + windll = ctypes.LibraryLoader(ctypes.WinDLL) +else: + raise ImportError(f"{__name__} can only be imported on Windows") + +import time +from ctypes import Structure, byref, wintypes +from typing import IO, NamedTuple, Type, cast + +from pip._vendor.rich.color import ColorSystem +from pip._vendor.rich.style import Style + +STDOUT = -11 +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 + +COORD = wintypes._COORD + + +class LegacyWindowsError(Exception): + pass + + +class WindowsCoordinates(NamedTuple): + """Coordinates in the Windows Console API are (y, x), not (x, y). + This class is intended to prevent that confusion. + Rows and columns are indexed from 0. + This class can be used in place of wintypes._COORD in arguments and argtypes. + """ + + row: int + col: int + + @classmethod + def from_param(cls, value: "WindowsCoordinates") -> COORD: + """Converts a WindowsCoordinates into a wintypes _COORD structure. + This classmethod is internally called by ctypes to perform the conversion. + + Args: + value (WindowsCoordinates): The input coordinates to convert. + + Returns: + wintypes._COORD: The converted coordinates struct. + """ + return COORD(value.col, value.row) + + +class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + + +class CONSOLE_CURSOR_INFO(ctypes.Structure): + _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] + + +_GetStdHandle = windll.kernel32.GetStdHandle +_GetStdHandle.argtypes = [ + wintypes.DWORD, +] +_GetStdHandle.restype = wintypes.HANDLE + + +def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: + """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). + + Args: + handle (int): Integer identifier for the handle. Defaults to -11 (stdout). + + Returns: + wintypes.HANDLE: The handle + """ + return cast(wintypes.HANDLE, _GetStdHandle(handle)) + + +_GetConsoleMode = windll.kernel32.GetConsoleMode +_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] +_GetConsoleMode.restype = wintypes.BOOL + + +def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: + """Retrieves the current input mode of a console's input buffer + or the current output mode of a console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Raises: + LegacyWindowsError: If any error occurs while calling the Windows console API. + + Returns: + int: Value representing the current console mode as documented at + https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters + """ + + console_mode = wintypes.DWORD() + success = bool(_GetConsoleMode(std_handle, console_mode)) + if not success: + raise LegacyWindowsError("Unable to get legacy Windows Console Mode") + return console_mode.value + + +_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW +_FillConsoleOutputCharacterW.argtypes = [ + wintypes.HANDLE, + ctypes.c_char, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputCharacterW.restype = wintypes.BOOL + + +def FillConsoleOutputCharacter( + std_handle: wintypes.HANDLE, + char: str, + length: int, + start: WindowsCoordinates, +) -> int: + """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + char (str): The character to write. Must be a string of length 1. + length (int): The number of times to write the character. + start (WindowsCoordinates): The coordinates to start writing at. + + Returns: + int: The number of characters written. + """ + character = ctypes.c_char(char.encode()) + num_characters = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + _FillConsoleOutputCharacterW( + std_handle, + character, + num_characters, + start, + byref(num_written), + ) + return num_written.value + + +_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute +_FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputAttribute.restype = wintypes.BOOL + + +def FillConsoleOutputAttribute( + std_handle: wintypes.HANDLE, + attributes: int, + length: int, + start: WindowsCoordinates, +) -> int: + """Sets the character attributes for a specified number of character cells, + beginning at the specified coordinates in a screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours of the cells. + length (int): The number of cells to set the output attribute of. + start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. + + Returns: + int: The number of cells whose attributes were actually set. + """ + num_cells = wintypes.DWORD(length) + style_attrs = wintypes.WORD(attributes) + num_written = wintypes.DWORD(0) + _FillConsoleOutputAttribute( + std_handle, style_attrs, num_cells, start, byref(num_written) + ) + return num_written.value + + +_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute +_SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, +] +_SetConsoleTextAttribute.restype = wintypes.BOOL + + +def SetConsoleTextAttribute( + std_handle: wintypes.HANDLE, attributes: wintypes.WORD +) -> bool: + """Set the colour attributes for all text written after this function is called. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours. + + + Returns: + bool: True if the attribute was set successfully, otherwise False. + """ + return bool(_SetConsoleTextAttribute(std_handle, attributes)) + + +_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo +_GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), +] +_GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + +def GetConsoleScreenBufferInfo( + std_handle: wintypes.HANDLE, +) -> CONSOLE_SCREEN_BUFFER_INFO: + """Retrieves information about the specified console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Returns: + CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about + screen size, cursor position, colour attributes, and more.""" + console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() + _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) + return console_screen_buffer_info + + +_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition +_SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + cast(Type[COORD], WindowsCoordinates), +] +_SetConsoleCursorPosition.restype = wintypes.BOOL + + +def SetConsoleCursorPosition( + std_handle: wintypes.HANDLE, coords: WindowsCoordinates +) -> bool: + """Set the position of the cursor in the console screen + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + coords (WindowsCoordinates): The coordinates to move the cursor to. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorPosition(std_handle, coords)) + + +_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo +_GetConsoleCursorInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_CURSOR_INFO), +] +_GetConsoleCursorInfo.restype = wintypes.BOOL + + +def GetConsoleCursorInfo( + std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO +) -> bool: + """Get the cursor info - used to get cursor visibility and width + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information + about the console's cursor. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info))) + + +_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo +_SetConsoleCursorInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_CURSOR_INFO), +] +_SetConsoleCursorInfo.restype = wintypes.BOOL + + +def SetConsoleCursorInfo( + std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO +) -> bool: + """Set the cursor info - used for adjusting cursor visibility and width + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) + + +_SetConsoleTitle = windll.kernel32.SetConsoleTitleW +_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] +_SetConsoleTitle.restype = wintypes.BOOL + + +def SetConsoleTitle(title: str) -> bool: + """Sets the title of the current console window + + Args: + title (str): The new title of the console window. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleTitle(title)) + + +class LegacyWindowsTerm: + """This class allows interaction with the legacy Windows Console API. It should only be used in the context + of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, + the entire API should work. + + Args: + file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. + """ + + BRIGHT_BIT = 8 + + # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers + ANSI_TO_WINDOWS = [ + 0, # black The Windows colours are defined in wincon.h as follows: + 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 + 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 + 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 + 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 + 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 + 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 + 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 + 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 + 12, # bright red + 10, # bright green + 14, # bright yellow + 9, # bright blue + 13, # bright magenta + 11, # bright cyan + 15, # bright white + ] + + def __init__(self, file: "IO[str]") -> None: + handle = GetStdHandle(STDOUT) + self._handle = handle + default_text = GetConsoleScreenBufferInfo(handle).wAttributes + self._default_text = default_text + + self._default_fore = default_text & 7 + self._default_back = (default_text >> 4) & 7 + self._default_attrs = self._default_fore | (self._default_back << 4) + + self._file = file + self.write = file.write + self.flush = file.flush + + @property + def cursor_position(self) -> WindowsCoordinates: + """Returns the current position of the cursor (0-based) + + Returns: + WindowsCoordinates: The current cursor position. + """ + coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition + return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) + + @property + def screen_size(self) -> WindowsCoordinates: + """Returns the current size of the console screen buffer, in character columns and rows + + Returns: + WindowsCoordinates: The width and height of the screen as WindowsCoordinates. + """ + screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize + return WindowsCoordinates( + row=cast(int, screen_size.Y), col=cast(int, screen_size.X) + ) + + def write_text(self, text: str) -> None: + """Write text directly to the terminal without any modification of styles + + Args: + text (str): The text to write to the console + """ + self.write(text) + self.flush() + + def write_styled(self, text: str, style: Style) -> None: + """Write styled text to the terminal. + + Args: + text (str): The text to write + style (Style): The style of the text + """ + color = style.color + bgcolor = style.bgcolor + if style.reverse: + color, bgcolor = bgcolor, color + + if color: + fore = color.downgrade(ColorSystem.WINDOWS).number + fore = fore if fore is not None else 7 # Default to ANSI 7: White + if style.bold: + fore = fore | self.BRIGHT_BIT + if style.dim: + fore = fore & ~self.BRIGHT_BIT + fore = self.ANSI_TO_WINDOWS[fore] + else: + fore = self._default_fore + + if bgcolor: + back = bgcolor.downgrade(ColorSystem.WINDOWS).number + back = back if back is not None else 0 # Default to ANSI 0: Black + back = self.ANSI_TO_WINDOWS[back] + else: + back = self._default_back + + assert fore is not None + assert back is not None + + SetConsoleTextAttribute( + self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) + ) + self.write_text(text) + SetConsoleTextAttribute(self._handle, attributes=self._default_text) + + def move_cursor_to(self, new_position: WindowsCoordinates) -> None: + """Set the position of the cursor + + Args: + new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. + """ + if new_position.col < 0 or new_position.row < 0: + return + SetConsoleCursorPosition(self._handle, coords=new_position) + + def erase_line(self) -> None: + """Erase all content on the line the cursor is currently located at""" + screen_size = self.screen_size + cursor_position = self.cursor_position + cells_to_erase = screen_size.col + start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=start_coordinates + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=start_coordinates, + ) + + def erase_end_of_line(self) -> None: + """Erase all content from the cursor position to the end of that line""" + cursor_position = self.cursor_position + cells_to_erase = self.screen_size.col - cursor_position.col + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=cursor_position + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=cursor_position, + ) + + def erase_start_of_line(self) -> None: + """Erase all content from the cursor position to the start of that line""" + row, col = self.cursor_position + start = WindowsCoordinates(row, 0) + FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) + FillConsoleOutputAttribute( + self._handle, self._default_attrs, length=col, start=start + ) + + def move_cursor_up(self) -> None: + """Move the cursor up a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row - 1, col=cursor_position.col + ), + ) + + def move_cursor_down(self) -> None: + """Move the cursor down a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row + 1, + col=cursor_position.col, + ), + ) + + def move_cursor_forward(self) -> None: + """Move the cursor forward a single cell. Wrap to the next line if required.""" + row, col = self.cursor_position + if col == self.screen_size.col - 1: + row += 1 + col = 0 + else: + col += 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def move_cursor_to_column(self, column: int) -> None: + """Move cursor to the column specified by the zero-based column index, staying on the same row + + Args: + column (int): The zero-based column index to move the cursor to. + """ + row, _ = self.cursor_position + SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) + + def move_cursor_backward(self) -> None: + """Move the cursor backward a single cell. Wrap to the previous line if required.""" + row, col = self.cursor_position + if col == 0: + row -= 1 + col = self.screen_size.col - 1 + else: + col -= 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def hide_cursor(self) -> None: + """Hide the cursor""" + current_cursor_size = self._get_cursor_size() + invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0) + SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) + + def show_cursor(self) -> None: + """Show the cursor""" + current_cursor_size = self._get_cursor_size() + visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1) + SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) + + def set_title(self, title: str) -> None: + """Set the title of the terminal window + + Args: + title (str): The new title of the console window + """ + assert len(title) < 255, "Console title must be less than 255 characters" + SetConsoleTitle(title) + + def _get_cursor_size(self) -> int: + """Get the percentage of the character cell that is filled by the cursor""" + cursor_info = CONSOLE_CURSOR_INFO() + GetConsoleCursorInfo(self._handle, cursor_info=cursor_info) + return int(cursor_info.dwSize) + + +if __name__ == "__main__": + handle = GetStdHandle() + + from pip._vendor.rich.console import Console + + console = Console() + + term = LegacyWindowsTerm(sys.stdout) + term.set_title("Win32 Console Examples") + + style = Style(color="black", bgcolor="red") + + heading = Style.parse("black on green") + + # Check colour output + console.rule("Checking colour output") + console.print("[on red]on red!") + console.print("[blue]blue!") + console.print("[yellow]yellow!") + console.print("[bold yellow]bold yellow!") + console.print("[bright_yellow]bright_yellow!") + console.print("[dim bright_yellow]dim bright_yellow!") + console.print("[italic cyan]italic cyan!") + console.print("[bold white on blue]bold white on blue!") + console.print("[reverse bold white on blue]reverse bold white on blue!") + console.print("[bold black on cyan]bold black on cyan!") + console.print("[black on green]black on green!") + console.print("[blue on green]blue on green!") + console.print("[white on black]white on black!") + console.print("[black on white]black on white!") + console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") + + # Check cursor movement + console.rule("Checking cursor movement") + console.print() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("went back and wrapped to prev line") + time.sleep(1) + term.move_cursor_up() + term.write_text("we go up") + time.sleep(1) + term.move_cursor_down() + term.write_text("and down") + time.sleep(1) + term.move_cursor_up() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went up and back 2") + time.sleep(1) + term.move_cursor_down() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went down and back 2") + time.sleep(1) + + # Check erasing of lines + term.hide_cursor() + console.print() + console.rule("Checking line erasing") + console.print("\n...Deleting to the start of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + term.move_cursor_to_column(16) + term.write_styled("<", Style.parse("black on red")) + term.move_cursor_backward() + time.sleep(1) + term.erase_start_of_line() + time.sleep(1) + + console.print("\n\n...And to the end of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + + term.move_cursor_to_column(16) + term.write_styled(">", Style.parse("black on red")) + time.sleep(1) + term.erase_end_of_line() + time.sleep(1) + + console.print("\n\n...Now the whole line will be erased...") + term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) + time.sleep(1) + term.erase_line() + + term.show_cursor() + print("\n") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py new file mode 100644 index 0000000..10fc0d7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py @@ -0,0 +1,72 @@ +import sys +from dataclasses import dataclass + + +@dataclass +class WindowsConsoleFeatures: + """Windows features available.""" + + vt: bool = False + """The console supports VT codes.""" + truecolor: bool = False + """The console supports truecolor.""" + + +try: + import ctypes + from ctypes import LibraryLoader + + if sys.platform == "win32": + windll = LibraryLoader(ctypes.WinDLL) + else: + windll = None + raise ImportError("Not windows") + + from pip._vendor.rich._win32_console import ( + ENABLE_VIRTUAL_TERMINAL_PROCESSING, + GetConsoleMode, + GetStdHandle, + LegacyWindowsError, + ) + +except (AttributeError, ImportError, ValueError): + + # Fallback if we can't load the Windows DLL + def get_windows_console_features() -> WindowsConsoleFeatures: + features = WindowsConsoleFeatures() + return features + +else: + + def get_windows_console_features() -> WindowsConsoleFeatures: + """Get windows console features. + + Returns: + WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. + """ + handle = GetStdHandle() + try: + console_mode = GetConsoleMode(handle) + success = True + except LegacyWindowsError: + console_mode = 0 + success = False + vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) + truecolor = False + if vt: + win_version = sys.getwindowsversion() + truecolor = win_version.major > 10 or ( + win_version.major == 10 and win_version.build >= 15063 + ) + features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) + return features + + +if __name__ == "__main__": + import platform + + features = get_windows_console_features() + from pip._vendor.rich import print + + print(f'platform="{platform.system()}"') + print(repr(features)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py new file mode 100644 index 0000000..5ece056 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py @@ -0,0 +1,56 @@ +from typing import Iterable, Sequence, Tuple, cast + +from pip._vendor.rich._win32_console import LegacyWindowsTerm, WindowsCoordinates +from pip._vendor.rich.segment import ControlCode, ControlType, Segment + + +def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: + """Makes appropriate Windows Console API calls based on the segments in the buffer. + + Args: + buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. + term (LegacyWindowsTerm): Used to call the Windows Console API. + """ + for text, style, control in buffer: + if not control: + if style: + term.write_styled(text, style) + else: + term.write_text(text) + else: + control_codes: Sequence[ControlCode] = control + for control_code in control_codes: + control_type = control_code[0] + if control_type == ControlType.CURSOR_MOVE_TO: + _, x, y = cast(Tuple[ControlType, int, int], control_code) + term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) + elif control_type == ControlType.CARRIAGE_RETURN: + term.write_text("\r") + elif control_type == ControlType.HOME: + term.move_cursor_to(WindowsCoordinates(0, 0)) + elif control_type == ControlType.CURSOR_UP: + term.move_cursor_up() + elif control_type == ControlType.CURSOR_DOWN: + term.move_cursor_down() + elif control_type == ControlType.CURSOR_FORWARD: + term.move_cursor_forward() + elif control_type == ControlType.CURSOR_BACKWARD: + term.move_cursor_backward() + elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: + _, column = cast(Tuple[ControlType, int], control_code) + term.move_cursor_to_column(column - 1) + elif control_type == ControlType.HIDE_CURSOR: + term.hide_cursor() + elif control_type == ControlType.SHOW_CURSOR: + term.show_cursor() + elif control_type == ControlType.ERASE_IN_LINE: + _, mode = cast(Tuple[ControlType, int], control_code) + if mode == 0: + term.erase_end_of_line() + elif mode == 1: + term.erase_start_of_line() + elif mode == 2: + term.erase_line() + elif control_type == ControlType.SET_WINDOW_TITLE: + _, title = cast(Tuple[ControlType, str], control_code) + term.set_title(title) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py new file mode 100644 index 0000000..c45f193 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py @@ -0,0 +1,56 @@ +import re +from typing import Iterable, List, Tuple + +from ._loop import loop_last +from .cells import cell_len, chop_cells + +re_word = re.compile(r"\s*\S+\s*") + + +def words(text: str) -> Iterable[Tuple[int, int, str]]: + position = 0 + word_match = re_word.match(text, position) + while word_match is not None: + start, end = word_match.span() + word = word_match.group(0) + yield start, end, word + word_match = re_word.match(text, end) + + +def divide_line(text: str, width: int, fold: bool = True) -> List[int]: + divides: List[int] = [] + append = divides.append + line_position = 0 + _cell_len = cell_len + for start, _end, word in words(text): + word_length = _cell_len(word.rstrip()) + if line_position + word_length > width: + if word_length > width: + if fold: + chopped_words = chop_cells(word, max_size=width, position=0) + for last, line in loop_last(chopped_words): + if start: + append(start) + + if last: + line_position = _cell_len(line) + else: + start += len(line) + else: + if start: + append(start) + line_position = _cell_len(word) + elif line_position and start: + append(start) + line_position = _cell_len(word) + else: + line_position += _cell_len(word) + return divides + + +if __name__ == "__main__": # pragma: no cover + from .console import Console + + console = Console(width=10) + console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") + print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py new file mode 100644 index 0000000..e6e498e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py @@ -0,0 +1,33 @@ +from abc import ABC + + +class RichRenderable(ABC): + """An abstract base class for Rich renderables. + + Note that there is no need to extend this class, the intended use is to check if an + object supports the Rich renderable protocol. For example:: + + if isinstance(my_object, RichRenderable): + console.print(my_object) + + """ + + @classmethod + def __subclasshook__(cls, other: type) -> bool: + """Check if this class supports the rich render protocol.""" + return hasattr(other, "__rich_console__") or hasattr(other, "__rich__") + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.text import Text + + t = Text() + print(isinstance(Text, RichRenderable)) + print(isinstance(t, RichRenderable)) + + class Foo: + pass + + f = Foo() + print(isinstance(f, RichRenderable)) + print(isinstance("", RichRenderable)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py new file mode 100644 index 0000000..c310b66 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py @@ -0,0 +1,311 @@ +import sys +from itertools import chain +from typing import TYPE_CHECKING, Iterable, Optional + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + +from .constrain import Constrain +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import StyleType + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + +AlignMethod = Literal["left", "center", "right"] +VerticalAlignMethod = Literal["top", "middle", "bottom"] + + +class Align(JupyterMixin): + """Align a renderable by adding spaces if necessary. + + Args: + renderable (RenderableType): A console renderable. + align (AlignMethod): One of "left", "center", or "right"" + style (StyleType, optional): An optional style to apply to the background. + vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. + pad (bool, optional): Pad the right with spaces. Defaults to True. + width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. + height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. + + Raises: + ValueError: if ``align`` is not one of the expected values. + """ + + def __init__( + self, + renderable: "RenderableType", + align: AlignMethod = "left", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> None: + if align not in ("left", "center", "right"): + raise ValueError( + f'invalid value for align, expected "left", "center", or "right" (not {align!r})' + ) + if vertical is not None and vertical not in ("top", "middle", "bottom"): + raise ValueError( + f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' + ) + self.renderable = renderable + self.align = align + self.style = style + self.vertical = vertical + self.pad = pad + self.width = width + self.height = height + + def __repr__(self) -> str: + return f"Align({self.renderable!r}, {self.align!r})" + + @classmethod + def left( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the left.""" + return cls( + renderable, + "left", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + @classmethod + def center( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the center.""" + return cls( + renderable, + "center", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + @classmethod + def right( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the right.""" + return cls( + renderable, + "right", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + align = self.align + width = console.measure(self.renderable, options=options).maximum + rendered = console.render( + Constrain( + self.renderable, width if self.width is None else min(width, self.width) + ), + options.update(height=None), + ) + lines = list(Segment.split_lines(rendered)) + width, height = Segment.get_shape(lines) + lines = Segment.set_shape(lines, width, height) + new_line = Segment.line() + excess_space = options.max_width - width + style = console.get_style(self.style) if self.style is not None else None + + def generate_segments() -> Iterable[Segment]: + if excess_space <= 0: + # Exact fit + for line in lines: + yield from line + yield new_line + + elif align == "left": + # Pad on the right + pad = Segment(" " * excess_space, style) if self.pad else None + for line in lines: + yield from line + if pad: + yield pad + yield new_line + + elif align == "center": + # Pad left and right + left = excess_space // 2 + pad = Segment(" " * left, style) + pad_right = ( + Segment(" " * (excess_space - left), style) if self.pad else None + ) + for line in lines: + if left: + yield pad + yield from line + if pad_right: + yield pad_right + yield new_line + + elif align == "right": + # Padding on left + pad = Segment(" " * excess_space, style) + for line in lines: + yield pad + yield from line + yield new_line + + blank_line = ( + Segment(f"{' ' * (self.width or options.max_width)}\n", style) + if self.pad + else Segment("\n") + ) + + def blank_lines(count: int) -> Iterable[Segment]: + if count > 0: + for _ in range(count): + yield blank_line + + vertical_height = self.height or options.height + iter_segments: Iterable[Segment] + if self.vertical and vertical_height is not None: + if self.vertical == "top": + bottom_space = vertical_height - height + iter_segments = chain(generate_segments(), blank_lines(bottom_space)) + elif self.vertical == "middle": + top_space = (vertical_height - height) // 2 + bottom_space = vertical_height - top_space - height + iter_segments = chain( + blank_lines(top_space), + generate_segments(), + blank_lines(bottom_space), + ) + else: # self.vertical == "bottom": + top_space = vertical_height - height + iter_segments = chain(blank_lines(top_space), generate_segments()) + else: + iter_segments = generate_segments() + if self.style: + style = console.get_style(self.style) + iter_segments = Segment.apply_style(iter_segments, style) + yield from iter_segments + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) + return measurement + + +class VerticalCenter(JupyterMixin): + """Vertically aligns a renderable. + + Warn: + This class is deprecated and may be removed in a future version. Use Align class with + `vertical="middle"`. + + Args: + renderable (RenderableType): A renderable object. + """ + + def __init__( + self, + renderable: "RenderableType", + style: Optional[StyleType] = None, + ) -> None: + self.renderable = renderable + self.style = style + + def __repr__(self) -> str: + return f"VerticalCenter({self.renderable!r})" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + style = console.get_style(self.style) if self.style is not None else None + lines = console.render_lines( + self.renderable, options.update(height=None), pad=False + ) + width, _height = Segment.get_shape(lines) + new_line = Segment.line() + height = options.height or options.size.height + top_space = (height - len(lines)) // 2 + bottom_space = height - top_space - len(lines) + blank_line = Segment(f"{' ' * width}", style) + + def blank_lines(count: int) -> Iterable[Segment]: + for _ in range(count): + yield blank_line + yield new_line + + if top_space > 0: + yield from blank_lines(top_space) + for line in lines: + yield from line + yield new_line + if bottom_space > 0: + yield from blank_lines(bottom_space) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) + return measurement + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console, Group + from pip._vendor.rich.highlighter import ReprHighlighter + from pip._vendor.rich.panel import Panel + + highlighter = ReprHighlighter() + console = Console() + + panel = Panel( + Group( + Align.left(highlighter("align='left'")), + Align.center(highlighter("align='center'")), + Align.right(highlighter("align='right'")), + ), + width=60, + style="on dark_blue", + title="Align", + ) + + console.print( + Align.center(panel, vertical="middle", style="on red", height=console.height) + ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py new file mode 100644 index 0000000..66365e6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py @@ -0,0 +1,240 @@ +import re +import sys +from contextlib import suppress +from typing import Iterable, NamedTuple, Optional + +from .color import Color +from .style import Style +from .text import Text + +re_ansi = re.compile( + r""" +(?:\x1b\](.*?)\x1b\\)| +(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) +""", + re.VERBOSE, +) + + +class _AnsiToken(NamedTuple): + """Result of ansi tokenized string.""" + + plain: str = "" + sgr: Optional[str] = "" + osc: Optional[str] = "" + + +def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: + """Tokenize a string in to plain text and ANSI codes. + + Args: + ansi_text (str): A String containing ANSI codes. + + Yields: + AnsiToken: A named tuple of (plain, sgr, osc) + """ + + position = 0 + sgr: Optional[str] + osc: Optional[str] + for match in re_ansi.finditer(ansi_text): + start, end = match.span(0) + osc, sgr = match.groups() + if start > position: + yield _AnsiToken(ansi_text[position:start]) + if sgr: + if sgr == "(": + position = end + 1 + continue + if sgr.endswith("m"): + yield _AnsiToken("", sgr[1:-1], osc) + else: + yield _AnsiToken("", sgr, osc) + position = end + if position < len(ansi_text): + yield _AnsiToken(ansi_text[position:]) + + +SGR_STYLE_MAP = { + 1: "bold", + 2: "dim", + 3: "italic", + 4: "underline", + 5: "blink", + 6: "blink2", + 7: "reverse", + 8: "conceal", + 9: "strike", + 21: "underline2", + 22: "not dim not bold", + 23: "not italic", + 24: "not underline", + 25: "not blink", + 26: "not blink2", + 27: "not reverse", + 28: "not conceal", + 29: "not strike", + 30: "color(0)", + 31: "color(1)", + 32: "color(2)", + 33: "color(3)", + 34: "color(4)", + 35: "color(5)", + 36: "color(6)", + 37: "color(7)", + 39: "default", + 40: "on color(0)", + 41: "on color(1)", + 42: "on color(2)", + 43: "on color(3)", + 44: "on color(4)", + 45: "on color(5)", + 46: "on color(6)", + 47: "on color(7)", + 49: "on default", + 51: "frame", + 52: "encircle", + 53: "overline", + 54: "not frame not encircle", + 55: "not overline", + 90: "color(8)", + 91: "color(9)", + 92: "color(10)", + 93: "color(11)", + 94: "color(12)", + 95: "color(13)", + 96: "color(14)", + 97: "color(15)", + 100: "on color(8)", + 101: "on color(9)", + 102: "on color(10)", + 103: "on color(11)", + 104: "on color(12)", + 105: "on color(13)", + 106: "on color(14)", + 107: "on color(15)", +} + + +class AnsiDecoder: + """Translate ANSI code in to styled Text.""" + + def __init__(self) -> None: + self.style = Style.null() + + def decode(self, terminal_text: str) -> Iterable[Text]: + """Decode ANSI codes in an iterable of lines. + + Args: + lines (Iterable[str]): An iterable of lines of terminal output. + + Yields: + Text: Marked up Text. + """ + for line in terminal_text.splitlines(): + yield self.decode_line(line) + + def decode_line(self, line: str) -> Text: + """Decode a line containing ansi codes. + + Args: + line (str): A line of terminal output. + + Returns: + Text: A Text instance marked up according to ansi codes. + """ + from_ansi = Color.from_ansi + from_rgb = Color.from_rgb + _Style = Style + text = Text() + append = text.append + line = line.rsplit("\r", 1)[-1] + for plain_text, sgr, osc in _ansi_tokenize(line): + if plain_text: + append(plain_text, self.style or None) + elif osc is not None: + if osc.startswith("8;"): + _params, semicolon, link = osc[2:].partition(";") + if semicolon: + self.style = self.style.update_link(link or None) + elif sgr is not None: + # Translate in to semi-colon separated codes + # Ignore invalid codes, because we want to be lenient + codes = [ + min(255, int(_code) if _code else 0) + for _code in sgr.split(";") + if _code.isdigit() or _code == "" + ] + iter_codes = iter(codes) + for code in iter_codes: + if code == 0: + # reset + self.style = _Style.null() + elif code in SGR_STYLE_MAP: + # styles + self.style += _Style.parse(SGR_STYLE_MAP[code]) + elif code == 38: + #  Foreground + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ) + ) + elif code == 48: + # Background + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + None, from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + None, + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ), + ) + + return text + + +if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover + import io + import os + import pty + import sys + + decoder = AnsiDecoder() + + stdout = io.BytesIO() + + def read(fd: int) -> bytes: + data = os.read(fd, 1024) + stdout.write(data) + return data + + pty.spawn(sys.argv[1:], read) + + from .console import Console + + console = Console(record=True) + + stdout_result = stdout.getvalue().decode("utf-8") + print(stdout_result) + + for line in decoder.decode(stdout_result): + console.print(line) + + console.save_html("stdout.html") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py new file mode 100644 index 0000000..ed86a55 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py @@ -0,0 +1,94 @@ +from typing import Optional, Union + +from .color import Color +from .console import Console, ConsoleOptions, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import Style + +# There are left-aligned characters for 1/8 to 7/8, but +# the right-aligned characters exist only for 1/8 and 4/8. +BEGIN_BLOCK_ELEMENTS = ["â–ˆ", "â–ˆ", "â–ˆ", "â–", "â–", "â–", "â–•", "â–•"] +END_BLOCK_ELEMENTS = [" ", "â–", "â–Ž", "â–", "â–Œ", "â–‹", "â–Š", "â–‰"] +FULL_BLOCK = "â–ˆ" + + +class Bar(JupyterMixin): + """Renders a solid block bar. + + Args: + size (float): Value for the end of the bar. + begin (float): Begin point (between 0 and size, inclusive). + end (float): End point (between 0 and size, inclusive). + width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. + color (Union[Color, str], optional): Color of the bar. Defaults to "default". + bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default". + """ + + def __init__( + self, + size: float, + begin: float, + end: float, + *, + width: Optional[int] = None, + color: Union[Color, str] = "default", + bgcolor: Union[Color, str] = "default", + ): + self.size = size + self.begin = max(begin, 0) + self.end = min(end, size) + self.width = width + self.style = Style(color=color, bgcolor=bgcolor) + + def __repr__(self) -> str: + return f"Bar({self.size}, {self.begin}, {self.end})" + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + + width = min( + self.width if self.width is not None else options.max_width, + options.max_width, + ) + + if self.begin >= self.end: + yield Segment(" " * width, self.style) + yield Segment.line() + return + + prefix_complete_eights = int(width * 8 * self.begin / self.size) + prefix_bar_count = prefix_complete_eights // 8 + prefix_eights_count = prefix_complete_eights % 8 + + body_complete_eights = int(width * 8 * self.end / self.size) + body_bar_count = body_complete_eights // 8 + body_eights_count = body_complete_eights % 8 + + # When start and end fall into the same cell, we ideally should render + # a symbol that's "center-aligned", but there is no good symbol in Unicode. + # In this case, we fall back to right-aligned block symbol for simplicity. + + prefix = " " * prefix_bar_count + if prefix_eights_count: + prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count] + + body = FULL_BLOCK * body_bar_count + if body_eights_count: + body += END_BLOCK_ELEMENTS[body_eights_count] + + suffix = " " * (width - len(body)) + + yield Segment(prefix + body[len(prefix) :] + suffix, self.style) + yield Segment.line() + + def __rich_measure__( + self, console: Console, options: ConsoleOptions + ) -> Measurement: + return ( + Measurement(self.width, self.width) + if self.width is not None + else Measurement(4, options.max_width) + ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py new file mode 100644 index 0000000..97d2a94 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py @@ -0,0 +1,517 @@ +import sys +from typing import TYPE_CHECKING, Iterable, List + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + + +from ._loop import loop_last + +if TYPE_CHECKING: + from pip._vendor.rich.console import ConsoleOptions + + +class Box: + """Defines characters to render boxes. + + ┌─┬┠top + │ ││ head + ├─┼┤ head_row + │ ││ mid + ├─┼┤ row + ├─┼┤ foot_row + │ ││ foot + └─┴┘ bottom + + Args: + box (str): Characters making up box. + ascii (bool, optional): True if this box uses ascii characters only. Default is False. + """ + + def __init__(self, box: str, *, ascii: bool = False) -> None: + self._box = box + self.ascii = ascii + line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines() + # top + self.top_left, self.top, self.top_divider, self.top_right = iter(line1) + # head + self.head_left, _, self.head_vertical, self.head_right = iter(line2) + # head_row + ( + self.head_row_left, + self.head_row_horizontal, + self.head_row_cross, + self.head_row_right, + ) = iter(line3) + + # mid + self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4) + # row + self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5) + # foot_row + ( + self.foot_row_left, + self.foot_row_horizontal, + self.foot_row_cross, + self.foot_row_right, + ) = iter(line6) + # foot + self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7) + # bottom + self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter( + line8 + ) + + def __repr__(self) -> str: + return "Box(...)" + + def __str__(self) -> str: + return self._box + + def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box": + """Substitute this box for another if it won't render due to platform issues. + + Args: + options (ConsoleOptions): Console options used in rendering. + safe (bool, optional): Substitute this for another Box if there are known problems + displaying on the platform (currently only relevant on Windows). Default is True. + + Returns: + Box: A different Box or the same Box. + """ + box = self + if options.legacy_windows and safe: + box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box) + if options.ascii_only and not box.ascii: + box = ASCII + return box + + def get_plain_headed_box(self) -> "Box": + """If this box uses special characters for the borders of the header, then + return the equivalent box that does not. + + Returns: + Box: The most similar Box that doesn't use header-specific box characters. + If the current Box already satisfies this criterion, then it's returned. + """ + return PLAIN_HEADED_SUBSTITUTIONS.get(self, self) + + def get_top(self, widths: Iterable[int]) -> str: + """Get the top of a simple box. + + Args: + widths (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + + parts: List[str] = [] + append = parts.append + append(self.top_left) + for last, width in loop_last(widths): + append(self.top * width) + if not last: + append(self.top_divider) + append(self.top_right) + return "".join(parts) + + def get_row( + self, + widths: Iterable[int], + level: Literal["head", "row", "foot", "mid"] = "row", + edge: bool = True, + ) -> str: + """Get the top of a simple box. + + Args: + width (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + if level == "head": + left = self.head_row_left + horizontal = self.head_row_horizontal + cross = self.head_row_cross + right = self.head_row_right + elif level == "row": + left = self.row_left + horizontal = self.row_horizontal + cross = self.row_cross + right = self.row_right + elif level == "mid": + left = self.mid_left + horizontal = " " + cross = self.mid_vertical + right = self.mid_right + elif level == "foot": + left = self.foot_row_left + horizontal = self.foot_row_horizontal + cross = self.foot_row_cross + right = self.foot_row_right + else: + raise ValueError("level must be 'head', 'row' or 'foot'") + + parts: List[str] = [] + append = parts.append + if edge: + append(left) + for last, width in loop_last(widths): + append(horizontal * width) + if not last: + append(cross) + if edge: + append(right) + return "".join(parts) + + def get_bottom(self, widths: Iterable[int]) -> str: + """Get the bottom of a simple box. + + Args: + widths (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + + parts: List[str] = [] + append = parts.append + append(self.bottom_left) + for last, width in loop_last(widths): + append(self.bottom * width) + if not last: + append(self.bottom_divider) + append(self.bottom_right) + return "".join(parts) + + +ASCII: Box = Box( + """\ ++--+ +| || +|-+| +| || +|-+| +|-+| +| || ++--+ +""", + ascii=True, +) + +ASCII2: Box = Box( + """\ ++-++ +| || ++-++ +| || ++-++ ++-++ +| || ++-++ +""", + ascii=True, +) + +ASCII_DOUBLE_HEAD: Box = Box( + """\ ++-++ +| || ++=++ +| || ++-++ ++-++ +| || ++-++ +""", + ascii=True, +) + +SQUARE: Box = Box( + """\ +┌─┬┠+│ ││ +├─┼┤ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +└─┴┘ +""" +) + +SQUARE_DOUBLE_HEAD: Box = Box( + """\ +┌─┬┠+│ ││ +╞â•╪╡ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +└─┴┘ +""" +) + +MINIMAL: Box = Box( + """\ + â•· + │ +╶─┼╴ + │ +╶─┼╴ +╶─┼╴ + │ + ╵ +""" +) + + +MINIMAL_HEAVY_HEAD: Box = Box( + """\ + â•· + │ +╺â”┿╸ + │ +╶─┼╴ +╶─┼╴ + │ + ╵ +""" +) + +MINIMAL_DOUBLE_HEAD: Box = Box( + """\ + â•· + │ + â•╪ + │ + ─┼ + ─┼ + │ + ╵ +""" +) + + +SIMPLE: Box = Box( + """\ + + + ── + + + ── + + +""" +) + +SIMPLE_HEAD: Box = Box( + """\ + + + ── + + + + + +""" +) + + +SIMPLE_HEAVY: Box = Box( + """\ + + + â”â” + + + â”â” + + +""" +) + + +HORIZONTALS: Box = Box( + """\ + ── + + ── + + ── + ── + + ── +""" +) + +ROUNDED: Box = Box( + """\ +╭─┬╮ +│ ││ +├─┼┤ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +╰─┴╯ +""" +) + +HEAVY: Box = Box( + """\ +â”â”┳┓ +┃ ┃┃ +┣â”╋┫ +┃ ┃┃ +┣â”╋┫ +┣â”╋┫ +┃ ┃┃ +â”—â”┻┛ +""" +) + +HEAVY_EDGE: Box = Box( + """\ +â”â”┯┓ +┃ │┃ +┠─┼┨ +┃ │┃ +┠─┼┨ +┠─┼┨ +┃ │┃ +â”—â”â”·â”› +""" +) + +HEAVY_HEAD: Box = Box( + """\ +â”â”┳┓ +┃ ┃┃ +┡â”╇┩ +│ ││ +├─┼┤ +├─┼┤ +│ ││ +└─┴┘ +""" +) + +DOUBLE: Box = Box( + """\ +â•”â•╦╗ +â•‘ â•‘â•‘ +â• â•╬╣ +â•‘ â•‘â•‘ +â• â•╬╣ +â• â•╬╣ +â•‘ â•‘â•‘ +╚â•â•©â• +""" +) + +DOUBLE_EDGE: Box = Box( + """\ +â•”â•╤╗ +â•‘ │║ +╟─┼╢ +â•‘ │║ +╟─┼╢ +╟─┼╢ +â•‘ │║ +╚â•â•§â• +""" +) + +MARKDOWN: Box = Box( + """\ + +| || +|-|| +| || +|-|| +|-|| +| || + +""", + ascii=True, +) + +# Map Boxes that don't render with raster fonts on to equivalent that do +LEGACY_WINDOWS_SUBSTITUTIONS = { + ROUNDED: SQUARE, + MINIMAL_HEAVY_HEAD: MINIMAL, + SIMPLE_HEAVY: SIMPLE, + HEAVY: SQUARE, + HEAVY_EDGE: SQUARE, + HEAVY_HEAD: SQUARE, +} + +# Map headed boxes to their headerless equivalents +PLAIN_HEADED_SUBSTITUTIONS = { + HEAVY_HEAD: SQUARE, + SQUARE_DOUBLE_HEAD: SQUARE, + MINIMAL_DOUBLE_HEAD: MINIMAL, + MINIMAL_HEAVY_HEAD: MINIMAL, + ASCII_DOUBLE_HEAD: ASCII2, +} + + +if __name__ == "__main__": # pragma: no cover + + from pip._vendor.rich.columns import Columns + from pip._vendor.rich.panel import Panel + + from . import box as box + from .console import Console + from .table import Table + from .text import Text + + console = Console(record=True) + + BOXES = [ + "ASCII", + "ASCII2", + "ASCII_DOUBLE_HEAD", + "SQUARE", + "SQUARE_DOUBLE_HEAD", + "MINIMAL", + "MINIMAL_HEAVY_HEAD", + "MINIMAL_DOUBLE_HEAD", + "SIMPLE", + "SIMPLE_HEAD", + "SIMPLE_HEAVY", + "HORIZONTALS", + "ROUNDED", + "HEAVY", + "HEAVY_EDGE", + "HEAVY_HEAD", + "DOUBLE", + "DOUBLE_EDGE", + "MARKDOWN", + ] + + console.print(Panel("[bold green]Box Constants", style="green"), justify="center") + console.print() + + columns = Columns(expand=True, padding=2) + for box_name in sorted(BOXES): + table = Table( + show_footer=True, style="dim", border_style="not dim", expand=True + ) + table.add_column("Header 1", "Footer 1") + table.add_column("Header 2", "Footer 2") + table.add_row("Cell", "Cell") + table.add_row("Cell", "Cell") + table.box = getattr(box, box_name) + table.title = Text(f"box.{box_name}", style="magenta") + columns.add_renderable(table) + console.print(columns) + + # console.save_svg("box.svg") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py new file mode 100644 index 0000000..9354f9e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py @@ -0,0 +1,154 @@ +import re +from functools import lru_cache +from typing import Callable, List + +from ._cell_widths import CELL_WIDTHS + +# Regex to match sequence of the most common character ranges +_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match + + +@lru_cache(4096) +def cached_cell_len(text: str) -> int: + """Get the number of cells required to display text. + + This method always caches, which may use up a lot of memory. It is recommended to use + `cell_len` over this method. + + Args: + text (str): Text to display. + + Returns: + int: Get the number of cells required to display text. + """ + _get_size = get_character_cell_size + total_size = sum(_get_size(character) for character in text) + return total_size + + +def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: + """Get the number of cells required to display text. + + Args: + text (str): Text to display. + + Returns: + int: Get the number of cells required to display text. + """ + if len(text) < 512: + return _cell_len(text) + _get_size = get_character_cell_size + total_size = sum(_get_size(character) for character in text) + return total_size + + +@lru_cache(maxsize=4096) +def get_character_cell_size(character: str) -> int: + """Get the cell size of a character. + + Args: + character (str): A single character. + + Returns: + int: Number of cells (0, 1 or 2) occupied by that character. + """ + return _get_codepoint_cell_size(ord(character)) + + +@lru_cache(maxsize=4096) +def _get_codepoint_cell_size(codepoint: int) -> int: + """Get the cell size of a character. + + Args: + codepoint (int): Codepoint of a character. + + Returns: + int: Number of cells (0, 1 or 2) occupied by that character. + """ + + _table = CELL_WIDTHS + lower_bound = 0 + upper_bound = len(_table) - 1 + index = (lower_bound + upper_bound) // 2 + while True: + start, end, width = _table[index] + if codepoint < start: + upper_bound = index - 1 + elif codepoint > end: + lower_bound = index + 1 + else: + return 0 if width == -1 else width + if upper_bound < lower_bound: + break + index = (lower_bound + upper_bound) // 2 + return 1 + + +def set_cell_size(text: str, total: int) -> str: + """Set the length of a string to fit within given number of cells.""" + + if _is_single_cell_widths(text): + size = len(text) + if size < total: + return text + " " * (total - size) + return text[:total] + + if total <= 0: + return "" + cell_size = cell_len(text) + if cell_size == total: + return text + if cell_size < total: + return text + " " * (total - cell_size) + + start = 0 + end = len(text) + + # Binary search until we find the right size + while True: + pos = (start + end) // 2 + before = text[: pos + 1] + before_len = cell_len(before) + if before_len == total + 1 and cell_len(before[-1]) == 2: + return before[:-1] + " " + if before_len == total: + return before + if before_len > total: + end = pos + else: + start = pos + + +# TODO: This is inefficient +# TODO: This might not work with CWJ type characters +def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: + """Break text in to equal (cell) length strings, returning the characters in reverse + order""" + _get_character_cell_size = get_character_cell_size + characters = [ + (character, _get_character_cell_size(character)) for character in text + ] + total_size = position + lines: List[List[str]] = [[]] + append = lines[-1].append + + for character, size in reversed(characters): + if total_size + size > max_size: + lines.append([character]) + append = lines[-1].append + total_size = size + else: + total_size += size + append(character) + + return ["".join(line) for line in lines] + + +if __name__ == "__main__": # pragma: no cover + + print(get_character_cell_size("😽")) + for line in chop_cells("""这是对亚洲语言支æŒçš„æµ‹è¯•。é¢å¯¹æ¨¡æ£±ä¸¤å¯çš„æƒ³æ³•,拒ç»çŒœæµ‹çš„诱惑。""", 8): + print(line) + for n in range(80, 1, -1): + print(set_cell_size("""这是对亚洲语言支æŒçš„æµ‹è¯•。é¢å¯¹æ¨¡æ£±ä¸¤å¯çš„æƒ³æ³•,拒ç»çŒœæµ‹çš„诱惑。""", n) + "|") + print("x" * n) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py new file mode 100644 index 0000000..dfe4559 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py @@ -0,0 +1,622 @@ +import platform +import re +from colorsys import rgb_to_hls +from enum import IntEnum +from functools import lru_cache +from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple + +from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE +from .color_triplet import ColorTriplet +from .repr import Result, rich_repr +from .terminal_theme import DEFAULT_TERMINAL_THEME + +if TYPE_CHECKING: # pragma: no cover + from .terminal_theme import TerminalTheme + from .text import Text + + +WINDOWS = platform.system() == "Windows" + + +class ColorSystem(IntEnum): + """One of the 3 color system supported by terminals.""" + + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorSystem.{self.name}" + + def __str__(self) -> str: + return repr(self) + + +class ColorType(IntEnum): + """Type of color stored in Color class.""" + + DEFAULT = 0 + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorType.{self.name}" + + +ANSI_COLOR_NAMES = { + "black": 0, + "red": 1, + "green": 2, + "yellow": 3, + "blue": 4, + "magenta": 5, + "cyan": 6, + "white": 7, + "bright_black": 8, + "bright_red": 9, + "bright_green": 10, + "bright_yellow": 11, + "bright_blue": 12, + "bright_magenta": 13, + "bright_cyan": 14, + "bright_white": 15, + "grey0": 16, + "gray0": 16, + "navy_blue": 17, + "dark_blue": 18, + "blue3": 20, + "blue1": 21, + "dark_green": 22, + "deep_sky_blue4": 25, + "dodger_blue3": 26, + "dodger_blue2": 27, + "green4": 28, + "spring_green4": 29, + "turquoise4": 30, + "deep_sky_blue3": 32, + "dodger_blue1": 33, + "green3": 40, + "spring_green3": 41, + "dark_cyan": 36, + "light_sea_green": 37, + "deep_sky_blue2": 38, + "deep_sky_blue1": 39, + "spring_green2": 47, + "cyan3": 43, + "dark_turquoise": 44, + "turquoise2": 45, + "green1": 46, + "spring_green1": 48, + "medium_spring_green": 49, + "cyan2": 50, + "cyan1": 51, + "dark_red": 88, + "deep_pink4": 125, + "purple4": 55, + "purple3": 56, + "blue_violet": 57, + "orange4": 94, + "grey37": 59, + "gray37": 59, + "medium_purple4": 60, + "slate_blue3": 62, + "royal_blue1": 63, + "chartreuse4": 64, + "dark_sea_green4": 71, + "pale_turquoise4": 66, + "steel_blue": 67, + "steel_blue3": 68, + "cornflower_blue": 69, + "chartreuse3": 76, + "cadet_blue": 73, + "sky_blue3": 74, + "steel_blue1": 81, + "pale_green3": 114, + "sea_green3": 78, + "aquamarine3": 79, + "medium_turquoise": 80, + "chartreuse2": 112, + "sea_green2": 83, + "sea_green1": 85, + "aquamarine1": 122, + "dark_slate_gray2": 87, + "dark_magenta": 91, + "dark_violet": 128, + "purple": 129, + "light_pink4": 95, + "plum4": 96, + "medium_purple3": 98, + "slate_blue1": 99, + "yellow4": 106, + "wheat4": 101, + "grey53": 102, + "gray53": 102, + "light_slate_grey": 103, + "light_slate_gray": 103, + "medium_purple": 104, + "light_slate_blue": 105, + "dark_olive_green3": 149, + "dark_sea_green": 108, + "light_sky_blue3": 110, + "sky_blue2": 111, + "dark_sea_green3": 150, + "dark_slate_gray3": 116, + "sky_blue1": 117, + "chartreuse1": 118, + "light_green": 120, + "pale_green1": 156, + "dark_slate_gray1": 123, + "red3": 160, + "medium_violet_red": 126, + "magenta3": 164, + "dark_orange3": 166, + "indian_red": 167, + "hot_pink3": 168, + "medium_orchid3": 133, + "medium_orchid": 134, + "medium_purple2": 140, + "dark_goldenrod": 136, + "light_salmon3": 173, + "rosy_brown": 138, + "grey63": 139, + "gray63": 139, + "medium_purple1": 141, + "gold3": 178, + "dark_khaki": 143, + "navajo_white3": 144, + "grey69": 145, + "gray69": 145, + "light_steel_blue3": 146, + "light_steel_blue": 147, + "yellow3": 184, + "dark_sea_green2": 157, + "light_cyan3": 152, + "light_sky_blue1": 153, + "green_yellow": 154, + "dark_olive_green2": 155, + "dark_sea_green1": 193, + "pale_turquoise1": 159, + "deep_pink3": 162, + "magenta2": 200, + "hot_pink2": 169, + "orchid": 170, + "medium_orchid1": 207, + "orange3": 172, + "light_pink3": 174, + "pink3": 175, + "plum3": 176, + "violet": 177, + "light_goldenrod3": 179, + "tan": 180, + "misty_rose3": 181, + "thistle3": 182, + "plum2": 183, + "khaki3": 185, + "light_goldenrod2": 222, + "light_yellow3": 187, + "grey84": 188, + "gray84": 188, + "light_steel_blue1": 189, + "yellow2": 190, + "dark_olive_green1": 192, + "honeydew2": 194, + "light_cyan1": 195, + "red1": 196, + "deep_pink2": 197, + "deep_pink1": 199, + "magenta1": 201, + "orange_red1": 202, + "indian_red1": 204, + "hot_pink": 206, + "dark_orange": 208, + "salmon1": 209, + "light_coral": 210, + "pale_violet_red1": 211, + "orchid2": 212, + "orchid1": 213, + "orange1": 214, + "sandy_brown": 215, + "light_salmon1": 216, + "light_pink1": 217, + "pink1": 218, + "plum1": 219, + "gold1": 220, + "navajo_white1": 223, + "misty_rose1": 224, + "thistle1": 225, + "yellow1": 226, + "light_goldenrod1": 227, + "khaki1": 228, + "wheat1": 229, + "cornsilk1": 230, + "grey100": 231, + "gray100": 231, + "grey3": 232, + "gray3": 232, + "grey7": 233, + "gray7": 233, + "grey11": 234, + "gray11": 234, + "grey15": 235, + "gray15": 235, + "grey19": 236, + "gray19": 236, + "grey23": 237, + "gray23": 237, + "grey27": 238, + "gray27": 238, + "grey30": 239, + "gray30": 239, + "grey35": 240, + "gray35": 240, + "grey39": 241, + "gray39": 241, + "grey42": 242, + "gray42": 242, + "grey46": 243, + "gray46": 243, + "grey50": 244, + "gray50": 244, + "grey54": 245, + "gray54": 245, + "grey58": 246, + "gray58": 246, + "grey62": 247, + "gray62": 247, + "grey66": 248, + "gray66": 248, + "grey70": 249, + "gray70": 249, + "grey74": 250, + "gray74": 250, + "grey78": 251, + "gray78": 251, + "grey82": 252, + "gray82": 252, + "grey85": 253, + "gray85": 253, + "grey89": 254, + "gray89": 254, + "grey93": 255, + "gray93": 255, +} + + +class ColorParseError(Exception): + """The color could not be parsed.""" + + +RE_COLOR = re.compile( + r"""^ +\#([0-9a-f]{6})$| +color\(([0-9]{1,3})\)$| +rgb\(([\d\s,]+)\)$ +""", + re.VERBOSE, +) + + +@rich_repr +class Color(NamedTuple): + """Terminal color definition.""" + + name: str + """The name of the color (typically the input to Color.parse).""" + type: ColorType + """The type of the color.""" + number: Optional[int] = None + """The color number, if a standard color, or None.""" + triplet: Optional[ColorTriplet] = None + """A triplet of color components, if an RGB color.""" + + def __rich__(self) -> "Text": + """Displays the actual color if Rich printed.""" + from .style import Style + from .text import Text + + return Text.assemble( + f"", + ) + + def __rich_repr__(self) -> Result: + yield self.name + yield self.type + yield "number", self.number, None + yield "triplet", self.triplet, None + + @property + def system(self) -> ColorSystem: + """Get the native color system for this color.""" + if self.type == ColorType.DEFAULT: + return ColorSystem.STANDARD + return ColorSystem(int(self.type)) + + @property + def is_system_defined(self) -> bool: + """Check if the color is ultimately defined by the system.""" + return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) + + @property + def is_default(self) -> bool: + """Check if the color is a default color.""" + return self.type == ColorType.DEFAULT + + def get_truecolor( + self, theme: Optional["TerminalTheme"] = None, foreground: bool = True + ) -> ColorTriplet: + """Get an equivalent color triplet for this color. + + Args: + theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. + foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. + + Returns: + ColorTriplet: A color triplet containing RGB components. + """ + + if theme is None: + theme = DEFAULT_TERMINAL_THEME + if self.type == ColorType.TRUECOLOR: + assert self.triplet is not None + return self.triplet + elif self.type == ColorType.EIGHT_BIT: + assert self.number is not None + return EIGHT_BIT_PALETTE[self.number] + elif self.type == ColorType.STANDARD: + assert self.number is not None + return theme.ansi_colors[self.number] + elif self.type == ColorType.WINDOWS: + assert self.number is not None + return WINDOWS_PALETTE[self.number] + else: # self.type == ColorType.DEFAULT: + assert self.number is None + return theme.foreground_color if foreground else theme.background_color + + @classmethod + def from_ansi(cls, number: int) -> "Color": + """Create a Color number from it's 8-bit ansi number. + + Args: + number (int): A number between 0-255 inclusive. + + Returns: + Color: A new Color instance. + """ + return cls( + name=f"color({number})", + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + @classmethod + def from_triplet(cls, triplet: "ColorTriplet") -> "Color": + """Create a truecolor RGB color from a triplet of values. + + Args: + triplet (ColorTriplet): A color triplet containing red, green and blue components. + + Returns: + Color: A new color object. + """ + return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) + + @classmethod + def from_rgb(cls, red: float, green: float, blue: float) -> "Color": + """Create a truecolor from three color components in the range(0->255). + + Args: + red (float): Red component in range 0-255. + green (float): Green component in range 0-255. + blue (float): Blue component in range 0-255. + + Returns: + Color: A new color object. + """ + return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) + + @classmethod + def default(cls) -> "Color": + """Get a Color instance representing the default color. + + Returns: + Color: Default color. + """ + return cls(name="default", type=ColorType.DEFAULT) + + @classmethod + @lru_cache(maxsize=1024) + def parse(cls, color: str) -> "Color": + """Parse a color definition.""" + original_color = color + color = color.lower().strip() + + if color == "default": + return cls(color, type=ColorType.DEFAULT) + + color_number = ANSI_COLOR_NAMES.get(color) + if color_number is not None: + return cls( + color, + type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), + number=color_number, + ) + + color_match = RE_COLOR.match(color) + if color_match is None: + raise ColorParseError(f"{original_color!r} is not a valid color") + + color_24, color_8, color_rgb = color_match.groups() + if color_24: + triplet = ColorTriplet( + int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + elif color_8: + number = int(color_8) + if number > 255: + raise ColorParseError(f"color number must be <= 255 in {color!r}") + return cls( + color, + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + else: # color_rgb: + components = color_rgb.split(",") + if len(components) != 3: + raise ColorParseError( + f"expected three components in {original_color!r}" + ) + red, green, blue = components + triplet = ColorTriplet(int(red), int(green), int(blue)) + if not all(component <= 255 for component in triplet): + raise ColorParseError( + f"color components must be <= 255 in {original_color!r}" + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + @lru_cache(maxsize=1024) + def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: + """Get the ANSI escape codes for this color.""" + _type = self.type + if _type == ColorType.DEFAULT: + return ("39" if foreground else "49",) + + elif _type == ColorType.WINDOWS: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.STANDARD: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.EIGHT_BIT: + assert self.number is not None + return ("38" if foreground else "48", "5", str(self.number)) + + else: # self.standard == ColorStandard.TRUECOLOR: + assert self.triplet is not None + red, green, blue = self.triplet + return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) + + @lru_cache(maxsize=1024) + def downgrade(self, system: ColorSystem) -> "Color": + """Downgrade a color system to a system with fewer colors.""" + + if self.type in (ColorType.DEFAULT, system): + return self + # Convert to 8-bit color from truecolor color + if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + _h, l, s = rgb_to_hls(*self.triplet.normalized) + # If saturation is under 15% assume it is grayscale + if s < 0.15: + gray = round(l * 25.0) + if gray == 0: + color_number = 16 + elif gray == 25: + color_number = 231 + else: + color_number = 231 + gray + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + red, green, blue = self.triplet + six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 + six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 + six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 + + color_number = ( + 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) + ) + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + # Convert to standard from truecolor or 8-bit + elif system == ColorSystem.STANDARD: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = STANDARD_PALETTE.match(triplet) + return Color(self.name, ColorType.STANDARD, number=color_number) + + elif system == ColorSystem.WINDOWS: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + if self.number < 16: + return Color(self.name, ColorType.WINDOWS, number=self.number) + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = WINDOWS_PALETTE.match(triplet) + return Color(self.name, ColorType.WINDOWS, number=color_number) + + return self + + +def parse_rgb_hex(hex_color: str) -> ColorTriplet: + """Parse six hex characters in to RGB triplet.""" + assert len(hex_color) == 6, "must be 6 characters" + color = ColorTriplet( + int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) + ) + return color + + +def blend_rgb( + color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 +) -> ColorTriplet: + """Blend one RGB color in to another.""" + r1, g1, b1 = color1 + r2, g2, b2 = color2 + new_color = ColorTriplet( + int(r1 + (r2 - r1) * cross_fade), + int(g1 + (g2 - g1) * cross_fade), + int(b1 + (b2 - b1) * cross_fade), + ) + return new_color + + +if __name__ == "__main__": # pragma: no cover + + from .console import Console + from .table import Table + from .text import Text + + console = Console() + + table = Table(show_footer=False, show_edge=True) + table.add_column("Color", width=10, overflow="ellipsis") + table.add_column("Number", justify="right", style="yellow") + table.add_column("Name", style="green") + table.add_column("Hex", style="blue") + table.add_column("RGB", style="magenta") + + colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) + for color_number, name in colors: + if "grey" in name: + continue + color_cell = Text(" " * 10, style=f"on {name}") + if color_number < 16: + table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) + else: + color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] + table.add_row( + color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb + ) + + console.print(table) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py new file mode 100644 index 0000000..02cab32 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py @@ -0,0 +1,38 @@ +from typing import NamedTuple, Tuple + + +class ColorTriplet(NamedTuple): + """The red, green, and blue components of a color.""" + + red: int + """Red component in 0 to 255 range.""" + green: int + """Green component in 0 to 255 range.""" + blue: int + """Blue component in 0 to 255 range.""" + + @property + def hex(self) -> str: + """get the color triplet in CSS style.""" + red, green, blue = self + return f"#{red:02x}{green:02x}{blue:02x}" + + @property + def rgb(self) -> str: + """The color in RGB format. + + Returns: + str: An rgb color, e.g. ``"rgb(100,23,255)"``. + """ + red, green, blue = self + return f"rgb({red},{green},{blue})" + + @property + def normalized(self) -> Tuple[float, float, float]: + """Convert components into floats between 0 and 1. + + Returns: + Tuple[float, float, float]: A tuple of three normalized colour components. + """ + red, green, blue = self + return red / 255.0, green / 255.0, blue / 255.0 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py new file mode 100644 index 0000000..669a3a7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py @@ -0,0 +1,187 @@ +from collections import defaultdict +from itertools import chain +from operator import itemgetter +from typing import Dict, Iterable, List, Optional, Tuple + +from .align import Align, AlignMethod +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .constrain import Constrain +from .measure import Measurement +from .padding import Padding, PaddingDimensions +from .table import Table +from .text import TextType +from .jupyter import JupyterMixin + + +class Columns(JupyterMixin): + """Display renderables in neat columns. + + Args: + renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). + width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. + padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). + expand (bool, optional): Expand columns to full width. Defaults to False. + equal (bool, optional): Arrange in to equal sized columns. Defaults to False. + column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. + right_to_left (bool, optional): Start column from right hand side. Defaults to False. + align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. + title (TextType, optional): Optional title for Columns. + """ + + def __init__( + self, + renderables: Optional[Iterable[RenderableType]] = None, + padding: PaddingDimensions = (0, 1), + *, + width: Optional[int] = None, + expand: bool = False, + equal: bool = False, + column_first: bool = False, + right_to_left: bool = False, + align: Optional[AlignMethod] = None, + title: Optional[TextType] = None, + ) -> None: + self.renderables = list(renderables or []) + self.width = width + self.padding = padding + self.expand = expand + self.equal = equal + self.column_first = column_first + self.right_to_left = right_to_left + self.align: Optional[AlignMethod] = align + self.title = title + + def add_renderable(self, renderable: RenderableType) -> None: + """Add a renderable to the columns. + + Args: + renderable (RenderableType): Any renderable object. + """ + self.renderables.append(renderable) + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + render_str = console.render_str + renderables = [ + render_str(renderable) if isinstance(renderable, str) else renderable + for renderable in self.renderables + ] + if not renderables: + return + _top, right, _bottom, left = Padding.unpack(self.padding) + width_padding = max(left, right) + max_width = options.max_width + widths: Dict[int, int] = defaultdict(int) + column_count = len(renderables) + + get_measurement = Measurement.get + renderable_widths = [ + get_measurement(console, options, renderable).maximum + for renderable in renderables + ] + if self.equal: + renderable_widths = [max(renderable_widths)] * len(renderable_widths) + + def iter_renderables( + column_count: int, + ) -> Iterable[Tuple[int, Optional[RenderableType]]]: + item_count = len(renderables) + if self.column_first: + width_renderables = list(zip(renderable_widths, renderables)) + + column_lengths: List[int] = [item_count // column_count] * column_count + for col_no in range(item_count % column_count): + column_lengths[col_no] += 1 + + row_count = (item_count + column_count - 1) // column_count + cells = [[-1] * column_count for _ in range(row_count)] + row = col = 0 + for index in range(item_count): + cells[row][col] = index + column_lengths[col] -= 1 + if column_lengths[col]: + row += 1 + else: + col += 1 + row = 0 + for index in chain.from_iterable(cells): + if index == -1: + break + yield width_renderables[index] + else: + yield from zip(renderable_widths, renderables) + # Pad odd elements with spaces + if item_count % column_count: + for _ in range(column_count - (item_count % column_count)): + yield 0, None + + table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) + table.expand = self.expand + table.title = self.title + + if self.width is not None: + column_count = (max_width) // (self.width + width_padding) + for _ in range(column_count): + table.add_column(width=self.width) + else: + while column_count > 1: + widths.clear() + column_no = 0 + for renderable_width, _ in iter_renderables(column_count): + widths[column_no] = max(widths[column_no], renderable_width) + total_width = sum(widths.values()) + width_padding * ( + len(widths) - 1 + ) + if total_width > max_width: + column_count = len(widths) - 1 + break + else: + column_no = (column_no + 1) % column_count + else: + break + + get_renderable = itemgetter(1) + _renderables = [ + get_renderable(_renderable) + for _renderable in iter_renderables(column_count) + ] + if self.equal: + _renderables = [ + None + if renderable is None + else Constrain(renderable, renderable_widths[0]) + for renderable in _renderables + ] + if self.align: + align = self.align + _Align = Align + _renderables = [ + None if renderable is None else _Align(renderable, align) + for renderable in _renderables + ] + + right_to_left = self.right_to_left + add_row = table.add_row + for start in range(0, len(_renderables), column_count): + row = _renderables[start : start + column_count] + if right_to_left: + row = row[::-1] + add_row(*row) + yield table + + +if __name__ == "__main__": # pragma: no cover + import os + + console = Console() + + files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] + columns = Columns(files, padding=(0, 1), expand=False, equal=False) + console.print(columns) + console.rule() + columns.column_first = True + console.print(columns) + columns.right_to_left = True + console.rule() + console.print(columns) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py new file mode 100644 index 0000000..e559cbb --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py @@ -0,0 +1,2633 @@ +import inspect +import os +import platform +import sys +import threading +import zlib +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from datetime import datetime +from functools import wraps +from getpass import getpass +from html import escape +from inspect import isclass +from itertools import islice +from math import ceil +from time import monotonic +from types import FrameType, ModuleType, TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + Mapping, + NamedTuple, + Optional, + TextIO, + Tuple, + Type, + Union, + cast, +) + +from pip._vendor.rich._null_file import NULL_FILE + +if sys.version_info >= (3, 8): + from typing import Literal, Protocol, runtime_checkable +else: + from pip._vendor.typing_extensions import ( + Literal, + Protocol, + runtime_checkable, + ) # pragma: no cover + +from . import errors, themes +from ._emoji_replace import _emoji_replace +from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT +from ._fileno import get_fileno +from ._log_render import FormatTimeCallable, LogRender +from .align import Align, AlignMethod +from .color import ColorSystem, blend_rgb +from .control import Control +from .emoji import EmojiVariant +from .highlighter import NullHighlighter, ReprHighlighter +from .markup import render as render_markup +from .measure import Measurement, measure_renderables +from .pager import Pager, SystemPager +from .pretty import Pretty, is_expandable +from .protocol import rich_cast +from .region import Region +from .scope import render_scope +from .screen import Screen +from .segment import Segment +from .style import Style, StyleType +from .styled import Styled +from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme +from .text import Text, TextType +from .theme import Theme, ThemeStack + +if TYPE_CHECKING: + from ._windows import WindowsConsoleFeatures + from .live import Live + from .status import Status + +JUPYTER_DEFAULT_COLUMNS = 115 +JUPYTER_DEFAULT_LINES = 100 +WINDOWS = platform.system() == "Windows" + +HighlighterType = Callable[[Union[str, "Text"]], "Text"] +JustifyMethod = Literal["default", "left", "center", "right", "full"] +OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] + + +class NoChange: + pass + + +NO_CHANGE = NoChange() + +try: + _STDIN_FILENO = sys.__stdin__.fileno() +except Exception: + _STDIN_FILENO = 0 +try: + _STDOUT_FILENO = sys.__stdout__.fileno() +except Exception: + _STDOUT_FILENO = 1 +try: + _STDERR_FILENO = sys.__stderr__.fileno() +except Exception: + _STDERR_FILENO = 2 + +_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) +_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) + + +_TERM_COLORS = { + "kitty": ColorSystem.EIGHT_BIT, + "256color": ColorSystem.EIGHT_BIT, + "16color": ColorSystem.STANDARD, +} + + +class ConsoleDimensions(NamedTuple): + """Size of the terminal.""" + + width: int + """The width of the console in 'cells'.""" + height: int + """The height of the console in lines.""" + + +@dataclass +class ConsoleOptions: + """Options for __rich_console__ method.""" + + size: ConsoleDimensions + """Size of console.""" + legacy_windows: bool + """legacy_windows: flag for legacy windows.""" + min_width: int + """Minimum width of renderable.""" + max_width: int + """Maximum width of renderable.""" + is_terminal: bool + """True if the target is a terminal, otherwise False.""" + encoding: str + """Encoding of terminal.""" + max_height: int + """Height of container (starts as terminal)""" + justify: Optional[JustifyMethod] = None + """Justify value override for renderable.""" + overflow: Optional[OverflowMethod] = None + """Overflow value override for renderable.""" + no_wrap: Optional[bool] = False + """Disable wrapping for text.""" + highlight: Optional[bool] = None + """Highlight override for render_str.""" + markup: Optional[bool] = None + """Enable markup when rendering strings.""" + height: Optional[int] = None + + @property + def ascii_only(self) -> bool: + """Check if renderables should use ascii only.""" + return not self.encoding.startswith("utf") + + def copy(self) -> "ConsoleOptions": + """Return a copy of the options. + + Returns: + ConsoleOptions: a copy of self. + """ + options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) + options.__dict__ = self.__dict__.copy() + return options + + def update( + self, + *, + width: Union[int, NoChange] = NO_CHANGE, + min_width: Union[int, NoChange] = NO_CHANGE, + max_width: Union[int, NoChange] = NO_CHANGE, + justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, + overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, + no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, + highlight: Union[Optional[bool], NoChange] = NO_CHANGE, + markup: Union[Optional[bool], NoChange] = NO_CHANGE, + height: Union[Optional[int], NoChange] = NO_CHANGE, + ) -> "ConsoleOptions": + """Update values, return a copy.""" + options = self.copy() + if not isinstance(width, NoChange): + options.min_width = options.max_width = max(0, width) + if not isinstance(min_width, NoChange): + options.min_width = min_width + if not isinstance(max_width, NoChange): + options.max_width = max_width + if not isinstance(justify, NoChange): + options.justify = justify + if not isinstance(overflow, NoChange): + options.overflow = overflow + if not isinstance(no_wrap, NoChange): + options.no_wrap = no_wrap + if not isinstance(highlight, NoChange): + options.highlight = highlight + if not isinstance(markup, NoChange): + options.markup = markup + if not isinstance(height, NoChange): + if height is not None: + options.max_height = height + options.height = None if height is None else max(0, height) + return options + + def update_width(self, width: int) -> "ConsoleOptions": + """Update just the width, return a copy. + + Args: + width (int): New width (sets both min_width and max_width) + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + return options + + def update_height(self, height: int) -> "ConsoleOptions": + """Update the height, and return a copy. + + Args: + height (int): New height + + Returns: + ~ConsoleOptions: New Console options instance. + """ + options = self.copy() + options.max_height = options.height = height + return options + + def reset_height(self) -> "ConsoleOptions": + """Return a copy of the options with height set to ``None``. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.height = None + return options + + def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": + """Update the width and height, and return a copy. + + Args: + width (int): New width (sets both min_width and max_width). + height (int): New height. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + options.height = options.max_height = height + return options + + +@runtime_checkable +class RichCast(Protocol): + """An object that may be 'cast' to a console renderable.""" + + def __rich__( + self, + ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover + ... + + +@runtime_checkable +class ConsoleRenderable(Protocol): + """An object that supports the console protocol.""" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": # pragma: no cover + ... + + +# A type that may be rendered by Console. +RenderableType = Union[ConsoleRenderable, RichCast, str] + +# The result of calling a __rich_console__ method. +RenderResult = Iterable[Union[RenderableType, Segment]] + +_null_highlighter = NullHighlighter() + + +class CaptureError(Exception): + """An error in the Capture context manager.""" + + +class NewLine: + """A renderable to generate new line(s)""" + + def __init__(self, count: int = 1) -> None: + self.count = count + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> Iterable[Segment]: + yield Segment("\n" * self.count) + + +class ScreenUpdate: + """Render a list of lines at a given offset.""" + + def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: + self._lines = lines + self.x = x + self.y = y + + def __rich_console__( + self, console: "Console", options: ConsoleOptions + ) -> RenderResult: + x = self.x + move_to = Control.move_to + for offset, line in enumerate(self._lines, self.y): + yield move_to(x, offset) + yield from line + + +class Capture: + """Context manager to capture the result of printing to the console. + See :meth:`~rich.console.Console.capture` for how to use. + + Args: + console (Console): A console instance to capture output. + """ + + def __init__(self, console: "Console") -> None: + self._console = console + self._result: Optional[str] = None + + def __enter__(self) -> "Capture": + self._console.begin_capture() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self._result = self._console.end_capture() + + def get(self) -> str: + """Get the result of the capture.""" + if self._result is None: + raise CaptureError( + "Capture result is not available until context manager exits." + ) + return self._result + + +class ThemeContext: + """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" + + def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: + self.console = console + self.theme = theme + self.inherit = inherit + + def __enter__(self) -> "ThemeContext": + self.console.push_theme(self.theme) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.console.pop_theme() + + +class PagerContext: + """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" + + def __init__( + self, + console: "Console", + pager: Optional[Pager] = None, + styles: bool = False, + links: bool = False, + ) -> None: + self._console = console + self.pager = SystemPager() if pager is None else pager + self.styles = styles + self.links = links + + def __enter__(self) -> "PagerContext": + self._console._enter_buffer() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if exc_type is None: + with self._console._lock: + buffer: List[Segment] = self._console._buffer[:] + del self._console._buffer[:] + segments: Iterable[Segment] = buffer + if not self.styles: + segments = Segment.strip_styles(segments) + elif not self.links: + segments = Segment.strip_links(segments) + content = self._console._render_buffer(segments) + self.pager.show(content) + self._console._exit_buffer() + + +class ScreenContext: + """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" + + def __init__( + self, console: "Console", hide_cursor: bool, style: StyleType = "" + ) -> None: + self.console = console + self.hide_cursor = hide_cursor + self.screen = Screen(style=style) + self._changed = False + + def update( + self, *renderables: RenderableType, style: Optional[StyleType] = None + ) -> None: + """Update the screen. + + Args: + renderable (RenderableType, optional): Optional renderable to replace current renderable, + or None for no change. Defaults to None. + style: (Style, optional): Replacement style, or None for no change. Defaults to None. + """ + if renderables: + self.screen.renderable = ( + Group(*renderables) if len(renderables) > 1 else renderables[0] + ) + if style is not None: + self.screen.style = style + self.console.print(self.screen, end="") + + def __enter__(self) -> "ScreenContext": + self._changed = self.console.set_alt_screen(True) + if self._changed and self.hide_cursor: + self.console.show_cursor(False) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if self._changed: + self.console.set_alt_screen(False) + if self.hide_cursor: + self.console.show_cursor(True) + + +class Group: + """Takes a group of renderables and returns a renderable object that renders the group. + + Args: + renderables (Iterable[RenderableType]): An iterable of renderable objects. + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: + self._renderables = renderables + self.fit = fit + self._render: Optional[List[RenderableType]] = None + + @property + def renderables(self) -> List["RenderableType"]: + if self._render is None: + self._render = list(self._renderables) + return self._render + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.fit: + return measure_renderables(console, options, self.renderables) + else: + return Measurement(options.max_width, options.max_width) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> RenderResult: + yield from self.renderables + + +def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: + """A decorator that turns an iterable of renderables in to a group. + + Args: + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def decorator( + method: Callable[..., Iterable[RenderableType]] + ) -> Callable[..., Group]: + """Convert a method that returns an iterable of renderables in to a Group.""" + + @wraps(method) + def _replace(*args: Any, **kwargs: Any) -> Group: + renderables = method(*args, **kwargs) + return Group(*renderables, fit=fit) + + return _replace + + return decorator + + +def _is_jupyter() -> bool: # pragma: no cover + """Check if we're running in a Jupyter notebook.""" + try: + get_ipython # type: ignore[name-defined] + except NameError: + return False + ipython = get_ipython() # type: ignore[name-defined] + shell = ipython.__class__.__name__ + if ( + "google.colab" in str(ipython.__class__) + or os.getenv("DATABRICKS_RUNTIME_VERSION") + or shell == "ZMQInteractiveShell" + ): + return True # Jupyter notebook or qtconsole + elif shell == "TerminalInteractiveShell": + return False # Terminal running IPython + else: + return False # Other type (?) + + +COLOR_SYSTEMS = { + "standard": ColorSystem.STANDARD, + "256": ColorSystem.EIGHT_BIT, + "truecolor": ColorSystem.TRUECOLOR, + "windows": ColorSystem.WINDOWS, +} + +_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} + + +@dataclass +class ConsoleThreadLocals(threading.local): + """Thread local values for Console context.""" + + theme_stack: ThemeStack + buffer: List[Segment] = field(default_factory=list) + buffer_index: int = 0 + + +class RenderHook(ABC): + """Provides hooks in to the render process.""" + + @abstractmethod + def process_renderables( + self, renderables: List[ConsoleRenderable] + ) -> List[ConsoleRenderable]: + """Called with a list of objects to render. + + This method can return a new list of renderables, or modify and return the same list. + + Args: + renderables (List[ConsoleRenderable]): A number of renderable objects. + + Returns: + List[ConsoleRenderable]: A replacement list of renderables. + """ + + +_windows_console_features: Optional["WindowsConsoleFeatures"] = None + + +def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover + global _windows_console_features + if _windows_console_features is not None: + return _windows_console_features + from ._windows import get_windows_console_features + + _windows_console_features = get_windows_console_features() + return _windows_console_features + + +def detect_legacy_windows() -> bool: + """Detect legacy Windows.""" + return WINDOWS and not get_windows_console_features().vt + + +class Console: + """A high level console interface. + + Args: + color_system (str, optional): The color system supported by your terminal, + either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. + force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. + force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. + force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. + soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. + theme (Theme, optional): An optional style theme object, or ``None`` for default theme. + stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. + file (IO, optional): A file object where the console should write to. Defaults to stdout. + quiet (bool, Optional): Boolean to suppress all output. Defaults to False. + width (int, optional): The width of the terminal. Leave as default to auto-detect width. + height (int, optional): The height of the terminal. Leave as default to auto-detect height. + style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. + no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. + tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. + record (bool, optional): Boolean to enable recording of terminal output, + required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. + markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. + emoji (bool, optional): Enable emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. + highlight (bool, optional): Enable automatic highlighting. Defaults to True. + log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. + log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. + log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". + highlighter (HighlighterType, optional): Default highlighter. + legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. + safe_box (bool, optional): Restrict box options that don't render on legacy Windows. + get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), + or None for datetime.now. + get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. + """ + + _environ: Mapping[str, str] = os.environ + + def __init__( + self, + *, + color_system: Optional[ + Literal["auto", "standard", "256", "truecolor", "windows"] + ] = "auto", + force_terminal: Optional[bool] = None, + force_jupyter: Optional[bool] = None, + force_interactive: Optional[bool] = None, + soft_wrap: bool = False, + theme: Optional[Theme] = None, + stderr: bool = False, + file: Optional[IO[str]] = None, + quiet: bool = False, + width: Optional[int] = None, + height: Optional[int] = None, + style: Optional[StyleType] = None, + no_color: Optional[bool] = None, + tab_size: int = 8, + record: bool = False, + markup: bool = True, + emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, + highlight: bool = True, + log_time: bool = True, + log_path: bool = True, + log_time_format: Union[str, FormatTimeCallable] = "[%X]", + highlighter: Optional["HighlighterType"] = ReprHighlighter(), + legacy_windows: Optional[bool] = None, + safe_box: bool = True, + get_datetime: Optional[Callable[[], datetime]] = None, + get_time: Optional[Callable[[], float]] = None, + _environ: Optional[Mapping[str, str]] = None, + ): + # Copy of os.environ allows us to replace it for testing + if _environ is not None: + self._environ = _environ + + self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter + if self.is_jupyter: + if width is None: + jupyter_columns = self._environ.get("JUPYTER_COLUMNS") + if jupyter_columns is not None and jupyter_columns.isdigit(): + width = int(jupyter_columns) + else: + width = JUPYTER_DEFAULT_COLUMNS + if height is None: + jupyter_lines = self._environ.get("JUPYTER_LINES") + if jupyter_lines is not None and jupyter_lines.isdigit(): + height = int(jupyter_lines) + else: + height = JUPYTER_DEFAULT_LINES + + self.tab_size = tab_size + self.record = record + self._markup = markup + self._emoji = emoji + self._emoji_variant: Optional[EmojiVariant] = emoji_variant + self._highlight = highlight + self.legacy_windows: bool = ( + (detect_legacy_windows() and not self.is_jupyter) + if legacy_windows is None + else legacy_windows + ) + + if width is None: + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) - self.legacy_windows + if height is None: + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + self.soft_wrap = soft_wrap + self._width = width + self._height = height + + self._color_system: Optional[ColorSystem] + + self._force_terminal = None + if force_terminal is not None: + self._force_terminal = force_terminal + + self._file = file + self.quiet = quiet + self.stderr = stderr + + if color_system is None: + self._color_system = None + elif color_system == "auto": + self._color_system = self._detect_color_system() + else: + self._color_system = COLOR_SYSTEMS[color_system] + + self._lock = threading.RLock() + self._log_render = LogRender( + show_time=log_time, + show_path=log_path, + time_format=log_time_format, + ) + self.highlighter: HighlighterType = highlighter or _null_highlighter + self.safe_box = safe_box + self.get_datetime = get_datetime or datetime.now + self.get_time = get_time or monotonic + self.style = style + self.no_color = ( + no_color if no_color is not None else "NO_COLOR" in self._environ + ) + self.is_interactive = ( + (self.is_terminal and not self.is_dumb_terminal) + if force_interactive is None + else force_interactive + ) + + self._record_buffer_lock = threading.RLock() + self._thread_locals = ConsoleThreadLocals( + theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) + ) + self._record_buffer: List[Segment] = [] + self._render_hooks: List[RenderHook] = [] + self._live: Optional["Live"] = None + self._is_alt_screen = False + + def __repr__(self) -> str: + return f"" + + @property + def file(self) -> IO[str]: + """Get the file object to write to.""" + file = self._file or (sys.stderr if self.stderr else sys.stdout) + file = getattr(file, "rich_proxied_file", file) + if file is None: + file = NULL_FILE + return file + + @file.setter + def file(self, new_file: IO[str]) -> None: + """Set a new file object.""" + self._file = new_file + + @property + def _buffer(self) -> List[Segment]: + """Get a thread local buffer.""" + return self._thread_locals.buffer + + @property + def _buffer_index(self) -> int: + """Get a thread local buffer.""" + return self._thread_locals.buffer_index + + @_buffer_index.setter + def _buffer_index(self, value: int) -> None: + self._thread_locals.buffer_index = value + + @property + def _theme_stack(self) -> ThemeStack: + """Get the thread local theme stack.""" + return self._thread_locals.theme_stack + + def _detect_color_system(self) -> Optional[ColorSystem]: + """Detect color system from env vars.""" + if self.is_jupyter: + return ColorSystem.TRUECOLOR + if not self.is_terminal or self.is_dumb_terminal: + return None + if WINDOWS: # pragma: no cover + if self.legacy_windows: # pragma: no cover + return ColorSystem.WINDOWS + windows_console_features = get_windows_console_features() + return ( + ColorSystem.TRUECOLOR + if windows_console_features.truecolor + else ColorSystem.EIGHT_BIT + ) + else: + color_term = self._environ.get("COLORTERM", "").strip().lower() + if color_term in ("truecolor", "24bit"): + return ColorSystem.TRUECOLOR + term = self._environ.get("TERM", "").strip().lower() + _term_name, _hyphen, colors = term.rpartition("-") + color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) + return color_system + + def _enter_buffer(self) -> None: + """Enter in to a buffer context, and buffer all output.""" + self._buffer_index += 1 + + def _exit_buffer(self) -> None: + """Leave buffer context, and render content if required.""" + self._buffer_index -= 1 + self._check_buffer() + + def set_live(self, live: "Live") -> None: + """Set Live instance. Used by Live context manager. + + Args: + live (Live): Live instance using this Console. + + Raises: + errors.LiveError: If this Console has a Live context currently active. + """ + with self._lock: + if self._live is not None: + raise errors.LiveError("Only one live display may be active at once") + self._live = live + + def clear_live(self) -> None: + """Clear the Live instance.""" + with self._lock: + self._live = None + + def push_render_hook(self, hook: RenderHook) -> None: + """Add a new render hook to the stack. + + Args: + hook (RenderHook): Render hook instance. + """ + with self._lock: + self._render_hooks.append(hook) + + def pop_render_hook(self) -> None: + """Pop the last renderhook from the stack.""" + with self._lock: + self._render_hooks.pop() + + def __enter__(self) -> "Console": + """Own context manager to enter buffer context.""" + self._enter_buffer() + return self + + def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: + """Exit buffer context.""" + self._exit_buffer() + + def begin_capture(self) -> None: + """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" + self._enter_buffer() + + def end_capture(self) -> str: + """End capture mode and return captured string. + + Returns: + str: Console output. + """ + render_result = self._render_buffer(self._buffer) + del self._buffer[:] + self._exit_buffer() + return render_result + + def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: + """Push a new theme on to the top of the stack, replacing the styles from the previous theme. + Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather + than calling this method directly. + + Args: + theme (Theme): A theme instance. + inherit (bool, optional): Inherit existing styles. Defaults to True. + """ + self._theme_stack.push_theme(theme, inherit=inherit) + + def pop_theme(self) -> None: + """Remove theme from top of stack, restoring previous theme.""" + self._theme_stack.pop_theme() + + def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: + """Use a different theme for the duration of the context manager. + + Args: + theme (Theme): Theme instance to user. + inherit (bool, optional): Inherit existing console styles. Defaults to True. + + Returns: + ThemeContext: [description] + """ + return ThemeContext(self, theme, inherit) + + @property + def color_system(self) -> Optional[str]: + """Get color system string. + + Returns: + Optional[str]: "standard", "256" or "truecolor". + """ + + if self._color_system is not None: + return _COLOR_SYSTEMS_NAMES[self._color_system] + else: + return None + + @property + def encoding(self) -> str: + """Get the encoding of the console file, e.g. ``"utf-8"``. + + Returns: + str: A standard encoding string. + """ + return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() + + @property + def is_terminal(self) -> bool: + """Check if the console is writing to a terminal. + + Returns: + bool: True if the console writing to a device capable of + understanding terminal codes, otherwise False. + """ + if self._force_terminal is not None: + return self._force_terminal + + if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( + "idlelib" + ): + # Return False for Idle which claims to be a tty but can't handle ansi codes + return False + + if self.is_jupyter: + # return False for Jupyter, which may have FORCE_COLOR set + return False + + # If FORCE_COLOR env var has any value at all, we assume a terminal. + force_color = self._environ.get("FORCE_COLOR") + if force_color is not None: + self._force_terminal = True + return True + + isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) + try: + return False if isatty is None else isatty() + except ValueError: + # in some situation (at the end of a pytest run for example) isatty() can raise + # ValueError: I/O operation on closed file + # return False because we aren't in a terminal anymore + return False + + @property + def is_dumb_terminal(self) -> bool: + """Detect dumb terminal. + + Returns: + bool: True if writing to a dumb terminal, otherwise False. + + """ + _term = self._environ.get("TERM", "") + is_dumb = _term.lower() in ("dumb", "unknown") + return self.is_terminal and is_dumb + + @property + def options(self) -> ConsoleOptions: + """Get default console options.""" + return ConsoleOptions( + max_height=self.size.height, + size=self.size, + legacy_windows=self.legacy_windows, + min_width=1, + max_width=self.width, + encoding=self.encoding, + is_terminal=self.is_terminal, + ) + + @property + def size(self) -> ConsoleDimensions: + """Get the size of the console. + + Returns: + ConsoleDimensions: A named tuple containing the dimensions. + """ + + if self._width is not None and self._height is not None: + return ConsoleDimensions(self._width - self.legacy_windows, self._height) + + if self.is_dumb_terminal: + return ConsoleDimensions(80, 25) + + width: Optional[int] = None + height: Optional[int] = None + + if WINDOWS: # pragma: no cover + try: + width, height = os.get_terminal_size() + except (AttributeError, ValueError, OSError): # Probably not a terminal + pass + else: + for file_descriptor in _STD_STREAMS: + try: + width, height = os.get_terminal_size(file_descriptor) + except (AttributeError, ValueError, OSError): + pass + else: + break + + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + # get_terminal_size can report 0, 0 if run from pseudo-terminal + width = width or 80 + height = height or 25 + return ConsoleDimensions( + width - self.legacy_windows if self._width is None else self._width, + height if self._height is None else self._height, + ) + + @size.setter + def size(self, new_size: Tuple[int, int]) -> None: + """Set a new size for the terminal. + + Args: + new_size (Tuple[int, int]): New width and height. + """ + width, height = new_size + self._width = width + self._height = height + + @property + def width(self) -> int: + """Get the width of the console. + + Returns: + int: The width (in characters) of the console. + """ + return self.size.width + + @width.setter + def width(self, width: int) -> None: + """Set width. + + Args: + width (int): New width. + """ + self._width = width + + @property + def height(self) -> int: + """Get the height of the console. + + Returns: + int: The height (in lines) of the console. + """ + return self.size.height + + @height.setter + def height(self, height: int) -> None: + """Set height. + + Args: + height (int): new height. + """ + self._height = height + + def bell(self) -> None: + """Play a 'bell' sound (if supported by the terminal).""" + self.control(Control.bell()) + + def capture(self) -> Capture: + """A context manager to *capture* the result of print() or log() in a string, + rather than writing it to the console. + + Example: + >>> from rich.console import Console + >>> console = Console() + >>> with console.capture() as capture: + ... console.print("[bold magenta]Hello World[/]") + >>> print(capture.get()) + + Returns: + Capture: Context manager with disables writing to the terminal. + """ + capture = Capture(self) + return capture + + def pager( + self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False + ) -> PagerContext: + """A context manager to display anything printed within a "pager". The pager application + is defined by the system and will typically support at least pressing a key to scroll. + + Args: + pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. + styles (bool, optional): Show styles in pager. Defaults to False. + links (bool, optional): Show links in pager. Defaults to False. + + Example: + >>> from rich.console import Console + >>> from rich.__main__ import make_test_card + >>> console = Console() + >>> with console.pager(): + console.print(make_test_card()) + + Returns: + PagerContext: A context manager. + """ + return PagerContext(self, pager=pager, styles=styles, links=links) + + def line(self, count: int = 1) -> None: + """Write new line(s). + + Args: + count (int, optional): Number of new lines. Defaults to 1. + """ + + assert count >= 0, "count must be >= 0" + self.print(NewLine(count)) + + def clear(self, home: bool = True) -> None: + """Clear the screen. + + Args: + home (bool, optional): Also move the cursor to 'home' position. Defaults to True. + """ + if home: + self.control(Control.clear(), Control.home()) + else: + self.control(Control.clear()) + + def status( + self, + status: RenderableType, + *, + spinner: str = "dots", + spinner_style: StyleType = "status.spinner", + speed: float = 1.0, + refresh_per_second: float = 12.5, + ) -> "Status": + """Display a status and spinner. + + Args: + status (RenderableType): A status renderable (str or Text typically). + spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". + spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". + speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. + refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. + + Returns: + Status: A Status object that may be used as a context manager. + """ + from .status import Status + + status_renderable = Status( + status, + console=self, + spinner=spinner, + spinner_style=spinner_style, + speed=speed, + refresh_per_second=refresh_per_second, + ) + return status_renderable + + def show_cursor(self, show: bool = True) -> bool: + """Show or hide the cursor. + + Args: + show (bool, optional): Set visibility of the cursor. + """ + if self.is_terminal: + self.control(Control.show_cursor(show)) + return True + return False + + def set_alt_screen(self, enable: bool = True) -> bool: + """Enables alternative screen mode. + + Note, if you enable this mode, you should ensure that is disabled before + the application exits. See :meth:`~rich.Console.screen` for a context manager + that handles this for you. + + Args: + enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. + + Returns: + bool: True if the control codes were written. + + """ + changed = False + if self.is_terminal and not self.legacy_windows: + self.control(Control.alt_screen(enable)) + changed = True + self._is_alt_screen = enable + return changed + + @property + def is_alt_screen(self) -> bool: + """Check if the alt screen was enabled. + + Returns: + bool: True if the alt screen was enabled, otherwise False. + """ + return self._is_alt_screen + + def set_window_title(self, title: str) -> bool: + """Set the title of the console terminal window. + + Warning: There is no means within Rich of "resetting" the window title to its + previous value, meaning the title you set will persist even after your application + exits. + + ``fish`` shell resets the window title before and after each command by default, + negating this issue. Windows Terminal and command prompt will also reset the title for you. + Most other shells and terminals, however, do not do this. + + Some terminals may require configuration changes before you can set the title. + Some terminals may not support setting the title at all. + + Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) + may also set the terminal window title. This could result in whatever value you write + using this method being overwritten. + + Args: + title (str): The new title of the terminal window. + + Returns: + bool: True if the control code to change the terminal title was + written, otherwise False. Note that a return value of True + does not guarantee that the window title has actually changed, + since the feature may be unsupported/disabled in some terminals. + """ + if self.is_terminal: + self.control(Control.title(title)) + return True + return False + + def screen( + self, hide_cursor: bool = True, style: Optional[StyleType] = None + ) -> "ScreenContext": + """Context manager to enable and disable 'alternative screen' mode. + + Args: + hide_cursor (bool, optional): Also hide the cursor. Defaults to False. + style (Style, optional): Optional style for screen. Defaults to None. + + Returns: + ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. + """ + return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") + + def measure( + self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None + ) -> Measurement: + """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains + information regarding the number of characters required to print the renderable. + + Args: + renderable (RenderableType): Any renderable or string. + options (Optional[ConsoleOptions], optional): Options to use when measuring, or None + to use default options. Defaults to None. + + Returns: + Measurement: A measurement of the renderable. + """ + measurement = Measurement.get(self, options or self.options, renderable) + return measurement + + def render( + self, renderable: RenderableType, options: Optional[ConsoleOptions] = None + ) -> Iterable[Segment]: + """Render an object in to an iterable of `Segment` instances. + + This method contains the logic for rendering objects with the console protocol. + You are unlikely to need to use it directly, unless you are extending the library. + + Args: + renderable (RenderableType): An object supporting the console protocol, or + an object that may be converted to a string. + options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. + + Returns: + Iterable[Segment]: An iterable of segments that may be rendered. + """ + + _options = options or self.options + if _options.max_width < 1: + # No space to render anything. This prevents potential recursion errors. + return + render_iterable: RenderResult + + renderable = rich_cast(renderable) + if hasattr(renderable, "__rich_console__") and not isclass(renderable): + render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] + elif isinstance(renderable, str): + text_renderable = self.render_str( + renderable, highlight=_options.highlight, markup=_options.markup + ) + render_iterable = text_renderable.__rich_console__(self, _options) + else: + raise errors.NotRenderableError( + f"Unable to render {renderable!r}; " + "A str, Segment or object with __rich_console__ method is required" + ) + + try: + iter_render = iter(render_iterable) + except TypeError: + raise errors.NotRenderableError( + f"object {render_iterable!r} is not renderable" + ) + _Segment = Segment + _options = _options.reset_height() + for render_output in iter_render: + if isinstance(render_output, _Segment): + yield render_output + else: + yield from self.render(render_output, _options) + + def render_lines( + self, + renderable: RenderableType, + options: Optional[ConsoleOptions] = None, + *, + style: Optional[Style] = None, + pad: bool = True, + new_lines: bool = False, + ) -> List[List[Segment]]: + """Render objects in to a list of lines. + + The output of render_lines is useful when further formatting of rendered console text + is required, such as the Panel class which draws a border around any renderable object. + + Args: + renderable (RenderableType): Any object renderable in the console. + options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. + style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. + pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. + new_lines (bool, optional): Include "\n" characters at end of lines. + + Returns: + List[List[Segment]]: A list of lines, where a line is a list of Segment objects. + """ + with self._lock: + render_options = options or self.options + _rendered = self.render(renderable, render_options) + if style: + _rendered = Segment.apply_style(_rendered, style) + + render_height = render_options.height + if render_height is not None: + render_height = max(0, render_height) + + lines = list( + islice( + Segment.split_and_crop_lines( + _rendered, + render_options.max_width, + include_new_lines=new_lines, + pad=pad, + style=style, + ), + None, + render_height, + ) + ) + if render_options.height is not None: + extra_lines = render_options.height - len(lines) + if extra_lines > 0: + pad_line = [ + [Segment(" " * render_options.max_width, style), Segment("\n")] + if new_lines + else [Segment(" " * render_options.max_width, style)] + ] + lines.extend(pad_line * extra_lines) + + return lines + + def render_str( + self, + text: str, + *, + style: Union[str, Style] = "", + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + highlighter: Optional[HighlighterType] = None, + ) -> "Text": + """Convert a string to a Text instance. This is called automatically if + you print or log a string. + + Args: + text (str): Text to render. + style (Union[str, Style], optional): Style to apply to rendered text. + justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. + highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. + highlighter (HighlighterType, optional): Optional highlighter to apply. + Returns: + ConsoleRenderable: Renderable object. + + """ + emoji_enabled = emoji or (emoji is None and self._emoji) + markup_enabled = markup or (markup is None and self._markup) + highlight_enabled = highlight or (highlight is None and self._highlight) + + if markup_enabled: + rich_text = render_markup( + text, + style=style, + emoji=emoji_enabled, + emoji_variant=self._emoji_variant, + ) + rich_text.justify = justify + rich_text.overflow = overflow + else: + rich_text = Text( + _emoji_replace(text, default_variant=self._emoji_variant) + if emoji_enabled + else text, + justify=justify, + overflow=overflow, + style=style, + ) + + _highlighter = (highlighter or self.highlighter) if highlight_enabled else None + if _highlighter is not None: + highlight_text = _highlighter(str(rich_text)) + highlight_text.copy_styles(rich_text) + return highlight_text + + return rich_text + + def get_style( + self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None + ) -> Style: + """Get a Style instance by its theme name or parse a definition. + + Args: + name (str): The name of a style or a style definition. + + Returns: + Style: A Style object. + + Raises: + MissingStyle: If no style could be parsed from name. + + """ + if isinstance(name, Style): + return name + + try: + style = self._theme_stack.get(name) + if style is None: + style = Style.parse(name) + return style.copy() if style.link else style + except errors.StyleSyntaxError as error: + if default is not None: + return self.get_style(default) + raise errors.MissingStyle( + f"Failed to get style {name!r}; {error}" + ) from None + + def _collect_renderables( + self, + objects: Iterable[Any], + sep: str, + end: str, + *, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + ) -> List[ConsoleRenderable]: + """Combine a number of renderables and text into one renderable. + + Args: + objects (Iterable[Any]): Anything that Rich can render. + sep (str): String to write between print data. + end (str): String to write at end of print data. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. + + Returns: + List[ConsoleRenderable]: A list of things to render. + """ + renderables: List[ConsoleRenderable] = [] + _append = renderables.append + text: List[Text] = [] + append_text = text.append + + append = _append + if justify in ("left", "center", "right"): + + def align_append(renderable: RenderableType) -> None: + _append(Align(renderable, cast(AlignMethod, justify))) + + append = align_append + + _highlighter: HighlighterType = _null_highlighter + if highlight or (highlight is None and self._highlight): + _highlighter = self.highlighter + + def check_text() -> None: + if text: + sep_text = Text(sep, justify=justify, end=end) + append(sep_text.join(text)) + text.clear() + + for renderable in objects: + renderable = rich_cast(renderable) + if isinstance(renderable, str): + append_text( + self.render_str( + renderable, emoji=emoji, markup=markup, highlighter=_highlighter + ) + ) + elif isinstance(renderable, Text): + append_text(renderable) + elif isinstance(renderable, ConsoleRenderable): + check_text() + append(renderable) + elif is_expandable(renderable): + check_text() + append(Pretty(renderable, highlighter=_highlighter)) + else: + append_text(_highlighter(str(renderable))) + + check_text() + + if self.style is not None: + style = self.get_style(self.style) + renderables = [Styled(renderable, style) for renderable in renderables] + + return renderables + + def rule( + self, + title: TextType = "", + *, + characters: str = "─", + style: Union[str, Style] = "rule.line", + align: AlignMethod = "center", + ) -> None: + """Draw a line with optional centered title. + + Args: + title (str, optional): Text to render over the rule. Defaults to "". + characters (str, optional): Character(s) to form the line. Defaults to "─". + style (str, optional): Style of line. Defaults to "rule.line". + align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". + """ + from .rule import Rule + + rule = Rule(title=title, characters=characters, style=style, align=align) + self.print(rule) + + def control(self, *control: Control) -> None: + """Insert non-printing control codes. + + Args: + control_codes (str): Control codes, such as those that may move the cursor. + """ + if not self.is_dumb_terminal: + with self: + self._buffer.extend(_control.segment for _control in control) + + def out( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + highlight: Optional[bool] = None, + ) -> None: + """Output to the terminal. This is a low-level way of writing to the terminal which unlike + :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will + optionally apply highlighting and a basic style. + + Args: + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use + console default. Defaults to ``None``. + """ + raw_output: str = sep.join(str(_object) for _object in objects) + self.print( + raw_output, + style=style, + highlight=highlight, + emoji=False, + markup=False, + no_wrap=True, + overflow="ignore", + crop=False, + end=end, + ) + + def print( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + no_wrap: Optional[bool] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + width: Optional[int] = None, + height: Optional[int] = None, + crop: bool = True, + soft_wrap: Optional[bool] = None, + new_line_start: bool = False, + ) -> None: + """Print to the console. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. + overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. + no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. + width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. + crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. + soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for + Console default. Defaults to ``None``. + new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. + """ + if not objects: + objects = (NewLine(),) + + if soft_wrap is None: + soft_wrap = self.soft_wrap + if soft_wrap: + if no_wrap is None: + no_wrap = True + if overflow is None: + overflow = "ignore" + crop = False + render_hooks = self._render_hooks[:] + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + render_options = self.options.update( + justify=justify, + overflow=overflow, + width=min(width, self.width) if width is not None else NO_CHANGE, + height=height, + no_wrap=no_wrap, + markup=markup, + highlight=highlight, + ) + + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + if style is None: + for renderable in renderables: + extend(render(renderable, render_options)) + else: + for renderable in renderables: + extend( + Segment.apply_style( + render(renderable, render_options), self.get_style(style) + ) + ) + if new_line_start: + if ( + len("".join(segment.text for segment in new_segments).splitlines()) + > 1 + ): + new_segments.insert(0, Segment.line()) + if crop: + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + else: + self._buffer.extend(new_segments) + + def print_json( + self, + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = False, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, + ) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (Optional[str]): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + from pip._vendor.rich.json import JSON + + if json is None: + json_renderable = JSON.from_data( + data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + else: + if not isinstance(json, str): + raise TypeError( + f"json must be str. Did you mean print_json(data={json!r}) ?" + ) + json_renderable = JSON( + json, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + self.print(json_renderable, soft_wrap=True) + + def update_screen( + self, + renderable: RenderableType, + *, + region: Optional[Region] = None, + options: Optional[ConsoleOptions] = None, + ) -> None: + """Update the screen at a given offset. + + Args: + renderable (RenderableType): A Rich renderable. + region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. + x (int, optional): x offset. Defaults to 0. + y (int, optional): y offset. Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + render_options = options or self.options + if region is None: + x = y = 0 + render_options = render_options.update_dimensions( + render_options.max_width, render_options.height or self.height + ) + else: + x, y, width, height = region + render_options = render_options.update_dimensions(width, height) + + lines = self.render_lines(renderable, options=render_options) + self.update_screen_lines(lines, x, y) + + def update_screen_lines( + self, lines: List[List[Segment]], x: int = 0, y: int = 0 + ) -> None: + """Update lines of the screen at a given offset. + + Args: + lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). + x (int, optional): x offset (column no). Defaults to 0. + y (int, optional): y offset (column no). Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + screen_update = ScreenUpdate(lines, x, y) + segments = self.render(screen_update) + self._buffer.extend(segments) + self._check_buffer() + + def print_exception( + self, + *, + width: Optional[int] = 100, + extra_lines: int = 3, + theme: Optional[str] = None, + word_wrap: bool = False, + show_locals: bool = False, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, + ) -> None: + """Prints a rich render of the last exception and traceback. + + Args: + width (Optional[int], optional): Number of characters used to render code. Defaults to 100. + extra_lines (int, optional): Additional lines of code to render. Defaults to 3. + theme (str, optional): Override pygments theme used in traceback + word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + """ + from .traceback import Traceback + + traceback = Traceback( + width=width, + extra_lines=extra_lines, + theme=theme, + word_wrap=word_wrap, + show_locals=show_locals, + suppress=suppress, + max_frames=max_frames, + ) + self.print(traceback) + + @staticmethod + def _caller_frame_info( + offset: int, + currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, + ) -> Tuple[str, int, Dict[str, Any]]: + """Get caller frame information. + + Args: + offset (int): the caller offset within the current frame stack. + currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to + retrieve the current frame. Defaults to ``inspect.currentframe``. + + Returns: + Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and + the dictionary of local variables associated with the caller frame. + + Raises: + RuntimeError: If the stack offset is invalid. + """ + # Ignore the frame of this local helper + offset += 1 + + frame = currentframe() + if frame is not None: + # Use the faster currentframe where implemented + while offset and frame is not None: + frame = frame.f_back + offset -= 1 + assert frame is not None + return frame.f_code.co_filename, frame.f_lineno, frame.f_locals + else: + # Fallback to the slower stack + frame_info = inspect.stack()[offset] + return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals + + def log( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + log_locals: bool = False, + _stack_offset: int = 1, + ) -> None: + """Log rich content to the terminal. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. + log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` + was called. Defaults to False. + _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. + """ + if not objects: + objects = (NewLine(),) + + render_hooks = self._render_hooks[:] + + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + if style is not None: + renderables = [Styled(renderable, style) for renderable in renderables] + + filename, line_no, locals = self._caller_frame_info(_stack_offset) + link_path = None if filename.startswith("<") else os.path.abspath(filename) + path = filename.rpartition(os.sep)[-1] + if log_locals: + locals_map = { + key: value + for key, value in locals.items() + if not key.startswith("__") + } + renderables.append(render_scope(locals_map, title="[i]locals")) + + renderables = [ + self._log_render( + self, + renderables, + log_time=self.get_datetime(), + path=path, + line_no=line_no, + link_path=link_path, + ) + ] + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + render_options = self.options + for renderable in renderables: + extend(render(renderable, render_options)) + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + + def _check_buffer(self) -> None: + """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) + Rendering is supported on Windows, Unix and Jupyter environments. For + legacy Windows consoles, the win32 API is called directly. + This method will also record what it renders if recording is enabled via Console.record. + """ + if self.quiet: + del self._buffer[:] + return + with self._lock: + if self.record: + with self._record_buffer_lock: + self._record_buffer.extend(self._buffer[:]) + + if self._buffer_index == 0: + if self.is_jupyter: # pragma: no cover + from .jupyter import display + + display(self._buffer, self._render_buffer(self._buffer[:])) + del self._buffer[:] + else: + if WINDOWS: + use_legacy_windows_render = False + if self.legacy_windows: + fileno = get_fileno(self.file) + if fileno is not None: + use_legacy_windows_render = ( + fileno in _STD_STREAMS_OUTPUT + ) + + if use_legacy_windows_render: + from pip._vendor.rich._win32_console import LegacyWindowsTerm + from pip._vendor.rich._windows_renderer import legacy_windows_render + + buffer = self._buffer[:] + if self.no_color and self._color_system: + buffer = list(Segment.remove_color(buffer)) + + legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) + else: + # Either a non-std stream on legacy Windows, or modern Windows. + text = self._render_buffer(self._buffer[:]) + # https://bugs.python.org/issue37871 + # https://github.com/python/cpython/issues/82052 + # We need to avoid writing more than 32Kb in a single write, due to the above bug + write = self.file.write + # Worse case scenario, every character is 4 bytes of utf-8 + MAX_WRITE = 32 * 1024 // 4 + try: + if len(text) <= MAX_WRITE: + write(text) + else: + batch: List[str] = [] + batch_append = batch.append + size = 0 + for line in text.splitlines(True): + if size + len(line) > MAX_WRITE and batch: + write("".join(batch)) + batch.clear() + size = 0 + batch_append(line) + size += len(line) + if batch: + write("".join(batch)) + batch.clear() + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + else: + text = self._render_buffer(self._buffer[:]) + try: + self.file.write(text) + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + + self.file.flush() + del self._buffer[:] + + def _render_buffer(self, buffer: Iterable[Segment]) -> str: + """Render buffered output, and clear buffer.""" + output: List[str] = [] + append = output.append + color_system = self._color_system + legacy_windows = self.legacy_windows + not_terminal = not self.is_terminal + if self.no_color and color_system: + buffer = Segment.remove_color(buffer) + for text, style, control in buffer: + if style: + append( + style.render( + text, + color_system=color_system, + legacy_windows=legacy_windows, + ) + ) + elif not (not_terminal and control): + append(text) + + rendered = "".join(output) + return rendered + + def input( + self, + prompt: TextType = "", + *, + markup: bool = True, + emoji: bool = True, + password: bool = False, + stream: Optional[TextIO] = None, + ) -> str: + """Displays a prompt and waits for input from the user. The prompt may contain color / style. + + It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. + + Args: + prompt (Union[str, Text]): Text to render in the prompt. + markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. + emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. + password: (bool, optional): Hide typed text. Defaults to False. + stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. + + Returns: + str: Text read from stdin. + """ + if prompt: + self.print(prompt, markup=markup, emoji=emoji, end="") + if password: + result = getpass("", stream=stream) + else: + if stream: + result = stream.readline() + else: + result = input() + return result + + def export_text(self, *, clear: bool = True, styles: bool = False) -> str: + """Generate text from console contents (requires record=True argument in constructor). + + Args: + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. + Defaults to ``False``. + + Returns: + str: String containing console contents. + + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + + with self._record_buffer_lock: + if styles: + text = "".join( + (style.render(text) if style else text) + for text, style, _ in self._record_buffer + ) + else: + text = "".join( + segment.text + for segment in self._record_buffer + if not segment.control + ) + if clear: + del self._record_buffer[:] + return text + + def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: + """Generate text from console and save to a given location (requires record=True argument in constructor). + + Args: + path (str): Path to write text files. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. + Defaults to ``False``. + + """ + text = self.export_text(clear=clear, styles=styles) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(text) + + def export_html( + self, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: Optional[str] = None, + inline_styles: bool = False, + ) -> str: + """Generate HTML from console contents (requires record=True argument in constructor). + + Args: + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + Returns: + str: String containing console contents as HTML. + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + fragments: List[str] = [] + append = fragments.append + _theme = theme or DEFAULT_TERMINAL_THEME + stylesheet = "" + + render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format + + with self._record_buffer_lock: + if inline_styles: + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + if style.link: + text = f'
    {text}' + text = f'{text}' if rule else text + append(text) + else: + styles: Dict[str, int] = {} + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + style_number = styles.setdefault(rule, len(styles) + 1) + if style.link: + text = f'{text}' + else: + text = f'{text}' + append(text) + stylesheet_rules: List[str] = [] + stylesheet_append = stylesheet_rules.append + for style_rule, style_number in styles.items(): + if style_rule: + stylesheet_append(f".r{style_number} {{{style_rule}}}") + stylesheet = "\n".join(stylesheet_rules) + + rendered_code = render_code_format.format( + code="".join(fragments), + stylesheet=stylesheet, + foreground=_theme.foreground_color.hex, + background=_theme.background_color.hex, + ) + if clear: + del self._record_buffer[:] + return rendered_code + + def save_html( + self, + path: str, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_HTML_FORMAT, + inline_styles: bool = False, + ) -> None: + """Generate HTML from console contents and write to a file (requires record=True argument in constructor). + + Args: + path (str): Path to write html file. + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + """ + html = self.export_html( + theme=theme, + clear=clear, + code_format=code_format, + inline_styles=inline_styles, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(html) + + def export_svg( + self, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> str: + """ + Generate an SVG from the console contents (requires record=True in Console constructor). + + Args: + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + + from pip._vendor.rich.cells import cell_len + + style_cache: Dict[Style, str] = {} + + def get_svg_style(style: Style) -> str: + """Convert a Style to CSS rules for SVG.""" + if style in style_cache: + return style_cache[style] + css_rules = [] + color = ( + _theme.foreground_color + if (style.color is None or style.color.is_default) + else style.color.get_truecolor(_theme) + ) + bgcolor = ( + _theme.background_color + if (style.bgcolor is None or style.bgcolor.is_default) + else style.bgcolor.get_truecolor(_theme) + ) + if style.reverse: + color, bgcolor = bgcolor, color + if style.dim: + color = blend_rgb(color, bgcolor, 0.4) + css_rules.append(f"fill: {color.hex}") + if style.bold: + css_rules.append("font-weight: bold") + if style.italic: + css_rules.append("font-style: italic;") + if style.underline: + css_rules.append("text-decoration: underline;") + if style.strike: + css_rules.append("text-decoration: line-through;") + + css = ";".join(css_rules) + style_cache[style] = css + return css + + _theme = theme or SVG_EXPORT_THEME + + width = self.width + char_height = 20 + char_width = char_height * font_aspect_ratio + line_height = char_height * 1.22 + + margin_top = 1 + margin_right = 1 + margin_bottom = 1 + margin_left = 1 + + padding_top = 40 + padding_right = 8 + padding_bottom = 8 + padding_left = 8 + + padding_width = padding_left + padding_right + padding_height = padding_top + padding_bottom + margin_width = margin_left + margin_right + margin_height = margin_top + margin_bottom + + text_backgrounds: List[str] = [] + text_group: List[str] = [] + classes: Dict[str, int] = {} + style_no = 1 + + def escape_text(text: str) -> str: + """HTML escape text and replace spaces with nbsp.""" + return escape(text).replace(" ", " ") + + def make_tag( + name: str, content: Optional[str] = None, **attribs: object + ) -> str: + """Make a tag from name, content, and attributes.""" + + def stringify(value: object) -> str: + if isinstance(value, (float)): + return format(value, "g") + return str(value) + + tag_attribs = " ".join( + f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' + for k, v in attribs.items() + ) + return ( + f"<{name} {tag_attribs}>{content}" + if content + else f"<{name} {tag_attribs}/>" + ) + + with self._record_buffer_lock: + segments = list(Segment.filter_control(self._record_buffer)) + if clear: + self._record_buffer.clear() + + if unique_id is None: + unique_id = "terminal-" + str( + zlib.adler32( + ("".join(repr(segment) for segment in segments)).encode( + "utf-8", + "ignore", + ) + + title.encode("utf-8", "ignore") + ) + ) + y = 0 + for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): + x = 0 + for text, style, _control in line: + style = style or Style() + rules = get_svg_style(style) + if rules not in classes: + classes[rules] = style_no + style_no += 1 + class_name = f"r{classes[rules]}" + + if style.reverse: + has_background = True + background = ( + _theme.foreground_color.hex + if style.color is None + else style.color.get_truecolor(_theme).hex + ) + else: + bgcolor = style.bgcolor + has_background = bgcolor is not None and not bgcolor.is_default + background = ( + _theme.background_color.hex + if style.bgcolor is None + else style.bgcolor.get_truecolor(_theme).hex + ) + + text_length = cell_len(text) + if has_background: + text_backgrounds.append( + make_tag( + "rect", + fill=background, + x=x * char_width, + y=y * line_height + 1.5, + width=char_width * text_length, + height=line_height + 0.25, + shape_rendering="crispEdges", + ) + ) + + if text != " " * len(text): + text_group.append( + make_tag( + "text", + escape_text(text), + _class=f"{unique_id}-{class_name}", + x=x * char_width, + y=y * line_height + char_height, + textLength=char_width * len(text), + clip_path=f"url(#{unique_id}-line-{y})", + ) + ) + x += cell_len(text) + + line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] + lines = "\n".join( + f""" + {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} + """ + for line_no, offset in enumerate(line_offsets) + ) + + styles = "\n".join( + f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() + ) + backgrounds = "".join(text_backgrounds) + matrix = "".join(text_group) + + terminal_width = ceil(width * char_width + padding_width) + terminal_height = (y + 1) * line_height + padding_height + chrome = make_tag( + "rect", + fill=_theme.background_color.hex, + stroke="rgba(255,255,255,0.35)", + stroke_width="1", + x=margin_left, + y=margin_top, + width=terminal_width, + height=terminal_height, + rx=8, + ) + + title_color = _theme.foreground_color.hex + if title: + chrome += make_tag( + "text", + escape_text(title), + _class=f"{unique_id}-title", + fill=title_color, + text_anchor="middle", + x=terminal_width // 2, + y=margin_top + char_height + 6, + ) + chrome += f""" + + + + + + """ + + svg = code_format.format( + unique_id=unique_id, + char_width=char_width, + char_height=char_height, + line_height=line_height, + terminal_width=char_width * width - 1, + terminal_height=(y + 1) * line_height - 1, + width=terminal_width + margin_width, + height=terminal_height + margin_height, + terminal_x=margin_left + padding_left, + terminal_y=margin_top + padding_top, + styles=styles, + chrome=chrome, + backgrounds=backgrounds, + matrix=matrix, + lines=lines, + ) + return svg + + def save_svg( + self, + path: str, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> None: + """Generate an SVG file from the console contents (requires record=True in Console constructor). + + Args: + path (str): The path to write the SVG to. + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + svg = self.export_svg( + title=title, + theme=theme, + clear=clear, + code_format=code_format, + font_aspect_ratio=font_aspect_ratio, + unique_id=unique_id, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(svg) + + +def _svg_hash(svg_main_code: str) -> str: + """Returns a unique hash for the given SVG main code. + + Args: + svg_main_code (str): The content we're going to inject in the SVG envelope. + + Returns: + str: a hash of the given content + """ + return str(zlib.adler32(svg_main_code.encode())) + + +if __name__ == "__main__": # pragma: no cover + console = Console(record=True) + + console.log( + "JSONRPC [i]request[/i]", + 5, + 1.3, + True, + False, + None, + { + "jsonrpc": "2.0", + "method": "subtract", + "params": {"minuend": 42, "subtrahend": 23}, + "id": 3, + }, + ) + + console.log("Hello, World!", "{'a': 1}", repr(console)) + + console.print( + { + "name": None, + "empty": [], + "quiz": { + "sport": { + "answered": True, + "q1": { + "question": "Which one is correct team name in NBA?", + "options": [ + "New York Bulls", + "Los Angeles Kings", + "Golden State Warriors", + "Huston Rocket", + ], + "answer": "Huston Rocket", + }, + }, + "maths": { + "answered": False, + "q1": { + "question": "5 + 7 = ?", + "options": [10, 11, 12, 13], + "answer": 12, + }, + "q2": { + "question": "12 - 8 = ?", + "options": [1, 2, 3, 4], + "answer": 4, + }, + }, + }, + } + ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py new file mode 100644 index 0000000..65fdf56 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py @@ -0,0 +1,37 @@ +from typing import Optional, TYPE_CHECKING + +from .jupyter import JupyterMixin +from .measure import Measurement + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + + +class Constrain(JupyterMixin): + """Constrain the width of a renderable to a given number of characters. + + Args: + renderable (RenderableType): A renderable object. + width (int, optional): The maximum width (in characters) to render. Defaults to 80. + """ + + def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: + self.renderable = renderable + self.width = width + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.width is None: + yield self.renderable + else: + child_options = options.update_width(min(self.width, options.max_width)) + yield from console.render(self.renderable, child_options) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.width is not None: + options = options.update_width(self.width) + measurement = Measurement.get(console, options, self.renderable) + return measurement diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py new file mode 100644 index 0000000..e29cf36 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py @@ -0,0 +1,167 @@ +from itertools import zip_longest +from typing import ( + Iterator, + Iterable, + List, + Optional, + Union, + overload, + TypeVar, + TYPE_CHECKING, +) + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + JustifyMethod, + OverflowMethod, + RenderResult, + RenderableType, + ) + from .text import Text + +from .cells import cell_len +from .measure import Measurement + +T = TypeVar("T") + + +class Renderables: + """A list subclass which renders its contents to the console.""" + + def __init__( + self, renderables: Optional[Iterable["RenderableType"]] = None + ) -> None: + self._renderables: List["RenderableType"] = ( + list(renderables) if renderables is not None else [] + ) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + """Console render method to insert line-breaks.""" + yield from self._renderables + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + dimensions = [ + Measurement.get(console, options, renderable) + for renderable in self._renderables + ] + if not dimensions: + return Measurement(1, 1) + _min = max(dimension.minimum for dimension in dimensions) + _max = max(dimension.maximum for dimension in dimensions) + return Measurement(_min, _max) + + def append(self, renderable: "RenderableType") -> None: + self._renderables.append(renderable) + + def __iter__(self) -> Iterable["RenderableType"]: + return iter(self._renderables) + + +class Lines: + """A list subclass which can render to the console.""" + + def __init__(self, lines: Iterable["Text"] = ()) -> None: + self._lines: List["Text"] = list(lines) + + def __repr__(self) -> str: + return f"Lines({self._lines!r})" + + def __iter__(self) -> Iterator["Text"]: + return iter(self._lines) + + @overload + def __getitem__(self, index: int) -> "Text": + ... + + @overload + def __getitem__(self, index: slice) -> List["Text"]: + ... + + def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: + return self._lines[index] + + def __setitem__(self, index: int, value: "Text") -> "Lines": + self._lines[index] = value + return self + + def __len__(self) -> int: + return self._lines.__len__() + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + """Console render method to insert line-breaks.""" + yield from self._lines + + def append(self, line: "Text") -> None: + self._lines.append(line) + + def extend(self, lines: Iterable["Text"]) -> None: + self._lines.extend(lines) + + def pop(self, index: int = -1) -> "Text": + return self._lines.pop(index) + + def justify( + self, + console: "Console", + width: int, + justify: "JustifyMethod" = "left", + overflow: "OverflowMethod" = "fold", + ) -> None: + """Justify and overflow text to a given width. + + Args: + console (Console): Console instance. + width (int): Number of characters per line. + justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". + overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". + + """ + from .text import Text + + if justify == "left": + for line in self._lines: + line.truncate(width, overflow=overflow, pad=True) + elif justify == "center": + for line in self._lines: + line.rstrip() + line.truncate(width, overflow=overflow) + line.pad_left((width - cell_len(line.plain)) // 2) + line.pad_right(width - cell_len(line.plain)) + elif justify == "right": + for line in self._lines: + line.rstrip() + line.truncate(width, overflow=overflow) + line.pad_left(width - cell_len(line.plain)) + elif justify == "full": + for line_index, line in enumerate(self._lines): + if line_index == len(self._lines) - 1: + break + words = line.split(" ") + words_size = sum(cell_len(word.plain) for word in words) + num_spaces = len(words) - 1 + spaces = [1 for _ in range(num_spaces)] + index = 0 + if spaces: + while words_size + num_spaces < width: + spaces[len(spaces) - index - 1] += 1 + num_spaces += 1 + index = (index + 1) % len(spaces) + tokens: List[Text] = [] + for index, (word, next_word) in enumerate( + zip_longest(words, words[1:]) + ): + tokens.append(word) + if index < len(spaces): + style = word.get_style_at_offset(console, -1) + next_style = next_word.get_style_at_offset(console, 0) + space_style = style if style == next_style else line.style + tokens.append(Text(" " * spaces[index], style=space_style)) + self[line_index] = Text("").join(tokens) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py new file mode 100644 index 0000000..88fcb92 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py @@ -0,0 +1,225 @@ +import sys +import time +from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union + +if sys.version_info >= (3, 8): + from typing import Final +else: + from pip._vendor.typing_extensions import Final # pragma: no cover + +from .segment import ControlCode, ControlType, Segment + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + +STRIP_CONTROL_CODES: Final = [ + 7, # Bell + 8, # Backspace + 11, # Vertical tab + 12, # Form feed + 13, # Carriage return +] +_CONTROL_STRIP_TRANSLATE: Final = { + _codepoint: None for _codepoint in STRIP_CONTROL_CODES +} + +CONTROL_ESCAPE: Final = { + 7: "\\a", + 8: "\\b", + 11: "\\v", + 12: "\\f", + 13: "\\r", +} + +CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { + ControlType.BELL: lambda: "\x07", + ControlType.CARRIAGE_RETURN: lambda: "\r", + ControlType.HOME: lambda: "\x1b[H", + ControlType.CLEAR: lambda: "\x1b[2J", + ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", + ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", + ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", + ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", + ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", + ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", + ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", + ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", + ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", + ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", + ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", + ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", +} + + +class Control: + """A renderable that inserts a control code (non printable but may move cursor). + + Args: + *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a + tuple of ControlType and an integer parameter + """ + + __slots__ = ["segment"] + + def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: + control_codes: List[ControlCode] = [ + (code,) if isinstance(code, ControlType) else code for code in codes + ] + _format_map = CONTROL_CODES_FORMAT + rendered_codes = "".join( + _format_map[code](*parameters) for code, *parameters in control_codes + ) + self.segment = Segment(rendered_codes, None, control_codes) + + @classmethod + def bell(cls) -> "Control": + """Ring the 'bell'.""" + return cls(ControlType.BELL) + + @classmethod + def home(cls) -> "Control": + """Move cursor to 'home' position.""" + return cls(ControlType.HOME) + + @classmethod + def move(cls, x: int = 0, y: int = 0) -> "Control": + """Move cursor relative to current position. + + Args: + x (int): X offset. + y (int): Y offset. + + Returns: + ~Control: Control object. + + """ + + def get_codes() -> Iterable[ControlCode]: + control = ControlType + if x: + yield ( + control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, + abs(x), + ) + if y: + yield ( + control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, + abs(y), + ) + + control = cls(*get_codes()) + return control + + @classmethod + def move_to_column(cls, x: int, y: int = 0) -> "Control": + """Move to the given column, optionally add offset to row. + + Returns: + x (int): absolute x (column) + y (int): optional y offset (row) + + Returns: + ~Control: Control object. + """ + + return ( + cls( + (ControlType.CURSOR_MOVE_TO_COLUMN, x), + ( + ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, + abs(y), + ), + ) + if y + else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) + ) + + @classmethod + def move_to(cls, x: int, y: int) -> "Control": + """Move cursor to absolute position. + + Args: + x (int): x offset (column) + y (int): y offset (row) + + Returns: + ~Control: Control object. + """ + return cls((ControlType.CURSOR_MOVE_TO, x, y)) + + @classmethod + def clear(cls) -> "Control": + """Clear the screen.""" + return cls(ControlType.CLEAR) + + @classmethod + def show_cursor(cls, show: bool) -> "Control": + """Show or hide the cursor.""" + return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) + + @classmethod + def alt_screen(cls, enable: bool) -> "Control": + """Enable or disable alt screen.""" + if enable: + return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) + else: + return cls(ControlType.DISABLE_ALT_SCREEN) + + @classmethod + def title(cls, title: str) -> "Control": + """Set the terminal window title + + Args: + title (str): The new terminal window title + """ + return cls((ControlType.SET_WINDOW_TITLE, title)) + + def __str__(self) -> str: + return self.segment.text + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.segment.text: + yield self.segment + + +def strip_control_codes( + text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE +) -> str: + """Remove control codes from text. + + Args: + text (str): A string possibly contain control codes. + + Returns: + str: String with control codes removed. + """ + return text.translate(_translate_table) + + +def escape_control_codes( + text: str, + _translate_table: Dict[int, str] = CONTROL_ESCAPE, +) -> str: + """Replace control codes with their "escaped" equivalent in the given text. + (e.g. "\b" becomes "\\b") + + Args: + text (str): A string possibly containing control codes. + + Returns: + str: String with control codes replaced with their escaped version. + """ + return text.translate(_translate_table) + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + console = Console() + console.print("Look at the title of your terminal window ^") + # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) + for i in range(10): + console.set_window_title("🚀 Loading" + "." * i) + time.sleep(0.5) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py new file mode 100644 index 0000000..dca3719 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py @@ -0,0 +1,190 @@ +from typing import Dict + +from .style import Style + +DEFAULT_STYLES: Dict[str, Style] = { + "none": Style.null(), + "reset": Style( + color="default", + bgcolor="default", + dim=False, + bold=False, + italic=False, + underline=False, + blink=False, + blink2=False, + reverse=False, + conceal=False, + strike=False, + ), + "dim": Style(dim=True), + "bright": Style(dim=False), + "bold": Style(bold=True), + "strong": Style(bold=True), + "code": Style(reverse=True, bold=True), + "italic": Style(italic=True), + "emphasize": Style(italic=True), + "underline": Style(underline=True), + "blink": Style(blink=True), + "blink2": Style(blink2=True), + "reverse": Style(reverse=True), + "strike": Style(strike=True), + "black": Style(color="black"), + "red": Style(color="red"), + "green": Style(color="green"), + "yellow": Style(color="yellow"), + "magenta": Style(color="magenta"), + "cyan": Style(color="cyan"), + "white": Style(color="white"), + "inspect.attr": Style(color="yellow", italic=True), + "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), + "inspect.callable": Style(bold=True, color="red"), + "inspect.async_def": Style(italic=True, color="bright_cyan"), + "inspect.def": Style(italic=True, color="bright_cyan"), + "inspect.class": Style(italic=True, color="bright_cyan"), + "inspect.error": Style(bold=True, color="red"), + "inspect.equals": Style(), + "inspect.help": Style(color="cyan"), + "inspect.doc": Style(dim=True), + "inspect.value.border": Style(color="green"), + "live.ellipsis": Style(bold=True, color="red"), + "layout.tree.row": Style(dim=False, color="red"), + "layout.tree.column": Style(dim=False, color="blue"), + "logging.keyword": Style(bold=True, color="yellow"), + "logging.level.notset": Style(dim=True), + "logging.level.debug": Style(color="green"), + "logging.level.info": Style(color="blue"), + "logging.level.warning": Style(color="red"), + "logging.level.error": Style(color="red", bold=True), + "logging.level.critical": Style(color="red", bold=True, reverse=True), + "log.level": Style.null(), + "log.time": Style(color="cyan", dim=True), + "log.message": Style.null(), + "log.path": Style(dim=True), + "repr.ellipsis": Style(color="yellow"), + "repr.indent": Style(color="green", dim=True), + "repr.error": Style(color="red", bold=True), + "repr.str": Style(color="green", italic=False, bold=False), + "repr.brace": Style(bold=True), + "repr.comma": Style(bold=True), + "repr.ipv4": Style(bold=True, color="bright_green"), + "repr.ipv6": Style(bold=True, color="bright_green"), + "repr.eui48": Style(bold=True, color="bright_green"), + "repr.eui64": Style(bold=True, color="bright_green"), + "repr.tag_start": Style(bold=True), + "repr.tag_name": Style(color="bright_magenta", bold=True), + "repr.tag_contents": Style(color="default"), + "repr.tag_end": Style(bold=True), + "repr.attrib_name": Style(color="yellow", italic=False), + "repr.attrib_equal": Style(bold=True), + "repr.attrib_value": Style(color="magenta", italic=False), + "repr.number": Style(color="cyan", bold=True, italic=False), + "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same + "repr.bool_true": Style(color="bright_green", italic=True), + "repr.bool_false": Style(color="bright_red", italic=True), + "repr.none": Style(color="magenta", italic=True), + "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), + "repr.uuid": Style(color="bright_yellow", bold=False), + "repr.call": Style(color="magenta", bold=True), + "repr.path": Style(color="magenta"), + "repr.filename": Style(color="bright_magenta"), + "rule.line": Style(color="bright_green"), + "rule.text": Style.null(), + "json.brace": Style(bold=True), + "json.bool_true": Style(color="bright_green", italic=True), + "json.bool_false": Style(color="bright_red", italic=True), + "json.null": Style(color="magenta", italic=True), + "json.number": Style(color="cyan", bold=True, italic=False), + "json.str": Style(color="green", italic=False, bold=False), + "json.key": Style(color="blue", bold=True), + "prompt": Style.null(), + "prompt.choices": Style(color="magenta", bold=True), + "prompt.default": Style(color="cyan", bold=True), + "prompt.invalid": Style(color="red"), + "prompt.invalid.choice": Style(color="red"), + "pretty": Style.null(), + "scope.border": Style(color="blue"), + "scope.key": Style(color="yellow", italic=True), + "scope.key.special": Style(color="yellow", italic=True, dim=True), + "scope.equals": Style(color="red"), + "table.header": Style(bold=True), + "table.footer": Style(bold=True), + "table.cell": Style.null(), + "table.title": Style(italic=True), + "table.caption": Style(italic=True, dim=True), + "traceback.error": Style(color="red", italic=True), + "traceback.border.syntax_error": Style(color="bright_red"), + "traceback.border": Style(color="red"), + "traceback.text": Style.null(), + "traceback.title": Style(color="red", bold=True), + "traceback.exc_type": Style(color="bright_red", bold=True), + "traceback.exc_value": Style.null(), + "traceback.offset": Style(color="bright_red", bold=True), + "bar.back": Style(color="grey23"), + "bar.complete": Style(color="rgb(249,38,114)"), + "bar.finished": Style(color="rgb(114,156,31)"), + "bar.pulse": Style(color="rgb(249,38,114)"), + "progress.description": Style.null(), + "progress.filesize": Style(color="green"), + "progress.filesize.total": Style(color="green"), + "progress.download": Style(color="green"), + "progress.elapsed": Style(color="yellow"), + "progress.percentage": Style(color="magenta"), + "progress.remaining": Style(color="cyan"), + "progress.data.speed": Style(color="red"), + "progress.spinner": Style(color="green"), + "status.spinner": Style(color="green"), + "tree": Style(), + "tree.line": Style(), + "markdown.paragraph": Style(), + "markdown.text": Style(), + "markdown.em": Style(italic=True), + "markdown.emph": Style(italic=True), # For commonmark backwards compatibility + "markdown.strong": Style(bold=True), + "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), + "markdown.code_block": Style(color="cyan", bgcolor="black"), + "markdown.block_quote": Style(color="magenta"), + "markdown.list": Style(color="cyan"), + "markdown.item": Style(), + "markdown.item.bullet": Style(color="yellow", bold=True), + "markdown.item.number": Style(color="yellow", bold=True), + "markdown.hr": Style(color="yellow"), + "markdown.h1.border": Style(), + "markdown.h1": Style(bold=True), + "markdown.h2": Style(bold=True, underline=True), + "markdown.h3": Style(bold=True), + "markdown.h4": Style(bold=True, dim=True), + "markdown.h5": Style(underline=True), + "markdown.h6": Style(italic=True), + "markdown.h7": Style(italic=True, dim=True), + "markdown.link": Style(color="bright_blue"), + "markdown.link_url": Style(color="blue", underline=True), + "markdown.s": Style(strike=True), + "iso8601.date": Style(color="blue"), + "iso8601.time": Style(color="magenta"), + "iso8601.timezone": Style(color="yellow"), +} + + +if __name__ == "__main__": # pragma: no cover + import argparse + import io + + from pip._vendor.rich.console import Console + from pip._vendor.rich.table import Table + from pip._vendor.rich.text import Text + + parser = argparse.ArgumentParser() + parser.add_argument("--html", action="store_true", help="Export as HTML table") + args = parser.parse_args() + html: bool = args.html + console = Console(record=True, width=70, file=io.StringIO()) if html else Console() + + table = Table("Name", "Styling") + + for style_name, style in DEFAULT_STYLES.items(): + table.add_row(Text(style_name, style=style), str(style)) + + console.print(table) + if html: + print(console.export_html(inline_styles=True)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py new file mode 100644 index 0000000..ad36183 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py @@ -0,0 +1,37 @@ +import os +import platform + +from pip._vendor.rich import inspect +from pip._vendor.rich.console import Console, get_windows_console_features +from pip._vendor.rich.panel import Panel +from pip._vendor.rich.pretty import Pretty + + +def report() -> None: # pragma: no cover + """Print a report to the terminal with debugging information""" + console = Console() + inspect(console) + features = get_windows_console_features() + inspect(features) + + env_names = ( + "TERM", + "COLORTERM", + "CLICOLOR", + "NO_COLOR", + "TERM_PROGRAM", + "COLUMNS", + "LINES", + "JUPYTER_COLUMNS", + "JUPYTER_LINES", + "JPY_PARENT_PID", + "VSCODE_VERBOSE_LOGGING", + ) + env = {name: os.getenv(name) for name in env_names} + console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) + + console.print(f'platform="{platform.system()}"') + + +if __name__ == "__main__": # pragma: no cover + report() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py new file mode 100644 index 0000000..791f046 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py @@ -0,0 +1,96 @@ +import sys +from typing import TYPE_CHECKING, Optional, Union + +from .jupyter import JupyterMixin +from .segment import Segment +from .style import Style +from ._emoji_codes import EMOJI +from ._emoji_replace import _emoji_replace + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + + +EmojiVariant = Literal["emoji", "text"] + + +class NoEmoji(Exception): + """No emoji by that name.""" + + +class Emoji(JupyterMixin): + __slots__ = ["name", "style", "_char", "variant"] + + VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} + + def __init__( + self, + name: str, + style: Union[str, Style] = "none", + variant: Optional[EmojiVariant] = None, + ) -> None: + """A single emoji character. + + Args: + name (str): Name of emoji. + style (Union[str, Style], optional): Optional style. Defaults to None. + + Raises: + NoEmoji: If the emoji doesn't exist. + """ + self.name = name + self.style = style + self.variant = variant + try: + self._char = EMOJI[name] + except KeyError: + raise NoEmoji(f"No emoji called {name!r}") + if variant is not None: + self._char += self.VARIANTS.get(variant, "") + + @classmethod + def replace(cls, text: str) -> str: + """Replace emoji markup with corresponding unicode characters. + + Args: + text (str): A string with emojis codes, e.g. "Hello :smiley:!" + + Returns: + str: A string with emoji codes replaces with actual emoji. + """ + return _emoji_replace(text) + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return self._char + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + yield Segment(self._char, console.get_style(self.style)) + + +if __name__ == "__main__": # pragma: no cover + import sys + + from pip._vendor.rich.columns import Columns + from pip._vendor.rich.console import Console + + console = Console(record=True) + + columns = Columns( + (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), + column_first=True, + ) + + console.print(columns) + if len(sys.argv) > 1: + console.save_html(sys.argv[1]) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py new file mode 100644 index 0000000..0bcbe53 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py @@ -0,0 +1,34 @@ +class ConsoleError(Exception): + """An error in console operation.""" + + +class StyleError(Exception): + """An error in styles.""" + + +class StyleSyntaxError(ConsoleError): + """Style was badly formatted.""" + + +class MissingStyle(StyleError): + """No such style.""" + + +class StyleStackError(ConsoleError): + """Style stack is invalid.""" + + +class NotRenderableError(ConsoleError): + """Object is not renderable.""" + + +class MarkupError(ConsoleError): + """Markup was badly formatted.""" + + +class LiveError(ConsoleError): + """Error related to Live display.""" + + +class NoAltScreen(ConsoleError): + """Alt screen mode was required.""" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py new file mode 100644 index 0000000..4b0b0da --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py @@ -0,0 +1,57 @@ +import io +from typing import IO, TYPE_CHECKING, Any, List + +from .ansi import AnsiDecoder +from .text import Text + +if TYPE_CHECKING: + from .console import Console + + +class FileProxy(io.TextIOBase): + """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" + + def __init__(self, console: "Console", file: IO[str]) -> None: + self.__console = console + self.__file = file + self.__buffer: List[str] = [] + self.__ansi_decoder = AnsiDecoder() + + @property + def rich_proxied_file(self) -> IO[str]: + """Get proxied file.""" + return self.__file + + def __getattr__(self, name: str) -> Any: + return getattr(self.__file, name) + + def write(self, text: str) -> int: + if not isinstance(text, str): + raise TypeError(f"write() argument must be str, not {type(text).__name__}") + buffer = self.__buffer + lines: List[str] = [] + while text: + line, new_line, text = text.partition("\n") + if new_line: + lines.append("".join(buffer) + line) + buffer.clear() + else: + buffer.append(line) + break + if lines: + console = self.__console + with console: + output = Text("\n").join( + self.__ansi_decoder.decode_line(line) for line in lines + ) + console.print(output) + return len(text) + + def flush(self) -> None: + output = "".join(self.__buffer) + if output: + self.__console.print(output) + del self.__buffer[:] + + def fileno(self) -> int: + return self.__file.fileno() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py new file mode 100644 index 0000000..99f118e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py @@ -0,0 +1,89 @@ +# coding: utf-8 +"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 + +The functions declared in this module should cover the different +use cases needed to generate a string representation of a file size +using several different units. Since there are many standards regarding +file size units, three different functions have been implemented. + +See Also: + * `Wikipedia: Binary prefix `_ + +""" + +__all__ = ["decimal"] + +from typing import Iterable, List, Optional, Tuple + + +def _to_str( + size: int, + suffixes: Iterable[str], + base: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: + if size == 1: + return "1 byte" + elif size < base: + return "{:,} bytes".format(size) + + for i, suffix in enumerate(suffixes, 2): # noqa: B007 + unit = base**i + if size < unit: + break + return "{:,.{precision}f}{separator}{}".format( + (base * size / unit), + suffix, + precision=precision, + separator=separator, + ) + + +def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: + """Pick a suffix and base for the given size.""" + for i, suffix in enumerate(suffixes): + unit = base**i + if size < unit * base: + break + return unit, suffix + + +def decimal( + size: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: + """Convert a filesize in to a string (powers of 1000, SI prefixes). + + In this convention, ``1000 B = 1 kB``. + + This is typically the format used to advertise the storage + capacity of USB flash drives and the like (*256 MB* meaning + actually a storage capacity of more than *256 000 000 B*), + or used by **Mac OS X** since v10.6 to report file sizes. + + Arguments: + int (size): A file size. + int (precision): The number of decimal places to include (default = 1). + str (separator): The string to separate the value from the units (default = " "). + + Returns: + `str`: A string containing a abbreviated file size and units. + + Example: + >>> filesize.decimal(30000) + '30.0 kB' + >>> filesize.decimal(30000, precision=2, separator="") + '30.00kB' + + """ + return _to_str( + size, + ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), + 1000, + precision=precision, + separator=separator, + ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py new file mode 100644 index 0000000..c264679 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py @@ -0,0 +1,232 @@ +import re +from abc import ABC, abstractmethod +from typing import List, Union + +from .text import Span, Text + + +def _combine_regex(*regexes: str) -> str: + """Combine a number of regexes in to a single regex. + + Returns: + str: New regex with all regexes ORed together. + """ + return "|".join(regexes) + + +class Highlighter(ABC): + """Abstract base class for highlighters.""" + + def __call__(self, text: Union[str, Text]) -> Text: + """Highlight a str or Text instance. + + Args: + text (Union[str, ~Text]): Text to highlight. + + Raises: + TypeError: If not called with text or str. + + Returns: + Text: A test instance with highlighting applied. + """ + if isinstance(text, str): + highlight_text = Text(text) + elif isinstance(text, Text): + highlight_text = text.copy() + else: + raise TypeError(f"str or Text instance required, not {text!r}") + self.highlight(highlight_text) + return highlight_text + + @abstractmethod + def highlight(self, text: Text) -> None: + """Apply highlighting in place to text. + + Args: + text (~Text): A text object highlight. + """ + + +class NullHighlighter(Highlighter): + """A highlighter object that doesn't highlight. + + May be used to disable highlighting entirely. + + """ + + def highlight(self, text: Text) -> None: + """Nothing to do""" + + +class RegexHighlighter(Highlighter): + """Applies highlighting from a list of regular expressions.""" + + highlights: List[str] = [] + base_style: str = "" + + def highlight(self, text: Text) -> None: + """Highlight :class:`rich.text.Text` using regular expressions. + + Args: + text (~Text): Text to highlighted. + + """ + + highlight_regex = text.highlight_regex + for re_highlight in self.highlights: + highlight_regex(re_highlight, style_prefix=self.base_style) + + +class ReprHighlighter(RegexHighlighter): + """Highlights the text typically produced from ``__repr__`` methods.""" + + base_style = "repr." + highlights = [ + r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", + r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', + r"(?P[][{}()])", + _combine_regex( + r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", + r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", + r"(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", + r"(?P[\w.]*?)\(", + r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b", + r"(?P\.\.\.)", + r"(?P(?(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", + r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", + ), + ] + + +class JSONHighlighter(RegexHighlighter): + """Highlights JSON""" + + # Captures the start and end of JSON strings, handling escaped quotes + JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", + r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", + r"(?P(? None: + super().highlight(text) + + # Additional work to handle highlighting JSON keys + plain = text.plain + append = text.spans.append + whitespace = self.JSON_WHITESPACE + for match in re.finditer(self.JSON_STR, plain): + start, end = match.span() + cursor = end + while cursor < len(plain): + char = plain[cursor] + cursor += 1 + if char == ":": + append(Span(start, end, "json.key")) + elif char in whitespace: + continue + break + + +class ISO8601Highlighter(RegexHighlighter): + """Highlights the ISO8601 date time strings. + Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html + """ + + base_style = "iso8601." + highlights = [ + # + # Dates + # + # Calendar month (e.g. 2008-08). The hyphen is required + r"^(?P[0-9]{4})-(?P1[0-2]|0[1-9])$", + # Calendar date w/o hyphens (e.g. 20080830) + r"^(?P(?P[0-9]{4})(?P1[0-2]|0[1-9])(?P3[01]|0[1-9]|[12][0-9]))$", + # Ordinal date (e.g. 2008-243). The hyphen is optional + r"^(?P(?P[0-9]{4})-?(?P36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", + # + # Weeks + # + # Week of the year (e.g., 2008-W35). The hyphen is optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9]))$", + # Week date (e.g., 2008-W35-6). The hyphens are optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9])-?(?P[1-7]))$", + # + # Times + # + # Hours and minutes (e.g., 17:21). The colon is optional + r"^(?P