This is page 18 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py:
--------------------------------------------------------------------------------
```python
1 | import errno
2 | import select
3 | import sys
4 | from functools import partial
5 |
6 | try:
7 | from time import monotonic
8 | except ImportError:
9 | from time import time as monotonic
10 |
11 | __all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"]
12 |
13 |
14 | class NoWayToWaitForSocketError(Exception):
15 | pass
16 |
17 |
18 | # How should we wait on sockets?
19 | #
20 | # There are two types of APIs you can use for waiting on sockets: the fancy
21 | # modern stateful APIs like epoll/kqueue, and the older stateless APIs like
22 | # select/poll. The stateful APIs are more efficient when you have a lots of
23 | # sockets to keep track of, because you can set them up once and then use them
24 | # lots of times. But we only ever want to wait on a single socket at a time
25 | # and don't want to keep track of state, so the stateless APIs are actually
26 | # more efficient. So we want to use select() or poll().
27 | #
28 | # Now, how do we choose between select() and poll()? On traditional Unixes,
29 | # select() has a strange calling convention that makes it slow, or fail
30 | # altogether, for high-numbered file descriptors. The point of poll() is to fix
31 | # that, so on Unixes, we prefer poll().
32 | #
33 | # On Windows, there is no poll() (or at least Python doesn't provide a wrapper
34 | # for it), but that's OK, because on Windows, select() doesn't have this
35 | # strange calling convention; plain select() works fine.
36 | #
37 | # So: on Windows we use select(), and everywhere else we use poll(). We also
38 | # fall back to select() in case poll() is somehow broken or missing.
39 |
40 | if sys.version_info >= (3, 5):
41 | # Modern Python, that retries syscalls by default
42 | def _retry_on_intr(fn, timeout):
43 | return fn(timeout)
44 |
45 | else:
46 | # Old and broken Pythons.
47 | def _retry_on_intr(fn, timeout):
48 | if timeout is None:
49 | deadline = float("inf")
50 | else:
51 | deadline = monotonic() + timeout
52 |
53 | while True:
54 | try:
55 | return fn(timeout)
56 | # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7
57 | except (OSError, select.error) as e:
58 | # 'e.args[0]' incantation works for both OSError and select.error
59 | if e.args[0] != errno.EINTR:
60 | raise
61 | else:
62 | timeout = deadline - monotonic()
63 | if timeout < 0:
64 | timeout = 0
65 | if timeout == float("inf"):
66 | timeout = None
67 | continue
68 |
69 |
70 | def select_wait_for_socket(sock, read=False, write=False, timeout=None):
71 | if not read and not write:
72 | raise RuntimeError("must specify at least one of read=True, write=True")
73 | rcheck = []
74 | wcheck = []
75 | if read:
76 | rcheck.append(sock)
77 | if write:
78 | wcheck.append(sock)
79 | # When doing a non-blocking connect, most systems signal success by
80 | # marking the socket writable. Windows, though, signals success by marked
81 | # it as "exceptional". We paper over the difference by checking the write
82 | # sockets for both conditions. (The stdlib selectors module does the same
83 | # thing.)
84 | fn = partial(select.select, rcheck, wcheck, wcheck)
85 | rready, wready, xready = _retry_on_intr(fn, timeout)
86 | return bool(rready or wready or xready)
87 |
88 |
89 | def poll_wait_for_socket(sock, read=False, write=False, timeout=None):
90 | if not read and not write:
91 | raise RuntimeError("must specify at least one of read=True, write=True")
92 | mask = 0
93 | if read:
94 | mask |= select.POLLIN
95 | if write:
96 | mask |= select.POLLOUT
97 | poll_obj = select.poll()
98 | poll_obj.register(sock, mask)
99 |
100 | # For some reason, poll() takes timeout in milliseconds
101 | def do_poll(t):
102 | if t is not None:
103 | t *= 1000
104 | return poll_obj.poll(t)
105 |
106 | return bool(_retry_on_intr(do_poll, timeout))
107 |
108 |
109 | def null_wait_for_socket(*args, **kwargs):
110 | raise NoWayToWaitForSocketError("no select-equivalent available")
111 |
112 |
113 | def _have_working_poll():
114 | # Apparently some systems have a select.poll that fails as soon as you try
115 | # to use it, either due to strange configuration or broken monkeypatching
116 | # from libraries like eventlet/greenlet.
117 | try:
118 | poll_obj = select.poll()
119 | _retry_on_intr(poll_obj.poll, 0)
120 | except (AttributeError, OSError):
121 | return False
122 | else:
123 | return True
124 |
125 |
126 | def wait_for_socket(*args, **kwargs):
127 | # We delay choosing which implementation to use until the first time we're
128 | # called. We could do it at import time, but then we might make the wrong
129 | # decision if someone goes wild with monkeypatching select.poll after
130 | # we're imported.
131 | global wait_for_socket
132 | if _have_working_poll():
133 | wait_for_socket = poll_wait_for_socket
134 | elif hasattr(select, "select"):
135 | wait_for_socket = select_wait_for_socket
136 | else: # Platform-specific: Appengine.
137 | wait_for_socket = null_wait_for_socket
138 | return wait_for_socket(*args, **kwargs)
139 |
140 |
141 | def wait_for_read(sock, timeout=None):
142 | """Waits for reading to be available on a given socket.
143 | Returns True if the socket is readable, or False if the timeout expired.
144 | """
145 | return wait_for_socket(sock, read=True, timeout=timeout)
146 |
147 |
148 | def wait_for_write(sock, timeout=None):
149 | """Waits for writing to be available on a given socket.
150 | Returns True if the socket is readable, or False if the timeout expired.
151 | """
152 | return wait_for_socket(sock, write=True, timeout=timeout)
153 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py:
--------------------------------------------------------------------------------
```python
1 | # SPDX-FileCopyrightText: 2015 Eric Larson
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | from __future__ import annotations
5 |
6 | import hashlib
7 | import os
8 | from textwrap import dedent
9 | from typing import IO, TYPE_CHECKING, Union
10 | from pathlib import Path
11 |
12 | from pip._vendor.cachecontrol.cache import BaseCache, SeparateBodyBaseCache
13 | from pip._vendor.cachecontrol.controller import CacheController
14 |
15 | if TYPE_CHECKING:
16 | from datetime import datetime
17 |
18 | from filelock import BaseFileLock
19 |
20 |
21 | def _secure_open_write(filename: str, fmode: int) -> IO[bytes]:
22 | # We only want to write to this file, so open it in write only mode
23 | flags = os.O_WRONLY
24 |
25 | # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only
26 | # will open *new* files.
27 | # We specify this because we want to ensure that the mode we pass is the
28 | # mode of the file.
29 | flags |= os.O_CREAT | os.O_EXCL
30 |
31 | # Do not follow symlinks to prevent someone from making a symlink that
32 | # we follow and insecurely open a cache file.
33 | if hasattr(os, "O_NOFOLLOW"):
34 | flags |= os.O_NOFOLLOW
35 |
36 | # On Windows we'll mark this file as binary
37 | if hasattr(os, "O_BINARY"):
38 | flags |= os.O_BINARY
39 |
40 | # Before we open our file, we want to delete any existing file that is
41 | # there
42 | try:
43 | os.remove(filename)
44 | except OSError:
45 | # The file must not exist already, so we can just skip ahead to opening
46 | pass
47 |
48 | # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a
49 | # race condition happens between the os.remove and this line, that an
50 | # error will be raised. Because we utilize a lockfile this should only
51 | # happen if someone is attempting to attack us.
52 | fd = os.open(filename, flags, fmode)
53 | try:
54 | return os.fdopen(fd, "wb")
55 |
56 | except:
57 | # An error occurred wrapping our FD in a file object
58 | os.close(fd)
59 | raise
60 |
61 |
62 | class _FileCacheMixin:
63 | """Shared implementation for both FileCache variants."""
64 |
65 | def __init__(
66 | self,
67 | directory: str | Path,
68 | forever: bool = False,
69 | filemode: int = 0o0600,
70 | dirmode: int = 0o0700,
71 | lock_class: type[BaseFileLock] | None = None,
72 | ) -> None:
73 | try:
74 | if lock_class is None:
75 | from filelock import FileLock
76 |
77 | lock_class = FileLock
78 | except ImportError:
79 | notice = dedent(
80 | """
81 | NOTE: In order to use the FileCache you must have
82 | filelock installed. You can install it via pip:
83 | pip install cachecontrol[filecache]
84 | """
85 | )
86 | raise ImportError(notice)
87 |
88 | self.directory = directory
89 | self.forever = forever
90 | self.filemode = filemode
91 | self.dirmode = dirmode
92 | self.lock_class = lock_class
93 |
94 | @staticmethod
95 | def encode(x: str) -> str:
96 | return hashlib.sha224(x.encode()).hexdigest()
97 |
98 | def _fn(self, name: str) -> str:
99 | # NOTE: This method should not change as some may depend on it.
100 | # See: https://github.com/ionrock/cachecontrol/issues/63
101 | hashed = self.encode(name)
102 | parts = list(hashed[:5]) + [hashed]
103 | return os.path.join(self.directory, *parts)
104 |
105 | def get(self, key: str) -> bytes | None:
106 | name = self._fn(key)
107 | try:
108 | with open(name, "rb") as fh:
109 | return fh.read()
110 |
111 | except FileNotFoundError:
112 | return None
113 |
114 | def set(
115 | self, key: str, value: bytes, expires: int | datetime | None = None
116 | ) -> None:
117 | name = self._fn(key)
118 | self._write(name, value)
119 |
120 | def _write(self, path: str, data: bytes) -> None:
121 | """
122 | Safely write the data to the given path.
123 | """
124 | # Make sure the directory exists
125 | try:
126 | os.makedirs(os.path.dirname(path), self.dirmode)
127 | except OSError:
128 | pass
129 |
130 | with self.lock_class(path + ".lock"):
131 | # Write our actual file
132 | with _secure_open_write(path, self.filemode) as fh:
133 | fh.write(data)
134 |
135 | def _delete(self, key: str, suffix: str) -> None:
136 | name = self._fn(key) + suffix
137 | if not self.forever:
138 | try:
139 | os.remove(name)
140 | except FileNotFoundError:
141 | pass
142 |
143 |
144 | class FileCache(_FileCacheMixin, BaseCache):
145 | """
146 | Traditional FileCache: body is stored in memory, so not suitable for large
147 | downloads.
148 | """
149 |
150 | def delete(self, key: str) -> None:
151 | self._delete(key, "")
152 |
153 |
154 | class SeparateBodyFileCache(_FileCacheMixin, SeparateBodyBaseCache):
155 | """
156 | Memory-efficient FileCache: body is stored in a separate file, reducing
157 | peak memory usage.
158 | """
159 |
160 | def get_body(self, key: str) -> IO[bytes] | None:
161 | name = self._fn(key) + ".body"
162 | try:
163 | return open(name, "rb")
164 | except FileNotFoundError:
165 | return None
166 |
167 | def set_body(self, key: str, body: bytes) -> None:
168 | name = self._fn(key) + ".body"
169 | self._write(name, body)
170 |
171 | def delete(self, key: str) -> None:
172 | self._delete(key, "")
173 | self._delete(key, ".body")
174 |
175 |
176 | def url_to_file_path(url: str, filecache: FileCache) -> str:
177 | """Return the file cache path based on the URL.
178 |
179 | This does not ensure the file exists!
180 | """
181 | key = CacheController.cache_url(url)
182 | return filecache._fn(key)
183 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py:
--------------------------------------------------------------------------------
```python
1 | import sys
2 | from fractions import Fraction
3 | from math import ceil
4 | from typing import cast, List, Optional, Sequence
5 |
6 | if sys.version_info >= (3, 8):
7 | from typing import Protocol
8 | else:
9 | from pip._vendor.typing_extensions import Protocol # pragma: no cover
10 |
11 |
12 | class Edge(Protocol):
13 | """Any object that defines an edge (such as Layout)."""
14 |
15 | size: Optional[int] = None
16 | ratio: int = 1
17 | minimum_size: int = 1
18 |
19 |
20 | def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]:
21 | """Divide total space to satisfy size, ratio, and minimum_size, constraints.
22 |
23 | The returned list of integers should add up to total in most cases, unless it is
24 | impossible to satisfy all the constraints. For instance, if there are two edges
25 | with a minimum size of 20 each and `total` is 30 then the returned list will be
26 | greater than total. In practice, this would mean that a Layout object would
27 | clip the rows that would overflow the screen height.
28 |
29 | Args:
30 | total (int): Total number of characters.
31 | edges (List[Edge]): Edges within total space.
32 |
33 | Returns:
34 | List[int]: Number of characters for each edge.
35 | """
36 | # Size of edge or None for yet to be determined
37 | sizes = [(edge.size or None) for edge in edges]
38 |
39 | _Fraction = Fraction
40 |
41 | # While any edges haven't been calculated
42 | while None in sizes:
43 | # Get flexible edges and index to map these back on to sizes list
44 | flexible_edges = [
45 | (index, edge)
46 | for index, (size, edge) in enumerate(zip(sizes, edges))
47 | if size is None
48 | ]
49 | # Remaining space in total
50 | remaining = total - sum(size or 0 for size in sizes)
51 | if remaining <= 0:
52 | # No room for flexible edges
53 | return [
54 | ((edge.minimum_size or 1) if size is None else size)
55 | for size, edge in zip(sizes, edges)
56 | ]
57 | # Calculate number of characters in a ratio portion
58 | portion = _Fraction(
59 | remaining, sum((edge.ratio or 1) for _, edge in flexible_edges)
60 | )
61 |
62 | # If any edges will be less than their minimum, replace size with the minimum
63 | for index, edge in flexible_edges:
64 | if portion * edge.ratio <= edge.minimum_size:
65 | sizes[index] = edge.minimum_size
66 | # New fixed size will invalidate calculations, so we need to repeat the process
67 | break
68 | else:
69 | # Distribute flexible space and compensate for rounding error
70 | # Since edge sizes can only be integers we need to add the remainder
71 | # to the following line
72 | remainder = _Fraction(0)
73 | for index, edge in flexible_edges:
74 | size, remainder = divmod(portion * edge.ratio + remainder, 1)
75 | sizes[index] = size
76 | break
77 | # Sizes now contains integers only
78 | return cast(List[int], sizes)
79 |
80 |
81 | def ratio_reduce(
82 | total: int, ratios: List[int], maximums: List[int], values: List[int]
83 | ) -> List[int]:
84 | """Divide an integer total in to parts based on ratios.
85 |
86 | Args:
87 | total (int): The total to divide.
88 | ratios (List[int]): A list of integer ratios.
89 | maximums (List[int]): List of maximums values for each slot.
90 | values (List[int]): List of values
91 |
92 | Returns:
93 | List[int]: A list of integers guaranteed to sum to total.
94 | """
95 | ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)]
96 | total_ratio = sum(ratios)
97 | if not total_ratio:
98 | return values[:]
99 | total_remaining = total
100 | result: List[int] = []
101 | append = result.append
102 | for ratio, maximum, value in zip(ratios, maximums, values):
103 | if ratio and total_ratio > 0:
104 | distributed = min(maximum, round(ratio * total_remaining / total_ratio))
105 | append(value - distributed)
106 | total_remaining -= distributed
107 | total_ratio -= ratio
108 | else:
109 | append(value)
110 | return result
111 |
112 |
113 | def ratio_distribute(
114 | total: int, ratios: List[int], minimums: Optional[List[int]] = None
115 | ) -> List[int]:
116 | """Distribute an integer total in to parts based on ratios.
117 |
118 | Args:
119 | total (int): The total to divide.
120 | ratios (List[int]): A list of integer ratios.
121 | minimums (List[int]): List of minimum values for each slot.
122 |
123 | Returns:
124 | List[int]: A list of integers guaranteed to sum to total.
125 | """
126 | if minimums:
127 | ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
128 | total_ratio = sum(ratios)
129 | assert total_ratio > 0, "Sum of ratios must be > 0"
130 |
131 | total_remaining = total
132 | distributed_total: List[int] = []
133 | append = distributed_total.append
134 | if minimums is None:
135 | _minimums = [0] * len(ratios)
136 | else:
137 | _minimums = minimums
138 | for ratio, minimum in zip(ratios, _minimums):
139 | if total_ratio > 0:
140 | distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
141 | else:
142 | distributed = total_remaining
143 | append(distributed)
144 | total_ratio -= ratio
145 | total_remaining -= distributed
146 | return distributed_total
147 |
148 |
149 | if __name__ == "__main__":
150 | from dataclasses import dataclass
151 |
152 | @dataclass
153 | class E:
154 | size: Optional[int] = None
155 | ratio: int = 1
156 | minimum_size: int = 1
157 |
158 | resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)])
159 | print(sum(resolved))
160 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py:
--------------------------------------------------------------------------------
```python
1 | from itertools import zip_longest
2 | from typing import (
3 | TYPE_CHECKING,
4 | Iterable,
5 | Iterator,
6 | List,
7 | Optional,
8 | TypeVar,
9 | Union,
10 | overload,
11 | )
12 |
13 | if TYPE_CHECKING:
14 | from .console import (
15 | Console,
16 | ConsoleOptions,
17 | JustifyMethod,
18 | OverflowMethod,
19 | RenderResult,
20 | RenderableType,
21 | )
22 | from .text import Text
23 |
24 | from .cells import cell_len
25 | from .measure import Measurement
26 |
27 | T = TypeVar("T")
28 |
29 |
30 | class Renderables:
31 | """A list subclass which renders its contents to the console."""
32 |
33 | def __init__(
34 | self, renderables: Optional[Iterable["RenderableType"]] = None
35 | ) -> None:
36 | self._renderables: List["RenderableType"] = (
37 | list(renderables) if renderables is not None else []
38 | )
39 |
40 | def __rich_console__(
41 | self, console: "Console", options: "ConsoleOptions"
42 | ) -> "RenderResult":
43 | """Console render method to insert line-breaks."""
44 | yield from self._renderables
45 |
46 | def __rich_measure__(
47 | self, console: "Console", options: "ConsoleOptions"
48 | ) -> "Measurement":
49 | dimensions = [
50 | Measurement.get(console, options, renderable)
51 | for renderable in self._renderables
52 | ]
53 | if not dimensions:
54 | return Measurement(1, 1)
55 | _min = max(dimension.minimum for dimension in dimensions)
56 | _max = max(dimension.maximum for dimension in dimensions)
57 | return Measurement(_min, _max)
58 |
59 | def append(self, renderable: "RenderableType") -> None:
60 | self._renderables.append(renderable)
61 |
62 | def __iter__(self) -> Iterable["RenderableType"]:
63 | return iter(self._renderables)
64 |
65 |
66 | class Lines:
67 | """A list subclass which can render to the console."""
68 |
69 | def __init__(self, lines: Iterable["Text"] = ()) -> None:
70 | self._lines: List["Text"] = list(lines)
71 |
72 | def __repr__(self) -> str:
73 | return f"Lines({self._lines!r})"
74 |
75 | def __iter__(self) -> Iterator["Text"]:
76 | return iter(self._lines)
77 |
78 | @overload
79 | def __getitem__(self, index: int) -> "Text":
80 | ...
81 |
82 | @overload
83 | def __getitem__(self, index: slice) -> List["Text"]:
84 | ...
85 |
86 | def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]:
87 | return self._lines[index]
88 |
89 | def __setitem__(self, index: int, value: "Text") -> "Lines":
90 | self._lines[index] = value
91 | return self
92 |
93 | def __len__(self) -> int:
94 | return self._lines.__len__()
95 |
96 | def __rich_console__(
97 | self, console: "Console", options: "ConsoleOptions"
98 | ) -> "RenderResult":
99 | """Console render method to insert line-breaks."""
100 | yield from self._lines
101 |
102 | def append(self, line: "Text") -> None:
103 | self._lines.append(line)
104 |
105 | def extend(self, lines: Iterable["Text"]) -> None:
106 | self._lines.extend(lines)
107 |
108 | def pop(self, index: int = -1) -> "Text":
109 | return self._lines.pop(index)
110 |
111 | def justify(
112 | self,
113 | console: "Console",
114 | width: int,
115 | justify: "JustifyMethod" = "left",
116 | overflow: "OverflowMethod" = "fold",
117 | ) -> None:
118 | """Justify and overflow text to a given width.
119 |
120 | Args:
121 | console (Console): Console instance.
122 | width (int): Number of cells available per line.
123 | justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left".
124 | overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold".
125 |
126 | """
127 | from .text import Text
128 |
129 | if justify == "left":
130 | for line in self._lines:
131 | line.truncate(width, overflow=overflow, pad=True)
132 | elif justify == "center":
133 | for line in self._lines:
134 | line.rstrip()
135 | line.truncate(width, overflow=overflow)
136 | line.pad_left((width - cell_len(line.plain)) // 2)
137 | line.pad_right(width - cell_len(line.plain))
138 | elif justify == "right":
139 | for line in self._lines:
140 | line.rstrip()
141 | line.truncate(width, overflow=overflow)
142 | line.pad_left(width - cell_len(line.plain))
143 | elif justify == "full":
144 | for line_index, line in enumerate(self._lines):
145 | if line_index == len(self._lines) - 1:
146 | break
147 | words = line.split(" ")
148 | words_size = sum(cell_len(word.plain) for word in words)
149 | num_spaces = len(words) - 1
150 | spaces = [1 for _ in range(num_spaces)]
151 | index = 0
152 | if spaces:
153 | while words_size + num_spaces < width:
154 | spaces[len(spaces) - index - 1] += 1
155 | num_spaces += 1
156 | index = (index + 1) % len(spaces)
157 | tokens: List[Text] = []
158 | for index, (word, next_word) in enumerate(
159 | zip_longest(words, words[1:])
160 | ):
161 | tokens.append(word)
162 | if index < len(spaces):
163 | style = word.get_style_at_offset(console, -1)
164 | next_style = next_word.get_style_at_offset(console, 0)
165 | space_style = style if style == next_style else line.style
166 | tokens.append(Text(" " * spaces[index], style=space_style))
167 | self[line_index] = Text("").join(tokens)
168 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/_internal.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import logging
4 | import re
5 | import sys
6 | import typing as t
7 | from datetime import datetime
8 | from datetime import timezone
9 |
10 | if t.TYPE_CHECKING:
11 | from _typeshed.wsgi import WSGIEnvironment
12 |
13 | from .wrappers.request import Request
14 |
15 | _logger: logging.Logger | None = None
16 |
17 |
18 | class _Missing:
19 | def __repr__(self) -> str:
20 | return "no value"
21 |
22 | def __reduce__(self) -> str:
23 | return "_missing"
24 |
25 |
26 | _missing = _Missing()
27 |
28 |
29 | def _wsgi_decoding_dance(s: str) -> str:
30 | return s.encode("latin1").decode(errors="replace")
31 |
32 |
33 | def _wsgi_encoding_dance(s: str) -> str:
34 | return s.encode().decode("latin1")
35 |
36 |
37 | def _get_environ(obj: WSGIEnvironment | Request) -> WSGIEnvironment:
38 | env = getattr(obj, "environ", obj)
39 | assert isinstance(
40 | env, dict
41 | ), f"{type(obj).__name__!r} is not a WSGI environment (has to be a dict)"
42 | return env
43 |
44 |
45 | def _has_level_handler(logger: logging.Logger) -> bool:
46 | """Check if there is a handler in the logging chain that will handle
47 | the given logger's effective level.
48 | """
49 | level = logger.getEffectiveLevel()
50 | current = logger
51 |
52 | while current:
53 | if any(handler.level <= level for handler in current.handlers):
54 | return True
55 |
56 | if not current.propagate:
57 | break
58 |
59 | current = current.parent # type: ignore
60 |
61 | return False
62 |
63 |
64 | class _ColorStreamHandler(logging.StreamHandler): # type: ignore[type-arg]
65 | """On Windows, wrap stream with Colorama for ANSI style support."""
66 |
67 | def __init__(self) -> None:
68 | try:
69 | import colorama
70 | except ImportError:
71 | stream = None
72 | else:
73 | stream = colorama.AnsiToWin32(sys.stderr)
74 |
75 | super().__init__(stream)
76 |
77 |
78 | def _log(type: str, message: str, *args: t.Any, **kwargs: t.Any) -> None:
79 | """Log a message to the 'werkzeug' logger.
80 |
81 | The logger is created the first time it is needed. If there is no
82 | level set, it is set to :data:`logging.INFO`. If there is no handler
83 | for the logger's effective level, a :class:`logging.StreamHandler`
84 | is added.
85 | """
86 | global _logger
87 |
88 | if _logger is None:
89 | _logger = logging.getLogger("werkzeug")
90 |
91 | if _logger.level == logging.NOTSET:
92 | _logger.setLevel(logging.INFO)
93 |
94 | if not _has_level_handler(_logger):
95 | _logger.addHandler(_ColorStreamHandler())
96 |
97 | getattr(_logger, type)(message.rstrip(), *args, **kwargs)
98 |
99 |
100 | @t.overload
101 | def _dt_as_utc(dt: None) -> None: ...
102 |
103 |
104 | @t.overload
105 | def _dt_as_utc(dt: datetime) -> datetime: ...
106 |
107 |
108 | def _dt_as_utc(dt: datetime | None) -> datetime | None:
109 | if dt is None:
110 | return dt
111 |
112 | if dt.tzinfo is None:
113 | return dt.replace(tzinfo=timezone.utc)
114 | elif dt.tzinfo != timezone.utc:
115 | return dt.astimezone(timezone.utc)
116 |
117 | return dt
118 |
119 |
120 | _TAccessorValue = t.TypeVar("_TAccessorValue")
121 |
122 |
123 | class _DictAccessorProperty(t.Generic[_TAccessorValue]):
124 | """Baseclass for `environ_property` and `header_property`."""
125 |
126 | read_only = False
127 |
128 | def __init__(
129 | self,
130 | name: str,
131 | default: _TAccessorValue | None = None,
132 | load_func: t.Callable[[str], _TAccessorValue] | None = None,
133 | dump_func: t.Callable[[_TAccessorValue], str] | None = None,
134 | read_only: bool | None = None,
135 | doc: str | None = None,
136 | ) -> None:
137 | self.name = name
138 | self.default = default
139 | self.load_func = load_func
140 | self.dump_func = dump_func
141 | if read_only is not None:
142 | self.read_only = read_only
143 | self.__doc__ = doc
144 |
145 | def lookup(self, instance: t.Any) -> t.MutableMapping[str, t.Any]:
146 | raise NotImplementedError
147 |
148 | @t.overload
149 | def __get__(
150 | self, instance: None, owner: type
151 | ) -> _DictAccessorProperty[_TAccessorValue]: ...
152 |
153 | @t.overload
154 | def __get__(self, instance: t.Any, owner: type) -> _TAccessorValue: ...
155 |
156 | def __get__(
157 | self, instance: t.Any | None, owner: type
158 | ) -> _TAccessorValue | _DictAccessorProperty[_TAccessorValue]:
159 | if instance is None:
160 | return self
161 |
162 | storage = self.lookup(instance)
163 |
164 | if self.name not in storage:
165 | return self.default # type: ignore
166 |
167 | value = storage[self.name]
168 |
169 | if self.load_func is not None:
170 | try:
171 | return self.load_func(value)
172 | except (ValueError, TypeError):
173 | return self.default # type: ignore
174 |
175 | return value # type: ignore
176 |
177 | def __set__(self, instance: t.Any, value: _TAccessorValue) -> None:
178 | if self.read_only:
179 | raise AttributeError("read only property")
180 |
181 | if self.dump_func is not None:
182 | self.lookup(instance)[self.name] = self.dump_func(value)
183 | else:
184 | self.lookup(instance)[self.name] = value
185 |
186 | def __delete__(self, instance: t.Any) -> None:
187 | if self.read_only:
188 | raise AttributeError("read only property")
189 |
190 | self.lookup(instance).pop(self.name, None)
191 |
192 | def __repr__(self) -> str:
193 | return f"<{type(self).__name__} {self.name}>"
194 |
195 |
196 | _plain_int_re = re.compile(r"-?\d+", re.ASCII)
197 |
198 |
199 | def _plain_int(value: str) -> int:
200 | """Parse an int only if it is only ASCII digits and ``-``.
201 |
202 | This disallows ``+``, ``_``, and non-ASCII digits, which are accepted by ``int`` but
203 | are not allowed in HTTP header values.
204 |
205 | Any leading or trailing whitespace is stripped
206 | """
207 | value = value.strip()
208 | if _plain_int_re.fullmatch(value) is None:
209 | raise ValueError
210 |
211 | return int(value)
212 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/middleware/profiler.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Application Profiler
3 | ====================
4 |
5 | This module provides a middleware that profiles each request with the
6 | :mod:`cProfile` module. This can help identify bottlenecks in your code
7 | that may be slowing down your application.
8 |
9 | .. autoclass:: ProfilerMiddleware
10 |
11 | :copyright: 2007 Pallets
12 | :license: BSD-3-Clause
13 | """
14 |
15 | from __future__ import annotations
16 |
17 | import os.path
18 | import sys
19 | import time
20 | import typing as t
21 | from pstats import Stats
22 |
23 | try:
24 | from cProfile import Profile
25 | except ImportError:
26 | from profile import Profile # type: ignore
27 |
28 | if t.TYPE_CHECKING:
29 | from _typeshed.wsgi import StartResponse
30 | from _typeshed.wsgi import WSGIApplication
31 | from _typeshed.wsgi import WSGIEnvironment
32 |
33 |
34 | class ProfilerMiddleware:
35 | """Wrap a WSGI application and profile the execution of each
36 | request. Responses are buffered so that timings are more exact.
37 |
38 | If ``stream`` is given, :class:`pstats.Stats` are written to it
39 | after each request. If ``profile_dir`` is given, :mod:`cProfile`
40 | data files are saved to that directory, one file per request.
41 |
42 | The filename can be customized by passing ``filename_format``. If
43 | it is a string, it will be formatted using :meth:`str.format` with
44 | the following fields available:
45 |
46 | - ``{method}`` - The request method; GET, POST, etc.
47 | - ``{path}`` - The request path or 'root' should one not exist.
48 | - ``{elapsed}`` - The elapsed time of the request in milliseconds.
49 | - ``{time}`` - The time of the request.
50 |
51 | If it is a callable, it will be called with the WSGI ``environ`` and
52 | be expected to return a filename string. The ``environ`` dictionary
53 | will also have the ``"werkzeug.profiler"`` key populated with a
54 | dictionary containing the following fields (more may be added in the
55 | future):
56 | - ``{elapsed}`` - The elapsed time of the request in milliseconds.
57 | - ``{time}`` - The time of the request.
58 |
59 | :param app: The WSGI application to wrap.
60 | :param stream: Write stats to this stream. Disable with ``None``.
61 | :param sort_by: A tuple of columns to sort stats by. See
62 | :meth:`pstats.Stats.sort_stats`.
63 | :param restrictions: A tuple of restrictions to filter stats by. See
64 | :meth:`pstats.Stats.print_stats`.
65 | :param profile_dir: Save profile data files to this directory.
66 | :param filename_format: Format string for profile data file names,
67 | or a callable returning a name. See explanation above.
68 |
69 | .. code-block:: python
70 |
71 | from werkzeug.middleware.profiler import ProfilerMiddleware
72 | app = ProfilerMiddleware(app)
73 |
74 | .. versionchanged:: 3.0
75 | Added the ``"werkzeug.profiler"`` key to the ``filename_format(environ)``
76 | parameter with the ``elapsed`` and ``time`` fields.
77 |
78 | .. versionchanged:: 0.15
79 | Stats are written even if ``profile_dir`` is given, and can be
80 | disable by passing ``stream=None``.
81 |
82 | .. versionadded:: 0.15
83 | Added ``filename_format``.
84 |
85 | .. versionadded:: 0.9
86 | Added ``restrictions`` and ``profile_dir``.
87 | """
88 |
89 | def __init__(
90 | self,
91 | app: WSGIApplication,
92 | stream: t.IO[str] | None = sys.stdout,
93 | sort_by: t.Iterable[str] = ("time", "calls"),
94 | restrictions: t.Iterable[str | int | float] = (),
95 | profile_dir: str | None = None,
96 | filename_format: str = "{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof",
97 | ) -> None:
98 | self._app = app
99 | self._stream = stream
100 | self._sort_by = sort_by
101 | self._restrictions = restrictions
102 | self._profile_dir = profile_dir
103 | self._filename_format = filename_format
104 |
105 | def __call__(
106 | self, environ: WSGIEnvironment, start_response: StartResponse
107 | ) -> t.Iterable[bytes]:
108 | response_body: list[bytes] = []
109 |
110 | def catching_start_response(status, headers, exc_info=None): # type: ignore
111 | start_response(status, headers, exc_info)
112 | return response_body.append
113 |
114 | def runapp() -> None:
115 | app_iter = self._app(
116 | environ, t.cast("StartResponse", catching_start_response)
117 | )
118 | response_body.extend(app_iter)
119 |
120 | if hasattr(app_iter, "close"):
121 | app_iter.close()
122 |
123 | profile = Profile()
124 | start = time.time()
125 | profile.runcall(runapp)
126 | body = b"".join(response_body)
127 | elapsed = time.time() - start
128 |
129 | if self._profile_dir is not None:
130 | if callable(self._filename_format):
131 | environ["werkzeug.profiler"] = {
132 | "elapsed": elapsed * 1000.0,
133 | "time": time.time(),
134 | }
135 | filename = self._filename_format(environ)
136 | else:
137 | filename = self._filename_format.format(
138 | method=environ["REQUEST_METHOD"],
139 | path=environ["PATH_INFO"].strip("/").replace("/", ".") or "root",
140 | elapsed=elapsed * 1000.0,
141 | time=time.time(),
142 | )
143 | filename = os.path.join(self._profile_dir, filename)
144 | profile.dump_stats(filename)
145 |
146 | if self._stream is not None:
147 | stats = Stats(profile, stream=self._stream)
148 | stats.sort_stats(*self._sort_by)
149 | print("-" * 80, file=self._stream)
150 | path_info = environ.get("PATH_INFO", "")
151 | print(f"PATH: {path_info!r}", file=self._stream)
152 | stats.print_stats(*self._restrictions)
153 | print(f"{'-' * 80}\n", file=self._stream)
154 |
155 | return [body]
156 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py:
--------------------------------------------------------------------------------
```python
1 | """macOS."""
2 |
3 | from __future__ import annotations
4 |
5 | import os.path
6 | import sys
7 |
8 | from .api import PlatformDirsABC
9 |
10 |
11 | class MacOS(PlatformDirsABC):
12 | """
13 | Platform directories for the macOS operating system.
14 |
15 | Follows the guidance from
16 | `Apple documentation <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_.
17 | Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`,
18 | `version <platformdirs.api.PlatformDirsABC.version>`,
19 | `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`.
20 |
21 | """
22 |
23 | @property
24 | def user_data_dir(self) -> str:
25 | """:return: data directory tied to the user, e.g. ``~/Library/Application Support/$appname/$version``"""
26 | return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support")) # noqa: PTH111
27 |
28 | @property
29 | def site_data_dir(self) -> str:
30 | """
31 | :return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``.
32 | If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory
33 | will be under the Homebrew prefix, e.g. ``/opt/homebrew/share/$appname/$version``.
34 | If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew,
35 | the response is a multi-path string separated by ":", e.g.
36 | ``/opt/homebrew/share/$appname/$version:/Library/Application Support/$appname/$version``
37 | """
38 | is_homebrew = sys.prefix.startswith("/opt/homebrew")
39 | path_list = [self._append_app_name_and_version("/opt/homebrew/share")] if is_homebrew else []
40 | path_list.append(self._append_app_name_and_version("/Library/Application Support"))
41 | if self.multipath:
42 | return os.pathsep.join(path_list)
43 | return path_list[0]
44 |
45 | @property
46 | def user_config_dir(self) -> str:
47 | """:return: config directory tied to the user, same as `user_data_dir`"""
48 | return self.user_data_dir
49 |
50 | @property
51 | def site_config_dir(self) -> str:
52 | """:return: config directory shared by the users, same as `site_data_dir`"""
53 | return self.site_data_dir
54 |
55 | @property
56 | def user_cache_dir(self) -> str:
57 | """:return: cache directory tied to the user, e.g. ``~/Library/Caches/$appname/$version``"""
58 | return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches")) # noqa: PTH111
59 |
60 | @property
61 | def site_cache_dir(self) -> str:
62 | """
63 | :return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``.
64 | If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory
65 | will be under the Homebrew prefix, e.g. ``/opt/homebrew/var/cache/$appname/$version``.
66 | If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew,
67 | the response is a multi-path string separated by ":", e.g.
68 | ``/opt/homebrew/var/cache/$appname/$version:/Library/Caches/$appname/$version``
69 | """
70 | is_homebrew = sys.prefix.startswith("/opt/homebrew")
71 | path_list = [self._append_app_name_and_version("/opt/homebrew/var/cache")] if is_homebrew else []
72 | path_list.append(self._append_app_name_and_version("/Library/Caches"))
73 | if self.multipath:
74 | return os.pathsep.join(path_list)
75 | return path_list[0]
76 |
77 | @property
78 | def user_state_dir(self) -> str:
79 | """:return: state directory tied to the user, same as `user_data_dir`"""
80 | return self.user_data_dir
81 |
82 | @property
83 | def user_log_dir(self) -> str:
84 | """:return: log directory tied to the user, e.g. ``~/Library/Logs/$appname/$version``"""
85 | return self._append_app_name_and_version(os.path.expanduser("~/Library/Logs")) # noqa: PTH111
86 |
87 | @property
88 | def user_documents_dir(self) -> str:
89 | """:return: documents directory tied to the user, e.g. ``~/Documents``"""
90 | return os.path.expanduser("~/Documents") # noqa: PTH111
91 |
92 | @property
93 | def user_downloads_dir(self) -> str:
94 | """:return: downloads directory tied to the user, e.g. ``~/Downloads``"""
95 | return os.path.expanduser("~/Downloads") # noqa: PTH111
96 |
97 | @property
98 | def user_pictures_dir(self) -> str:
99 | """:return: pictures directory tied to the user, e.g. ``~/Pictures``"""
100 | return os.path.expanduser("~/Pictures") # noqa: PTH111
101 |
102 | @property
103 | def user_videos_dir(self) -> str:
104 | """:return: videos directory tied to the user, e.g. ``~/Movies``"""
105 | return os.path.expanduser("~/Movies") # noqa: PTH111
106 |
107 | @property
108 | def user_music_dir(self) -> str:
109 | """:return: music directory tied to the user, e.g. ``~/Music``"""
110 | return os.path.expanduser("~/Music") # noqa: PTH111
111 |
112 | @property
113 | def user_desktop_dir(self) -> str:
114 | """:return: desktop directory tied to the user, e.g. ``~/Desktop``"""
115 | return os.path.expanduser("~/Desktop") # noqa: PTH111
116 |
117 | @property
118 | def user_runtime_dir(self) -> str:
119 | """:return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``"""
120 | return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) # noqa: PTH111
121 |
122 | @property
123 | def site_runtime_dir(self) -> str:
124 | """:return: runtime directory shared by users, same as `user_runtime_dir`"""
125 | return self.user_runtime_dir
126 |
127 |
128 | __all__ = [
129 | "MacOS",
130 | ]
131 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/flask/json/__init__.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import json as _json
4 | import typing as t
5 |
6 | from ..globals import current_app
7 | from .provider import _default
8 |
9 | if t.TYPE_CHECKING: # pragma: no cover
10 | from ..wrappers import Response
11 |
12 |
13 | def dumps(obj: t.Any, **kwargs: t.Any) -> str:
14 | """Serialize data as JSON.
15 |
16 | If :data:`~flask.current_app` is available, it will use its
17 | :meth:`app.json.dumps() <flask.json.provider.JSONProvider.dumps>`
18 | method, otherwise it will use :func:`json.dumps`.
19 |
20 | :param obj: The data to serialize.
21 | :param kwargs: Arguments passed to the ``dumps`` implementation.
22 |
23 | .. versionchanged:: 2.3
24 | The ``app`` parameter was removed.
25 |
26 | .. versionchanged:: 2.2
27 | Calls ``current_app.json.dumps``, allowing an app to override
28 | the behavior.
29 |
30 | .. versionchanged:: 2.0.2
31 | :class:`decimal.Decimal` is supported by converting to a string.
32 |
33 | .. versionchanged:: 2.0
34 | ``encoding`` will be removed in Flask 2.1.
35 |
36 | .. versionchanged:: 1.0.3
37 | ``app`` can be passed directly, rather than requiring an app
38 | context for configuration.
39 | """
40 | if current_app:
41 | return current_app.json.dumps(obj, **kwargs)
42 |
43 | kwargs.setdefault("default", _default)
44 | return _json.dumps(obj, **kwargs)
45 |
46 |
47 | def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None:
48 | """Serialize data as JSON and write to a file.
49 |
50 | If :data:`~flask.current_app` is available, it will use its
51 | :meth:`app.json.dump() <flask.json.provider.JSONProvider.dump>`
52 | method, otherwise it will use :func:`json.dump`.
53 |
54 | :param obj: The data to serialize.
55 | :param fp: A file opened for writing text. Should use the UTF-8
56 | encoding to be valid JSON.
57 | :param kwargs: Arguments passed to the ``dump`` implementation.
58 |
59 | .. versionchanged:: 2.3
60 | The ``app`` parameter was removed.
61 |
62 | .. versionchanged:: 2.2
63 | Calls ``current_app.json.dump``, allowing an app to override
64 | the behavior.
65 |
66 | .. versionchanged:: 2.0
67 | Writing to a binary file, and the ``encoding`` argument, will be
68 | removed in Flask 2.1.
69 | """
70 | if current_app:
71 | current_app.json.dump(obj, fp, **kwargs)
72 | else:
73 | kwargs.setdefault("default", _default)
74 | _json.dump(obj, fp, **kwargs)
75 |
76 |
77 | def loads(s: str | bytes, **kwargs: t.Any) -> t.Any:
78 | """Deserialize data as JSON.
79 |
80 | If :data:`~flask.current_app` is available, it will use its
81 | :meth:`app.json.loads() <flask.json.provider.JSONProvider.loads>`
82 | method, otherwise it will use :func:`json.loads`.
83 |
84 | :param s: Text or UTF-8 bytes.
85 | :param kwargs: Arguments passed to the ``loads`` implementation.
86 |
87 | .. versionchanged:: 2.3
88 | The ``app`` parameter was removed.
89 |
90 | .. versionchanged:: 2.2
91 | Calls ``current_app.json.loads``, allowing an app to override
92 | the behavior.
93 |
94 | .. versionchanged:: 2.0
95 | ``encoding`` will be removed in Flask 2.1. The data must be a
96 | string or UTF-8 bytes.
97 |
98 | .. versionchanged:: 1.0.3
99 | ``app`` can be passed directly, rather than requiring an app
100 | context for configuration.
101 | """
102 | if current_app:
103 | return current_app.json.loads(s, **kwargs)
104 |
105 | return _json.loads(s, **kwargs)
106 |
107 |
108 | def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any:
109 | """Deserialize data as JSON read from a file.
110 |
111 | If :data:`~flask.current_app` is available, it will use its
112 | :meth:`app.json.load() <flask.json.provider.JSONProvider.load>`
113 | method, otherwise it will use :func:`json.load`.
114 |
115 | :param fp: A file opened for reading text or UTF-8 bytes.
116 | :param kwargs: Arguments passed to the ``load`` implementation.
117 |
118 | .. versionchanged:: 2.3
119 | The ``app`` parameter was removed.
120 |
121 | .. versionchanged:: 2.2
122 | Calls ``current_app.json.load``, allowing an app to override
123 | the behavior.
124 |
125 | .. versionchanged:: 2.2
126 | The ``app`` parameter will be removed in Flask 2.3.
127 |
128 | .. versionchanged:: 2.0
129 | ``encoding`` will be removed in Flask 2.1. The file must be text
130 | mode, or binary mode with UTF-8 bytes.
131 | """
132 | if current_app:
133 | return current_app.json.load(fp, **kwargs)
134 |
135 | return _json.load(fp, **kwargs)
136 |
137 |
138 | def jsonify(*args: t.Any, **kwargs: t.Any) -> Response:
139 | """Serialize the given arguments as JSON, and return a
140 | :class:`~flask.Response` object with the ``application/json``
141 | mimetype. A dict or list returned from a view will be converted to a
142 | JSON response automatically without needing to call this.
143 |
144 | This requires an active request or application context, and calls
145 | :meth:`app.json.response() <flask.json.provider.JSONProvider.response>`.
146 |
147 | In debug mode, the output is formatted with indentation to make it
148 | easier to read. This may also be controlled by the provider.
149 |
150 | Either positional or keyword arguments can be given, not both.
151 | If no arguments are given, ``None`` is serialized.
152 |
153 | :param args: A single value to serialize, or multiple values to
154 | treat as a list to serialize.
155 | :param kwargs: Treat as a dict to serialize.
156 |
157 | .. versionchanged:: 2.2
158 | Calls ``current_app.json.response``, allowing an app to override
159 | the behavior.
160 |
161 | .. versionchanged:: 2.0.2
162 | :class:`decimal.Decimal` is supported by converting to a string.
163 |
164 | .. versionchanged:: 0.11
165 | Added support for serializing top-level arrays. This was a
166 | security risk in ancient browsers. See :ref:`security-json`.
167 |
168 | .. versionadded:: 0.2
169 | """
170 | return current_app.json.response(*args, **kwargs) # type: ignore[return-value]
171 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/search.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | import shutil
3 | import sys
4 | import textwrap
5 | import xmlrpc.client
6 | from collections import OrderedDict
7 | from optparse import Values
8 | from typing import TYPE_CHECKING, Dict, List, Optional, TypedDict
9 |
10 | from pip._vendor.packaging.version import parse as parse_version
11 |
12 | from pip._internal.cli.base_command import Command
13 | from pip._internal.cli.req_command import SessionCommandMixin
14 | from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS
15 | from pip._internal.exceptions import CommandError
16 | from pip._internal.metadata import get_default_environment
17 | from pip._internal.models.index import PyPI
18 | from pip._internal.network.xmlrpc import PipXmlrpcTransport
19 | from pip._internal.utils.logging import indent_log
20 | from pip._internal.utils.misc import write_output
21 |
22 | if TYPE_CHECKING:
23 |
24 | class TransformedHit(TypedDict):
25 | name: str
26 | summary: str
27 | versions: List[str]
28 |
29 |
30 | logger = logging.getLogger(__name__)
31 |
32 |
33 | class SearchCommand(Command, SessionCommandMixin):
34 | """Search for PyPI packages whose name or summary contains <query>."""
35 |
36 | usage = """
37 | %prog [options] <query>"""
38 | ignore_require_venv = True
39 |
40 | def add_options(self) -> None:
41 | self.cmd_opts.add_option(
42 | "-i",
43 | "--index",
44 | dest="index",
45 | metavar="URL",
46 | default=PyPI.pypi_url,
47 | help="Base URL of Python Package Index (default %default)",
48 | )
49 |
50 | self.parser.insert_option_group(0, self.cmd_opts)
51 |
52 | def run(self, options: Values, args: List[str]) -> int:
53 | if not args:
54 | raise CommandError("Missing required argument (search query).")
55 | query = args
56 | pypi_hits = self.search(query, options)
57 | hits = transform_hits(pypi_hits)
58 |
59 | terminal_width = None
60 | if sys.stdout.isatty():
61 | terminal_width = shutil.get_terminal_size()[0]
62 |
63 | print_results(hits, terminal_width=terminal_width)
64 | if pypi_hits:
65 | return SUCCESS
66 | return NO_MATCHES_FOUND
67 |
68 | def search(self, query: List[str], options: Values) -> List[Dict[str, str]]:
69 | index_url = options.index
70 |
71 | session = self.get_default_session(options)
72 |
73 | transport = PipXmlrpcTransport(index_url, session)
74 | pypi = xmlrpc.client.ServerProxy(index_url, transport)
75 | try:
76 | hits = pypi.search({"name": query, "summary": query}, "or")
77 | except xmlrpc.client.Fault as fault:
78 | message = (
79 | f"XMLRPC request failed [code: {fault.faultCode}]\n{fault.faultString}"
80 | )
81 | raise CommandError(message)
82 | assert isinstance(hits, list)
83 | return hits
84 |
85 |
86 | def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]:
87 | """
88 | The list from pypi is really a list of versions. We want a list of
89 | packages with the list of versions stored inline. This converts the
90 | list from pypi into one we can use.
91 | """
92 | packages: Dict[str, "TransformedHit"] = OrderedDict()
93 | for hit in hits:
94 | name = hit["name"]
95 | summary = hit["summary"]
96 | version = hit["version"]
97 |
98 | if name not in packages.keys():
99 | packages[name] = {
100 | "name": name,
101 | "summary": summary,
102 | "versions": [version],
103 | }
104 | else:
105 | packages[name]["versions"].append(version)
106 |
107 | # if this is the highest version, replace summary and score
108 | if version == highest_version(packages[name]["versions"]):
109 | packages[name]["summary"] = summary
110 |
111 | return list(packages.values())
112 |
113 |
114 | def print_dist_installation_info(name: str, latest: str) -> None:
115 | env = get_default_environment()
116 | dist = env.get_distribution(name)
117 | if dist is not None:
118 | with indent_log():
119 | if dist.version == latest:
120 | write_output("INSTALLED: %s (latest)", dist.version)
121 | else:
122 | write_output("INSTALLED: %s", dist.version)
123 | if parse_version(latest).pre:
124 | write_output(
125 | "LATEST: %s (pre-release; install"
126 | " with `pip install --pre`)",
127 | latest,
128 | )
129 | else:
130 | write_output("LATEST: %s", latest)
131 |
132 |
133 | def print_results(
134 | hits: List["TransformedHit"],
135 | name_column_width: Optional[int] = None,
136 | terminal_width: Optional[int] = None,
137 | ) -> None:
138 | if not hits:
139 | return
140 | if name_column_width is None:
141 | name_column_width = (
142 | max(
143 | [
144 | len(hit["name"]) + len(highest_version(hit.get("versions", ["-"])))
145 | for hit in hits
146 | ]
147 | )
148 | + 4
149 | )
150 |
151 | for hit in hits:
152 | name = hit["name"]
153 | summary = hit["summary"] or ""
154 | latest = highest_version(hit.get("versions", ["-"]))
155 | if terminal_width is not None:
156 | target_width = terminal_width - name_column_width - 5
157 | if target_width > 10:
158 | # wrap and indent summary to fit terminal
159 | summary_lines = textwrap.wrap(summary, target_width)
160 | summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines)
161 |
162 | name_latest = f"{name} ({latest})"
163 | line = f"{name_latest:{name_column_width}} - {summary}"
164 | try:
165 | write_output(line)
166 | print_dist_installation_info(name, latest)
167 | except UnicodeEncodeError:
168 | pass
169 |
170 |
171 | def highest_version(versions: List[str]) -> str:
172 | return max(versions, key=parse_version)
173 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py:
--------------------------------------------------------------------------------
```python
1 | from collections import namedtuple
2 | import datetime
3 | import struct
4 |
5 |
6 | class ExtType(namedtuple("ExtType", "code data")):
7 | """ExtType represents ext type in msgpack."""
8 |
9 | def __new__(cls, code, data):
10 | if not isinstance(code, int):
11 | raise TypeError("code must be int")
12 | if not isinstance(data, bytes):
13 | raise TypeError("data must be bytes")
14 | if not 0 <= code <= 127:
15 | raise ValueError("code must be 0~127")
16 | return super().__new__(cls, code, data)
17 |
18 |
19 | class Timestamp:
20 | """Timestamp represents the Timestamp extension type in msgpack.
21 |
22 | When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`.
23 | When using pure-Python msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and
24 | unpack `Timestamp`.
25 |
26 | This class is immutable: Do not override seconds and nanoseconds.
27 | """
28 |
29 | __slots__ = ["seconds", "nanoseconds"]
30 |
31 | def __init__(self, seconds, nanoseconds=0):
32 | """Initialize a Timestamp object.
33 |
34 | :param int seconds:
35 | Number of seconds since the UNIX epoch (00:00:00 UTC Jan 1 1970, minus leap seconds).
36 | May be negative.
37 |
38 | :param int nanoseconds:
39 | Number of nanoseconds to add to `seconds` to get fractional time.
40 | Maximum is 999_999_999. Default is 0.
41 |
42 | Note: Negative times (before the UNIX epoch) are represented as neg. seconds + pos. ns.
43 | """
44 | if not isinstance(seconds, int):
45 | raise TypeError("seconds must be an integer")
46 | if not isinstance(nanoseconds, int):
47 | raise TypeError("nanoseconds must be an integer")
48 | if not (0 <= nanoseconds < 10**9):
49 | raise ValueError("nanoseconds must be a non-negative integer less than 999999999.")
50 | self.seconds = seconds
51 | self.nanoseconds = nanoseconds
52 |
53 | def __repr__(self):
54 | """String representation of Timestamp."""
55 | return f"Timestamp(seconds={self.seconds}, nanoseconds={self.nanoseconds})"
56 |
57 | def __eq__(self, other):
58 | """Check for equality with another Timestamp object"""
59 | if type(other) is self.__class__:
60 | return self.seconds == other.seconds and self.nanoseconds == other.nanoseconds
61 | return False
62 |
63 | def __ne__(self, other):
64 | """not-equals method (see :func:`__eq__()`)"""
65 | return not self.__eq__(other)
66 |
67 | def __hash__(self):
68 | return hash((self.seconds, self.nanoseconds))
69 |
70 | @staticmethod
71 | def from_bytes(b):
72 | """Unpack bytes into a `Timestamp` object.
73 |
74 | Used for pure-Python msgpack unpacking.
75 |
76 | :param b: Payload from msgpack ext message with code -1
77 | :type b: bytes
78 |
79 | :returns: Timestamp object unpacked from msgpack ext payload
80 | :rtype: Timestamp
81 | """
82 | if len(b) == 4:
83 | seconds = struct.unpack("!L", b)[0]
84 | nanoseconds = 0
85 | elif len(b) == 8:
86 | data64 = struct.unpack("!Q", b)[0]
87 | seconds = data64 & 0x00000003FFFFFFFF
88 | nanoseconds = data64 >> 34
89 | elif len(b) == 12:
90 | nanoseconds, seconds = struct.unpack("!Iq", b)
91 | else:
92 | raise ValueError(
93 | "Timestamp type can only be created from 32, 64, or 96-bit byte objects"
94 | )
95 | return Timestamp(seconds, nanoseconds)
96 |
97 | def to_bytes(self):
98 | """Pack this Timestamp object into bytes.
99 |
100 | Used for pure-Python msgpack packing.
101 |
102 | :returns data: Payload for EXT message with code -1 (timestamp type)
103 | :rtype: bytes
104 | """
105 | if (self.seconds >> 34) == 0: # seconds is non-negative and fits in 34 bits
106 | data64 = self.nanoseconds << 34 | self.seconds
107 | if data64 & 0xFFFFFFFF00000000 == 0:
108 | # nanoseconds is zero and seconds < 2**32, so timestamp 32
109 | data = struct.pack("!L", data64)
110 | else:
111 | # timestamp 64
112 | data = struct.pack("!Q", data64)
113 | else:
114 | # timestamp 96
115 | data = struct.pack("!Iq", self.nanoseconds, self.seconds)
116 | return data
117 |
118 | @staticmethod
119 | def from_unix(unix_sec):
120 | """Create a Timestamp from posix timestamp in seconds.
121 |
122 | :param unix_float: Posix timestamp in seconds.
123 | :type unix_float: int or float
124 | """
125 | seconds = int(unix_sec // 1)
126 | nanoseconds = int((unix_sec % 1) * 10**9)
127 | return Timestamp(seconds, nanoseconds)
128 |
129 | def to_unix(self):
130 | """Get the timestamp as a floating-point value.
131 |
132 | :returns: posix timestamp
133 | :rtype: float
134 | """
135 | return self.seconds + self.nanoseconds / 1e9
136 |
137 | @staticmethod
138 | def from_unix_nano(unix_ns):
139 | """Create a Timestamp from posix timestamp in nanoseconds.
140 |
141 | :param int unix_ns: Posix timestamp in nanoseconds.
142 | :rtype: Timestamp
143 | """
144 | return Timestamp(*divmod(unix_ns, 10**9))
145 |
146 | def to_unix_nano(self):
147 | """Get the timestamp as a unixtime in nanoseconds.
148 |
149 | :returns: posix timestamp in nanoseconds
150 | :rtype: int
151 | """
152 | return self.seconds * 10**9 + self.nanoseconds
153 |
154 | def to_datetime(self):
155 | """Get the timestamp as a UTC datetime.
156 |
157 | :rtype: `datetime.datetime`
158 | """
159 | utc = datetime.timezone.utc
160 | return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(seconds=self.to_unix())
161 |
162 | @staticmethod
163 | def from_datetime(dt):
164 | """Create a Timestamp from datetime with tzinfo.
165 |
166 | :rtype: Timestamp
167 | """
168 | return Timestamp.from_unix(dt.timestamp())
169 |
```