This is page 55 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py:
--------------------------------------------------------------------------------
```python
1 | # This file is dual licensed under the terms of the Apache License, Version
2 | # 2.0, and the BSD License. See the LICENSE file in the root of this repository
3 | # for complete details.
4 | """
5 | .. testsetup::
6 |
7 | from pip._vendor.packaging.version import parse, Version
8 | """
9 |
10 | from __future__ import annotations
11 |
12 | import itertools
13 | import re
14 | from typing import Any, Callable, NamedTuple, SupportsInt, Tuple, Union
15 |
16 | from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType
17 |
18 | __all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"]
19 |
20 | LocalType = Tuple[Union[int, str], ...]
21 |
22 | CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]]
23 | CmpLocalType = Union[
24 | NegativeInfinityType,
25 | Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...],
26 | ]
27 | CmpKey = Tuple[
28 | int,
29 | Tuple[int, ...],
30 | CmpPrePostDevType,
31 | CmpPrePostDevType,
32 | CmpPrePostDevType,
33 | CmpLocalType,
34 | ]
35 | VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool]
36 |
37 |
38 | class _Version(NamedTuple):
39 | epoch: int
40 | release: tuple[int, ...]
41 | dev: tuple[str, int] | None
42 | pre: tuple[str, int] | None
43 | post: tuple[str, int] | None
44 | local: LocalType | None
45 |
46 |
47 | def parse(version: str) -> Version:
48 | """Parse the given version string.
49 |
50 | >>> parse('1.0.dev1')
51 | <Version('1.0.dev1')>
52 |
53 | :param version: The version string to parse.
54 | :raises InvalidVersion: When the version string is not a valid version.
55 | """
56 | return Version(version)
57 |
58 |
59 | class InvalidVersion(ValueError):
60 | """Raised when a version string is not a valid version.
61 |
62 | >>> Version("invalid")
63 | Traceback (most recent call last):
64 | ...
65 | packaging.version.InvalidVersion: Invalid version: 'invalid'
66 | """
67 |
68 |
69 | class _BaseVersion:
70 | _key: tuple[Any, ...]
71 |
72 | def __hash__(self) -> int:
73 | return hash(self._key)
74 |
75 | # Please keep the duplicated `isinstance` check
76 | # in the six comparisons hereunder
77 | # unless you find a way to avoid adding overhead function calls.
78 | def __lt__(self, other: _BaseVersion) -> bool:
79 | if not isinstance(other, _BaseVersion):
80 | return NotImplemented
81 |
82 | return self._key < other._key
83 |
84 | def __le__(self, other: _BaseVersion) -> bool:
85 | if not isinstance(other, _BaseVersion):
86 | return NotImplemented
87 |
88 | return self._key <= other._key
89 |
90 | def __eq__(self, other: object) -> bool:
91 | if not isinstance(other, _BaseVersion):
92 | return NotImplemented
93 |
94 | return self._key == other._key
95 |
96 | def __ge__(self, other: _BaseVersion) -> bool:
97 | if not isinstance(other, _BaseVersion):
98 | return NotImplemented
99 |
100 | return self._key >= other._key
101 |
102 | def __gt__(self, other: _BaseVersion) -> bool:
103 | if not isinstance(other, _BaseVersion):
104 | return NotImplemented
105 |
106 | return self._key > other._key
107 |
108 | def __ne__(self, other: object) -> bool:
109 | if not isinstance(other, _BaseVersion):
110 | return NotImplemented
111 |
112 | return self._key != other._key
113 |
114 |
115 | # Deliberately not anchored to the start and end of the string, to make it
116 | # easier for 3rd party code to reuse
117 | _VERSION_PATTERN = r"""
118 | v?
119 | (?:
120 | (?:(?P<epoch>[0-9]+)!)? # epoch
121 | (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
122 | (?P<pre> # pre-release
123 | [-_\.]?
124 | (?P<pre_l>alpha|a|beta|b|preview|pre|c|rc)
125 | [-_\.]?
126 | (?P<pre_n>[0-9]+)?
127 | )?
128 | (?P<post> # post release
129 | (?:-(?P<post_n1>[0-9]+))
130 | |
131 | (?:
132 | [-_\.]?
133 | (?P<post_l>post|rev|r)
134 | [-_\.]?
135 | (?P<post_n2>[0-9]+)?
136 | )
137 | )?
138 | (?P<dev> # dev release
139 | [-_\.]?
140 | (?P<dev_l>dev)
141 | [-_\.]?
142 | (?P<dev_n>[0-9]+)?
143 | )?
144 | )
145 | (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
146 | """
147 |
148 | VERSION_PATTERN = _VERSION_PATTERN
149 | """
150 | A string containing the regular expression used to match a valid version.
151 |
152 | The pattern is not anchored at either end, and is intended for embedding in larger
153 | expressions (for example, matching a version number as part of a file name). The
154 | regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
155 | flags set.
156 |
157 | :meta hide-value:
158 | """
159 |
160 |
161 | class Version(_BaseVersion):
162 | """This class abstracts handling of a project's versions.
163 |
164 | A :class:`Version` instance is comparison aware and can be compared and
165 | sorted using the standard Python interfaces.
166 |
167 | >>> v1 = Version("1.0a5")
168 | >>> v2 = Version("1.0")
169 | >>> v1
170 | <Version('1.0a5')>
171 | >>> v2
172 | <Version('1.0')>
173 | >>> v1 < v2
174 | True
175 | >>> v1 == v2
176 | False
177 | >>> v1 > v2
178 | False
179 | >>> v1 >= v2
180 | False
181 | >>> v1 <= v2
182 | True
183 | """
184 |
185 | _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
186 | _key: CmpKey
187 |
188 | def __init__(self, version: str) -> None:
189 | """Initialize a Version object.
190 |
191 | :param version:
192 | The string representation of a version which will be parsed and normalized
193 | before use.
194 | :raises InvalidVersion:
195 | If the ``version`` does not conform to PEP 440 in any way then this
196 | exception will be raised.
197 | """
198 |
199 | # Validate the version and parse it into pieces
200 | match = self._regex.search(version)
201 | if not match:
202 | raise InvalidVersion(f"Invalid version: '{version}'")
203 |
204 | # Store the parsed out pieces of the version
205 | self._version = _Version(
206 | epoch=int(match.group("epoch")) if match.group("epoch") else 0,
207 | release=tuple(int(i) for i in match.group("release").split(".")),
208 | pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
209 | post=_parse_letter_version(
210 | match.group("post_l"), match.group("post_n1") or match.group("post_n2")
211 | ),
212 | dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
213 | local=_parse_local_version(match.group("local")),
214 | )
215 |
216 | # Generate a key which will be used for sorting
217 | self._key = _cmpkey(
218 | self._version.epoch,
219 | self._version.release,
220 | self._version.pre,
221 | self._version.post,
222 | self._version.dev,
223 | self._version.local,
224 | )
225 |
226 | def __repr__(self) -> str:
227 | """A representation of the Version that shows all internal state.
228 |
229 | >>> Version('1.0.0')
230 | <Version('1.0.0')>
231 | """
232 | return f"<Version('{self}')>"
233 |
234 | def __str__(self) -> str:
235 | """A string representation of the version that can be rounded-tripped.
236 |
237 | >>> str(Version("1.0a5"))
238 | '1.0a5'
239 | """
240 | parts = []
241 |
242 | # Epoch
243 | if self.epoch != 0:
244 | parts.append(f"{self.epoch}!")
245 |
246 | # Release segment
247 | parts.append(".".join(str(x) for x in self.release))
248 |
249 | # Pre-release
250 | if self.pre is not None:
251 | parts.append("".join(str(x) for x in self.pre))
252 |
253 | # Post-release
254 | if self.post is not None:
255 | parts.append(f".post{self.post}")
256 |
257 | # Development release
258 | if self.dev is not None:
259 | parts.append(f".dev{self.dev}")
260 |
261 | # Local version segment
262 | if self.local is not None:
263 | parts.append(f"+{self.local}")
264 |
265 | return "".join(parts)
266 |
267 | @property
268 | def epoch(self) -> int:
269 | """The epoch of the version.
270 |
271 | >>> Version("2.0.0").epoch
272 | 0
273 | >>> Version("1!2.0.0").epoch
274 | 1
275 | """
276 | return self._version.epoch
277 |
278 | @property
279 | def release(self) -> tuple[int, ...]:
280 | """The components of the "release" segment of the version.
281 |
282 | >>> Version("1.2.3").release
283 | (1, 2, 3)
284 | >>> Version("2.0.0").release
285 | (2, 0, 0)
286 | >>> Version("1!2.0.0.post0").release
287 | (2, 0, 0)
288 |
289 | Includes trailing zeroes but not the epoch or any pre-release / development /
290 | post-release suffixes.
291 | """
292 | return self._version.release
293 |
294 | @property
295 | def pre(self) -> tuple[str, int] | None:
296 | """The pre-release segment of the version.
297 |
298 | >>> print(Version("1.2.3").pre)
299 | None
300 | >>> Version("1.2.3a1").pre
301 | ('a', 1)
302 | >>> Version("1.2.3b1").pre
303 | ('b', 1)
304 | >>> Version("1.2.3rc1").pre
305 | ('rc', 1)
306 | """
307 | return self._version.pre
308 |
309 | @property
310 | def post(self) -> int | None:
311 | """The post-release number of the version.
312 |
313 | >>> print(Version("1.2.3").post)
314 | None
315 | >>> Version("1.2.3.post1").post
316 | 1
317 | """
318 | return self._version.post[1] if self._version.post else None
319 |
320 | @property
321 | def dev(self) -> int | None:
322 | """The development number of the version.
323 |
324 | >>> print(Version("1.2.3").dev)
325 | None
326 | >>> Version("1.2.3.dev1").dev
327 | 1
328 | """
329 | return self._version.dev[1] if self._version.dev else None
330 |
331 | @property
332 | def local(self) -> str | None:
333 | """The local version segment of the version.
334 |
335 | >>> print(Version("1.2.3").local)
336 | None
337 | >>> Version("1.2.3+abc").local
338 | 'abc'
339 | """
340 | if self._version.local:
341 | return ".".join(str(x) for x in self._version.local)
342 | else:
343 | return None
344 |
345 | @property
346 | def public(self) -> str:
347 | """The public portion of the version.
348 |
349 | >>> Version("1.2.3").public
350 | '1.2.3'
351 | >>> Version("1.2.3+abc").public
352 | '1.2.3'
353 | >>> Version("1.2.3+abc.dev1").public
354 | '1.2.3'
355 | """
356 | return str(self).split("+", 1)[0]
357 |
358 | @property
359 | def base_version(self) -> str:
360 | """The "base version" of the version.
361 |
362 | >>> Version("1.2.3").base_version
363 | '1.2.3'
364 | >>> Version("1.2.3+abc").base_version
365 | '1.2.3'
366 | >>> Version("1!1.2.3+abc.dev1").base_version
367 | '1!1.2.3'
368 |
369 | The "base version" is the public version of the project without any pre or post
370 | release markers.
371 | """
372 | parts = []
373 |
374 | # Epoch
375 | if self.epoch != 0:
376 | parts.append(f"{self.epoch}!")
377 |
378 | # Release segment
379 | parts.append(".".join(str(x) for x in self.release))
380 |
381 | return "".join(parts)
382 |
383 | @property
384 | def is_prerelease(self) -> bool:
385 | """Whether this version is a pre-release.
386 |
387 | >>> Version("1.2.3").is_prerelease
388 | False
389 | >>> Version("1.2.3a1").is_prerelease
390 | True
391 | >>> Version("1.2.3b1").is_prerelease
392 | True
393 | >>> Version("1.2.3rc1").is_prerelease
394 | True
395 | >>> Version("1.2.3dev1").is_prerelease
396 | True
397 | """
398 | return self.dev is not None or self.pre is not None
399 |
400 | @property
401 | def is_postrelease(self) -> bool:
402 | """Whether this version is a post-release.
403 |
404 | >>> Version("1.2.3").is_postrelease
405 | False
406 | >>> Version("1.2.3.post1").is_postrelease
407 | True
408 | """
409 | return self.post is not None
410 |
411 | @property
412 | def is_devrelease(self) -> bool:
413 | """Whether this version is a development release.
414 |
415 | >>> Version("1.2.3").is_devrelease
416 | False
417 | >>> Version("1.2.3.dev1").is_devrelease
418 | True
419 | """
420 | return self.dev is not None
421 |
422 | @property
423 | def major(self) -> int:
424 | """The first item of :attr:`release` or ``0`` if unavailable.
425 |
426 | >>> Version("1.2.3").major
427 | 1
428 | """
429 | return self.release[0] if len(self.release) >= 1 else 0
430 |
431 | @property
432 | def minor(self) -> int:
433 | """The second item of :attr:`release` or ``0`` if unavailable.
434 |
435 | >>> Version("1.2.3").minor
436 | 2
437 | >>> Version("1").minor
438 | 0
439 | """
440 | return self.release[1] if len(self.release) >= 2 else 0
441 |
442 | @property
443 | def micro(self) -> int:
444 | """The third item of :attr:`release` or ``0`` if unavailable.
445 |
446 | >>> Version("1.2.3").micro
447 | 3
448 | >>> Version("1").micro
449 | 0
450 | """
451 | return self.release[2] if len(self.release) >= 3 else 0
452 |
453 |
454 | def _parse_letter_version(
455 | letter: str | None, number: str | bytes | SupportsInt | None
456 | ) -> tuple[str, int] | None:
457 | if letter:
458 | # We consider there to be an implicit 0 in a pre-release if there is
459 | # not a numeral associated with it.
460 | if number is None:
461 | number = 0
462 |
463 | # We normalize any letters to their lower case form
464 | letter = letter.lower()
465 |
466 | # We consider some words to be alternate spellings of other words and
467 | # in those cases we want to normalize the spellings to our preferred
468 | # spelling.
469 | if letter == "alpha":
470 | letter = "a"
471 | elif letter == "beta":
472 | letter = "b"
473 | elif letter in ["c", "pre", "preview"]:
474 | letter = "rc"
475 | elif letter in ["rev", "r"]:
476 | letter = "post"
477 |
478 | return letter, int(number)
479 | if not letter and number:
480 | # We assume if we are given a number, but we are not given a letter
481 | # then this is using the implicit post release syntax (e.g. 1.0-1)
482 | letter = "post"
483 |
484 | return letter, int(number)
485 |
486 | return None
487 |
488 |
489 | _local_version_separators = re.compile(r"[\._-]")
490 |
491 |
492 | def _parse_local_version(local: str | None) -> LocalType | None:
493 | """
494 | Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
495 | """
496 | if local is not None:
497 | return tuple(
498 | part.lower() if not part.isdigit() else int(part)
499 | for part in _local_version_separators.split(local)
500 | )
501 | return None
502 |
503 |
504 | def _cmpkey(
505 | epoch: int,
506 | release: tuple[int, ...],
507 | pre: tuple[str, int] | None,
508 | post: tuple[str, int] | None,
509 | dev: tuple[str, int] | None,
510 | local: LocalType | None,
511 | ) -> CmpKey:
512 | # When we compare a release version, we want to compare it with all of the
513 | # trailing zeros removed. So we'll use a reverse the list, drop all the now
514 | # leading zeros until we come to something non zero, then take the rest
515 | # re-reverse it back into the correct order and make it a tuple and use
516 | # that for our sorting key.
517 | _release = tuple(
518 | reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
519 | )
520 |
521 | # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
522 | # We'll do this by abusing the pre segment, but we _only_ want to do this
523 | # if there is not a pre or a post segment. If we have one of those then
524 | # the normal sorting rules will handle this case correctly.
525 | if pre is None and post is None and dev is not None:
526 | _pre: CmpPrePostDevType = NegativeInfinity
527 | # Versions without a pre-release (except as noted above) should sort after
528 | # those with one.
529 | elif pre is None:
530 | _pre = Infinity
531 | else:
532 | _pre = pre
533 |
534 | # Versions without a post segment should sort before those with one.
535 | if post is None:
536 | _post: CmpPrePostDevType = NegativeInfinity
537 |
538 | else:
539 | _post = post
540 |
541 | # Versions without a development segment should sort after those with one.
542 | if dev is None:
543 | _dev: CmpPrePostDevType = Infinity
544 |
545 | else:
546 | _dev = dev
547 |
548 | if local is None:
549 | # Versions without a local segment should sort before those with one.
550 | _local: CmpLocalType = NegativeInfinity
551 | else:
552 | # Versions with a local segment need that segment parsed to implement
553 | # the sorting rules in PEP440.
554 | # - Alpha numeric segments sort before numeric segments
555 | # - Alpha numeric segments sort lexicographically
556 | # - Numeric segments sort numerically
557 | # - Shorter versions sort before longer versions when the prefixes
558 | # match exactly
559 | _local = tuple(
560 | (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
561 | )
562 |
563 | return epoch, _release, _pre, _post, _dev, _local
564 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/index/collector.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | The main purpose of this module is to expose LinkCollector.collect_sources().
3 | """
4 |
5 | import collections
6 | import email.message
7 | import functools
8 | import itertools
9 | import json
10 | import logging
11 | import os
12 | import urllib.parse
13 | import urllib.request
14 | from dataclasses import dataclass
15 | from html.parser import HTMLParser
16 | from optparse import Values
17 | from typing import (
18 | Callable,
19 | Dict,
20 | Iterable,
21 | List,
22 | MutableMapping,
23 | NamedTuple,
24 | Optional,
25 | Protocol,
26 | Sequence,
27 | Tuple,
28 | Union,
29 | )
30 |
31 | from pip._vendor import requests
32 | from pip._vendor.requests import Response
33 | from pip._vendor.requests.exceptions import RetryError, SSLError
34 |
35 | from pip._internal.exceptions import NetworkConnectionError
36 | from pip._internal.models.link import Link
37 | from pip._internal.models.search_scope import SearchScope
38 | from pip._internal.network.session import PipSession
39 | from pip._internal.network.utils import raise_for_status
40 | from pip._internal.utils.filetypes import is_archive_file
41 | from pip._internal.utils.misc import redact_auth_from_url
42 | from pip._internal.vcs import vcs
43 |
44 | from .sources import CandidatesFromPage, LinkSource, build_source
45 |
46 | logger = logging.getLogger(__name__)
47 |
48 | ResponseHeaders = MutableMapping[str, str]
49 |
50 |
51 | def _match_vcs_scheme(url: str) -> Optional[str]:
52 | """Look for VCS schemes in the URL.
53 |
54 | Returns the matched VCS scheme, or None if there's no match.
55 | """
56 | for scheme in vcs.schemes:
57 | if url.lower().startswith(scheme) and url[len(scheme)] in "+:":
58 | return scheme
59 | return None
60 |
61 |
62 | class _NotAPIContent(Exception):
63 | def __init__(self, content_type: str, request_desc: str) -> None:
64 | super().__init__(content_type, request_desc)
65 | self.content_type = content_type
66 | self.request_desc = request_desc
67 |
68 |
69 | def _ensure_api_header(response: Response) -> None:
70 | """
71 | Check the Content-Type header to ensure the response contains a Simple
72 | API Response.
73 |
74 | Raises `_NotAPIContent` if the content type is not a valid content-type.
75 | """
76 | content_type = response.headers.get("Content-Type", "Unknown")
77 |
78 | content_type_l = content_type.lower()
79 | if content_type_l.startswith(
80 | (
81 | "text/html",
82 | "application/vnd.pypi.simple.v1+html",
83 | "application/vnd.pypi.simple.v1+json",
84 | )
85 | ):
86 | return
87 |
88 | raise _NotAPIContent(content_type, response.request.method)
89 |
90 |
91 | class _NotHTTP(Exception):
92 | pass
93 |
94 |
95 | def _ensure_api_response(url: str, session: PipSession) -> None:
96 | """
97 | Send a HEAD request to the URL, and ensure the response contains a simple
98 | API Response.
99 |
100 | Raises `_NotHTTP` if the URL is not available for a HEAD request, or
101 | `_NotAPIContent` if the content type is not a valid content type.
102 | """
103 | scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url)
104 | if scheme not in {"http", "https"}:
105 | raise _NotHTTP()
106 |
107 | resp = session.head(url, allow_redirects=True)
108 | raise_for_status(resp)
109 |
110 | _ensure_api_header(resp)
111 |
112 |
113 | def _get_simple_response(url: str, session: PipSession) -> Response:
114 | """Access an Simple API response with GET, and return the response.
115 |
116 | This consists of three parts:
117 |
118 | 1. If the URL looks suspiciously like an archive, send a HEAD first to
119 | check the Content-Type is HTML or Simple API, to avoid downloading a
120 | large file. Raise `_NotHTTP` if the content type cannot be determined, or
121 | `_NotAPIContent` if it is not HTML or a Simple API.
122 | 2. Actually perform the request. Raise HTTP exceptions on network failures.
123 | 3. Check the Content-Type header to make sure we got a Simple API response,
124 | and raise `_NotAPIContent` otherwise.
125 | """
126 | if is_archive_file(Link(url).filename):
127 | _ensure_api_response(url, session=session)
128 |
129 | logger.debug("Getting page %s", redact_auth_from_url(url))
130 |
131 | resp = session.get(
132 | url,
133 | headers={
134 | "Accept": ", ".join(
135 | [
136 | "application/vnd.pypi.simple.v1+json",
137 | "application/vnd.pypi.simple.v1+html; q=0.1",
138 | "text/html; q=0.01",
139 | ]
140 | ),
141 | # We don't want to blindly returned cached data for
142 | # /simple/, because authors generally expecting that
143 | # twine upload && pip install will function, but if
144 | # they've done a pip install in the last ~10 minutes
145 | # it won't. Thus by setting this to zero we will not
146 | # blindly use any cached data, however the benefit of
147 | # using max-age=0 instead of no-cache, is that we will
148 | # still support conditional requests, so we will still
149 | # minimize traffic sent in cases where the page hasn't
150 | # changed at all, we will just always incur the round
151 | # trip for the conditional GET now instead of only
152 | # once per 10 minutes.
153 | # For more information, please see pypa/pip#5670.
154 | "Cache-Control": "max-age=0",
155 | },
156 | )
157 | raise_for_status(resp)
158 |
159 | # The check for archives above only works if the url ends with
160 | # something that looks like an archive. However that is not a
161 | # requirement of an url. Unless we issue a HEAD request on every
162 | # url we cannot know ahead of time for sure if something is a
163 | # Simple API response or not. However we can check after we've
164 | # downloaded it.
165 | _ensure_api_header(resp)
166 |
167 | logger.debug(
168 | "Fetched page %s as %s",
169 | redact_auth_from_url(url),
170 | resp.headers.get("Content-Type", "Unknown"),
171 | )
172 |
173 | return resp
174 |
175 |
176 | def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
177 | """Determine if we have any encoding information in our headers."""
178 | if headers and "Content-Type" in headers:
179 | m = email.message.Message()
180 | m["content-type"] = headers["Content-Type"]
181 | charset = m.get_param("charset")
182 | if charset:
183 | return str(charset)
184 | return None
185 |
186 |
187 | class CacheablePageContent:
188 | def __init__(self, page: "IndexContent") -> None:
189 | assert page.cache_link_parsing
190 | self.page = page
191 |
192 | def __eq__(self, other: object) -> bool:
193 | return isinstance(other, type(self)) and self.page.url == other.page.url
194 |
195 | def __hash__(self) -> int:
196 | return hash(self.page.url)
197 |
198 |
199 | class ParseLinks(Protocol):
200 | def __call__(self, page: "IndexContent") -> Iterable[Link]: ...
201 |
202 |
203 | def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
204 | """
205 | Given a function that parses an Iterable[Link] from an IndexContent, cache the
206 | function's result (keyed by CacheablePageContent), unless the IndexContent
207 | `page` has `page.cache_link_parsing == False`.
208 | """
209 |
210 | @functools.lru_cache(maxsize=None)
211 | def wrapper(cacheable_page: CacheablePageContent) -> List[Link]:
212 | return list(fn(cacheable_page.page))
213 |
214 | @functools.wraps(fn)
215 | def wrapper_wrapper(page: "IndexContent") -> List[Link]:
216 | if page.cache_link_parsing:
217 | return wrapper(CacheablePageContent(page))
218 | return list(fn(page))
219 |
220 | return wrapper_wrapper
221 |
222 |
223 | @with_cached_index_content
224 | def parse_links(page: "IndexContent") -> Iterable[Link]:
225 | """
226 | Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
227 | """
228 |
229 | content_type_l = page.content_type.lower()
230 | if content_type_l.startswith("application/vnd.pypi.simple.v1+json"):
231 | data = json.loads(page.content)
232 | for file in data.get("files", []):
233 | link = Link.from_json(file, page.url)
234 | if link is None:
235 | continue
236 | yield link
237 | return
238 |
239 | parser = HTMLLinkParser(page.url)
240 | encoding = page.encoding or "utf-8"
241 | parser.feed(page.content.decode(encoding))
242 |
243 | url = page.url
244 | base_url = parser.base_url or url
245 | for anchor in parser.anchors:
246 | link = Link.from_element(anchor, page_url=url, base_url=base_url)
247 | if link is None:
248 | continue
249 | yield link
250 |
251 |
252 | @dataclass(frozen=True)
253 | class IndexContent:
254 | """Represents one response (or page), along with its URL.
255 |
256 | :param encoding: the encoding to decode the given content.
257 | :param url: the URL from which the HTML was downloaded.
258 | :param cache_link_parsing: whether links parsed from this page's url
259 | should be cached. PyPI index urls should
260 | have this set to False, for example.
261 | """
262 |
263 | content: bytes
264 | content_type: str
265 | encoding: Optional[str]
266 | url: str
267 | cache_link_parsing: bool = True
268 |
269 | def __str__(self) -> str:
270 | return redact_auth_from_url(self.url)
271 |
272 |
273 | class HTMLLinkParser(HTMLParser):
274 | """
275 | HTMLParser that keeps the first base HREF and a list of all anchor
276 | elements' attributes.
277 | """
278 |
279 | def __init__(self, url: str) -> None:
280 | super().__init__(convert_charrefs=True)
281 |
282 | self.url: str = url
283 | self.base_url: Optional[str] = None
284 | self.anchors: List[Dict[str, Optional[str]]] = []
285 |
286 | def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None:
287 | if tag == "base" and self.base_url is None:
288 | href = self.get_href(attrs)
289 | if href is not None:
290 | self.base_url = href
291 | elif tag == "a":
292 | self.anchors.append(dict(attrs))
293 |
294 | def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]:
295 | for name, value in attrs:
296 | if name == "href":
297 | return value
298 | return None
299 |
300 |
301 | def _handle_get_simple_fail(
302 | link: Link,
303 | reason: Union[str, Exception],
304 | meth: Optional[Callable[..., None]] = None,
305 | ) -> None:
306 | if meth is None:
307 | meth = logger.debug
308 | meth("Could not fetch URL %s: %s - skipping", link, reason)
309 |
310 |
311 | def _make_index_content(
312 | response: Response, cache_link_parsing: bool = True
313 | ) -> IndexContent:
314 | encoding = _get_encoding_from_headers(response.headers)
315 | return IndexContent(
316 | response.content,
317 | response.headers["Content-Type"],
318 | encoding=encoding,
319 | url=response.url,
320 | cache_link_parsing=cache_link_parsing,
321 | )
322 |
323 |
324 | def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]:
325 | url = link.url.split("#", 1)[0]
326 |
327 | # Check for VCS schemes that do not support lookup as web pages.
328 | vcs_scheme = _match_vcs_scheme(url)
329 | if vcs_scheme:
330 | logger.warning(
331 | "Cannot look at %s URL %s because it does not support lookup as web pages.",
332 | vcs_scheme,
333 | link,
334 | )
335 | return None
336 |
337 | # Tack index.html onto file:// URLs that point to directories
338 | scheme, _, path, _, _, _ = urllib.parse.urlparse(url)
339 | if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)):
340 | # add trailing slash if not present so urljoin doesn't trim
341 | # final segment
342 | if not url.endswith("/"):
343 | url += "/"
344 | # TODO: In the future, it would be nice if pip supported PEP 691
345 | # style responses in the file:// URLs, however there's no
346 | # standard file extension for application/vnd.pypi.simple.v1+json
347 | # so we'll need to come up with something on our own.
348 | url = urllib.parse.urljoin(url, "index.html")
349 | logger.debug(" file: URL is directory, getting %s", url)
350 |
351 | try:
352 | resp = _get_simple_response(url, session=session)
353 | except _NotHTTP:
354 | logger.warning(
355 | "Skipping page %s because it looks like an archive, and cannot "
356 | "be checked by a HTTP HEAD request.",
357 | link,
358 | )
359 | except _NotAPIContent as exc:
360 | logger.warning(
361 | "Skipping page %s because the %s request got Content-Type: %s. "
362 | "The only supported Content-Types are application/vnd.pypi.simple.v1+json, "
363 | "application/vnd.pypi.simple.v1+html, and text/html",
364 | link,
365 | exc.request_desc,
366 | exc.content_type,
367 | )
368 | except NetworkConnectionError as exc:
369 | _handle_get_simple_fail(link, exc)
370 | except RetryError as exc:
371 | _handle_get_simple_fail(link, exc)
372 | except SSLError as exc:
373 | reason = "There was a problem confirming the ssl certificate: "
374 | reason += str(exc)
375 | _handle_get_simple_fail(link, reason, meth=logger.info)
376 | except requests.ConnectionError as exc:
377 | _handle_get_simple_fail(link, f"connection error: {exc}")
378 | except requests.Timeout:
379 | _handle_get_simple_fail(link, "timed out")
380 | else:
381 | return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing)
382 | return None
383 |
384 |
385 | class CollectedSources(NamedTuple):
386 | find_links: Sequence[Optional[LinkSource]]
387 | index_urls: Sequence[Optional[LinkSource]]
388 |
389 |
390 | class LinkCollector:
391 | """
392 | Responsible for collecting Link objects from all configured locations,
393 | making network requests as needed.
394 |
395 | The class's main method is its collect_sources() method.
396 | """
397 |
398 | def __init__(
399 | self,
400 | session: PipSession,
401 | search_scope: SearchScope,
402 | ) -> None:
403 | self.search_scope = search_scope
404 | self.session = session
405 |
406 | @classmethod
407 | def create(
408 | cls,
409 | session: PipSession,
410 | options: Values,
411 | suppress_no_index: bool = False,
412 | ) -> "LinkCollector":
413 | """
414 | :param session: The Session to use to make requests.
415 | :param suppress_no_index: Whether to ignore the --no-index option
416 | when constructing the SearchScope object.
417 | """
418 | index_urls = [options.index_url] + options.extra_index_urls
419 | if options.no_index and not suppress_no_index:
420 | logger.debug(
421 | "Ignoring indexes: %s",
422 | ",".join(redact_auth_from_url(url) for url in index_urls),
423 | )
424 | index_urls = []
425 |
426 | # Make sure find_links is a list before passing to create().
427 | find_links = options.find_links or []
428 |
429 | search_scope = SearchScope.create(
430 | find_links=find_links,
431 | index_urls=index_urls,
432 | no_index=options.no_index,
433 | )
434 | link_collector = LinkCollector(
435 | session=session,
436 | search_scope=search_scope,
437 | )
438 | return link_collector
439 |
440 | @property
441 | def find_links(self) -> List[str]:
442 | return self.search_scope.find_links
443 |
444 | def fetch_response(self, location: Link) -> Optional[IndexContent]:
445 | """
446 | Fetch an HTML page containing package links.
447 | """
448 | return _get_index_content(location, session=self.session)
449 |
450 | def collect_sources(
451 | self,
452 | project_name: str,
453 | candidates_from_page: CandidatesFromPage,
454 | ) -> CollectedSources:
455 | # The OrderedDict calls deduplicate sources by URL.
456 | index_url_sources = collections.OrderedDict(
457 | build_source(
458 | loc,
459 | candidates_from_page=candidates_from_page,
460 | page_validator=self.session.is_secure_origin,
461 | expand_dir=False,
462 | cache_link_parsing=False,
463 | project_name=project_name,
464 | )
465 | for loc in self.search_scope.get_index_urls_locations(project_name)
466 | ).values()
467 | find_links_sources = collections.OrderedDict(
468 | build_source(
469 | loc,
470 | candidates_from_page=candidates_from_page,
471 | page_validator=self.session.is_secure_origin,
472 | expand_dir=True,
473 | cache_link_parsing=True,
474 | project_name=project_name,
475 | )
476 | for loc in self.find_links
477 | ).values()
478 |
479 | if logger.isEnabledFor(logging.DEBUG):
480 | lines = [
481 | f"* {s.link}"
482 | for s in itertools.chain(find_links_sources, index_url_sources)
483 | if s is not None and s.link is not None
484 | ]
485 | lines = [
486 | f"{len(lines)} location(s) to search "
487 | f"for versions of {project_name}:"
488 | ] + lines
489 | logger.debug("\n".join(lines))
490 |
491 | return CollectedSources(
492 | find_links=list(find_links_sources),
493 | index_urls=list(index_url_sources),
494 | )
495 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/xpath.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: XML Path Language implementation
3 | * Description: API for the XML Path Language implementation
4 | *
5 | * XML Path Language implementation
6 | * XPath is a language for addressing parts of an XML document,
7 | * designed to be used by both XSLT and XPointer
8 | * http://www.w3.org/TR/xpath
9 | *
10 | * Implements
11 | * W3C Recommendation 16 November 1999
12 | * http://www.w3.org/TR/1999/REC-xpath-19991116
13 | *
14 | * Copy: See Copyright for the status of this software.
15 | *
16 | * Author: Daniel Veillard
17 | */
18 |
19 | #ifndef __XML_XPATH_H__
20 | #define __XML_XPATH_H__
21 |
22 | #include <libxml/xmlversion.h>
23 |
24 | #ifdef LIBXML_XPATH_ENABLED
25 |
26 | #include <libxml/xmlerror.h>
27 | #include <libxml/tree.h>
28 | #include <libxml/hash.h>
29 | #endif /* LIBXML_XPATH_ENABLED */
30 |
31 | #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
32 | #ifdef __cplusplus
33 | extern "C" {
34 | #endif
35 | #endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */
36 |
37 | #ifdef LIBXML_XPATH_ENABLED
38 |
39 | typedef struct _xmlXPathContext xmlXPathContext;
40 | typedef xmlXPathContext *xmlXPathContextPtr;
41 | typedef struct _xmlXPathParserContext xmlXPathParserContext;
42 | typedef xmlXPathParserContext *xmlXPathParserContextPtr;
43 |
44 | /**
45 | * The set of XPath error codes.
46 | */
47 |
48 | typedef enum {
49 | XPATH_EXPRESSION_OK = 0,
50 | XPATH_NUMBER_ERROR,
51 | XPATH_UNFINISHED_LITERAL_ERROR,
52 | XPATH_START_LITERAL_ERROR,
53 | XPATH_VARIABLE_REF_ERROR,
54 | XPATH_UNDEF_VARIABLE_ERROR,
55 | XPATH_INVALID_PREDICATE_ERROR,
56 | XPATH_EXPR_ERROR,
57 | XPATH_UNCLOSED_ERROR,
58 | XPATH_UNKNOWN_FUNC_ERROR,
59 | XPATH_INVALID_OPERAND,
60 | XPATH_INVALID_TYPE,
61 | XPATH_INVALID_ARITY,
62 | XPATH_INVALID_CTXT_SIZE,
63 | XPATH_INVALID_CTXT_POSITION,
64 | XPATH_MEMORY_ERROR,
65 | XPTR_SYNTAX_ERROR,
66 | XPTR_RESOURCE_ERROR,
67 | XPTR_SUB_RESOURCE_ERROR,
68 | XPATH_UNDEF_PREFIX_ERROR,
69 | XPATH_ENCODING_ERROR,
70 | XPATH_INVALID_CHAR_ERROR,
71 | XPATH_INVALID_CTXT,
72 | XPATH_STACK_ERROR,
73 | XPATH_FORBID_VARIABLE_ERROR,
74 | XPATH_OP_LIMIT_EXCEEDED,
75 | XPATH_RECURSION_LIMIT_EXCEEDED
76 | } xmlXPathError;
77 |
78 | /*
79 | * A node-set (an unordered collection of nodes without duplicates).
80 | */
81 | typedef struct _xmlNodeSet xmlNodeSet;
82 | typedef xmlNodeSet *xmlNodeSetPtr;
83 | struct _xmlNodeSet {
84 | int nodeNr; /* number of nodes in the set */
85 | int nodeMax; /* size of the array as allocated */
86 | xmlNodePtr *nodeTab; /* array of nodes in no particular order */
87 | /* @@ with_ns to check whether namespace nodes should be looked at @@ */
88 | };
89 |
90 | /*
91 | * An expression is evaluated to yield an object, which
92 | * has one of the following four basic types:
93 | * - node-set
94 | * - boolean
95 | * - number
96 | * - string
97 | *
98 | * @@ XPointer will add more types !
99 | */
100 |
101 | typedef enum {
102 | XPATH_UNDEFINED = 0,
103 | XPATH_NODESET = 1,
104 | XPATH_BOOLEAN = 2,
105 | XPATH_NUMBER = 3,
106 | XPATH_STRING = 4,
107 | #ifdef LIBXML_XPTR_LOCS_ENABLED
108 | XPATH_POINT = 5,
109 | XPATH_RANGE = 6,
110 | XPATH_LOCATIONSET = 7,
111 | #endif
112 | XPATH_USERS = 8,
113 | XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */
114 | } xmlXPathObjectType;
115 |
116 | #ifndef LIBXML_XPTR_LOCS_ENABLED
117 | /** DOC_DISABLE */
118 | #define XPATH_POINT 5
119 | #define XPATH_RANGE 6
120 | #define XPATH_LOCATIONSET 7
121 | /** DOC_ENABLE */
122 | #endif
123 |
124 | typedef struct _xmlXPathObject xmlXPathObject;
125 | typedef xmlXPathObject *xmlXPathObjectPtr;
126 | struct _xmlXPathObject {
127 | xmlXPathObjectType type;
128 | xmlNodeSetPtr nodesetval;
129 | int boolval;
130 | double floatval;
131 | xmlChar *stringval;
132 | void *user;
133 | int index;
134 | void *user2;
135 | int index2;
136 | };
137 |
138 | /**
139 | * xmlXPathConvertFunc:
140 | * @obj: an XPath object
141 | * @type: the number of the target type
142 | *
143 | * A conversion function is associated to a type and used to cast
144 | * the new type to primitive values.
145 | *
146 | * Returns -1 in case of error, 0 otherwise
147 | */
148 | typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type);
149 |
150 | /*
151 | * Extra type: a name and a conversion function.
152 | */
153 |
154 | typedef struct _xmlXPathType xmlXPathType;
155 | typedef xmlXPathType *xmlXPathTypePtr;
156 | struct _xmlXPathType {
157 | const xmlChar *name; /* the type name */
158 | xmlXPathConvertFunc func; /* the conversion function */
159 | };
160 |
161 | /*
162 | * Extra variable: a name and a value.
163 | */
164 |
165 | typedef struct _xmlXPathVariable xmlXPathVariable;
166 | typedef xmlXPathVariable *xmlXPathVariablePtr;
167 | struct _xmlXPathVariable {
168 | const xmlChar *name; /* the variable name */
169 | xmlXPathObjectPtr value; /* the value */
170 | };
171 |
172 | /**
173 | * xmlXPathEvalFunc:
174 | * @ctxt: an XPath parser context
175 | * @nargs: the number of arguments passed to the function
176 | *
177 | * An XPath evaluation function, the parameters are on the XPath context stack.
178 | */
179 |
180 | typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt,
181 | int nargs);
182 |
183 | /*
184 | * Extra function: a name and a evaluation function.
185 | */
186 |
187 | typedef struct _xmlXPathFunct xmlXPathFunct;
188 | typedef xmlXPathFunct *xmlXPathFuncPtr;
189 | struct _xmlXPathFunct {
190 | const xmlChar *name; /* the function name */
191 | xmlXPathEvalFunc func; /* the evaluation function */
192 | };
193 |
194 | /**
195 | * xmlXPathAxisFunc:
196 | * @ctxt: the XPath interpreter context
197 | * @cur: the previous node being explored on that axis
198 | *
199 | * An axis traversal function. To traverse an axis, the engine calls
200 | * the first time with cur == NULL and repeat until the function returns
201 | * NULL indicating the end of the axis traversal.
202 | *
203 | * Returns the next node in that axis or NULL if at the end of the axis.
204 | */
205 |
206 | typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt,
207 | xmlXPathObjectPtr cur);
208 |
209 | /*
210 | * Extra axis: a name and an axis function.
211 | */
212 |
213 | typedef struct _xmlXPathAxis xmlXPathAxis;
214 | typedef xmlXPathAxis *xmlXPathAxisPtr;
215 | struct _xmlXPathAxis {
216 | const xmlChar *name; /* the axis name */
217 | xmlXPathAxisFunc func; /* the search function */
218 | };
219 |
220 | /**
221 | * xmlXPathFunction:
222 | * @ctxt: the XPath interprestation context
223 | * @nargs: the number of arguments
224 | *
225 | * An XPath function.
226 | * The arguments (if any) are popped out from the context stack
227 | * and the result is pushed on the stack.
228 | */
229 |
230 | typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs);
231 |
232 | /*
233 | * Function and Variable Lookup.
234 | */
235 |
236 | /**
237 | * xmlXPathVariableLookupFunc:
238 | * @ctxt: an XPath context
239 | * @name: name of the variable
240 | * @ns_uri: the namespace name hosting this variable
241 | *
242 | * Prototype for callbacks used to plug variable lookup in the XPath
243 | * engine.
244 | *
245 | * Returns the XPath object value or NULL if not found.
246 | */
247 | typedef xmlXPathObjectPtr (*xmlXPathVariableLookupFunc) (void *ctxt,
248 | const xmlChar *name,
249 | const xmlChar *ns_uri);
250 |
251 | /**
252 | * xmlXPathFuncLookupFunc:
253 | * @ctxt: an XPath context
254 | * @name: name of the function
255 | * @ns_uri: the namespace name hosting this function
256 | *
257 | * Prototype for callbacks used to plug function lookup in the XPath
258 | * engine.
259 | *
260 | * Returns the XPath function or NULL if not found.
261 | */
262 | typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt,
263 | const xmlChar *name,
264 | const xmlChar *ns_uri);
265 |
266 | /**
267 | * xmlXPathFlags:
268 | * Flags for XPath engine compilation and runtime
269 | */
270 | /**
271 | * XML_XPATH_CHECKNS:
272 | *
273 | * check namespaces at compilation
274 | */
275 | #define XML_XPATH_CHECKNS (1<<0)
276 | /**
277 | * XML_XPATH_NOVAR:
278 | *
279 | * forbid variables in expression
280 | */
281 | #define XML_XPATH_NOVAR (1<<1)
282 |
283 | /**
284 | * xmlXPathContext:
285 | *
286 | * Expression evaluation occurs with respect to a context.
287 | * he context consists of:
288 | * - a node (the context node)
289 | * - a node list (the context node list)
290 | * - a set of variable bindings
291 | * - a function library
292 | * - the set of namespace declarations in scope for the expression
293 | * Following the switch to hash tables, this need to be trimmed up at
294 | * the next binary incompatible release.
295 | * The node may be modified when the context is passed to libxml2
296 | * for an XPath evaluation so you may need to initialize it again
297 | * before the next call.
298 | */
299 |
300 | struct _xmlXPathContext {
301 | xmlDocPtr doc; /* The current document */
302 | xmlNodePtr node; /* The current node */
303 |
304 | int nb_variables_unused; /* unused (hash table) */
305 | int max_variables_unused; /* unused (hash table) */
306 | xmlHashTablePtr varHash; /* Hash table of defined variables */
307 |
308 | int nb_types; /* number of defined types */
309 | int max_types; /* max number of types */
310 | xmlXPathTypePtr types; /* Array of defined types */
311 |
312 | int nb_funcs_unused; /* unused (hash table) */
313 | int max_funcs_unused; /* unused (hash table) */
314 | xmlHashTablePtr funcHash; /* Hash table of defined funcs */
315 |
316 | int nb_axis; /* number of defined axis */
317 | int max_axis; /* max number of axis */
318 | xmlXPathAxisPtr axis; /* Array of defined axis */
319 |
320 | /* the namespace nodes of the context node */
321 | xmlNsPtr *namespaces; /* Array of namespaces */
322 | int nsNr; /* number of namespace in scope */
323 | void *user; /* function to free */
324 |
325 | /* extra variables */
326 | int contextSize; /* the context size */
327 | int proximityPosition; /* the proximity position */
328 |
329 | /* extra stuff for XPointer */
330 | int xptr; /* is this an XPointer context? */
331 | xmlNodePtr here; /* for here() */
332 | xmlNodePtr origin; /* for origin() */
333 |
334 | /* the set of namespace declarations in scope for the expression */
335 | xmlHashTablePtr nsHash; /* The namespaces hash table */
336 | xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */
337 | void *varLookupData; /* variable lookup data */
338 |
339 | /* Possibility to link in an extra item */
340 | void *extra; /* needed for XSLT */
341 |
342 | /* The function name and URI when calling a function */
343 | const xmlChar *function;
344 | const xmlChar *functionURI;
345 |
346 | /* function lookup function and data */
347 | xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */
348 | void *funcLookupData; /* function lookup data */
349 |
350 | /* temporary namespace lists kept for walking the namespace axis */
351 | xmlNsPtr *tmpNsList; /* Array of namespaces */
352 | int tmpNsNr; /* number of namespaces in scope */
353 |
354 | /* error reporting mechanism */
355 | void *userData; /* user specific data block */
356 | xmlStructuredErrorFunc error; /* the callback in case of errors */
357 | xmlError lastError; /* the last error */
358 | xmlNodePtr debugNode; /* the source node XSLT */
359 |
360 | /* dictionary */
361 | xmlDictPtr dict; /* dictionary if any */
362 |
363 | int flags; /* flags to control compilation */
364 |
365 | /* Cache for reusal of XPath objects */
366 | void *cache;
367 |
368 | /* Resource limits */
369 | unsigned long opLimit;
370 | unsigned long opCount;
371 | int depth;
372 | };
373 |
374 | /*
375 | * The structure of a compiled expression form is not public.
376 | */
377 |
378 | typedef struct _xmlXPathCompExpr xmlXPathCompExpr;
379 | typedef xmlXPathCompExpr *xmlXPathCompExprPtr;
380 |
381 | /**
382 | * xmlXPathParserContext:
383 | *
384 | * An XPath parser context. It contains pure parsing information,
385 | * an xmlXPathContext, and the stack of objects.
386 | */
387 | struct _xmlXPathParserContext {
388 | const xmlChar *cur; /* the current char being parsed */
389 | const xmlChar *base; /* the full expression */
390 |
391 | int error; /* error code */
392 |
393 | xmlXPathContextPtr context; /* the evaluation context */
394 | xmlXPathObjectPtr value; /* the current value */
395 | int valueNr; /* number of values stacked */
396 | int valueMax; /* max number of values stacked */
397 | xmlXPathObjectPtr *valueTab; /* stack of values */
398 |
399 | xmlXPathCompExprPtr comp; /* the precompiled expression */
400 | int xptr; /* it this an XPointer expression */
401 | xmlNodePtr ancestor; /* used for walking preceding axis */
402 |
403 | int valueFrame; /* always zero for compatibility */
404 | };
405 |
406 | /************************************************************************
407 | * *
408 | * Public API *
409 | * *
410 | ************************************************************************/
411 |
412 | /**
413 | * Objects and Nodesets handling
414 | */
415 |
416 | XMLPUBVAR double xmlXPathNAN;
417 | XMLPUBVAR double xmlXPathPINF;
418 | XMLPUBVAR double xmlXPathNINF;
419 |
420 | /* These macros may later turn into functions */
421 | /**
422 | * xmlXPathNodeSetGetLength:
423 | * @ns: a node-set
424 | *
425 | * Implement a functionality similar to the DOM NodeList.length.
426 | *
427 | * Returns the number of nodes in the node-set.
428 | */
429 | #define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0)
430 | /**
431 | * xmlXPathNodeSetItem:
432 | * @ns: a node-set
433 | * @index: index of a node in the set
434 | *
435 | * Implements a functionality similar to the DOM NodeList.item().
436 | *
437 | * Returns the xmlNodePtr at the given @index in @ns or NULL if
438 | * @index is out of range (0 to length-1)
439 | */
440 | #define xmlXPathNodeSetItem(ns, index) \
441 | ((((ns) != NULL) && \
442 | ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \
443 | (ns)->nodeTab[(index)] \
444 | : NULL)
445 | /**
446 | * xmlXPathNodeSetIsEmpty:
447 | * @ns: a node-set
448 | *
449 | * Checks whether @ns is empty or not.
450 | *
451 | * Returns %TRUE if @ns is an empty node-set.
452 | */
453 | #define xmlXPathNodeSetIsEmpty(ns) \
454 | (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL))
455 |
456 |
457 | XMLPUBFUN void
458 | xmlXPathFreeObject (xmlXPathObjectPtr obj);
459 | XMLPUBFUN xmlNodeSetPtr
460 | xmlXPathNodeSetCreate (xmlNodePtr val);
461 | XMLPUBFUN void
462 | xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj);
463 | XMLPUBFUN void
464 | xmlXPathFreeNodeSet (xmlNodeSetPtr obj);
465 | XMLPUBFUN xmlXPathObjectPtr
466 | xmlXPathObjectCopy (xmlXPathObjectPtr val);
467 | XMLPUBFUN int
468 | xmlXPathCmpNodes (xmlNodePtr node1,
469 | xmlNodePtr node2);
470 | /**
471 | * Conversion functions to basic types.
472 | */
473 | XMLPUBFUN int
474 | xmlXPathCastNumberToBoolean (double val);
475 | XMLPUBFUN int
476 | xmlXPathCastStringToBoolean (const xmlChar * val);
477 | XMLPUBFUN int
478 | xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns);
479 | XMLPUBFUN int
480 | xmlXPathCastToBoolean (xmlXPathObjectPtr val);
481 |
482 | XMLPUBFUN double
483 | xmlXPathCastBooleanToNumber (int val);
484 | XMLPUBFUN double
485 | xmlXPathCastStringToNumber (const xmlChar * val);
486 | XMLPUBFUN double
487 | xmlXPathCastNodeToNumber (xmlNodePtr node);
488 | XMLPUBFUN double
489 | xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns);
490 | XMLPUBFUN double
491 | xmlXPathCastToNumber (xmlXPathObjectPtr val);
492 |
493 | XMLPUBFUN xmlChar *
494 | xmlXPathCastBooleanToString (int val);
495 | XMLPUBFUN xmlChar *
496 | xmlXPathCastNumberToString (double val);
497 | XMLPUBFUN xmlChar *
498 | xmlXPathCastNodeToString (xmlNodePtr node);
499 | XMLPUBFUN xmlChar *
500 | xmlXPathCastNodeSetToString (xmlNodeSetPtr ns);
501 | XMLPUBFUN xmlChar *
502 | xmlXPathCastToString (xmlXPathObjectPtr val);
503 |
504 | XMLPUBFUN xmlXPathObjectPtr
505 | xmlXPathConvertBoolean (xmlXPathObjectPtr val);
506 | XMLPUBFUN xmlXPathObjectPtr
507 | xmlXPathConvertNumber (xmlXPathObjectPtr val);
508 | XMLPUBFUN xmlXPathObjectPtr
509 | xmlXPathConvertString (xmlXPathObjectPtr val);
510 |
511 | /**
512 | * Context handling.
513 | */
514 | XMLPUBFUN xmlXPathContextPtr
515 | xmlXPathNewContext (xmlDocPtr doc);
516 | XMLPUBFUN void
517 | xmlXPathFreeContext (xmlXPathContextPtr ctxt);
518 | XMLPUBFUN int
519 | xmlXPathContextSetCache(xmlXPathContextPtr ctxt,
520 | int active,
521 | int value,
522 | int options);
523 | /**
524 | * Evaluation functions.
525 | */
526 | XMLPUBFUN long
527 | xmlXPathOrderDocElems (xmlDocPtr doc);
528 | XMLPUBFUN int
529 | xmlXPathSetContextNode (xmlNodePtr node,
530 | xmlXPathContextPtr ctx);
531 | XMLPUBFUN xmlXPathObjectPtr
532 | xmlXPathNodeEval (xmlNodePtr node,
533 | const xmlChar *str,
534 | xmlXPathContextPtr ctx);
535 | XMLPUBFUN xmlXPathObjectPtr
536 | xmlXPathEval (const xmlChar *str,
537 | xmlXPathContextPtr ctx);
538 | XMLPUBFUN xmlXPathObjectPtr
539 | xmlXPathEvalExpression (const xmlChar *str,
540 | xmlXPathContextPtr ctxt);
541 | XMLPUBFUN int
542 | xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
543 | xmlXPathObjectPtr res);
544 | /**
545 | * Separate compilation/evaluation entry points.
546 | */
547 | XMLPUBFUN xmlXPathCompExprPtr
548 | xmlXPathCompile (const xmlChar *str);
549 | XMLPUBFUN xmlXPathCompExprPtr
550 | xmlXPathCtxtCompile (xmlXPathContextPtr ctxt,
551 | const xmlChar *str);
552 | XMLPUBFUN xmlXPathObjectPtr
553 | xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
554 | xmlXPathContextPtr ctx);
555 | XMLPUBFUN int
556 | xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
557 | xmlXPathContextPtr ctxt);
558 | XMLPUBFUN void
559 | xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);
560 | #endif /* LIBXML_XPATH_ENABLED */
561 | #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
562 | XML_DEPRECATED
563 | XMLPUBFUN void
564 | xmlXPathInit (void);
565 | XMLPUBFUN int
566 | xmlXPathIsNaN (double val);
567 | XMLPUBFUN int
568 | xmlXPathIsInf (double val);
569 |
570 | #ifdef __cplusplus
571 | }
572 | #endif
573 |
574 | #endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*/
575 | #endif /* ! __XML_XPATH_H__ */
576 |
```