This is page 59 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
--------------------------------------------------------------------------------
/search_results.json:
--------------------------------------------------------------------------------
```json
1 | [
2 | {
3 | "name": "test.py",
4 | "path": "/Users/user/Documents/myproject/.venv/test.py",
5 | "size": 144,
6 | "created": "2025-02-27 13:27:09"
7 | },
8 | {
9 | "name": "testing.py",
10 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/flask/testing.py",
11 | "size": 10163,
12 | "created": "2025-02-27 13:35:44"
13 | },
14 | {
15 | "name": "testing.cpython-312.pyc",
16 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/flask/__pycache__/testing.cpython-312.pyc",
17 | "size": 13700,
18 | "created": "2025-02-27 13:35:52"
19 | },
20 | {
21 | "name": "test_firefox.json",
22 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/useragent/test/test_firefox.json",
23 | "size": 44953,
24 | "created": "2025-02-27 13:35:49"
25 | },
26 | {
27 | "name": "test_os.json",
28 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/useragent/test/test_os.json",
29 | "size": 11390,
30 | "created": "2025-02-27 13:35:50"
31 | },
32 | {
33 | "name": "test_device.json",
34 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/useragent/test/test_device.json",
35 | "size": 1305,
36 | "created": "2025-02-27 13:35:49"
37 | },
38 | {
39 | "name": "test_pgts_browser.json",
40 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/useragent/test/test_pgts_browser.json",
41 | "size": 2055934,
42 | "created": "2025-02-27 13:35:49"
43 | },
44 | {
45 | "name": "test_browser.json",
46 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/useragent/test/test_browser.json",
47 | "size": 12257,
48 | "created": "2025-02-27 13:35:50"
49 | },
50 | {
51 | "name": "test_additional_os.json",
52 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/useragent/test/test_additional_os.json",
53 | "size": 4376,
54 | "created": "2025-02-27 13:35:49"
55 | },
56 | {
57 | "name": "tests.py",
58 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/jinja2/tests.py",
59 | "size": 5926,
60 | "created": "2025-02-27 13:35:44"
61 | },
62 | {
63 | "name": "tests.cpython-312.pyc",
64 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/jinja2/__pycache__/tests.cpython-312.pyc",
65 | "size": 9048,
66 | "created": "2025-02-27 13:35:50"
67 | },
68 | {
69 | "name": "test.py",
70 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/werkzeug/test.py",
71 | "size": 52782,
72 | "created": "2025-02-27 13:35:45"
73 | },
74 | {
75 | "name": "testapp.py",
76 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/werkzeug/testapp.py",
77 | "size": 6332,
78 | "created": "2025-02-27 13:35:45"
79 | },
80 | {
81 | "name": "testapp.cpython-312.pyc",
82 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/testapp.cpython-312.pyc",
83 | "size": 8889,
84 | "created": "2025-02-27 13:35:54"
85 | },
86 | {
87 | "name": "test.cpython-312.pyc",
88 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/werkzeug/__pycache__/test.cpython-312.pyc",
89 | "size": 59898,
90 | "created": "2025-02-27 13:35:53"
91 | },
92 | {
93 | "name": "test_tree.py",
94 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_tree.py",
95 | "size": 48129,
96 | "created": "2025-02-27 13:35:49"
97 | },
98 | {
99 | "name": "test_soup.py",
100 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_soup.py",
101 | "size": 19877,
102 | "created": "2025-02-27 13:35:49"
103 | },
104 | {
105 | "name": "test_lxml.py",
106 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_lxml.py",
107 | "size": 7635,
108 | "created": "2025-02-27 13:35:50"
109 | },
110 | {
111 | "name": "test_dammit.py",
112 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_dammit.py",
113 | "size": 15451,
114 | "created": "2025-02-27 13:35:49"
115 | },
116 | {
117 | "name": "test_docs.py",
118 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_docs.py",
119 | "size": 1127,
120 | "created": "2025-02-27 13:35:50"
121 | },
122 | {
123 | "name": "test_navigablestring.py",
124 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_navigablestring.py",
125 | "size": 5081,
126 | "created": "2025-02-27 13:35:49"
127 | },
128 | {
129 | "name": "test_element.py",
130 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_element.py",
131 | "size": 2377,
132 | "created": "2025-02-27 13:35:50"
133 | },
134 | {
135 | "name": "test_builder_registry.py",
136 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_builder_registry.py",
137 | "size": 5114,
138 | "created": "2025-02-27 13:35:49"
139 | },
140 | {
141 | "name": "test_builder.py",
142 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_builder.py",
143 | "size": 1115,
144 | "created": "2025-02-27 13:35:50"
145 | },
146 | {
147 | "name": "test_formatter.py",
148 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_formatter.py",
149 | "size": 4148,
150 | "created": "2025-02-27 13:35:49"
151 | },
152 | {
153 | "name": "test_tag.py",
154 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_tag.py",
155 | "size": 9616,
156 | "created": "2025-02-27 13:35:49"
157 | },
158 | {
159 | "name": "test_pageelement.py",
160 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_pageelement.py",
161 | "size": 14274,
162 | "created": "2025-02-27 13:35:50"
163 | },
164 | {
165 | "name": "test_css.py",
166 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_css.py",
167 | "size": 17279,
168 | "created": "2025-02-27 13:35:49"
169 | },
170 | {
171 | "name": "test_fuzz.py",
172 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_fuzz.py",
173 | "size": 6972,
174 | "created": "2025-02-27 13:35:49"
175 | },
176 | {
177 | "name": "test_html5lib.py",
178 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_html5lib.py",
179 | "size": 8322,
180 | "created": "2025-02-27 13:35:49"
181 | },
182 | {
183 | "name": "test_htmlparser.py",
184 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/test_htmlparser.py",
185 | "size": 6256,
186 | "created": "2025-02-27 13:35:50"
187 | },
188 | {
189 | "name": "test_tree.cpython-312.pyc",
190 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tree.cpython-312.pyc",
191 | "size": 82690,
192 | "created": "2025-02-27 13:36:03"
193 | },
194 | {
195 | "name": "test_navigablestring.cpython-312.pyc",
196 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_navigablestring.cpython-312.pyc",
197 | "size": 7663,
198 | "created": "2025-02-27 13:36:03"
199 | },
200 | {
201 | "name": "test_builder.cpython-312.pyc",
202 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_builder.cpython-312.pyc",
203 | "size": 1594,
204 | "created": "2025-02-27 13:36:04"
205 | },
206 | {
207 | "name": "test_pageelement.cpython-312.pyc",
208 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_pageelement.cpython-312.pyc",
209 | "size": 20412,
210 | "created": "2025-02-27 13:36:04"
211 | },
212 | {
213 | "name": "test_css.cpython-312.pyc",
214 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_css.cpython-312.pyc",
215 | "size": 28521,
216 | "created": "2025-02-27 13:36:05"
217 | },
218 | {
219 | "name": "test_html5lib.cpython-312.pyc",
220 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_html5lib.cpython-312.pyc",
221 | "size": 10873,
222 | "created": "2025-02-27 13:36:04"
223 | },
224 | {
225 | "name": "test_dammit.cpython-312.pyc",
226 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_dammit.cpython-312.pyc",
227 | "size": 17247,
228 | "created": "2025-02-27 13:36:04"
229 | },
230 | {
231 | "name": "test_builder_registry.cpython-312.pyc",
232 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_builder_registry.cpython-312.pyc",
233 | "size": 7531,
234 | "created": "2025-02-27 13:36:05"
235 | },
236 | {
237 | "name": "test_tag.cpython-312.pyc",
238 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tag.cpython-312.pyc",
239 | "size": 14092,
240 | "created": "2025-02-27 13:36:05"
241 | },
242 | {
243 | "name": "test_element.cpython-312.pyc",
244 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_element.cpython-312.pyc",
245 | "size": 3637,
246 | "created": "2025-02-27 13:36:04"
247 | },
248 | {
249 | "name": "test_htmlparser.cpython-312.pyc",
250 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_htmlparser.cpython-312.pyc",
251 | "size": 6721,
252 | "created": "2025-02-27 13:36:03"
253 | },
254 | {
255 | "name": "test_formatter.cpython-312.pyc",
256 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_formatter.cpython-312.pyc",
257 | "size": 4695,
258 | "created": "2025-02-27 13:36:05"
259 | },
260 | {
261 | "name": "test_soup.cpython-312.pyc",
262 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_soup.cpython-312.pyc",
263 | "size": 28802,
264 | "created": "2025-02-27 13:36:04"
265 | },
266 | {
267 | "name": "test_lxml.cpython-312.pyc",
268 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_lxml.cpython-312.pyc",
269 | "size": 8329,
270 | "created": "2025-02-27 13:36:04"
271 | },
272 | {
273 | "name": "test_fuzz.cpython-312.pyc",
274 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_fuzz.cpython-312.pyc",
275 | "size": 6761,
276 | "created": "2025-02-27 13:36:05"
277 | },
278 | {
279 | "name": "test_docs.cpython-312.pyc",
280 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/__pycache__/test_docs.cpython-312.pyc",
281 | "size": 567,
282 | "created": "2025-02-27 13:36:04"
283 | },
284 | {
285 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase",
286 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase",
287 | "size": 35,
288 | "created": "2025-02-27 13:36:04"
289 | },
290 | {
291 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase",
292 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase",
293 | "size": 12,
294 | "created": "2025-02-27 13:36:03"
295 | },
296 | {
297 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase",
298 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase",
299 | "size": 19,
300 | "created": "2025-02-27 13:36:04"
301 | },
302 | {
303 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase",
304 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase",
305 | "size": 15347,
306 | "created": "2025-02-27 13:36:04"
307 | },
308 | {
309 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase",
310 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase",
311 | "size": 3546,
312 | "created": "2025-02-27 13:36:04"
313 | },
314 | {
315 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase",
316 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase",
317 | "size": 5,
318 | "created": "2025-02-27 13:36:04"
319 | },
320 | {
321 | "name": "crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase",
322 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase",
323 | "size": 103,
324 | "created": "2025-02-27 13:36:05"
325 | },
326 | {
327 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase",
328 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase",
329 | "size": 10380,
330 | "created": "2025-02-27 13:36:05"
331 | },
332 | {
333 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase",
334 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase",
335 | "size": 23,
336 | "created": "2025-02-27 13:36:05"
337 | },
338 | {
339 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase",
340 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase",
341 | "size": 11502,
342 | "created": "2025-02-27 13:36:04"
343 | },
344 | {
345 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase",
346 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase",
347 | "size": 51495,
348 | "created": "2025-02-27 13:36:05"
349 | },
350 | {
351 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase",
352 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase",
353 | "size": 4317,
354 | "created": "2025-02-27 13:36:05"
355 | },
356 | {
357 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase",
358 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase",
359 | "size": 124,
360 | "created": "2025-02-27 13:36:04"
361 | },
362 | {
363 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase",
364 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase",
365 | "size": 30,
366 | "created": "2025-02-27 13:36:05"
367 | },
368 | {
369 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase",
370 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase",
371 | "size": 15,
372 | "created": "2025-02-27 13:36:03"
373 | },
374 | {
375 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase",
376 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase",
377 | "size": 47,
378 | "created": "2025-02-27 13:36:04"
379 | },
380 | {
381 | "name": "clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase",
382 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase",
383 | "size": 19469,
384 | "created": "2025-02-27 13:36:04"
385 | },
386 | {
387 | "name": "crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase",
388 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase",
389 | "size": 2607,
390 | "created": "2025-02-27 13:36:04"
391 | },
392 | {
393 | "name": "testing.py",
394 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/click/testing.py",
395 | "size": 16084,
396 | "created": "2025-02-27 13:35:44"
397 | },
398 | {
399 | "name": "testing.cpython-312.pyc",
400 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc",
401 | "size": 24577,
402 | "created": "2025-02-27 13:35:50"
403 | },
404 | {
405 | "name": "doctestcompare.py",
406 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/lxml/doctestcompare.py",
407 | "size": 17731,
408 | "created": "2025-02-27 13:35:47"
409 | },
410 | {
411 | "name": "usedoctest.py",
412 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/lxml/usedoctest.py",
413 | "size": 230,
414 | "created": "2025-02-27 13:35:47"
415 | },
416 | {
417 | "name": "usedoctest.py",
418 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/lxml/html/usedoctest.py",
419 | "size": 249,
420 | "created": "2025-02-27 13:35:52"
421 | },
422 | {
423 | "name": "usedoctest.cpython-312.pyc",
424 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/lxml/html/__pycache__/usedoctest.cpython-312.pyc",
425 | "size": 506,
426 | "created": "2025-02-27 13:36:08"
427 | },
428 | {
429 | "name": "usedoctest.cpython-312.pyc",
430 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/lxml/__pycache__/usedoctest.cpython-312.pyc",
431 | "size": 482,
432 | "created": "2025-02-27 13:35:53"
433 | },
434 | {
435 | "name": "doctestcompare.cpython-312.pyc",
436 | "path": "/Users/user/Documents/myproject/.venv/lib/python3.12/site-packages/lxml/__pycache__/doctestcompare.cpython-312.pyc",
437 | "size": 24296,
438 | "created": "2025-02-27 13:35:53"
439 | }
440 | ]
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py:
--------------------------------------------------------------------------------
```python
1 | import contextlib
2 | import ctypes
3 | import platform
4 | import ssl
5 | import typing
6 | from ctypes import (
7 | CDLL,
8 | POINTER,
9 | c_bool,
10 | c_char_p,
11 | c_int32,
12 | c_long,
13 | c_uint32,
14 | c_ulong,
15 | c_void_p,
16 | )
17 | from ctypes.util import find_library
18 |
19 | from ._ssl_constants import _set_ssl_context_verify_mode
20 |
21 | _mac_version = platform.mac_ver()[0]
22 | _mac_version_info = tuple(map(int, _mac_version.split(".")))
23 | if _mac_version_info < (10, 8):
24 | raise ImportError(
25 | f"Only OS X 10.8 and newer are supported, not {_mac_version_info[0]}.{_mac_version_info[1]}"
26 | )
27 |
28 |
29 | def _load_cdll(name: str, macos10_16_path: str) -> CDLL:
30 | """Loads a CDLL by name, falling back to known path on 10.16+"""
31 | try:
32 | # Big Sur is technically 11 but we use 10.16 due to the Big Sur
33 | # beta being labeled as 10.16.
34 | path: str | None
35 | if _mac_version_info >= (10, 16):
36 | path = macos10_16_path
37 | else:
38 | path = find_library(name)
39 | if not path:
40 | raise OSError # Caught and reraised as 'ImportError'
41 | return CDLL(path, use_errno=True)
42 | except OSError:
43 | raise ImportError(f"The library {name} failed to load") from None
44 |
45 |
46 | Security = _load_cdll(
47 | "Security", "/System/Library/Frameworks/Security.framework/Security"
48 | )
49 | CoreFoundation = _load_cdll(
50 | "CoreFoundation",
51 | "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation",
52 | )
53 |
54 | Boolean = c_bool
55 | CFIndex = c_long
56 | CFStringEncoding = c_uint32
57 | CFData = c_void_p
58 | CFString = c_void_p
59 | CFArray = c_void_p
60 | CFMutableArray = c_void_p
61 | CFError = c_void_p
62 | CFType = c_void_p
63 | CFTypeID = c_ulong
64 | CFTypeRef = POINTER(CFType)
65 | CFAllocatorRef = c_void_p
66 |
67 | OSStatus = c_int32
68 |
69 | CFErrorRef = POINTER(CFError)
70 | CFDataRef = POINTER(CFData)
71 | CFStringRef = POINTER(CFString)
72 | CFArrayRef = POINTER(CFArray)
73 | CFMutableArrayRef = POINTER(CFMutableArray)
74 | CFArrayCallBacks = c_void_p
75 | CFOptionFlags = c_uint32
76 |
77 | SecCertificateRef = POINTER(c_void_p)
78 | SecPolicyRef = POINTER(c_void_p)
79 | SecTrustRef = POINTER(c_void_p)
80 | SecTrustResultType = c_uint32
81 | SecTrustOptionFlags = c_uint32
82 |
83 | try:
84 | Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef]
85 | Security.SecCertificateCreateWithData.restype = SecCertificateRef
86 |
87 | Security.SecCertificateCopyData.argtypes = [SecCertificateRef]
88 | Security.SecCertificateCopyData.restype = CFDataRef
89 |
90 | Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p]
91 | Security.SecCopyErrorMessageString.restype = CFStringRef
92 |
93 | Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef]
94 | Security.SecTrustSetAnchorCertificates.restype = OSStatus
95 |
96 | Security.SecTrustSetAnchorCertificatesOnly.argtypes = [SecTrustRef, Boolean]
97 | Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus
98 |
99 | Security.SecPolicyCreateRevocation.argtypes = [CFOptionFlags]
100 | Security.SecPolicyCreateRevocation.restype = SecPolicyRef
101 |
102 | Security.SecPolicyCreateSSL.argtypes = [Boolean, CFStringRef]
103 | Security.SecPolicyCreateSSL.restype = SecPolicyRef
104 |
105 | Security.SecTrustCreateWithCertificates.argtypes = [
106 | CFTypeRef,
107 | CFTypeRef,
108 | POINTER(SecTrustRef),
109 | ]
110 | Security.SecTrustCreateWithCertificates.restype = OSStatus
111 |
112 | Security.SecTrustGetTrustResult.argtypes = [
113 | SecTrustRef,
114 | POINTER(SecTrustResultType),
115 | ]
116 | Security.SecTrustGetTrustResult.restype = OSStatus
117 |
118 | Security.SecTrustRef = SecTrustRef # type: ignore[attr-defined]
119 | Security.SecTrustResultType = SecTrustResultType # type: ignore[attr-defined]
120 | Security.OSStatus = OSStatus # type: ignore[attr-defined]
121 |
122 | kSecRevocationUseAnyAvailableMethod = 3
123 | kSecRevocationRequirePositiveResponse = 8
124 |
125 | CoreFoundation.CFRelease.argtypes = [CFTypeRef]
126 | CoreFoundation.CFRelease.restype = None
127 |
128 | CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef]
129 | CoreFoundation.CFGetTypeID.restype = CFTypeID
130 |
131 | CoreFoundation.CFStringCreateWithCString.argtypes = [
132 | CFAllocatorRef,
133 | c_char_p,
134 | CFStringEncoding,
135 | ]
136 | CoreFoundation.CFStringCreateWithCString.restype = CFStringRef
137 |
138 | CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding]
139 | CoreFoundation.CFStringGetCStringPtr.restype = c_char_p
140 |
141 | CoreFoundation.CFStringGetCString.argtypes = [
142 | CFStringRef,
143 | c_char_p,
144 | CFIndex,
145 | CFStringEncoding,
146 | ]
147 | CoreFoundation.CFStringGetCString.restype = c_bool
148 |
149 | CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex]
150 | CoreFoundation.CFDataCreate.restype = CFDataRef
151 |
152 | CoreFoundation.CFDataGetLength.argtypes = [CFDataRef]
153 | CoreFoundation.CFDataGetLength.restype = CFIndex
154 |
155 | CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef]
156 | CoreFoundation.CFDataGetBytePtr.restype = c_void_p
157 |
158 | CoreFoundation.CFArrayCreate.argtypes = [
159 | CFAllocatorRef,
160 | POINTER(CFTypeRef),
161 | CFIndex,
162 | CFArrayCallBacks,
163 | ]
164 | CoreFoundation.CFArrayCreate.restype = CFArrayRef
165 |
166 | CoreFoundation.CFArrayCreateMutable.argtypes = [
167 | CFAllocatorRef,
168 | CFIndex,
169 | CFArrayCallBacks,
170 | ]
171 | CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef
172 |
173 | CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p]
174 | CoreFoundation.CFArrayAppendValue.restype = None
175 |
176 | CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef]
177 | CoreFoundation.CFArrayGetCount.restype = CFIndex
178 |
179 | CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex]
180 | CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p
181 |
182 | CoreFoundation.CFErrorGetCode.argtypes = [CFErrorRef]
183 | CoreFoundation.CFErrorGetCode.restype = CFIndex
184 |
185 | CoreFoundation.CFErrorCopyDescription.argtypes = [CFErrorRef]
186 | CoreFoundation.CFErrorCopyDescription.restype = CFStringRef
187 |
188 | CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( # type: ignore[attr-defined]
189 | CoreFoundation, "kCFAllocatorDefault"
190 | )
191 | CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll( # type: ignore[attr-defined]
192 | CoreFoundation, "kCFTypeArrayCallBacks"
193 | )
194 |
195 | CoreFoundation.CFTypeRef = CFTypeRef # type: ignore[attr-defined]
196 | CoreFoundation.CFArrayRef = CFArrayRef # type: ignore[attr-defined]
197 | CoreFoundation.CFStringRef = CFStringRef # type: ignore[attr-defined]
198 | CoreFoundation.CFErrorRef = CFErrorRef # type: ignore[attr-defined]
199 |
200 | except AttributeError:
201 | raise ImportError("Error initializing ctypes") from None
202 |
203 |
204 | def _handle_osstatus(result: OSStatus, _: typing.Any, args: typing.Any) -> typing.Any:
205 | """
206 | Raises an error if the OSStatus value is non-zero.
207 | """
208 | if int(result) == 0:
209 | return args
210 |
211 | # Returns a CFString which we need to transform
212 | # into a UTF-8 Python string.
213 | error_message_cfstring = None
214 | try:
215 | error_message_cfstring = Security.SecCopyErrorMessageString(result, None)
216 |
217 | # First step is convert the CFString into a C string pointer.
218 | # We try the fast no-copy way first.
219 | error_message_cfstring_c_void_p = ctypes.cast(
220 | error_message_cfstring, ctypes.POINTER(ctypes.c_void_p)
221 | )
222 | message = CoreFoundation.CFStringGetCStringPtr(
223 | error_message_cfstring_c_void_p, CFConst.kCFStringEncodingUTF8
224 | )
225 |
226 | # Quoting the Apple dev docs:
227 | #
228 | # "A pointer to a C string or NULL if the internal
229 | # storage of theString does not allow this to be
230 | # returned efficiently."
231 | #
232 | # So we need to get our hands dirty.
233 | if message is None:
234 | buffer = ctypes.create_string_buffer(1024)
235 | result = CoreFoundation.CFStringGetCString(
236 | error_message_cfstring_c_void_p,
237 | buffer,
238 | 1024,
239 | CFConst.kCFStringEncodingUTF8,
240 | )
241 | if not result:
242 | raise OSError("Error copying C string from CFStringRef")
243 | message = buffer.value
244 |
245 | finally:
246 | if error_message_cfstring is not None:
247 | CoreFoundation.CFRelease(error_message_cfstring)
248 |
249 | # If no message can be found for this status we come
250 | # up with a generic one that forwards the status code.
251 | if message is None or message == "":
252 | message = f"SecureTransport operation returned a non-zero OSStatus: {result}"
253 |
254 | raise ssl.SSLError(message)
255 |
256 |
257 | Security.SecTrustCreateWithCertificates.errcheck = _handle_osstatus # type: ignore[assignment]
258 | Security.SecTrustSetAnchorCertificates.errcheck = _handle_osstatus # type: ignore[assignment]
259 | Security.SecTrustSetAnchorCertificatesOnly.errcheck = _handle_osstatus # type: ignore[assignment]
260 | Security.SecTrustGetTrustResult.errcheck = _handle_osstatus # type: ignore[assignment]
261 |
262 |
263 | class CFConst:
264 | """CoreFoundation constants"""
265 |
266 | kCFStringEncodingUTF8 = CFStringEncoding(0x08000100)
267 |
268 | errSecIncompleteCertRevocationCheck = -67635
269 | errSecHostNameMismatch = -67602
270 | errSecCertificateExpired = -67818
271 | errSecNotTrusted = -67843
272 |
273 |
274 | def _bytes_to_cf_data_ref(value: bytes) -> CFDataRef: # type: ignore[valid-type]
275 | return CoreFoundation.CFDataCreate( # type: ignore[no-any-return]
276 | CoreFoundation.kCFAllocatorDefault, value, len(value)
277 | )
278 |
279 |
280 | def _bytes_to_cf_string(value: bytes) -> CFString:
281 | """
282 | Given a Python binary data, create a CFString.
283 | The string must be CFReleased by the caller.
284 | """
285 | c_str = ctypes.c_char_p(value)
286 | cf_str = CoreFoundation.CFStringCreateWithCString(
287 | CoreFoundation.kCFAllocatorDefault,
288 | c_str,
289 | CFConst.kCFStringEncodingUTF8,
290 | )
291 | return cf_str # type: ignore[no-any-return]
292 |
293 |
294 | def _cf_string_ref_to_str(cf_string_ref: CFStringRef) -> str | None: # type: ignore[valid-type]
295 | """
296 | Creates a Unicode string from a CFString object. Used entirely for error
297 | reporting.
298 | Yes, it annoys me quite a lot that this function is this complex.
299 | """
300 |
301 | string = CoreFoundation.CFStringGetCStringPtr(
302 | cf_string_ref, CFConst.kCFStringEncodingUTF8
303 | )
304 | if string is None:
305 | buffer = ctypes.create_string_buffer(1024)
306 | result = CoreFoundation.CFStringGetCString(
307 | cf_string_ref, buffer, 1024, CFConst.kCFStringEncodingUTF8
308 | )
309 | if not result:
310 | raise OSError("Error copying C string from CFStringRef")
311 | string = buffer.value
312 | if string is not None:
313 | string = string.decode("utf-8")
314 | return string # type: ignore[no-any-return]
315 |
316 |
317 | def _der_certs_to_cf_cert_array(certs: list[bytes]) -> CFMutableArrayRef: # type: ignore[valid-type]
318 | """Builds a CFArray of SecCertificateRefs from a list of DER-encoded certificates.
319 | Responsibility of the caller to call CoreFoundation.CFRelease on the CFArray.
320 | """
321 | cf_array = CoreFoundation.CFArrayCreateMutable(
322 | CoreFoundation.kCFAllocatorDefault,
323 | 0,
324 | ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
325 | )
326 | if not cf_array:
327 | raise MemoryError("Unable to allocate memory!")
328 |
329 | for cert_data in certs:
330 | cf_data = None
331 | sec_cert_ref = None
332 | try:
333 | cf_data = _bytes_to_cf_data_ref(cert_data)
334 | sec_cert_ref = Security.SecCertificateCreateWithData(
335 | CoreFoundation.kCFAllocatorDefault, cf_data
336 | )
337 | CoreFoundation.CFArrayAppendValue(cf_array, sec_cert_ref)
338 | finally:
339 | if cf_data:
340 | CoreFoundation.CFRelease(cf_data)
341 | if sec_cert_ref:
342 | CoreFoundation.CFRelease(sec_cert_ref)
343 |
344 | return cf_array # type: ignore[no-any-return]
345 |
346 |
347 | @contextlib.contextmanager
348 | def _configure_context(ctx: ssl.SSLContext) -> typing.Iterator[None]:
349 | check_hostname = ctx.check_hostname
350 | verify_mode = ctx.verify_mode
351 | ctx.check_hostname = False
352 | _set_ssl_context_verify_mode(ctx, ssl.CERT_NONE)
353 | try:
354 | yield
355 | finally:
356 | ctx.check_hostname = check_hostname
357 | _set_ssl_context_verify_mode(ctx, verify_mode)
358 |
359 |
360 | def _verify_peercerts_impl(
361 | ssl_context: ssl.SSLContext,
362 | cert_chain: list[bytes],
363 | server_hostname: str | None = None,
364 | ) -> None:
365 | certs = None
366 | policies = None
367 | trust = None
368 | cf_error = None
369 | try:
370 | if server_hostname is not None:
371 | cf_str_hostname = None
372 | try:
373 | cf_str_hostname = _bytes_to_cf_string(server_hostname.encode("ascii"))
374 | ssl_policy = Security.SecPolicyCreateSSL(True, cf_str_hostname)
375 | finally:
376 | if cf_str_hostname:
377 | CoreFoundation.CFRelease(cf_str_hostname)
378 | else:
379 | ssl_policy = Security.SecPolicyCreateSSL(True, None)
380 |
381 | policies = ssl_policy
382 | if ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_CHAIN:
383 | # Add explicit policy requiring positive revocation checks
384 | policies = CoreFoundation.CFArrayCreateMutable(
385 | CoreFoundation.kCFAllocatorDefault,
386 | 0,
387 | ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks),
388 | )
389 | CoreFoundation.CFArrayAppendValue(policies, ssl_policy)
390 | CoreFoundation.CFRelease(ssl_policy)
391 | revocation_policy = Security.SecPolicyCreateRevocation(
392 | kSecRevocationUseAnyAvailableMethod
393 | | kSecRevocationRequirePositiveResponse
394 | )
395 | CoreFoundation.CFArrayAppendValue(policies, revocation_policy)
396 | CoreFoundation.CFRelease(revocation_policy)
397 | elif ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_LEAF:
398 | raise NotImplementedError("VERIFY_CRL_CHECK_LEAF not implemented for macOS")
399 |
400 | certs = None
401 | try:
402 | certs = _der_certs_to_cf_cert_array(cert_chain)
403 |
404 | # Now that we have certificates loaded and a SecPolicy
405 | # we can finally create a SecTrust object!
406 | trust = Security.SecTrustRef()
407 | Security.SecTrustCreateWithCertificates(
408 | certs, policies, ctypes.byref(trust)
409 | )
410 |
411 | finally:
412 | # The certs are now being held by SecTrust so we can
413 | # release our handles for the array.
414 | if certs:
415 | CoreFoundation.CFRelease(certs)
416 |
417 | # If there are additional trust anchors to load we need to transform
418 | # the list of DER-encoded certificates into a CFArray.
419 | ctx_ca_certs_der: list[bytes] | None = ssl_context.get_ca_certs(
420 | binary_form=True
421 | )
422 | if ctx_ca_certs_der:
423 | ctx_ca_certs = None
424 | try:
425 | ctx_ca_certs = _der_certs_to_cf_cert_array(ctx_ca_certs_der)
426 | Security.SecTrustSetAnchorCertificates(trust, ctx_ca_certs)
427 | finally:
428 | if ctx_ca_certs:
429 | CoreFoundation.CFRelease(ctx_ca_certs)
430 |
431 | # We always want system certificates.
432 | Security.SecTrustSetAnchorCertificatesOnly(trust, False)
433 |
434 | cf_error = CoreFoundation.CFErrorRef()
435 | sec_trust_eval_result = Security.SecTrustEvaluateWithError(
436 | trust, ctypes.byref(cf_error)
437 | )
438 | # sec_trust_eval_result is a bool (0 or 1)
439 | # where 1 means that the certs are trusted.
440 | if sec_trust_eval_result == 1:
441 | is_trusted = True
442 | elif sec_trust_eval_result == 0:
443 | is_trusted = False
444 | else:
445 | raise ssl.SSLError(
446 | f"Unknown result from Security.SecTrustEvaluateWithError: {sec_trust_eval_result!r}"
447 | )
448 |
449 | cf_error_code = 0
450 | if not is_trusted:
451 | cf_error_code = CoreFoundation.CFErrorGetCode(cf_error)
452 |
453 | # If the error is a known failure that we're
454 | # explicitly okay with from SSLContext configuration
455 | # we can set is_trusted accordingly.
456 | if ssl_context.verify_mode != ssl.CERT_REQUIRED and (
457 | cf_error_code == CFConst.errSecNotTrusted
458 | or cf_error_code == CFConst.errSecCertificateExpired
459 | ):
460 | is_trusted = True
461 | elif (
462 | not ssl_context.check_hostname
463 | and cf_error_code == CFConst.errSecHostNameMismatch
464 | ):
465 | is_trusted = True
466 |
467 | # If we're still not trusted then we start to
468 | # construct and raise the SSLCertVerificationError.
469 | if not is_trusted:
470 | cf_error_string_ref = None
471 | try:
472 | cf_error_string_ref = CoreFoundation.CFErrorCopyDescription(cf_error)
473 |
474 | # Can this ever return 'None' if there's a CFError?
475 | cf_error_message = (
476 | _cf_string_ref_to_str(cf_error_string_ref)
477 | or "Certificate verification failed"
478 | )
479 |
480 | # TODO: Not sure if we need the SecTrustResultType for anything?
481 | # We only care whether or not it's a success or failure for now.
482 | sec_trust_result_type = Security.SecTrustResultType()
483 | Security.SecTrustGetTrustResult(
484 | trust, ctypes.byref(sec_trust_result_type)
485 | )
486 |
487 | err = ssl.SSLCertVerificationError(cf_error_message)
488 | err.verify_message = cf_error_message
489 | err.verify_code = cf_error_code
490 | raise err
491 | finally:
492 | if cf_error_string_ref:
493 | CoreFoundation.CFRelease(cf_error_string_ref)
494 |
495 | finally:
496 | if policies:
497 | CoreFoundation.CFRelease(policies)
498 | if trust:
499 | CoreFoundation.CFRelease(trust)
500 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | This module uses ctypes to bind a whole bunch of functions and constants from
3 | SecureTransport. The goal here is to provide the low-level API to
4 | SecureTransport. These are essentially the C-level functions and constants, and
5 | they're pretty gross to work with.
6 |
7 | This code is a bastardised version of the code found in Will Bond's oscrypto
8 | library. An enormous debt is owed to him for blazing this trail for us. For
9 | that reason, this code should be considered to be covered both by urllib3's
10 | license and by oscrypto's:
11 |
12 | Copyright (c) 2015-2016 Will Bond <[email protected]>
13 |
14 | Permission is hereby granted, free of charge, to any person obtaining a
15 | copy of this software and associated documentation files (the "Software"),
16 | to deal in the Software without restriction, including without limitation
17 | the rights to use, copy, modify, merge, publish, distribute, sublicense,
18 | and/or sell copies of the Software, and to permit persons to whom the
19 | Software is furnished to do so, subject to the following conditions:
20 |
21 | The above copyright notice and this permission notice shall be included in
22 | all copies or substantial portions of the Software.
23 |
24 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 | DEALINGS IN THE SOFTWARE.
31 | """
32 | from __future__ import absolute_import
33 |
34 | import platform
35 | from ctypes import (
36 | CDLL,
37 | CFUNCTYPE,
38 | POINTER,
39 | c_bool,
40 | c_byte,
41 | c_char_p,
42 | c_int32,
43 | c_long,
44 | c_size_t,
45 | c_uint32,
46 | c_ulong,
47 | c_void_p,
48 | )
49 | from ctypes.util import find_library
50 |
51 | from ...packages.six import raise_from
52 |
53 | if platform.system() != "Darwin":
54 | raise ImportError("Only macOS is supported")
55 |
56 | version = platform.mac_ver()[0]
57 | version_info = tuple(map(int, version.split(".")))
58 | if version_info < (10, 8):
59 | raise OSError(
60 | "Only OS X 10.8 and newer are supported, not %s.%s"
61 | % (version_info[0], version_info[1])
62 | )
63 |
64 |
65 | def load_cdll(name, macos10_16_path):
66 | """Loads a CDLL by name, falling back to known path on 10.16+"""
67 | try:
68 | # Big Sur is technically 11 but we use 10.16 due to the Big Sur
69 | # beta being labeled as 10.16.
70 | if version_info >= (10, 16):
71 | path = macos10_16_path
72 | else:
73 | path = find_library(name)
74 | if not path:
75 | raise OSError # Caught and reraised as 'ImportError'
76 | return CDLL(path, use_errno=True)
77 | except OSError:
78 | raise_from(ImportError("The library %s failed to load" % name), None)
79 |
80 |
81 | Security = load_cdll(
82 | "Security", "/System/Library/Frameworks/Security.framework/Security"
83 | )
84 | CoreFoundation = load_cdll(
85 | "CoreFoundation",
86 | "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation",
87 | )
88 |
89 |
90 | Boolean = c_bool
91 | CFIndex = c_long
92 | CFStringEncoding = c_uint32
93 | CFData = c_void_p
94 | CFString = c_void_p
95 | CFArray = c_void_p
96 | CFMutableArray = c_void_p
97 | CFDictionary = c_void_p
98 | CFError = c_void_p
99 | CFType = c_void_p
100 | CFTypeID = c_ulong
101 |
102 | CFTypeRef = POINTER(CFType)
103 | CFAllocatorRef = c_void_p
104 |
105 | OSStatus = c_int32
106 |
107 | CFDataRef = POINTER(CFData)
108 | CFStringRef = POINTER(CFString)
109 | CFArrayRef = POINTER(CFArray)
110 | CFMutableArrayRef = POINTER(CFMutableArray)
111 | CFDictionaryRef = POINTER(CFDictionary)
112 | CFArrayCallBacks = c_void_p
113 | CFDictionaryKeyCallBacks = c_void_p
114 | CFDictionaryValueCallBacks = c_void_p
115 |
116 | SecCertificateRef = POINTER(c_void_p)
117 | SecExternalFormat = c_uint32
118 | SecExternalItemType = c_uint32
119 | SecIdentityRef = POINTER(c_void_p)
120 | SecItemImportExportFlags = c_uint32
121 | SecItemImportExportKeyParameters = c_void_p
122 | SecKeychainRef = POINTER(c_void_p)
123 | SSLProtocol = c_uint32
124 | SSLCipherSuite = c_uint32
125 | SSLContextRef = POINTER(c_void_p)
126 | SecTrustRef = POINTER(c_void_p)
127 | SSLConnectionRef = c_uint32
128 | SecTrustResultType = c_uint32
129 | SecTrustOptionFlags = c_uint32
130 | SSLProtocolSide = c_uint32
131 | SSLConnectionType = c_uint32
132 | SSLSessionOption = c_uint32
133 |
134 |
135 | try:
136 | Security.SecItemImport.argtypes = [
137 | CFDataRef,
138 | CFStringRef,
139 | POINTER(SecExternalFormat),
140 | POINTER(SecExternalItemType),
141 | SecItemImportExportFlags,
142 | POINTER(SecItemImportExportKeyParameters),
143 | SecKeychainRef,
144 | POINTER(CFArrayRef),
145 | ]
146 | Security.SecItemImport.restype = OSStatus
147 |
148 | Security.SecCertificateGetTypeID.argtypes = []
149 | Security.SecCertificateGetTypeID.restype = CFTypeID
150 |
151 | Security.SecIdentityGetTypeID.argtypes = []
152 | Security.SecIdentityGetTypeID.restype = CFTypeID
153 |
154 | Security.SecKeyGetTypeID.argtypes = []
155 | Security.SecKeyGetTypeID.restype = CFTypeID
156 |
157 | Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef]
158 | Security.SecCertificateCreateWithData.restype = SecCertificateRef
159 |
160 | Security.SecCertificateCopyData.argtypes = [SecCertificateRef]
161 | Security.SecCertificateCopyData.restype = CFDataRef
162 |
163 | Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p]
164 | Security.SecCopyErrorMessageString.restype = CFStringRef
165 |
166 | Security.SecIdentityCreateWithCertificate.argtypes = [
167 | CFTypeRef,
168 | SecCertificateRef,
169 | POINTER(SecIdentityRef),
170 | ]
171 | Security.SecIdentityCreateWithCertificate.restype = OSStatus
172 |
173 | Security.SecKeychainCreate.argtypes = [
174 | c_char_p,
175 | c_uint32,
176 | c_void_p,
177 | Boolean,
178 | c_void_p,
179 | POINTER(SecKeychainRef),
180 | ]
181 | Security.SecKeychainCreate.restype = OSStatus
182 |
183 | Security.SecKeychainDelete.argtypes = [SecKeychainRef]
184 | Security.SecKeychainDelete.restype = OSStatus
185 |
186 | Security.SecPKCS12Import.argtypes = [
187 | CFDataRef,
188 | CFDictionaryRef,
189 | POINTER(CFArrayRef),
190 | ]
191 | Security.SecPKCS12Import.restype = OSStatus
192 |
193 | SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t))
194 | SSLWriteFunc = CFUNCTYPE(
195 | OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)
196 | )
197 |
198 | Security.SSLSetIOFuncs.argtypes = [SSLContextRef, SSLReadFunc, SSLWriteFunc]
199 | Security.SSLSetIOFuncs.restype = OSStatus
200 |
201 | Security.SSLSetPeerID.argtypes = [SSLContextRef, c_char_p, c_size_t]
202 | Security.SSLSetPeerID.restype = OSStatus
203 |
204 | Security.SSLSetCertificate.argtypes = [SSLContextRef, CFArrayRef]
205 | Security.SSLSetCertificate.restype = OSStatus
206 |
207 | Security.SSLSetCertificateAuthorities.argtypes = [SSLContextRef, CFTypeRef, Boolean]
208 | Security.SSLSetCertificateAuthorities.restype = OSStatus
209 |
210 | Security.SSLSetConnection.argtypes = [SSLContextRef, SSLConnectionRef]
211 | Security.SSLSetConnection.restype = OSStatus
212 |
213 | Security.SSLSetPeerDomainName.argtypes = [SSLContextRef, c_char_p, c_size_t]
214 | Security.SSLSetPeerDomainName.restype = OSStatus
215 |
216 | Security.SSLHandshake.argtypes = [SSLContextRef]
217 | Security.SSLHandshake.restype = OSStatus
218 |
219 | Security.SSLRead.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)]
220 | Security.SSLRead.restype = OSStatus
221 |
222 | Security.SSLWrite.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)]
223 | Security.SSLWrite.restype = OSStatus
224 |
225 | Security.SSLClose.argtypes = [SSLContextRef]
226 | Security.SSLClose.restype = OSStatus
227 |
228 | Security.SSLGetNumberSupportedCiphers.argtypes = [SSLContextRef, POINTER(c_size_t)]
229 | Security.SSLGetNumberSupportedCiphers.restype = OSStatus
230 |
231 | Security.SSLGetSupportedCiphers.argtypes = [
232 | SSLContextRef,
233 | POINTER(SSLCipherSuite),
234 | POINTER(c_size_t),
235 | ]
236 | Security.SSLGetSupportedCiphers.restype = OSStatus
237 |
238 | Security.SSLSetEnabledCiphers.argtypes = [
239 | SSLContextRef,
240 | POINTER(SSLCipherSuite),
241 | c_size_t,
242 | ]
243 | Security.SSLSetEnabledCiphers.restype = OSStatus
244 |
245 | Security.SSLGetNumberEnabledCiphers.argtype = [SSLContextRef, POINTER(c_size_t)]
246 | Security.SSLGetNumberEnabledCiphers.restype = OSStatus
247 |
248 | Security.SSLGetEnabledCiphers.argtypes = [
249 | SSLContextRef,
250 | POINTER(SSLCipherSuite),
251 | POINTER(c_size_t),
252 | ]
253 | Security.SSLGetEnabledCiphers.restype = OSStatus
254 |
255 | Security.SSLGetNegotiatedCipher.argtypes = [SSLContextRef, POINTER(SSLCipherSuite)]
256 | Security.SSLGetNegotiatedCipher.restype = OSStatus
257 |
258 | Security.SSLGetNegotiatedProtocolVersion.argtypes = [
259 | SSLContextRef,
260 | POINTER(SSLProtocol),
261 | ]
262 | Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus
263 |
264 | Security.SSLCopyPeerTrust.argtypes = [SSLContextRef, POINTER(SecTrustRef)]
265 | Security.SSLCopyPeerTrust.restype = OSStatus
266 |
267 | Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef]
268 | Security.SecTrustSetAnchorCertificates.restype = OSStatus
269 |
270 | Security.SecTrustSetAnchorCertificatesOnly.argstypes = [SecTrustRef, Boolean]
271 | Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus
272 |
273 | Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)]
274 | Security.SecTrustEvaluate.restype = OSStatus
275 |
276 | Security.SecTrustGetCertificateCount.argtypes = [SecTrustRef]
277 | Security.SecTrustGetCertificateCount.restype = CFIndex
278 |
279 | Security.SecTrustGetCertificateAtIndex.argtypes = [SecTrustRef, CFIndex]
280 | Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef
281 |
282 | Security.SSLCreateContext.argtypes = [
283 | CFAllocatorRef,
284 | SSLProtocolSide,
285 | SSLConnectionType,
286 | ]
287 | Security.SSLCreateContext.restype = SSLContextRef
288 |
289 | Security.SSLSetSessionOption.argtypes = [SSLContextRef, SSLSessionOption, Boolean]
290 | Security.SSLSetSessionOption.restype = OSStatus
291 |
292 | Security.SSLSetProtocolVersionMin.argtypes = [SSLContextRef, SSLProtocol]
293 | Security.SSLSetProtocolVersionMin.restype = OSStatus
294 |
295 | Security.SSLSetProtocolVersionMax.argtypes = [SSLContextRef, SSLProtocol]
296 | Security.SSLSetProtocolVersionMax.restype = OSStatus
297 |
298 | try:
299 | Security.SSLSetALPNProtocols.argtypes = [SSLContextRef, CFArrayRef]
300 | Security.SSLSetALPNProtocols.restype = OSStatus
301 | except AttributeError:
302 | # Supported only in 10.12+
303 | pass
304 |
305 | Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p]
306 | Security.SecCopyErrorMessageString.restype = CFStringRef
307 |
308 | Security.SSLReadFunc = SSLReadFunc
309 | Security.SSLWriteFunc = SSLWriteFunc
310 | Security.SSLContextRef = SSLContextRef
311 | Security.SSLProtocol = SSLProtocol
312 | Security.SSLCipherSuite = SSLCipherSuite
313 | Security.SecIdentityRef = SecIdentityRef
314 | Security.SecKeychainRef = SecKeychainRef
315 | Security.SecTrustRef = SecTrustRef
316 | Security.SecTrustResultType = SecTrustResultType
317 | Security.SecExternalFormat = SecExternalFormat
318 | Security.OSStatus = OSStatus
319 |
320 | Security.kSecImportExportPassphrase = CFStringRef.in_dll(
321 | Security, "kSecImportExportPassphrase"
322 | )
323 | Security.kSecImportItemIdentity = CFStringRef.in_dll(
324 | Security, "kSecImportItemIdentity"
325 | )
326 |
327 | # CoreFoundation time!
328 | CoreFoundation.CFRetain.argtypes = [CFTypeRef]
329 | CoreFoundation.CFRetain.restype = CFTypeRef
330 |
331 | CoreFoundation.CFRelease.argtypes = [CFTypeRef]
332 | CoreFoundation.CFRelease.restype = None
333 |
334 | CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef]
335 | CoreFoundation.CFGetTypeID.restype = CFTypeID
336 |
337 | CoreFoundation.CFStringCreateWithCString.argtypes = [
338 | CFAllocatorRef,
339 | c_char_p,
340 | CFStringEncoding,
341 | ]
342 | CoreFoundation.CFStringCreateWithCString.restype = CFStringRef
343 |
344 | CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding]
345 | CoreFoundation.CFStringGetCStringPtr.restype = c_char_p
346 |
347 | CoreFoundation.CFStringGetCString.argtypes = [
348 | CFStringRef,
349 | c_char_p,
350 | CFIndex,
351 | CFStringEncoding,
352 | ]
353 | CoreFoundation.CFStringGetCString.restype = c_bool
354 |
355 | CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex]
356 | CoreFoundation.CFDataCreate.restype = CFDataRef
357 |
358 | CoreFoundation.CFDataGetLength.argtypes = [CFDataRef]
359 | CoreFoundation.CFDataGetLength.restype = CFIndex
360 |
361 | CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef]
362 | CoreFoundation.CFDataGetBytePtr.restype = c_void_p
363 |
364 | CoreFoundation.CFDictionaryCreate.argtypes = [
365 | CFAllocatorRef,
366 | POINTER(CFTypeRef),
367 | POINTER(CFTypeRef),
368 | CFIndex,
369 | CFDictionaryKeyCallBacks,
370 | CFDictionaryValueCallBacks,
371 | ]
372 | CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef
373 |
374 | CoreFoundation.CFDictionaryGetValue.argtypes = [CFDictionaryRef, CFTypeRef]
375 | CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef
376 |
377 | CoreFoundation.CFArrayCreate.argtypes = [
378 | CFAllocatorRef,
379 | POINTER(CFTypeRef),
380 | CFIndex,
381 | CFArrayCallBacks,
382 | ]
383 | CoreFoundation.CFArrayCreate.restype = CFArrayRef
384 |
385 | CoreFoundation.CFArrayCreateMutable.argtypes = [
386 | CFAllocatorRef,
387 | CFIndex,
388 | CFArrayCallBacks,
389 | ]
390 | CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef
391 |
392 | CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p]
393 | CoreFoundation.CFArrayAppendValue.restype = None
394 |
395 | CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef]
396 | CoreFoundation.CFArrayGetCount.restype = CFIndex
397 |
398 | CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex]
399 | CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p
400 |
401 | CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll(
402 | CoreFoundation, "kCFAllocatorDefault"
403 | )
404 | CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(
405 | CoreFoundation, "kCFTypeArrayCallBacks"
406 | )
407 | CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll(
408 | CoreFoundation, "kCFTypeDictionaryKeyCallBacks"
409 | )
410 | CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll(
411 | CoreFoundation, "kCFTypeDictionaryValueCallBacks"
412 | )
413 |
414 | CoreFoundation.CFTypeRef = CFTypeRef
415 | CoreFoundation.CFArrayRef = CFArrayRef
416 | CoreFoundation.CFStringRef = CFStringRef
417 | CoreFoundation.CFDictionaryRef = CFDictionaryRef
418 |
419 | except (AttributeError):
420 | raise ImportError("Error initializing ctypes")
421 |
422 |
423 | class CFConst(object):
424 | """
425 | A class object that acts as essentially a namespace for CoreFoundation
426 | constants.
427 | """
428 |
429 | kCFStringEncodingUTF8 = CFStringEncoding(0x08000100)
430 |
431 |
432 | class SecurityConst(object):
433 | """
434 | A class object that acts as essentially a namespace for Security constants.
435 | """
436 |
437 | kSSLSessionOptionBreakOnServerAuth = 0
438 |
439 | kSSLProtocol2 = 1
440 | kSSLProtocol3 = 2
441 | kTLSProtocol1 = 4
442 | kTLSProtocol11 = 7
443 | kTLSProtocol12 = 8
444 | # SecureTransport does not support TLS 1.3 even if there's a constant for it
445 | kTLSProtocol13 = 10
446 | kTLSProtocolMaxSupported = 999
447 |
448 | kSSLClientSide = 1
449 | kSSLStreamType = 0
450 |
451 | kSecFormatPEMSequence = 10
452 |
453 | kSecTrustResultInvalid = 0
454 | kSecTrustResultProceed = 1
455 | # This gap is present on purpose: this was kSecTrustResultConfirm, which
456 | # is deprecated.
457 | kSecTrustResultDeny = 3
458 | kSecTrustResultUnspecified = 4
459 | kSecTrustResultRecoverableTrustFailure = 5
460 | kSecTrustResultFatalTrustFailure = 6
461 | kSecTrustResultOtherError = 7
462 |
463 | errSSLProtocol = -9800
464 | errSSLWouldBlock = -9803
465 | errSSLClosedGraceful = -9805
466 | errSSLClosedNoNotify = -9816
467 | errSSLClosedAbort = -9806
468 |
469 | errSSLXCertChainInvalid = -9807
470 | errSSLCrypto = -9809
471 | errSSLInternal = -9810
472 | errSSLCertExpired = -9814
473 | errSSLCertNotYetValid = -9815
474 | errSSLUnknownRootCert = -9812
475 | errSSLNoRootCert = -9813
476 | errSSLHostNameMismatch = -9843
477 | errSSLPeerHandshakeFail = -9824
478 | errSSLPeerUserCancelled = -9839
479 | errSSLWeakPeerEphemeralDHKey = -9850
480 | errSSLServerAuthCompleted = -9841
481 | errSSLRecordOverflow = -9847
482 |
483 | errSecVerifyFailed = -67808
484 | errSecNoTrustSettings = -25263
485 | errSecItemNotFound = -25300
486 | errSecInvalidTrustSettings = -25262
487 |
488 | # Cipher suites. We only pick the ones our default cipher string allows.
489 | # Source: https://developer.apple.com/documentation/security/1550981-ssl_cipher_suite_values
490 | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C
491 | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030
492 | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B
493 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F
494 | TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9
495 | TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA8
496 | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F
497 | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E
498 | TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024
499 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028
500 | TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A
501 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014
502 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B
503 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039
504 | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023
505 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027
506 | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009
507 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013
508 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067
509 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033
510 | TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D
511 | TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C
512 | TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D
513 | TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C
514 | TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035
515 | TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F
516 | TLS_AES_128_GCM_SHA256 = 0x1301
517 | TLS_AES_256_GCM_SHA384 = 0x1302
518 | TLS_AES_128_CCM_8_SHA256 = 0x1305
519 | TLS_AES_128_CCM_SHA256 = 0x1304
520 |
```