This is page 44 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/charset_normalizer/utils.py:
--------------------------------------------------------------------------------
```python
1 | import importlib
2 | import logging
3 | import unicodedata
4 | from codecs import IncrementalDecoder
5 | from encodings.aliases import aliases
6 | from functools import lru_cache
7 | from re import findall
8 | from typing import Generator, List, Optional, Set, Tuple, Union
9 |
10 | from _multibytecodec import MultibyteIncrementalDecoder
11 |
12 | from .constant import (
13 | ENCODING_MARKS,
14 | IANA_SUPPORTED_SIMILAR,
15 | RE_POSSIBLE_ENCODING_INDICATION,
16 | UNICODE_RANGES_COMBINED,
17 | UNICODE_SECONDARY_RANGE_KEYWORD,
18 | UTF8_MAXIMAL_ALLOCATION,
19 | )
20 |
21 |
22 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
23 | def is_accentuated(character: str) -> bool:
24 | try:
25 | description: str = unicodedata.name(character)
26 | except ValueError:
27 | return False
28 | return (
29 | "WITH GRAVE" in description
30 | or "WITH ACUTE" in description
31 | or "WITH CEDILLA" in description
32 | or "WITH DIAERESIS" in description
33 | or "WITH CIRCUMFLEX" in description
34 | or "WITH TILDE" in description
35 | or "WITH MACRON" in description
36 | or "WITH RING ABOVE" in description
37 | )
38 |
39 |
40 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
41 | def remove_accent(character: str) -> str:
42 | decomposed: str = unicodedata.decomposition(character)
43 | if not decomposed:
44 | return character
45 |
46 | codes: List[str] = decomposed.split(" ")
47 |
48 | return chr(int(codes[0], 16))
49 |
50 |
51 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
52 | def unicode_range(character: str) -> Optional[str]:
53 | """
54 | Retrieve the Unicode range official name from a single character.
55 | """
56 | character_ord: int = ord(character)
57 |
58 | for range_name, ord_range in UNICODE_RANGES_COMBINED.items():
59 | if character_ord in ord_range:
60 | return range_name
61 |
62 | return None
63 |
64 |
65 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
66 | def is_latin(character: str) -> bool:
67 | try:
68 | description: str = unicodedata.name(character)
69 | except ValueError:
70 | return False
71 | return "LATIN" in description
72 |
73 |
74 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
75 | def is_punctuation(character: str) -> bool:
76 | character_category: str = unicodedata.category(character)
77 |
78 | if "P" in character_category:
79 | return True
80 |
81 | character_range: Optional[str] = unicode_range(character)
82 |
83 | if character_range is None:
84 | return False
85 |
86 | return "Punctuation" in character_range
87 |
88 |
89 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
90 | def is_symbol(character: str) -> bool:
91 | character_category: str = unicodedata.category(character)
92 |
93 | if "S" in character_category or "N" in character_category:
94 | return True
95 |
96 | character_range: Optional[str] = unicode_range(character)
97 |
98 | if character_range is None:
99 | return False
100 |
101 | return "Forms" in character_range and character_category != "Lo"
102 |
103 |
104 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
105 | def is_emoticon(character: str) -> bool:
106 | character_range: Optional[str] = unicode_range(character)
107 |
108 | if character_range is None:
109 | return False
110 |
111 | return "Emoticons" in character_range or "Pictographs" in character_range
112 |
113 |
114 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
115 | def is_separator(character: str) -> bool:
116 | if character.isspace() or character in {"|", "+", "<", ">"}:
117 | return True
118 |
119 | character_category: str = unicodedata.category(character)
120 |
121 | return "Z" in character_category or character_category in {"Po", "Pd", "Pc"}
122 |
123 |
124 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
125 | def is_case_variable(character: str) -> bool:
126 | return character.islower() != character.isupper()
127 |
128 |
129 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
130 | def is_cjk(character: str) -> bool:
131 | try:
132 | character_name = unicodedata.name(character)
133 | except ValueError:
134 | return False
135 |
136 | return "CJK" in character_name
137 |
138 |
139 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
140 | def is_hiragana(character: str) -> bool:
141 | try:
142 | character_name = unicodedata.name(character)
143 | except ValueError:
144 | return False
145 |
146 | return "HIRAGANA" in character_name
147 |
148 |
149 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
150 | def is_katakana(character: str) -> bool:
151 | try:
152 | character_name = unicodedata.name(character)
153 | except ValueError:
154 | return False
155 |
156 | return "KATAKANA" in character_name
157 |
158 |
159 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
160 | def is_hangul(character: str) -> bool:
161 | try:
162 | character_name = unicodedata.name(character)
163 | except ValueError:
164 | return False
165 |
166 | return "HANGUL" in character_name
167 |
168 |
169 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
170 | def is_thai(character: str) -> bool:
171 | try:
172 | character_name = unicodedata.name(character)
173 | except ValueError:
174 | return False
175 |
176 | return "THAI" in character_name
177 |
178 |
179 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
180 | def is_arabic(character: str) -> bool:
181 | try:
182 | character_name = unicodedata.name(character)
183 | except ValueError:
184 | return False
185 |
186 | return "ARABIC" in character_name
187 |
188 |
189 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
190 | def is_arabic_isolated_form(character: str) -> bool:
191 | try:
192 | character_name = unicodedata.name(character)
193 | except ValueError:
194 | return False
195 |
196 | return "ARABIC" in character_name and "ISOLATED FORM" in character_name
197 |
198 |
199 | @lru_cache(maxsize=len(UNICODE_RANGES_COMBINED))
200 | def is_unicode_range_secondary(range_name: str) -> bool:
201 | return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD)
202 |
203 |
204 | @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION)
205 | def is_unprintable(character: str) -> bool:
206 | return (
207 | character.isspace() is False # includes \n \t \r \v
208 | and character.isprintable() is False
209 | and character != "\x1A" # Why? Its the ASCII substitute character.
210 | and character != "\ufeff" # bug discovered in Python,
211 | # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space.
212 | )
213 |
214 |
215 | def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> Optional[str]:
216 | """
217 | Extract using ASCII-only decoder any specified encoding in the first n-bytes.
218 | """
219 | if not isinstance(sequence, bytes):
220 | raise TypeError
221 |
222 | seq_len: int = len(sequence)
223 |
224 | results: List[str] = findall(
225 | RE_POSSIBLE_ENCODING_INDICATION,
226 | sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"),
227 | )
228 |
229 | if len(results) == 0:
230 | return None
231 |
232 | for specified_encoding in results:
233 | specified_encoding = specified_encoding.lower().replace("-", "_")
234 |
235 | encoding_alias: str
236 | encoding_iana: str
237 |
238 | for encoding_alias, encoding_iana in aliases.items():
239 | if encoding_alias == specified_encoding:
240 | return encoding_iana
241 | if encoding_iana == specified_encoding:
242 | return encoding_iana
243 |
244 | return None
245 |
246 |
247 | @lru_cache(maxsize=128)
248 | def is_multi_byte_encoding(name: str) -> bool:
249 | """
250 | Verify is a specific encoding is a multi byte one based on it IANA name
251 | """
252 | return name in {
253 | "utf_8",
254 | "utf_8_sig",
255 | "utf_16",
256 | "utf_16_be",
257 | "utf_16_le",
258 | "utf_32",
259 | "utf_32_le",
260 | "utf_32_be",
261 | "utf_7",
262 | } or issubclass(
263 | importlib.import_module("encodings.{}".format(name)).IncrementalDecoder,
264 | MultibyteIncrementalDecoder,
265 | )
266 |
267 |
268 | def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]:
269 | """
270 | Identify and extract SIG/BOM in given sequence.
271 | """
272 |
273 | for iana_encoding in ENCODING_MARKS:
274 | marks: Union[bytes, List[bytes]] = ENCODING_MARKS[iana_encoding]
275 |
276 | if isinstance(marks, bytes):
277 | marks = [marks]
278 |
279 | for mark in marks:
280 | if sequence.startswith(mark):
281 | return iana_encoding, mark
282 |
283 | return None, b""
284 |
285 |
286 | def should_strip_sig_or_bom(iana_encoding: str) -> bool:
287 | return iana_encoding not in {"utf_16", "utf_32"}
288 |
289 |
290 | def iana_name(cp_name: str, strict: bool = True) -> str:
291 | cp_name = cp_name.lower().replace("-", "_")
292 |
293 | encoding_alias: str
294 | encoding_iana: str
295 |
296 | for encoding_alias, encoding_iana in aliases.items():
297 | if cp_name in [encoding_alias, encoding_iana]:
298 | return encoding_iana
299 |
300 | if strict:
301 | raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name))
302 |
303 | return cp_name
304 |
305 |
306 | def range_scan(decoded_sequence: str) -> List[str]:
307 | ranges: Set[str] = set()
308 |
309 | for character in decoded_sequence:
310 | character_range: Optional[str] = unicode_range(character)
311 |
312 | if character_range is None:
313 | continue
314 |
315 | ranges.add(character_range)
316 |
317 | return list(ranges)
318 |
319 |
320 | def cp_similarity(iana_name_a: str, iana_name_b: str) -> float:
321 | if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b):
322 | return 0.0
323 |
324 | decoder_a = importlib.import_module(
325 | "encodings.{}".format(iana_name_a)
326 | ).IncrementalDecoder
327 | decoder_b = importlib.import_module(
328 | "encodings.{}".format(iana_name_b)
329 | ).IncrementalDecoder
330 |
331 | id_a: IncrementalDecoder = decoder_a(errors="ignore")
332 | id_b: IncrementalDecoder = decoder_b(errors="ignore")
333 |
334 | character_match_count: int = 0
335 |
336 | for i in range(255):
337 | to_be_decoded: bytes = bytes([i])
338 | if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded):
339 | character_match_count += 1
340 |
341 | return character_match_count / 254
342 |
343 |
344 | def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool:
345 | """
346 | Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using
347 | the function cp_similarity.
348 | """
349 | return (
350 | iana_name_a in IANA_SUPPORTED_SIMILAR
351 | and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a]
352 | )
353 |
354 |
355 | def set_logging_handler(
356 | name: str = "charset_normalizer",
357 | level: int = logging.INFO,
358 | format_string: str = "%(asctime)s | %(levelname)s | %(message)s",
359 | ) -> None:
360 | logger = logging.getLogger(name)
361 | logger.setLevel(level)
362 |
363 | handler = logging.StreamHandler()
364 | handler.setFormatter(logging.Formatter(format_string))
365 | logger.addHandler(handler)
366 |
367 |
368 | def cut_sequence_chunks(
369 | sequences: bytes,
370 | encoding_iana: str,
371 | offsets: range,
372 | chunk_size: int,
373 | bom_or_sig_available: bool,
374 | strip_sig_or_bom: bool,
375 | sig_payload: bytes,
376 | is_multi_byte_decoder: bool,
377 | decoded_payload: Optional[str] = None,
378 | ) -> Generator[str, None, None]:
379 | if decoded_payload and is_multi_byte_decoder is False:
380 | for i in offsets:
381 | chunk = decoded_payload[i : i + chunk_size]
382 | if not chunk:
383 | break
384 | yield chunk
385 | else:
386 | for i in offsets:
387 | chunk_end = i + chunk_size
388 | if chunk_end > len(sequences) + 8:
389 | continue
390 |
391 | cut_sequence = sequences[i : i + chunk_size]
392 |
393 | if bom_or_sig_available and strip_sig_or_bom is False:
394 | cut_sequence = sig_payload + cut_sequence
395 |
396 | chunk = cut_sequence.decode(
397 | encoding_iana,
398 | errors="ignore" if is_multi_byte_decoder else "strict",
399 | )
400 |
401 | # multi-byte bad cutting detector and adjustment
402 | # not the cleanest way to perform that fix but clever enough for now.
403 | if is_multi_byte_decoder and i > 0:
404 | chunk_partial_size_chk: int = min(chunk_size, 16)
405 |
406 | if (
407 | decoded_payload
408 | and chunk[:chunk_partial_size_chk] not in decoded_payload
409 | ):
410 | for j in range(i, i - 4, -1):
411 | cut_sequence = sequences[j:chunk_end]
412 |
413 | if bom_or_sig_available and strip_sig_or_bom is False:
414 | cut_sequence = sig_payload + cut_sequence
415 |
416 | chunk = cut_sequence.decode(encoding_iana, errors="ignore")
417 |
418 | if chunk[:chunk_partial_size_chk] in decoded_payload:
419 | break
420 |
421 | yield chunk
422 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | from datetime import datetime
3 | from logging import Handler, LogRecord
4 | from pathlib import Path
5 | from types import ModuleType
6 | from typing import ClassVar, Iterable, List, Optional, Type, Union
7 |
8 | from pip._vendor.rich._null_file import NullFile
9 |
10 | from . import get_console
11 | from ._log_render import FormatTimeCallable, LogRender
12 | from .console import Console, ConsoleRenderable
13 | from .highlighter import Highlighter, ReprHighlighter
14 | from .text import Text
15 | from .traceback import Traceback
16 |
17 |
18 | class RichHandler(Handler):
19 | """A logging handler that renders output with Rich. The time / level / message and file are displayed in columns.
20 | The level is color coded, and the message is syntax highlighted.
21 |
22 | Note:
23 | Be careful when enabling console markup in log messages if you have configured logging for libraries not
24 | under your control. If a dependency writes messages containing square brackets, it may not produce the intended output.
25 |
26 | Args:
27 | level (Union[int, str], optional): Log level. Defaults to logging.NOTSET.
28 | console (:class:`~rich.console.Console`, optional): Optional console instance to write logs.
29 | Default will use a global console instance writing to stdout.
30 | show_time (bool, optional): Show a column for the time. Defaults to True.
31 | omit_repeated_times (bool, optional): Omit repetition of the same time. Defaults to True.
32 | show_level (bool, optional): Show a column for the level. Defaults to True.
33 | show_path (bool, optional): Show the path to the original log call. Defaults to True.
34 | enable_link_path (bool, optional): Enable terminal link of path column to file. Defaults to True.
35 | highlighter (Highlighter, optional): Highlighter to style log messages, or None to use ReprHighlighter. Defaults to None.
36 | markup (bool, optional): Enable console markup in log messages. Defaults to False.
37 | rich_tracebacks (bool, optional): Enable rich tracebacks with syntax highlighting and formatting. Defaults to False.
38 | tracebacks_width (Optional[int], optional): Number of characters used to render tracebacks, or None for full width. Defaults to None.
39 | tracebacks_extra_lines (int, optional): Additional lines of code to render tracebacks, or None for full width. Defaults to None.
40 | tracebacks_theme (str, optional): Override pygments theme used in traceback.
41 | tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True.
42 | tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False.
43 | tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
44 | locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
45 | Defaults to 10.
46 | locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
47 | log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%x %X] ".
48 | keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``.
49 | """
50 |
51 | KEYWORDS: ClassVar[Optional[List[str]]] = [
52 | "GET",
53 | "POST",
54 | "HEAD",
55 | "PUT",
56 | "DELETE",
57 | "OPTIONS",
58 | "TRACE",
59 | "PATCH",
60 | ]
61 | HIGHLIGHTER_CLASS: ClassVar[Type[Highlighter]] = ReprHighlighter
62 |
63 | def __init__(
64 | self,
65 | level: Union[int, str] = logging.NOTSET,
66 | console: Optional[Console] = None,
67 | *,
68 | show_time: bool = True,
69 | omit_repeated_times: bool = True,
70 | show_level: bool = True,
71 | show_path: bool = True,
72 | enable_link_path: bool = True,
73 | highlighter: Optional[Highlighter] = None,
74 | markup: bool = False,
75 | rich_tracebacks: bool = False,
76 | tracebacks_width: Optional[int] = None,
77 | tracebacks_extra_lines: int = 3,
78 | tracebacks_theme: Optional[str] = None,
79 | tracebacks_word_wrap: bool = True,
80 | tracebacks_show_locals: bool = False,
81 | tracebacks_suppress: Iterable[Union[str, ModuleType]] = (),
82 | locals_max_length: int = 10,
83 | locals_max_string: int = 80,
84 | log_time_format: Union[str, FormatTimeCallable] = "[%x %X]",
85 | keywords: Optional[List[str]] = None,
86 | ) -> None:
87 | super().__init__(level=level)
88 | self.console = console or get_console()
89 | self.highlighter = highlighter or self.HIGHLIGHTER_CLASS()
90 | self._log_render = LogRender(
91 | show_time=show_time,
92 | show_level=show_level,
93 | show_path=show_path,
94 | time_format=log_time_format,
95 | omit_repeated_times=omit_repeated_times,
96 | level_width=None,
97 | )
98 | self.enable_link_path = enable_link_path
99 | self.markup = markup
100 | self.rich_tracebacks = rich_tracebacks
101 | self.tracebacks_width = tracebacks_width
102 | self.tracebacks_extra_lines = tracebacks_extra_lines
103 | self.tracebacks_theme = tracebacks_theme
104 | self.tracebacks_word_wrap = tracebacks_word_wrap
105 | self.tracebacks_show_locals = tracebacks_show_locals
106 | self.tracebacks_suppress = tracebacks_suppress
107 | self.locals_max_length = locals_max_length
108 | self.locals_max_string = locals_max_string
109 | self.keywords = keywords
110 |
111 | def get_level_text(self, record: LogRecord) -> Text:
112 | """Get the level name from the record.
113 |
114 | Args:
115 | record (LogRecord): LogRecord instance.
116 |
117 | Returns:
118 | Text: A tuple of the style and level name.
119 | """
120 | level_name = record.levelname
121 | level_text = Text.styled(
122 | level_name.ljust(8), f"logging.level.{level_name.lower()}"
123 | )
124 | return level_text
125 |
126 | def emit(self, record: LogRecord) -> None:
127 | """Invoked by logging."""
128 | message = self.format(record)
129 | traceback = None
130 | if (
131 | self.rich_tracebacks
132 | and record.exc_info
133 | and record.exc_info != (None, None, None)
134 | ):
135 | exc_type, exc_value, exc_traceback = record.exc_info
136 | assert exc_type is not None
137 | assert exc_value is not None
138 | traceback = Traceback.from_exception(
139 | exc_type,
140 | exc_value,
141 | exc_traceback,
142 | width=self.tracebacks_width,
143 | extra_lines=self.tracebacks_extra_lines,
144 | theme=self.tracebacks_theme,
145 | word_wrap=self.tracebacks_word_wrap,
146 | show_locals=self.tracebacks_show_locals,
147 | locals_max_length=self.locals_max_length,
148 | locals_max_string=self.locals_max_string,
149 | suppress=self.tracebacks_suppress,
150 | )
151 | message = record.getMessage()
152 | if self.formatter:
153 | record.message = record.getMessage()
154 | formatter = self.formatter
155 | if hasattr(formatter, "usesTime") and formatter.usesTime():
156 | record.asctime = formatter.formatTime(record, formatter.datefmt)
157 | message = formatter.formatMessage(record)
158 |
159 | message_renderable = self.render_message(record, message)
160 | log_renderable = self.render(
161 | record=record, traceback=traceback, message_renderable=message_renderable
162 | )
163 | if isinstance(self.console.file, NullFile):
164 | # Handles pythonw, where stdout/stderr are null, and we return NullFile
165 | # instance from Console.file. In this case, we still want to make a log record
166 | # even though we won't be writing anything to a file.
167 | self.handleError(record)
168 | else:
169 | try:
170 | self.console.print(log_renderable)
171 | except Exception:
172 | self.handleError(record)
173 |
174 | def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable":
175 | """Render message text in to Text.
176 |
177 | Args:
178 | record (LogRecord): logging Record.
179 | message (str): String containing log message.
180 |
181 | Returns:
182 | ConsoleRenderable: Renderable to display log message.
183 | """
184 | use_markup = getattr(record, "markup", self.markup)
185 | message_text = Text.from_markup(message) if use_markup else Text(message)
186 |
187 | highlighter = getattr(record, "highlighter", self.highlighter)
188 | if highlighter:
189 | message_text = highlighter(message_text)
190 |
191 | if self.keywords is None:
192 | self.keywords = self.KEYWORDS
193 |
194 | if self.keywords:
195 | message_text.highlight_words(self.keywords, "logging.keyword")
196 |
197 | return message_text
198 |
199 | def render(
200 | self,
201 | *,
202 | record: LogRecord,
203 | traceback: Optional[Traceback],
204 | message_renderable: "ConsoleRenderable",
205 | ) -> "ConsoleRenderable":
206 | """Render log for display.
207 |
208 | Args:
209 | record (LogRecord): logging Record.
210 | traceback (Optional[Traceback]): Traceback instance or None for no Traceback.
211 | message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents.
212 |
213 | Returns:
214 | ConsoleRenderable: Renderable to display log.
215 | """
216 | path = Path(record.pathname).name
217 | level = self.get_level_text(record)
218 | time_format = None if self.formatter is None else self.formatter.datefmt
219 | log_time = datetime.fromtimestamp(record.created)
220 |
221 | log_renderable = self._log_render(
222 | self.console,
223 | [message_renderable] if not traceback else [message_renderable, traceback],
224 | log_time=log_time,
225 | time_format=time_format,
226 | level=level,
227 | path=path,
228 | line_no=record.lineno,
229 | link_path=record.pathname if self.enable_link_path else None,
230 | )
231 | return log_renderable
232 |
233 |
234 | if __name__ == "__main__": # pragma: no cover
235 | from time import sleep
236 |
237 | FORMAT = "%(message)s"
238 | # FORMAT = "%(asctime)-15s - %(levelname)s - %(message)s"
239 | logging.basicConfig(
240 | level="NOTSET",
241 | format=FORMAT,
242 | datefmt="[%X]",
243 | handlers=[RichHandler(rich_tracebacks=True, tracebacks_show_locals=True)],
244 | )
245 | log = logging.getLogger("rich")
246 |
247 | log.info("Server starting...")
248 | log.info("Listening on http://127.0.0.1:8080")
249 | sleep(1)
250 |
251 | log.info("GET /index.html 200 1298")
252 | log.info("GET /imgs/backgrounds/back1.jpg 200 54386")
253 | log.info("GET /css/styles.css 200 54386")
254 | log.warning("GET /favicon.ico 404 242")
255 | sleep(1)
256 |
257 | log.debug(
258 | "JSONRPC request\n--> %r\n<-- %r",
259 | {
260 | "version": "1.1",
261 | "method": "confirmFruitPurchase",
262 | "params": [["apple", "orange", "mangoes", "pomelo"], 1.123],
263 | "id": "194521489",
264 | },
265 | {"version": "1.1", "result": True, "error": None, "id": "194521489"},
266 | )
267 | log.debug(
268 | "Loading configuration file /adasd/asdasd/qeqwe/qwrqwrqwr/sdgsdgsdg/werwerwer/dfgerert/ertertert/ertetert/werwerwer"
269 | )
270 | log.error("Unable to find 'pomelo' in database!")
271 | log.info("POST /jsonrpc/ 200 65532")
272 | log.info("POST /admin/ 401 42234")
273 | log.warning("password was rejected for admin site.")
274 |
275 | def divide() -> None:
276 | number = 1
277 | divisor = 0
278 | foos = ["foo"] * 100
279 | log.debug("in divide")
280 | try:
281 | number / divisor
282 | except:
283 | log.exception("An error of some kind occurred!")
284 |
285 | divide()
286 | sleep(1)
287 | log.critical("Out of memory!")
288 | log.info("Server exited with code=-1")
289 | log.info("[bold]EXITING...[/bold]", extra=dict(markup=True))
290 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py:
--------------------------------------------------------------------------------
```python
1 | import json
2 | import os
3 | import sys
4 | import tempfile
5 | from contextlib import contextmanager
6 | from os.path import abspath
7 | from os.path import join as pjoin
8 | from subprocess import STDOUT, check_call, check_output
9 |
10 | from ._in_process import _in_proc_script_path
11 |
12 |
13 | def write_json(obj, path, **kwargs):
14 | with open(path, 'w', encoding='utf-8') as f:
15 | json.dump(obj, f, **kwargs)
16 |
17 |
18 | def read_json(path):
19 | with open(path, encoding='utf-8') as f:
20 | return json.load(f)
21 |
22 |
23 | class BackendUnavailable(Exception):
24 | """Will be raised if the backend cannot be imported in the hook process."""
25 | def __init__(self, traceback):
26 | self.traceback = traceback
27 |
28 |
29 | class BackendInvalid(Exception):
30 | """Will be raised if the backend is invalid."""
31 | def __init__(self, backend_name, backend_path, message):
32 | super().__init__(message)
33 | self.backend_name = backend_name
34 | self.backend_path = backend_path
35 |
36 |
37 | class HookMissing(Exception):
38 | """Will be raised on missing hooks (if a fallback can't be used)."""
39 | def __init__(self, hook_name):
40 | super().__init__(hook_name)
41 | self.hook_name = hook_name
42 |
43 |
44 | class UnsupportedOperation(Exception):
45 | """May be raised by build_sdist if the backend indicates that it can't."""
46 | def __init__(self, traceback):
47 | self.traceback = traceback
48 |
49 |
50 | def default_subprocess_runner(cmd, cwd=None, extra_environ=None):
51 | """The default method of calling the wrapper subprocess.
52 |
53 | This uses :func:`subprocess.check_call` under the hood.
54 | """
55 | env = os.environ.copy()
56 | if extra_environ:
57 | env.update(extra_environ)
58 |
59 | check_call(cmd, cwd=cwd, env=env)
60 |
61 |
62 | def quiet_subprocess_runner(cmd, cwd=None, extra_environ=None):
63 | """Call the subprocess while suppressing output.
64 |
65 | This uses :func:`subprocess.check_output` under the hood.
66 | """
67 | env = os.environ.copy()
68 | if extra_environ:
69 | env.update(extra_environ)
70 |
71 | check_output(cmd, cwd=cwd, env=env, stderr=STDOUT)
72 |
73 |
74 | def norm_and_check(source_tree, requested):
75 | """Normalise and check a backend path.
76 |
77 | Ensure that the requested backend path is specified as a relative path,
78 | and resolves to a location under the given source tree.
79 |
80 | Return an absolute version of the requested path.
81 | """
82 | if os.path.isabs(requested):
83 | raise ValueError("paths must be relative")
84 |
85 | abs_source = os.path.abspath(source_tree)
86 | abs_requested = os.path.normpath(os.path.join(abs_source, requested))
87 | # We have to use commonprefix for Python 2.7 compatibility. So we
88 | # normalise case to avoid problems because commonprefix is a character
89 | # based comparison :-(
90 | norm_source = os.path.normcase(abs_source)
91 | norm_requested = os.path.normcase(abs_requested)
92 | if os.path.commonprefix([norm_source, norm_requested]) != norm_source:
93 | raise ValueError("paths must be inside source tree")
94 |
95 | return abs_requested
96 |
97 |
98 | class BuildBackendHookCaller:
99 | """A wrapper to call the build backend hooks for a source directory.
100 | """
101 |
102 | def __init__(
103 | self,
104 | source_dir,
105 | build_backend,
106 | backend_path=None,
107 | runner=None,
108 | python_executable=None,
109 | ):
110 | """
111 | :param source_dir: The source directory to invoke the build backend for
112 | :param build_backend: The build backend spec
113 | :param backend_path: Additional path entries for the build backend spec
114 | :param runner: The :ref:`subprocess runner <Subprocess Runners>` to use
115 | :param python_executable:
116 | The Python executable used to invoke the build backend
117 | """
118 | if runner is None:
119 | runner = default_subprocess_runner
120 |
121 | self.source_dir = abspath(source_dir)
122 | self.build_backend = build_backend
123 | if backend_path:
124 | backend_path = [
125 | norm_and_check(self.source_dir, p) for p in backend_path
126 | ]
127 | self.backend_path = backend_path
128 | self._subprocess_runner = runner
129 | if not python_executable:
130 | python_executable = sys.executable
131 | self.python_executable = python_executable
132 |
133 | @contextmanager
134 | def subprocess_runner(self, runner):
135 | """A context manager for temporarily overriding the default
136 | :ref:`subprocess runner <Subprocess Runners>`.
137 |
138 | .. code-block:: python
139 |
140 | hook_caller = BuildBackendHookCaller(...)
141 | with hook_caller.subprocess_runner(quiet_subprocess_runner):
142 | ...
143 | """
144 | prev = self._subprocess_runner
145 | self._subprocess_runner = runner
146 | try:
147 | yield
148 | finally:
149 | self._subprocess_runner = prev
150 |
151 | def _supported_features(self):
152 | """Return the list of optional features supported by the backend."""
153 | return self._call_hook('_supported_features', {})
154 |
155 | def get_requires_for_build_wheel(self, config_settings=None):
156 | """Get additional dependencies required for building a wheel.
157 |
158 | :returns: A list of :pep:`dependency specifiers <508>`.
159 | :rtype: list[str]
160 |
161 | .. admonition:: Fallback
162 |
163 | If the build backend does not defined a hook with this name, an
164 | empty list will be returned.
165 | """
166 | return self._call_hook('get_requires_for_build_wheel', {
167 | 'config_settings': config_settings
168 | })
169 |
170 | def prepare_metadata_for_build_wheel(
171 | self, metadata_directory, config_settings=None,
172 | _allow_fallback=True):
173 | """Prepare a ``*.dist-info`` folder with metadata for this project.
174 |
175 | :returns: Name of the newly created subfolder within
176 | ``metadata_directory``, containing the metadata.
177 | :rtype: str
178 |
179 | .. admonition:: Fallback
180 |
181 | If the build backend does not define a hook with this name and
182 | ``_allow_fallback`` is truthy, the backend will be asked to build a
183 | wheel via the ``build_wheel`` hook and the dist-info extracted from
184 | that will be returned.
185 | """
186 | return self._call_hook('prepare_metadata_for_build_wheel', {
187 | 'metadata_directory': abspath(metadata_directory),
188 | 'config_settings': config_settings,
189 | '_allow_fallback': _allow_fallback,
190 | })
191 |
192 | def build_wheel(
193 | self, wheel_directory, config_settings=None,
194 | metadata_directory=None):
195 | """Build a wheel from this project.
196 |
197 | :returns:
198 | The name of the newly created wheel within ``wheel_directory``.
199 |
200 | .. admonition:: Interaction with fallback
201 |
202 | If the ``build_wheel`` hook was called in the fallback for
203 | :meth:`prepare_metadata_for_build_wheel`, the build backend would
204 | not be invoked. Instead, the previously built wheel will be copied
205 | to ``wheel_directory`` and the name of that file will be returned.
206 | """
207 | if metadata_directory is not None:
208 | metadata_directory = abspath(metadata_directory)
209 | return self._call_hook('build_wheel', {
210 | 'wheel_directory': abspath(wheel_directory),
211 | 'config_settings': config_settings,
212 | 'metadata_directory': metadata_directory,
213 | })
214 |
215 | def get_requires_for_build_editable(self, config_settings=None):
216 | """Get additional dependencies required for building an editable wheel.
217 |
218 | :returns: A list of :pep:`dependency specifiers <508>`.
219 | :rtype: list[str]
220 |
221 | .. admonition:: Fallback
222 |
223 | If the build backend does not defined a hook with this name, an
224 | empty list will be returned.
225 | """
226 | return self._call_hook('get_requires_for_build_editable', {
227 | 'config_settings': config_settings
228 | })
229 |
230 | def prepare_metadata_for_build_editable(
231 | self, metadata_directory, config_settings=None,
232 | _allow_fallback=True):
233 | """Prepare a ``*.dist-info`` folder with metadata for this project.
234 |
235 | :returns: Name of the newly created subfolder within
236 | ``metadata_directory``, containing the metadata.
237 | :rtype: str
238 |
239 | .. admonition:: Fallback
240 |
241 | If the build backend does not define a hook with this name and
242 | ``_allow_fallback`` is truthy, the backend will be asked to build a
243 | wheel via the ``build_editable`` hook and the dist-info
244 | extracted from that will be returned.
245 | """
246 | return self._call_hook('prepare_metadata_for_build_editable', {
247 | 'metadata_directory': abspath(metadata_directory),
248 | 'config_settings': config_settings,
249 | '_allow_fallback': _allow_fallback,
250 | })
251 |
252 | def build_editable(
253 | self, wheel_directory, config_settings=None,
254 | metadata_directory=None):
255 | """Build an editable wheel from this project.
256 |
257 | :returns:
258 | The name of the newly created wheel within ``wheel_directory``.
259 |
260 | .. admonition:: Interaction with fallback
261 |
262 | If the ``build_editable`` hook was called in the fallback for
263 | :meth:`prepare_metadata_for_build_editable`, the build backend
264 | would not be invoked. Instead, the previously built wheel will be
265 | copied to ``wheel_directory`` and the name of that file will be
266 | returned.
267 | """
268 | if metadata_directory is not None:
269 | metadata_directory = abspath(metadata_directory)
270 | return self._call_hook('build_editable', {
271 | 'wheel_directory': abspath(wheel_directory),
272 | 'config_settings': config_settings,
273 | 'metadata_directory': metadata_directory,
274 | })
275 |
276 | def get_requires_for_build_sdist(self, config_settings=None):
277 | """Get additional dependencies required for building an sdist.
278 |
279 | :returns: A list of :pep:`dependency specifiers <508>`.
280 | :rtype: list[str]
281 | """
282 | return self._call_hook('get_requires_for_build_sdist', {
283 | 'config_settings': config_settings
284 | })
285 |
286 | def build_sdist(self, sdist_directory, config_settings=None):
287 | """Build an sdist from this project.
288 |
289 | :returns:
290 | The name of the newly created sdist within ``wheel_directory``.
291 | """
292 | return self._call_hook('build_sdist', {
293 | 'sdist_directory': abspath(sdist_directory),
294 | 'config_settings': config_settings,
295 | })
296 |
297 | def _call_hook(self, hook_name, kwargs):
298 | extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend}
299 |
300 | if self.backend_path:
301 | backend_path = os.pathsep.join(self.backend_path)
302 | extra_environ['PEP517_BACKEND_PATH'] = backend_path
303 |
304 | with tempfile.TemporaryDirectory() as td:
305 | hook_input = {'kwargs': kwargs}
306 | write_json(hook_input, pjoin(td, 'input.json'), indent=2)
307 |
308 | # Run the hook in a subprocess
309 | with _in_proc_script_path() as script:
310 | python = self.python_executable
311 | self._subprocess_runner(
312 | [python, abspath(str(script)), hook_name, td],
313 | cwd=self.source_dir,
314 | extra_environ=extra_environ
315 | )
316 |
317 | data = read_json(pjoin(td, 'output.json'))
318 | if data.get('unsupported'):
319 | raise UnsupportedOperation(data.get('traceback', ''))
320 | if data.get('no_backend'):
321 | raise BackendUnavailable(data.get('traceback', ''))
322 | if data.get('backend_invalid'):
323 | raise BackendInvalid(
324 | backend_name=self.build_backend,
325 | backend_path=self.backend_path,
326 | message=data.get('backend_error', '')
327 | )
328 | if data.get('hook_missing'):
329 | raise HookMissing(data.get('missing_hook_name') or hook_name)
330 | return data['return_val']
331 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py:
--------------------------------------------------------------------------------
```python
1 | """Utilities related archives.
2 | """
3 |
4 | import logging
5 | import os
6 | import shutil
7 | import stat
8 | import sys
9 | import tarfile
10 | import zipfile
11 | from typing import Iterable, List, Optional
12 | from zipfile import ZipInfo
13 |
14 | from pip._internal.exceptions import InstallationError
15 | from pip._internal.utils.filetypes import (
16 | BZ2_EXTENSIONS,
17 | TAR_EXTENSIONS,
18 | XZ_EXTENSIONS,
19 | ZIP_EXTENSIONS,
20 | )
21 | from pip._internal.utils.misc import ensure_dir
22 |
23 | logger = logging.getLogger(__name__)
24 |
25 |
26 | SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS
27 |
28 | try:
29 | import bz2 # noqa
30 |
31 | SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS
32 | except ImportError:
33 | logger.debug("bz2 module is not available")
34 |
35 | try:
36 | # Only for Python 3.3+
37 | import lzma # noqa
38 |
39 | SUPPORTED_EXTENSIONS += XZ_EXTENSIONS
40 | except ImportError:
41 | logger.debug("lzma module is not available")
42 |
43 |
44 | def current_umask() -> int:
45 | """Get the current umask which involves having to set it temporarily."""
46 | mask = os.umask(0)
47 | os.umask(mask)
48 | return mask
49 |
50 |
51 | def split_leading_dir(path: str) -> List[str]:
52 | path = path.lstrip("/").lstrip("\\")
53 | if "/" in path and (
54 | ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path
55 | ):
56 | return path.split("/", 1)
57 | elif "\\" in path:
58 | return path.split("\\", 1)
59 | else:
60 | return [path, ""]
61 |
62 |
63 | def has_leading_dir(paths: Iterable[str]) -> bool:
64 | """Returns true if all the paths have the same leading path name
65 | (i.e., everything is in one subdirectory in an archive)"""
66 | common_prefix = None
67 | for path in paths:
68 | prefix, rest = split_leading_dir(path)
69 | if not prefix:
70 | return False
71 | elif common_prefix is None:
72 | common_prefix = prefix
73 | elif prefix != common_prefix:
74 | return False
75 | return True
76 |
77 |
78 | def is_within_directory(directory: str, target: str) -> bool:
79 | """
80 | Return true if the absolute path of target is within the directory
81 | """
82 | abs_directory = os.path.abspath(directory)
83 | abs_target = os.path.abspath(target)
84 |
85 | prefix = os.path.commonprefix([abs_directory, abs_target])
86 | return prefix == abs_directory
87 |
88 |
89 | def _get_default_mode_plus_executable() -> int:
90 | return 0o777 & ~current_umask() | 0o111
91 |
92 |
93 | def set_extracted_file_to_default_mode_plus_executable(path: str) -> None:
94 | """
95 | Make file present at path have execute for user/group/world
96 | (chmod +x) is no-op on windows per python docs
97 | """
98 | os.chmod(path, _get_default_mode_plus_executable())
99 |
100 |
101 | def zip_item_is_executable(info: ZipInfo) -> bool:
102 | mode = info.external_attr >> 16
103 | # if mode and regular file and any execute permissions for
104 | # user/group/world?
105 | return bool(mode and stat.S_ISREG(mode) and mode & 0o111)
106 |
107 |
108 | def unzip_file(filename: str, location: str, flatten: bool = True) -> None:
109 | """
110 | Unzip the file (with path `filename`) to the destination `location`. All
111 | files are written based on system defaults and umask (i.e. permissions are
112 | not preserved), except that regular file members with any execute
113 | permissions (user, group, or world) have "chmod +x" applied after being
114 | written. Note that for windows, any execute changes using os.chmod are
115 | no-ops per the python docs.
116 | """
117 | ensure_dir(location)
118 | zipfp = open(filename, "rb")
119 | try:
120 | zip = zipfile.ZipFile(zipfp, allowZip64=True)
121 | leading = has_leading_dir(zip.namelist()) and flatten
122 | for info in zip.infolist():
123 | name = info.filename
124 | fn = name
125 | if leading:
126 | fn = split_leading_dir(name)[1]
127 | fn = os.path.join(location, fn)
128 | dir = os.path.dirname(fn)
129 | if not is_within_directory(location, fn):
130 | message = (
131 | "The zip file ({}) has a file ({}) trying to install "
132 | "outside target directory ({})"
133 | )
134 | raise InstallationError(message.format(filename, fn, location))
135 | if fn.endswith("/") or fn.endswith("\\"):
136 | # A directory
137 | ensure_dir(fn)
138 | else:
139 | ensure_dir(dir)
140 | # Don't use read() to avoid allocating an arbitrarily large
141 | # chunk of memory for the file's content
142 | fp = zip.open(name)
143 | try:
144 | with open(fn, "wb") as destfp:
145 | shutil.copyfileobj(fp, destfp)
146 | finally:
147 | fp.close()
148 | if zip_item_is_executable(info):
149 | set_extracted_file_to_default_mode_plus_executable(fn)
150 | finally:
151 | zipfp.close()
152 |
153 |
154 | def untar_file(filename: str, location: str) -> None:
155 | """
156 | Untar the file (with path `filename`) to the destination `location`.
157 | All files are written based on system defaults and umask (i.e. permissions
158 | are not preserved), except that regular file members with any execute
159 | permissions (user, group, or world) have "chmod +x" applied on top of the
160 | default. Note that for windows, any execute changes using os.chmod are
161 | no-ops per the python docs.
162 | """
163 | ensure_dir(location)
164 | if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"):
165 | mode = "r:gz"
166 | elif filename.lower().endswith(BZ2_EXTENSIONS):
167 | mode = "r:bz2"
168 | elif filename.lower().endswith(XZ_EXTENSIONS):
169 | mode = "r:xz"
170 | elif filename.lower().endswith(".tar"):
171 | mode = "r"
172 | else:
173 | logger.warning(
174 | "Cannot determine compression type for file %s",
175 | filename,
176 | )
177 | mode = "r:*"
178 |
179 | tar = tarfile.open(filename, mode, encoding="utf-8")
180 | try:
181 | leading = has_leading_dir([member.name for member in tar.getmembers()])
182 |
183 | # PEP 706 added `tarfile.data_filter`, and made some other changes to
184 | # Python's tarfile module (see below). The features were backported to
185 | # security releases.
186 | try:
187 | data_filter = tarfile.data_filter
188 | except AttributeError:
189 | _untar_without_filter(filename, location, tar, leading)
190 | else:
191 | default_mode_plus_executable = _get_default_mode_plus_executable()
192 |
193 | if leading:
194 | # Strip the leading directory from all files in the archive,
195 | # including hardlink targets (which are relative to the
196 | # unpack location).
197 | for member in tar.getmembers():
198 | name_lead, name_rest = split_leading_dir(member.name)
199 | member.name = name_rest
200 | if member.islnk():
201 | lnk_lead, lnk_rest = split_leading_dir(member.linkname)
202 | if lnk_lead == name_lead:
203 | member.linkname = lnk_rest
204 |
205 | def pip_filter(member: tarfile.TarInfo, path: str) -> tarfile.TarInfo:
206 | orig_mode = member.mode
207 | try:
208 | try:
209 | member = data_filter(member, location)
210 | except tarfile.LinkOutsideDestinationError:
211 | if sys.version_info[:3] in {
212 | (3, 8, 17),
213 | (3, 9, 17),
214 | (3, 10, 12),
215 | (3, 11, 4),
216 | }:
217 | # The tarfile filter in specific Python versions
218 | # raises LinkOutsideDestinationError on valid input
219 | # (https://github.com/python/cpython/issues/107845)
220 | # Ignore the error there, but do use the
221 | # more lax `tar_filter`
222 | member = tarfile.tar_filter(member, location)
223 | else:
224 | raise
225 | except tarfile.TarError as exc:
226 | message = "Invalid member in the tar file {}: {}"
227 | # Filter error messages mention the member name.
228 | # No need to add it here.
229 | raise InstallationError(
230 | message.format(
231 | filename,
232 | exc,
233 | )
234 | )
235 | if member.isfile() and orig_mode & 0o111:
236 | member.mode = default_mode_plus_executable
237 | else:
238 | # See PEP 706 note above.
239 | # The PEP changed this from `int` to `Optional[int]`,
240 | # where None means "use the default". Mypy doesn't
241 | # know this yet.
242 | member.mode = None # type: ignore [assignment]
243 | return member
244 |
245 | tar.extractall(location, filter=pip_filter)
246 |
247 | finally:
248 | tar.close()
249 |
250 |
251 | def _untar_without_filter(
252 | filename: str,
253 | location: str,
254 | tar: tarfile.TarFile,
255 | leading: bool,
256 | ) -> None:
257 | """Fallback for Python without tarfile.data_filter"""
258 | for member in tar.getmembers():
259 | fn = member.name
260 | if leading:
261 | fn = split_leading_dir(fn)[1]
262 | path = os.path.join(location, fn)
263 | if not is_within_directory(location, path):
264 | message = (
265 | "The tar file ({}) has a file ({}) trying to install "
266 | "outside target directory ({})"
267 | )
268 | raise InstallationError(message.format(filename, path, location))
269 | if member.isdir():
270 | ensure_dir(path)
271 | elif member.issym():
272 | try:
273 | tar._extract_member(member, path)
274 | except Exception as exc:
275 | # Some corrupt tar files seem to produce this
276 | # (specifically bad symlinks)
277 | logger.warning(
278 | "In the tar file %s the member %s is invalid: %s",
279 | filename,
280 | member.name,
281 | exc,
282 | )
283 | continue
284 | else:
285 | try:
286 | fp = tar.extractfile(member)
287 | except (KeyError, AttributeError) as exc:
288 | # Some corrupt tar files seem to produce this
289 | # (specifically bad symlinks)
290 | logger.warning(
291 | "In the tar file %s the member %s is invalid: %s",
292 | filename,
293 | member.name,
294 | exc,
295 | )
296 | continue
297 | ensure_dir(os.path.dirname(path))
298 | assert fp is not None
299 | with open(path, "wb") as destfp:
300 | shutil.copyfileobj(fp, destfp)
301 | fp.close()
302 | # Update the timestamp (useful for cython compiled files)
303 | tar.utime(member, path)
304 | # member have any execute permissions for user/group/world?
305 | if member.mode & 0o111:
306 | set_extracted_file_to_default_mode_plus_executable(path)
307 |
308 |
309 | def unpack_file(
310 | filename: str,
311 | location: str,
312 | content_type: Optional[str] = None,
313 | ) -> None:
314 | filename = os.path.realpath(filename)
315 | if (
316 | content_type == "application/zip"
317 | or filename.lower().endswith(ZIP_EXTENSIONS)
318 | or zipfile.is_zipfile(filename)
319 | ):
320 | unzip_file(filename, location, flatten=not filename.endswith(".whl"))
321 | elif (
322 | content_type == "application/x-gzip"
323 | or tarfile.is_tarfile(filename)
324 | or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)
325 | ):
326 | untar_file(filename, location)
327 | else:
328 | # FIXME: handle?
329 | # FIXME: magic signatures?
330 | logger.critical(
331 | "Cannot unpack file %s (downloaded from %s, content-type: %s); "
332 | "cannot detect archive format",
333 | filename,
334 | location,
335 | content_type,
336 | )
337 | raise InstallationError(f"Cannot determine archive format of {location}")
338 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pygments.formatters.rtf
3 | ~~~~~~~~~~~~~~~~~~~~~~~
4 |
5 | A formatter that generates RTF files.
6 |
7 | :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
8 | :license: BSD, see LICENSE for details.
9 | """
10 |
11 | from collections import OrderedDict
12 | from pip._vendor.pygments.formatter import Formatter
13 | from pip._vendor.pygments.style import _ansimap
14 | from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt, surrogatepair
15 |
16 |
17 | __all__ = ['RtfFormatter']
18 |
19 |
20 | class RtfFormatter(Formatter):
21 | """
22 | Format tokens as RTF markup. This formatter automatically outputs full RTF
23 | documents with color information and other useful stuff. Perfect for Copy and
24 | Paste into Microsoft(R) Word(R) documents.
25 |
26 | Please note that ``encoding`` and ``outencoding`` options are ignored.
27 | The RTF format is ASCII natively, but handles unicode characters correctly
28 | thanks to escape sequences.
29 |
30 | .. versionadded:: 0.6
31 |
32 | Additional options accepted:
33 |
34 | `style`
35 | The style to use, can be a string or a Style subclass (default:
36 | ``'default'``).
37 |
38 | `fontface`
39 | The used font family, for example ``Bitstream Vera Sans``. Defaults to
40 | some generic font which is supposed to have fixed width.
41 |
42 | `fontsize`
43 | Size of the font used. Size is specified in half points. The
44 | default is 24 half-points, giving a size 12 font.
45 |
46 | .. versionadded:: 2.0
47 |
48 | `linenos`
49 | Turn on line numbering (default: ``False``).
50 |
51 | .. versionadded:: 2.18
52 |
53 | `lineno_fontsize`
54 | Font size for line numbers. Size is specified in half points
55 | (default: `fontsize`).
56 |
57 | .. versionadded:: 2.18
58 |
59 | `lineno_padding`
60 | Number of spaces between the (inline) line numbers and the
61 | source code (default: ``2``).
62 |
63 | .. versionadded:: 2.18
64 |
65 | `linenostart`
66 | The line number for the first line (default: ``1``).
67 |
68 | .. versionadded:: 2.18
69 |
70 | `linenostep`
71 | If set to a number n > 1, only every nth line number is printed.
72 |
73 | .. versionadded:: 2.18
74 |
75 | `lineno_color`
76 | Color for line numbers specified as a hex triplet, e.g. ``'5e5e5e'``.
77 | Defaults to the style's line number color if it is a hex triplet,
78 | otherwise ansi bright black.
79 |
80 | .. versionadded:: 2.18
81 |
82 | `hl_lines`
83 | Specify a list of lines to be highlighted, as line numbers separated by
84 | spaces, e.g. ``'3 7 8'``. The line numbers are relative to the input
85 | (i.e. the first line is line 1) unless `hl_linenostart` is set.
86 |
87 | .. versionadded:: 2.18
88 |
89 | `hl_color`
90 | Color for highlighting the lines specified in `hl_lines`, specified as
91 | a hex triplet (default: style's `highlight_color`).
92 |
93 | .. versionadded:: 2.18
94 |
95 | `hl_linenostart`
96 | If set to ``True`` line numbers in `hl_lines` are specified
97 | relative to `linenostart` (default ``False``).
98 |
99 | .. versionadded:: 2.18
100 | """
101 | name = 'RTF'
102 | aliases = ['rtf']
103 | filenames = ['*.rtf']
104 |
105 | def __init__(self, **options):
106 | r"""
107 | Additional options accepted:
108 |
109 | ``fontface``
110 | Name of the font used. Could for example be ``'Courier New'``
111 | to further specify the default which is ``'\fmodern'``. The RTF
112 | specification claims that ``\fmodern`` are "Fixed-pitch serif
113 | and sans serif fonts". Hope every RTF implementation thinks
114 | the same about modern...
115 |
116 | """
117 | Formatter.__init__(self, **options)
118 | self.fontface = options.get('fontface') or ''
119 | self.fontsize = get_int_opt(options, 'fontsize', 0)
120 | self.linenos = get_bool_opt(options, 'linenos', False)
121 | self.lineno_fontsize = get_int_opt(options, 'lineno_fontsize',
122 | self.fontsize)
123 | self.lineno_padding = get_int_opt(options, 'lineno_padding', 2)
124 | self.linenostart = abs(get_int_opt(options, 'linenostart', 1))
125 | self.linenostep = abs(get_int_opt(options, 'linenostep', 1))
126 | self.hl_linenostart = get_bool_opt(options, 'hl_linenostart', False)
127 |
128 | self.hl_color = options.get('hl_color', '')
129 | if not self.hl_color:
130 | self.hl_color = self.style.highlight_color
131 |
132 | self.hl_lines = []
133 | for lineno in get_list_opt(options, 'hl_lines', []):
134 | try:
135 | lineno = int(lineno)
136 | if self.hl_linenostart:
137 | lineno = lineno - self.linenostart + 1
138 | self.hl_lines.append(lineno)
139 | except ValueError:
140 | pass
141 |
142 | self.lineno_color = options.get('lineno_color', '')
143 | if not self.lineno_color:
144 | if self.style.line_number_color == 'inherit':
145 | # style color is the css value 'inherit'
146 | # default to ansi bright-black
147 | self.lineno_color = _ansimap['ansibrightblack']
148 | else:
149 | # style color is assumed to be a hex triplet as other
150 | # colors in pygments/style.py
151 | self.lineno_color = self.style.line_number_color
152 |
153 | self.color_mapping = self._create_color_mapping()
154 |
155 | def _escape(self, text):
156 | return text.replace('\\', '\\\\') \
157 | .replace('{', '\\{') \
158 | .replace('}', '\\}')
159 |
160 | def _escape_text(self, text):
161 | # empty strings, should give a small performance improvement
162 | if not text:
163 | return ''
164 |
165 | # escape text
166 | text = self._escape(text)
167 |
168 | buf = []
169 | for c in text:
170 | cn = ord(c)
171 | if cn < (2**7):
172 | # ASCII character
173 | buf.append(str(c))
174 | elif (2**7) <= cn < (2**16):
175 | # single unicode escape sequence
176 | buf.append('{\\u%d}' % cn)
177 | elif (2**16) <= cn:
178 | # RTF limits unicode to 16 bits.
179 | # Force surrogate pairs
180 | buf.append('{\\u%d}{\\u%d}' % surrogatepair(cn))
181 |
182 | return ''.join(buf).replace('\n', '\\par')
183 |
184 | @staticmethod
185 | def hex_to_rtf_color(hex_color):
186 | if hex_color[0] == "#":
187 | hex_color = hex_color[1:]
188 |
189 | return '\\red%d\\green%d\\blue%d;' % (
190 | int(hex_color[0:2], 16),
191 | int(hex_color[2:4], 16),
192 | int(hex_color[4:6], 16)
193 | )
194 |
195 | def _split_tokens_on_newlines(self, tokensource):
196 | """
197 | Split tokens containing newline characters into multiple token
198 | each representing a line of the input file. Needed for numbering
199 | lines of e.g. multiline comments.
200 | """
201 | for ttype, value in tokensource:
202 | if value == '\n':
203 | yield (ttype, value)
204 | elif "\n" in value:
205 | lines = value.split("\n")
206 | for line in lines[:-1]:
207 | yield (ttype, line+"\n")
208 | if lines[-1]:
209 | yield (ttype, lines[-1])
210 | else:
211 | yield (ttype, value)
212 |
213 | def _create_color_mapping(self):
214 | """
215 | Create a mapping of style hex colors to index/offset in
216 | the RTF color table.
217 | """
218 | color_mapping = OrderedDict()
219 | offset = 1
220 |
221 | if self.linenos:
222 | color_mapping[self.lineno_color] = offset
223 | offset += 1
224 |
225 | if self.hl_lines:
226 | color_mapping[self.hl_color] = offset
227 | offset += 1
228 |
229 | for _, style in self.style:
230 | for color in style['color'], style['bgcolor'], style['border']:
231 | if color and color not in color_mapping:
232 | color_mapping[color] = offset
233 | offset += 1
234 |
235 | return color_mapping
236 |
237 | @property
238 | def _lineno_template(self):
239 | if self.lineno_fontsize != self.fontsize:
240 | return '{{\\fs{} \\cf{} %s{}}}'.format(self.lineno_fontsize,
241 | self.color_mapping[self.lineno_color],
242 | " " * self.lineno_padding)
243 |
244 | return '{{\\cf{} %s{}}}'.format(self.color_mapping[self.lineno_color],
245 | " " * self.lineno_padding)
246 |
247 | @property
248 | def _hl_open_str(self):
249 | return rf'{{\highlight{self.color_mapping[self.hl_color]} '
250 |
251 | @property
252 | def _rtf_header(self):
253 | lines = []
254 | # rtf 1.8 header
255 | lines.append('{\\rtf1\\ansi\\uc0\\deff0'
256 | '{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}'
257 | % (self.fontface and ' '
258 | + self._escape(self.fontface) or ''))
259 |
260 | # color table
261 | lines.append('{\\colortbl;')
262 | for color, _ in self.color_mapping.items():
263 | lines.append(self.hex_to_rtf_color(color))
264 | lines.append('}')
265 |
266 | # font and fontsize
267 | lines.append('\\f0\\sa0')
268 | if self.fontsize:
269 | lines.append('\\fs%d' % self.fontsize)
270 |
271 | # ensure Libre Office Writer imports and renders consecutive
272 | # space characters the same width, needed for line numbering.
273 | # https://bugs.documentfoundation.org/show_bug.cgi?id=144050
274 | lines.append('\\dntblnsbdb')
275 |
276 | return lines
277 |
278 | def format_unencoded(self, tokensource, outfile):
279 | for line in self._rtf_header:
280 | outfile.write(line + "\n")
281 |
282 | tokensource = self._split_tokens_on_newlines(tokensource)
283 |
284 | # first pass of tokens to count lines, needed for line numbering
285 | if self.linenos:
286 | line_count = 0
287 | tokens = [] # for copying the token source generator
288 | for ttype, value in tokensource:
289 | tokens.append((ttype, value))
290 | if value.endswith("\n"):
291 | line_count += 1
292 |
293 | # width of line number strings (for padding with spaces)
294 | linenos_width = len(str(line_count+self.linenostart-1))
295 |
296 | tokensource = tokens
297 |
298 | # highlight stream
299 | lineno = 1
300 | start_new_line = True
301 | for ttype, value in tokensource:
302 | if start_new_line and lineno in self.hl_lines:
303 | outfile.write(self._hl_open_str)
304 |
305 | if start_new_line and self.linenos:
306 | if (lineno-self.linenostart+1)%self.linenostep == 0:
307 | current_lineno = lineno + self.linenostart - 1
308 | lineno_str = str(current_lineno).rjust(linenos_width)
309 | else:
310 | lineno_str = "".rjust(linenos_width)
311 | outfile.write(self._lineno_template % lineno_str)
312 |
313 | while not self.style.styles_token(ttype) and ttype.parent:
314 | ttype = ttype.parent
315 | style = self.style.style_for_token(ttype)
316 | buf = []
317 | if style['bgcolor']:
318 | buf.append('\\cb%d' % self.color_mapping[style['bgcolor']])
319 | if style['color']:
320 | buf.append('\\cf%d' % self.color_mapping[style['color']])
321 | if style['bold']:
322 | buf.append('\\b')
323 | if style['italic']:
324 | buf.append('\\i')
325 | if style['underline']:
326 | buf.append('\\ul')
327 | if style['border']:
328 | buf.append('\\chbrdr\\chcfpat%d' %
329 | self.color_mapping[style['border']])
330 | start = ''.join(buf)
331 | if start:
332 | outfile.write(f'{{{start} ')
333 | outfile.write(self._escape_text(value))
334 | if start:
335 | outfile.write('}')
336 | start_new_line = False
337 |
338 | # complete line of input
339 | if value.endswith("\n"):
340 | # close line highlighting
341 | if lineno in self.hl_lines:
342 | outfile.write('}')
343 | # newline in RTF file after closing }
344 | outfile.write("\n")
345 |
346 | start_new_line = True
347 | lineno += 1
348 |
349 | outfile.write('}\n')
350 |
```