#
tokens: 44668/50000 2/808 files (page 77/168)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 77 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/flask/helpers.py:
--------------------------------------------------------------------------------

```python
  1 | from __future__ import annotations
  2 | 
  3 | import importlib.util
  4 | import os
  5 | import sys
  6 | import typing as t
  7 | from datetime import datetime
  8 | from functools import lru_cache
  9 | from functools import update_wrapper
 10 | 
 11 | import werkzeug.utils
 12 | from werkzeug.exceptions import abort as _wz_abort
 13 | from werkzeug.utils import redirect as _wz_redirect
 14 | from werkzeug.wrappers import Response as BaseResponse
 15 | 
 16 | from .globals import _cv_request
 17 | from .globals import current_app
 18 | from .globals import request
 19 | from .globals import request_ctx
 20 | from .globals import session
 21 | from .signals import message_flashed
 22 | 
 23 | if t.TYPE_CHECKING:  # pragma: no cover
 24 |     from .wrappers import Response
 25 | 
 26 | 
 27 | def get_debug_flag() -> bool:
 28 |     """Get whether debug mode should be enabled for the app, indicated by the
 29 |     :envvar:`FLASK_DEBUG` environment variable. The default is ``False``.
 30 |     """
 31 |     val = os.environ.get("FLASK_DEBUG")
 32 |     return bool(val and val.lower() not in {"0", "false", "no"})
 33 | 
 34 | 
 35 | def get_load_dotenv(default: bool = True) -> bool:
 36 |     """Get whether the user has disabled loading default dotenv files by
 37 |     setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load
 38 |     the files.
 39 | 
 40 |     :param default: What to return if the env var isn't set.
 41 |     """
 42 |     val = os.environ.get("FLASK_SKIP_DOTENV")
 43 | 
 44 |     if not val:
 45 |         return default
 46 | 
 47 |     return val.lower() in ("0", "false", "no")
 48 | 
 49 | 
 50 | def stream_with_context(
 51 |     generator_or_function: t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]],
 52 | ) -> t.Iterator[t.AnyStr]:
 53 |     """Request contexts disappear when the response is started on the server.
 54 |     This is done for efficiency reasons and to make it less likely to encounter
 55 |     memory leaks with badly written WSGI middlewares.  The downside is that if
 56 |     you are using streamed responses, the generator cannot access request bound
 57 |     information any more.
 58 | 
 59 |     This function however can help you keep the context around for longer::
 60 | 
 61 |         from flask import stream_with_context, request, Response
 62 | 
 63 |         @app.route('/stream')
 64 |         def streamed_response():
 65 |             @stream_with_context
 66 |             def generate():
 67 |                 yield 'Hello '
 68 |                 yield request.args['name']
 69 |                 yield '!'
 70 |             return Response(generate())
 71 | 
 72 |     Alternatively it can also be used around a specific generator::
 73 | 
 74 |         from flask import stream_with_context, request, Response
 75 | 
 76 |         @app.route('/stream')
 77 |         def streamed_response():
 78 |             def generate():
 79 |                 yield 'Hello '
 80 |                 yield request.args['name']
 81 |                 yield '!'
 82 |             return Response(stream_with_context(generate()))
 83 | 
 84 |     .. versionadded:: 0.9
 85 |     """
 86 |     try:
 87 |         gen = iter(generator_or_function)  # type: ignore[arg-type]
 88 |     except TypeError:
 89 | 
 90 |         def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any:
 91 |             gen = generator_or_function(*args, **kwargs)  # type: ignore[operator]
 92 |             return stream_with_context(gen)
 93 | 
 94 |         return update_wrapper(decorator, generator_or_function)  # type: ignore[arg-type]
 95 | 
 96 |     def generator() -> t.Iterator[t.AnyStr | None]:
 97 |         ctx = _cv_request.get(None)
 98 |         if ctx is None:
 99 |             raise RuntimeError(
100 |                 "'stream_with_context' can only be used when a request"
101 |                 " context is active, such as in a view function."
102 |             )
103 |         with ctx:
104 |             # Dummy sentinel.  Has to be inside the context block or we're
105 |             # not actually keeping the context around.
106 |             yield None
107 | 
108 |             # The try/finally is here so that if someone passes a WSGI level
109 |             # iterator in we're still running the cleanup logic.  Generators
110 |             # don't need that because they are closed on their destruction
111 |             # automatically.
112 |             try:
113 |                 yield from gen
114 |             finally:
115 |                 if hasattr(gen, "close"):
116 |                     gen.close()
117 | 
118 |     # The trick is to start the generator.  Then the code execution runs until
119 |     # the first dummy None is yielded at which point the context was already
120 |     # pushed.  This item is discarded.  Then when the iteration continues the
121 |     # real generator is executed.
122 |     wrapped_g = generator()
123 |     next(wrapped_g)
124 |     return wrapped_g  # type: ignore[return-value]
125 | 
126 | 
127 | def make_response(*args: t.Any) -> Response:
128 |     """Sometimes it is necessary to set additional headers in a view.  Because
129 |     views do not have to return response objects but can return a value that
130 |     is converted into a response object by Flask itself, it becomes tricky to
131 |     add headers to it.  This function can be called instead of using a return
132 |     and you will get a response object which you can use to attach headers.
133 | 
134 |     If view looked like this and you want to add a new header::
135 | 
136 |         def index():
137 |             return render_template('index.html', foo=42)
138 | 
139 |     You can now do something like this::
140 | 
141 |         def index():
142 |             response = make_response(render_template('index.html', foo=42))
143 |             response.headers['X-Parachutes'] = 'parachutes are cool'
144 |             return response
145 | 
146 |     This function accepts the very same arguments you can return from a
147 |     view function.  This for example creates a response with a 404 error
148 |     code::
149 | 
150 |         response = make_response(render_template('not_found.html'), 404)
151 | 
152 |     The other use case of this function is to force the return value of a
153 |     view function into a response which is helpful with view
154 |     decorators::
155 | 
156 |         response = make_response(view_function())
157 |         response.headers['X-Parachutes'] = 'parachutes are cool'
158 | 
159 |     Internally this function does the following things:
160 | 
161 |     -   if no arguments are passed, it creates a new response argument
162 |     -   if one argument is passed, :meth:`flask.Flask.make_response`
163 |         is invoked with it.
164 |     -   if more than one argument is passed, the arguments are passed
165 |         to the :meth:`flask.Flask.make_response` function as tuple.
166 | 
167 |     .. versionadded:: 0.6
168 |     """
169 |     if not args:
170 |         return current_app.response_class()
171 |     if len(args) == 1:
172 |         args = args[0]
173 |     return current_app.make_response(args)
174 | 
175 | 
176 | def url_for(
177 |     endpoint: str,
178 |     *,
179 |     _anchor: str | None = None,
180 |     _method: str | None = None,
181 |     _scheme: str | None = None,
182 |     _external: bool | None = None,
183 |     **values: t.Any,
184 | ) -> str:
185 |     """Generate a URL to the given endpoint with the given values.
186 | 
187 |     This requires an active request or application context, and calls
188 |     :meth:`current_app.url_for() <flask.Flask.url_for>`. See that method
189 |     for full documentation.
190 | 
191 |     :param endpoint: The endpoint name associated with the URL to
192 |         generate. If this starts with a ``.``, the current blueprint
193 |         name (if any) will be used.
194 |     :param _anchor: If given, append this as ``#anchor`` to the URL.
195 |     :param _method: If given, generate the URL associated with this
196 |         method for the endpoint.
197 |     :param _scheme: If given, the URL will have this scheme if it is
198 |         external.
199 |     :param _external: If given, prefer the URL to be internal (False) or
200 |         require it to be external (True). External URLs include the
201 |         scheme and domain. When not in an active request, URLs are
202 |         external by default.
203 |     :param values: Values to use for the variable parts of the URL rule.
204 |         Unknown keys are appended as query string arguments, like
205 |         ``?a=b&c=d``.
206 | 
207 |     .. versionchanged:: 2.2
208 |         Calls ``current_app.url_for``, allowing an app to override the
209 |         behavior.
210 | 
211 |     .. versionchanged:: 0.10
212 |        The ``_scheme`` parameter was added.
213 | 
214 |     .. versionchanged:: 0.9
215 |        The ``_anchor`` and ``_method`` parameters were added.
216 | 
217 |     .. versionchanged:: 0.9
218 |        Calls ``app.handle_url_build_error`` on build errors.
219 |     """
220 |     return current_app.url_for(
221 |         endpoint,
222 |         _anchor=_anchor,
223 |         _method=_method,
224 |         _scheme=_scheme,
225 |         _external=_external,
226 |         **values,
227 |     )
228 | 
229 | 
230 | def redirect(
231 |     location: str, code: int = 302, Response: type[BaseResponse] | None = None
232 | ) -> BaseResponse:
233 |     """Create a redirect response object.
234 | 
235 |     If :data:`~flask.current_app` is available, it will use its
236 |     :meth:`~flask.Flask.redirect` method, otherwise it will use
237 |     :func:`werkzeug.utils.redirect`.
238 | 
239 |     :param location: The URL to redirect to.
240 |     :param code: The status code for the redirect.
241 |     :param Response: The response class to use. Not used when
242 |         ``current_app`` is active, which uses ``app.response_class``.
243 | 
244 |     .. versionadded:: 2.2
245 |         Calls ``current_app.redirect`` if available instead of always
246 |         using Werkzeug's default ``redirect``.
247 |     """
248 |     if current_app:
249 |         return current_app.redirect(location, code=code)
250 | 
251 |     return _wz_redirect(location, code=code, Response=Response)
252 | 
253 | 
254 | def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn:
255 |     """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given
256 |     status code.
257 | 
258 |     If :data:`~flask.current_app` is available, it will call its
259 |     :attr:`~flask.Flask.aborter` object, otherwise it will use
260 |     :func:`werkzeug.exceptions.abort`.
261 | 
262 |     :param code: The status code for the exception, which must be
263 |         registered in ``app.aborter``.
264 |     :param args: Passed to the exception.
265 |     :param kwargs: Passed to the exception.
266 | 
267 |     .. versionadded:: 2.2
268 |         Calls ``current_app.aborter`` if available instead of always
269 |         using Werkzeug's default ``abort``.
270 |     """
271 |     if current_app:
272 |         current_app.aborter(code, *args, **kwargs)
273 | 
274 |     _wz_abort(code, *args, **kwargs)
275 | 
276 | 
277 | def get_template_attribute(template_name: str, attribute: str) -> t.Any:
278 |     """Loads a macro (or variable) a template exports.  This can be used to
279 |     invoke a macro from within Python code.  If you for example have a
280 |     template named :file:`_cider.html` with the following contents:
281 | 
282 |     .. sourcecode:: html+jinja
283 | 
284 |        {% macro hello(name) %}Hello {{ name }}!{% endmacro %}
285 | 
286 |     You can access this from Python code like this::
287 | 
288 |         hello = get_template_attribute('_cider.html', 'hello')
289 |         return hello('World')
290 | 
291 |     .. versionadded:: 0.2
292 | 
293 |     :param template_name: the name of the template
294 |     :param attribute: the name of the variable of macro to access
295 |     """
296 |     return getattr(current_app.jinja_env.get_template(template_name).module, attribute)
297 | 
298 | 
299 | def flash(message: str, category: str = "message") -> None:
300 |     """Flashes a message to the next request.  In order to remove the
301 |     flashed message from the session and to display it to the user,
302 |     the template has to call :func:`get_flashed_messages`.
303 | 
304 |     .. versionchanged:: 0.3
305 |        `category` parameter added.
306 | 
307 |     :param message: the message to be flashed.
308 |     :param category: the category for the message.  The following values
309 |                      are recommended: ``'message'`` for any kind of message,
310 |                      ``'error'`` for errors, ``'info'`` for information
311 |                      messages and ``'warning'`` for warnings.  However any
312 |                      kind of string can be used as category.
313 |     """
314 |     # Original implementation:
315 |     #
316 |     #     session.setdefault('_flashes', []).append((category, message))
317 |     #
318 |     # This assumed that changes made to mutable structures in the session are
319 |     # always in sync with the session object, which is not true for session
320 |     # implementations that use external storage for keeping their keys/values.
321 |     flashes = session.get("_flashes", [])
322 |     flashes.append((category, message))
323 |     session["_flashes"] = flashes
324 |     app = current_app._get_current_object()  # type: ignore
325 |     message_flashed.send(
326 |         app,
327 |         _async_wrapper=app.ensure_sync,
328 |         message=message,
329 |         category=category,
330 |     )
331 | 
332 | 
333 | def get_flashed_messages(
334 |     with_categories: bool = False, category_filter: t.Iterable[str] = ()
335 | ) -> list[str] | list[tuple[str, str]]:
336 |     """Pulls all flashed messages from the session and returns them.
337 |     Further calls in the same request to the function will return
338 |     the same messages.  By default just the messages are returned,
339 |     but when `with_categories` is set to ``True``, the return value will
340 |     be a list of tuples in the form ``(category, message)`` instead.
341 | 
342 |     Filter the flashed messages to one or more categories by providing those
343 |     categories in `category_filter`.  This allows rendering categories in
344 |     separate html blocks.  The `with_categories` and `category_filter`
345 |     arguments are distinct:
346 | 
347 |     * `with_categories` controls whether categories are returned with message
348 |       text (``True`` gives a tuple, where ``False`` gives just the message text).
349 |     * `category_filter` filters the messages down to only those matching the
350 |       provided categories.
351 | 
352 |     See :doc:`/patterns/flashing` for examples.
353 | 
354 |     .. versionchanged:: 0.3
355 |        `with_categories` parameter added.
356 | 
357 |     .. versionchanged:: 0.9
358 |         `category_filter` parameter added.
359 | 
360 |     :param with_categories: set to ``True`` to also receive categories.
361 |     :param category_filter: filter of categories to limit return values.  Only
362 |                             categories in the list will be returned.
363 |     """
364 |     flashes = request_ctx.flashes
365 |     if flashes is None:
366 |         flashes = session.pop("_flashes") if "_flashes" in session else []
367 |         request_ctx.flashes = flashes
368 |     if category_filter:
369 |         flashes = list(filter(lambda f: f[0] in category_filter, flashes))
370 |     if not with_categories:
371 |         return [x[1] for x in flashes]
372 |     return flashes
373 | 
374 | 
375 | def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]:
376 |     if kwargs.get("max_age") is None:
377 |         kwargs["max_age"] = current_app.get_send_file_max_age
378 | 
379 |     kwargs.update(
380 |         environ=request.environ,
381 |         use_x_sendfile=current_app.config["USE_X_SENDFILE"],
382 |         response_class=current_app.response_class,
383 |         _root_path=current_app.root_path,  # type: ignore
384 |     )
385 |     return kwargs
386 | 
387 | 
388 | def send_file(
389 |     path_or_file: os.PathLike[t.AnyStr] | str | t.BinaryIO,
390 |     mimetype: str | None = None,
391 |     as_attachment: bool = False,
392 |     download_name: str | None = None,
393 |     conditional: bool = True,
394 |     etag: bool | str = True,
395 |     last_modified: datetime | int | float | None = None,
396 |     max_age: None | (int | t.Callable[[str | None], int | None]) = None,
397 | ) -> Response:
398 |     """Send the contents of a file to the client.
399 | 
400 |     The first argument can be a file path or a file-like object. Paths
401 |     are preferred in most cases because Werkzeug can manage the file and
402 |     get extra information from the path. Passing a file-like object
403 |     requires that the file is opened in binary mode, and is mostly
404 |     useful when building a file in memory with :class:`io.BytesIO`.
405 | 
406 |     Never pass file paths provided by a user. The path is assumed to be
407 |     trusted, so a user could craft a path to access a file you didn't
408 |     intend. Use :func:`send_from_directory` to safely serve
409 |     user-requested paths from within a directory.
410 | 
411 |     If the WSGI server sets a ``file_wrapper`` in ``environ``, it is
412 |     used, otherwise Werkzeug's built-in wrapper is used. Alternatively,
413 |     if the HTTP server supports ``X-Sendfile``, configuring Flask with
414 |     ``USE_X_SENDFILE = True`` will tell the server to send the given
415 |     path, which is much more efficient than reading it in Python.
416 | 
417 |     :param path_or_file: The path to the file to send, relative to the
418 |         current working directory if a relative path is given.
419 |         Alternatively, a file-like object opened in binary mode. Make
420 |         sure the file pointer is seeked to the start of the data.
421 |     :param mimetype: The MIME type to send for the file. If not
422 |         provided, it will try to detect it from the file name.
423 |     :param as_attachment: Indicate to a browser that it should offer to
424 |         save the file instead of displaying it.
425 |     :param download_name: The default name browsers will use when saving
426 |         the file. Defaults to the passed file name.
427 |     :param conditional: Enable conditional and range responses based on
428 |         request headers. Requires passing a file path and ``environ``.
429 |     :param etag: Calculate an ETag for the file, which requires passing
430 |         a file path. Can also be a string to use instead.
431 |     :param last_modified: The last modified time to send for the file,
432 |         in seconds. If not provided, it will try to detect it from the
433 |         file path.
434 |     :param max_age: How long the client should cache the file, in
435 |         seconds. If set, ``Cache-Control`` will be ``public``, otherwise
436 |         it will be ``no-cache`` to prefer conditional caching.
437 | 
438 |     .. versionchanged:: 2.0
439 |         ``download_name`` replaces the ``attachment_filename``
440 |         parameter. If ``as_attachment=False``, it is passed with
441 |         ``Content-Disposition: inline`` instead.
442 | 
443 |     .. versionchanged:: 2.0
444 |         ``max_age`` replaces the ``cache_timeout`` parameter.
445 |         ``conditional`` is enabled and ``max_age`` is not set by
446 |         default.
447 | 
448 |     .. versionchanged:: 2.0
449 |         ``etag`` replaces the ``add_etags`` parameter. It can be a
450 |         string to use instead of generating one.
451 | 
452 |     .. versionchanged:: 2.0
453 |         Passing a file-like object that inherits from
454 |         :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather
455 |         than sending an empty file.
456 | 
457 |     .. versionadded:: 2.0
458 |         Moved the implementation to Werkzeug. This is now a wrapper to
459 |         pass some Flask-specific arguments.
460 | 
461 |     .. versionchanged:: 1.1
462 |         ``filename`` may be a :class:`~os.PathLike` object.
463 | 
464 |     .. versionchanged:: 1.1
465 |         Passing a :class:`~io.BytesIO` object supports range requests.
466 | 
467 |     .. versionchanged:: 1.0.3
468 |         Filenames are encoded with ASCII instead of Latin-1 for broader
469 |         compatibility with WSGI servers.
470 | 
471 |     .. versionchanged:: 1.0
472 |         UTF-8 filenames as specified in :rfc:`2231` are supported.
473 | 
474 |     .. versionchanged:: 0.12
475 |         The filename is no longer automatically inferred from file
476 |         objects. If you want to use automatic MIME and etag support,
477 |         pass a filename via ``filename_or_fp`` or
478 |         ``attachment_filename``.
479 | 
480 |     .. versionchanged:: 0.12
481 |         ``attachment_filename`` is preferred over ``filename`` for MIME
482 |         detection.
483 | 
484 |     .. versionchanged:: 0.9
485 |         ``cache_timeout`` defaults to
486 |         :meth:`Flask.get_send_file_max_age`.
487 | 
488 |     .. versionchanged:: 0.7
489 |         MIME guessing and etag support for file-like objects was
490 |         removed because it was unreliable. Pass a filename if you are
491 |         able to, otherwise attach an etag yourself.
492 | 
493 |     .. versionchanged:: 0.5
494 |         The ``add_etags``, ``cache_timeout`` and ``conditional``
495 |         parameters were added. The default behavior is to add etags.
496 | 
497 |     .. versionadded:: 0.2
498 |     """
499 |     return werkzeug.utils.send_file(  # type: ignore[return-value]
500 |         **_prepare_send_file_kwargs(
501 |             path_or_file=path_or_file,
502 |             environ=request.environ,
503 |             mimetype=mimetype,
504 |             as_attachment=as_attachment,
505 |             download_name=download_name,
506 |             conditional=conditional,
507 |             etag=etag,
508 |             last_modified=last_modified,
509 |             max_age=max_age,
510 |         )
511 |     )
512 | 
513 | 
514 | def send_from_directory(
515 |     directory: os.PathLike[str] | str,
516 |     path: os.PathLike[str] | str,
517 |     **kwargs: t.Any,
518 | ) -> Response:
519 |     """Send a file from within a directory using :func:`send_file`.
520 | 
521 |     .. code-block:: python
522 | 
523 |         @app.route("/uploads/<path:name>")
524 |         def download_file(name):
525 |             return send_from_directory(
526 |                 app.config['UPLOAD_FOLDER'], name, as_attachment=True
527 |             )
528 | 
529 |     This is a secure way to serve files from a folder, such as static
530 |     files or uploads. Uses :func:`~werkzeug.security.safe_join` to
531 |     ensure the path coming from the client is not maliciously crafted to
532 |     point outside the specified directory.
533 | 
534 |     If the final path does not point to an existing regular file,
535 |     raises a 404 :exc:`~werkzeug.exceptions.NotFound` error.
536 | 
537 |     :param directory: The directory that ``path`` must be located under,
538 |         relative to the current application's root path.
539 |     :param path: The path to the file to send, relative to
540 |         ``directory``.
541 |     :param kwargs: Arguments to pass to :func:`send_file`.
542 | 
543 |     .. versionchanged:: 2.0
544 |         ``path`` replaces the ``filename`` parameter.
545 | 
546 |     .. versionadded:: 2.0
547 |         Moved the implementation to Werkzeug. This is now a wrapper to
548 |         pass some Flask-specific arguments.
549 | 
550 |     .. versionadded:: 0.5
551 |     """
552 |     return werkzeug.utils.send_from_directory(  # type: ignore[return-value]
553 |         directory, path, **_prepare_send_file_kwargs(**kwargs)
554 |     )
555 | 
556 | 
557 | def get_root_path(import_name: str) -> str:
558 |     """Find the root path of a package, or the path that contains a
559 |     module. If it cannot be found, returns the current working
560 |     directory.
561 | 
562 |     Not to be confused with the value returned by :func:`find_package`.
563 | 
564 |     :meta private:
565 |     """
566 |     # Module already imported and has a file attribute. Use that first.
567 |     mod = sys.modules.get(import_name)
568 | 
569 |     if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None:
570 |         return os.path.dirname(os.path.abspath(mod.__file__))
571 | 
572 |     # Next attempt: check the loader.
573 |     try:
574 |         spec = importlib.util.find_spec(import_name)
575 | 
576 |         if spec is None:
577 |             raise ValueError
578 |     except (ImportError, ValueError):
579 |         loader = None
580 |     else:
581 |         loader = spec.loader
582 | 
583 |     # Loader does not exist or we're referring to an unloaded main
584 |     # module or a main module without path (interactive sessions), go
585 |     # with the current working directory.
586 |     if loader is None:
587 |         return os.getcwd()
588 | 
589 |     if hasattr(loader, "get_filename"):
590 |         filepath = loader.get_filename(import_name)
591 |     else:
592 |         # Fall back to imports.
593 |         __import__(import_name)
594 |         mod = sys.modules[import_name]
595 |         filepath = getattr(mod, "__file__", None)
596 | 
597 |         # If we don't have a file path it might be because it is a
598 |         # namespace package. In this case pick the root path from the
599 |         # first module that is contained in the package.
600 |         if filepath is None:
601 |             raise RuntimeError(
602 |                 "No root path can be found for the provided module"
603 |                 f" {import_name!r}. This can happen because the module"
604 |                 " came from an import hook that does not provide file"
605 |                 " name information or because it's a namespace package."
606 |                 " In this case the root path needs to be explicitly"
607 |                 " provided."
608 |             )
609 | 
610 |     # filepath is import_name.py for a module, or __init__.py for a package.
611 |     return os.path.dirname(os.path.abspath(filepath))  # type: ignore[no-any-return]
612 | 
613 | 
614 | @lru_cache(maxsize=None)
615 | def _split_blueprint_path(name: str) -> list[str]:
616 |     out: list[str] = [name]
617 | 
618 |     if "." in name:
619 |         out.extend(_split_blueprint_path(name.rpartition(".")[0]))
620 | 
621 |     return out
622 | 
```

--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/jinja2/loaders.py:
--------------------------------------------------------------------------------

```python
  1 | """API and implementations for loading templates from different data
  2 | sources.
  3 | """
  4 | 
  5 | import importlib.util
  6 | import os
  7 | import posixpath
  8 | import sys
  9 | import typing as t
 10 | import weakref
 11 | import zipimport
 12 | from collections import abc
 13 | from hashlib import sha1
 14 | from importlib import import_module
 15 | from types import ModuleType
 16 | 
 17 | from .exceptions import TemplateNotFound
 18 | from .utils import internalcode
 19 | 
 20 | if t.TYPE_CHECKING:
 21 |     from .environment import Environment
 22 |     from .environment import Template
 23 | 
 24 | 
 25 | def split_template_path(template: str) -> t.List[str]:
 26 |     """Split a path into segments and perform a sanity check.  If it detects
 27 |     '..' in the path it will raise a `TemplateNotFound` error.
 28 |     """
 29 |     pieces = []
 30 |     for piece in template.split("/"):
 31 |         if (
 32 |             os.path.sep in piece
 33 |             or (os.path.altsep and os.path.altsep in piece)
 34 |             or piece == os.path.pardir
 35 |         ):
 36 |             raise TemplateNotFound(template)
 37 |         elif piece and piece != ".":
 38 |             pieces.append(piece)
 39 |     return pieces
 40 | 
 41 | 
 42 | class BaseLoader:
 43 |     """Baseclass for all loaders.  Subclass this and override `get_source` to
 44 |     implement a custom loading mechanism.  The environment provides a
 45 |     `get_template` method that calls the loader's `load` method to get the
 46 |     :class:`Template` object.
 47 | 
 48 |     A very basic example for a loader that looks up templates on the file
 49 |     system could look like this::
 50 | 
 51 |         from jinja2 import BaseLoader, TemplateNotFound
 52 |         from os.path import join, exists, getmtime
 53 | 
 54 |         class MyLoader(BaseLoader):
 55 | 
 56 |             def __init__(self, path):
 57 |                 self.path = path
 58 | 
 59 |             def get_source(self, environment, template):
 60 |                 path = join(self.path, template)
 61 |                 if not exists(path):
 62 |                     raise TemplateNotFound(template)
 63 |                 mtime = getmtime(path)
 64 |                 with open(path) as f:
 65 |                     source = f.read()
 66 |                 return source, path, lambda: mtime == getmtime(path)
 67 |     """
 68 | 
 69 |     #: if set to `False` it indicates that the loader cannot provide access
 70 |     #: to the source of templates.
 71 |     #:
 72 |     #: .. versionadded:: 2.4
 73 |     has_source_access = True
 74 | 
 75 |     def get_source(
 76 |         self, environment: "Environment", template: str
 77 |     ) -> t.Tuple[str, t.Optional[str], t.Optional[t.Callable[[], bool]]]:
 78 |         """Get the template source, filename and reload helper for a template.
 79 |         It's passed the environment and template name and has to return a
 80 |         tuple in the form ``(source, filename, uptodate)`` or raise a
 81 |         `TemplateNotFound` error if it can't locate the template.
 82 | 
 83 |         The source part of the returned tuple must be the source of the
 84 |         template as a string. The filename should be the name of the
 85 |         file on the filesystem if it was loaded from there, otherwise
 86 |         ``None``. The filename is used by Python for the tracebacks
 87 |         if no loader extension is used.
 88 | 
 89 |         The last item in the tuple is the `uptodate` function.  If auto
 90 |         reloading is enabled it's always called to check if the template
 91 |         changed.  No arguments are passed so the function must store the
 92 |         old state somewhere (for example in a closure).  If it returns `False`
 93 |         the template will be reloaded.
 94 |         """
 95 |         if not self.has_source_access:
 96 |             raise RuntimeError(
 97 |                 f"{type(self).__name__} cannot provide access to the source"
 98 |             )
 99 |         raise TemplateNotFound(template)
100 | 
101 |     def list_templates(self) -> t.List[str]:
102 |         """Iterates over all templates.  If the loader does not support that
103 |         it should raise a :exc:`TypeError` which is the default behavior.
104 |         """
105 |         raise TypeError("this loader cannot iterate over all templates")
106 | 
107 |     @internalcode
108 |     def load(
109 |         self,
110 |         environment: "Environment",
111 |         name: str,
112 |         globals: t.Optional[t.MutableMapping[str, t.Any]] = None,
113 |     ) -> "Template":
114 |         """Loads a template.  This method looks up the template in the cache
115 |         or loads one by calling :meth:`get_source`.  Subclasses should not
116 |         override this method as loaders working on collections of other
117 |         loaders (such as :class:`PrefixLoader` or :class:`ChoiceLoader`)
118 |         will not call this method but `get_source` directly.
119 |         """
120 |         code = None
121 |         if globals is None:
122 |             globals = {}
123 | 
124 |         # first we try to get the source for this template together
125 |         # with the filename and the uptodate function.
126 |         source, filename, uptodate = self.get_source(environment, name)
127 | 
128 |         # try to load the code from the bytecode cache if there is a
129 |         # bytecode cache configured.
130 |         bcc = environment.bytecode_cache
131 |         if bcc is not None:
132 |             bucket = bcc.get_bucket(environment, name, filename, source)
133 |             code = bucket.code
134 | 
135 |         # if we don't have code so far (not cached, no longer up to
136 |         # date) etc. we compile the template
137 |         if code is None:
138 |             code = environment.compile(source, name, filename)
139 | 
140 |         # if the bytecode cache is available and the bucket doesn't
141 |         # have a code so far, we give the bucket the new code and put
142 |         # it back to the bytecode cache.
143 |         if bcc is not None and bucket.code is None:
144 |             bucket.code = code
145 |             bcc.set_bucket(bucket)
146 | 
147 |         return environment.template_class.from_code(
148 |             environment, code, globals, uptodate
149 |         )
150 | 
151 | 
152 | class FileSystemLoader(BaseLoader):
153 |     """Load templates from a directory in the file system.
154 | 
155 |     The path can be relative or absolute. Relative paths are relative to
156 |     the current working directory.
157 | 
158 |     .. code-block:: python
159 | 
160 |         loader = FileSystemLoader("templates")
161 | 
162 |     A list of paths can be given. The directories will be searched in
163 |     order, stopping at the first matching template.
164 | 
165 |     .. code-block:: python
166 | 
167 |         loader = FileSystemLoader(["/override/templates", "/default/templates"])
168 | 
169 |     :param searchpath: A path, or list of paths, to the directory that
170 |         contains the templates.
171 |     :param encoding: Use this encoding to read the text from template
172 |         files.
173 |     :param followlinks: Follow symbolic links in the path.
174 | 
175 |     .. versionchanged:: 2.8
176 |         Added the ``followlinks`` parameter.
177 |     """
178 | 
179 |     def __init__(
180 |         self,
181 |         searchpath: t.Union[
182 |             str, "os.PathLike[str]", t.Sequence[t.Union[str, "os.PathLike[str]"]]
183 |         ],
184 |         encoding: str = "utf-8",
185 |         followlinks: bool = False,
186 |     ) -> None:
187 |         if not isinstance(searchpath, abc.Iterable) or isinstance(searchpath, str):
188 |             searchpath = [searchpath]
189 | 
190 |         self.searchpath = [os.fspath(p) for p in searchpath]
191 |         self.encoding = encoding
192 |         self.followlinks = followlinks
193 | 
194 |     def get_source(
195 |         self, environment: "Environment", template: str
196 |     ) -> t.Tuple[str, str, t.Callable[[], bool]]:
197 |         pieces = split_template_path(template)
198 | 
199 |         for searchpath in self.searchpath:
200 |             # Use posixpath even on Windows to avoid "drive:" or UNC
201 |             # segments breaking out of the search directory.
202 |             filename = posixpath.join(searchpath, *pieces)
203 | 
204 |             if os.path.isfile(filename):
205 |                 break
206 |         else:
207 |             raise TemplateNotFound(template)
208 | 
209 |         with open(filename, encoding=self.encoding) as f:
210 |             contents = f.read()
211 | 
212 |         mtime = os.path.getmtime(filename)
213 | 
214 |         def uptodate() -> bool:
215 |             try:
216 |                 return os.path.getmtime(filename) == mtime
217 |             except OSError:
218 |                 return False
219 | 
220 |         # Use normpath to convert Windows altsep to sep.
221 |         return contents, os.path.normpath(filename), uptodate
222 | 
223 |     def list_templates(self) -> t.List[str]:
224 |         found = set()
225 |         for searchpath in self.searchpath:
226 |             walk_dir = os.walk(searchpath, followlinks=self.followlinks)
227 |             for dirpath, _, filenames in walk_dir:
228 |                 for filename in filenames:
229 |                     template = (
230 |                         os.path.join(dirpath, filename)[len(searchpath) :]
231 |                         .strip(os.path.sep)
232 |                         .replace(os.path.sep, "/")
233 |                     )
234 |                     if template[:2] == "./":
235 |                         template = template[2:]
236 |                     if template not in found:
237 |                         found.add(template)
238 |         return sorted(found)
239 | 
240 | 
241 | class PackageLoader(BaseLoader):
242 |     """Load templates from a directory in a Python package.
243 | 
244 |     :param package_name: Import name of the package that contains the
245 |         template directory.
246 |     :param package_path: Directory within the imported package that
247 |         contains the templates.
248 |     :param encoding: Encoding of template files.
249 | 
250 |     The following example looks up templates in the ``pages`` directory
251 |     within the ``project.ui`` package.
252 | 
253 |     .. code-block:: python
254 | 
255 |         loader = PackageLoader("project.ui", "pages")
256 | 
257 |     Only packages installed as directories (standard pip behavior) or
258 |     zip/egg files (less common) are supported. The Python API for
259 |     introspecting data in packages is too limited to support other
260 |     installation methods the way this loader requires.
261 | 
262 |     There is limited support for :pep:`420` namespace packages. The
263 |     template directory is assumed to only be in one namespace
264 |     contributor. Zip files contributing to a namespace are not
265 |     supported.
266 | 
267 |     .. versionchanged:: 3.0
268 |         No longer uses ``setuptools`` as a dependency.
269 | 
270 |     .. versionchanged:: 3.0
271 |         Limited PEP 420 namespace package support.
272 |     """
273 | 
274 |     def __init__(
275 |         self,
276 |         package_name: str,
277 |         package_path: "str" = "templates",
278 |         encoding: str = "utf-8",
279 |     ) -> None:
280 |         package_path = os.path.normpath(package_path).rstrip(os.path.sep)
281 | 
282 |         # normpath preserves ".", which isn't valid in zip paths.
283 |         if package_path == os.path.curdir:
284 |             package_path = ""
285 |         elif package_path[:2] == os.path.curdir + os.path.sep:
286 |             package_path = package_path[2:]
287 | 
288 |         self.package_path = package_path
289 |         self.package_name = package_name
290 |         self.encoding = encoding
291 | 
292 |         # Make sure the package exists. This also makes namespace
293 |         # packages work, otherwise get_loader returns None.
294 |         import_module(package_name)
295 |         spec = importlib.util.find_spec(package_name)
296 |         assert spec is not None, "An import spec was not found for the package."
297 |         loader = spec.loader
298 |         assert loader is not None, "A loader was not found for the package."
299 |         self._loader = loader
300 |         self._archive = None
301 |         template_root = None
302 | 
303 |         if isinstance(loader, zipimport.zipimporter):
304 |             self._archive = loader.archive
305 |             pkgdir = next(iter(spec.submodule_search_locations))  # type: ignore
306 |             template_root = os.path.join(pkgdir, package_path).rstrip(os.path.sep)
307 |         else:
308 |             roots: t.List[str] = []
309 | 
310 |             # One element for regular packages, multiple for namespace
311 |             # packages, or None for single module file.
312 |             if spec.submodule_search_locations:
313 |                 roots.extend(spec.submodule_search_locations)
314 |             # A single module file, use the parent directory instead.
315 |             elif spec.origin is not None:
316 |                 roots.append(os.path.dirname(spec.origin))
317 | 
318 |             for root in roots:
319 |                 root = os.path.join(root, package_path)
320 | 
321 |                 if os.path.isdir(root):
322 |                     template_root = root
323 |                     break
324 | 
325 |         if template_root is None:
326 |             raise ValueError(
327 |                 f"The {package_name!r} package was not installed in a"
328 |                 " way that PackageLoader understands."
329 |             )
330 | 
331 |         self._template_root = template_root
332 | 
333 |     def get_source(
334 |         self, environment: "Environment", template: str
335 |     ) -> t.Tuple[str, str, t.Optional[t.Callable[[], bool]]]:
336 |         # Use posixpath even on Windows to avoid "drive:" or UNC
337 |         # segments breaking out of the search directory. Use normpath to
338 |         # convert Windows altsep to sep.
339 |         p = os.path.normpath(
340 |             posixpath.join(self._template_root, *split_template_path(template))
341 |         )
342 |         up_to_date: t.Optional[t.Callable[[], bool]]
343 | 
344 |         if self._archive is None:
345 |             # Package is a directory.
346 |             if not os.path.isfile(p):
347 |                 raise TemplateNotFound(template)
348 | 
349 |             with open(p, "rb") as f:
350 |                 source = f.read()
351 | 
352 |             mtime = os.path.getmtime(p)
353 | 
354 |             def up_to_date() -> bool:
355 |                 return os.path.isfile(p) and os.path.getmtime(p) == mtime
356 | 
357 |         else:
358 |             # Package is a zip file.
359 |             try:
360 |                 source = self._loader.get_data(p)  # type: ignore
361 |             except OSError as e:
362 |                 raise TemplateNotFound(template) from e
363 | 
364 |             # Could use the zip's mtime for all template mtimes, but
365 |             # would need to safely reload the module if it's out of
366 |             # date, so just report it as always current.
367 |             up_to_date = None
368 | 
369 |         return source.decode(self.encoding), p, up_to_date
370 | 
371 |     def list_templates(self) -> t.List[str]:
372 |         results: t.List[str] = []
373 | 
374 |         if self._archive is None:
375 |             # Package is a directory.
376 |             offset = len(self._template_root)
377 | 
378 |             for dirpath, _, filenames in os.walk(self._template_root):
379 |                 dirpath = dirpath[offset:].lstrip(os.path.sep)
380 |                 results.extend(
381 |                     os.path.join(dirpath, name).replace(os.path.sep, "/")
382 |                     for name in filenames
383 |                 )
384 |         else:
385 |             if not hasattr(self._loader, "_files"):
386 |                 raise TypeError(
387 |                     "This zip import does not have the required"
388 |                     " metadata to list templates."
389 |                 )
390 | 
391 |             # Package is a zip file.
392 |             prefix = (
393 |                 self._template_root[len(self._archive) :].lstrip(os.path.sep)
394 |                 + os.path.sep
395 |             )
396 |             offset = len(prefix)
397 | 
398 |             for name in self._loader._files.keys():
399 |                 # Find names under the templates directory that aren't directories.
400 |                 if name.startswith(prefix) and name[-1] != os.path.sep:
401 |                     results.append(name[offset:].replace(os.path.sep, "/"))
402 | 
403 |         results.sort()
404 |         return results
405 | 
406 | 
407 | class DictLoader(BaseLoader):
408 |     """Loads a template from a Python dict mapping template names to
409 |     template source.  This loader is useful for unittesting:
410 | 
411 |     >>> loader = DictLoader({'index.html': 'source here'})
412 | 
413 |     Because auto reloading is rarely useful this is disabled per default.
414 |     """
415 | 
416 |     def __init__(self, mapping: t.Mapping[str, str]) -> None:
417 |         self.mapping = mapping
418 | 
419 |     def get_source(
420 |         self, environment: "Environment", template: str
421 |     ) -> t.Tuple[str, None, t.Callable[[], bool]]:
422 |         if template in self.mapping:
423 |             source = self.mapping[template]
424 |             return source, None, lambda: source == self.mapping.get(template)
425 |         raise TemplateNotFound(template)
426 | 
427 |     def list_templates(self) -> t.List[str]:
428 |         return sorted(self.mapping)
429 | 
430 | 
431 | class FunctionLoader(BaseLoader):
432 |     """A loader that is passed a function which does the loading.  The
433 |     function receives the name of the template and has to return either
434 |     a string with the template source, a tuple in the form ``(source,
435 |     filename, uptodatefunc)`` or `None` if the template does not exist.
436 | 
437 |     >>> def load_template(name):
438 |     ...     if name == 'index.html':
439 |     ...         return '...'
440 |     ...
441 |     >>> loader = FunctionLoader(load_template)
442 | 
443 |     The `uptodatefunc` is a function that is called if autoreload is enabled
444 |     and has to return `True` if the template is still up to date.  For more
445 |     details have a look at :meth:`BaseLoader.get_source` which has the same
446 |     return value.
447 |     """
448 | 
449 |     def __init__(
450 |         self,
451 |         load_func: t.Callable[
452 |             [str],
453 |             t.Optional[
454 |                 t.Union[
455 |                     str, t.Tuple[str, t.Optional[str], t.Optional[t.Callable[[], bool]]]
456 |                 ]
457 |             ],
458 |         ],
459 |     ) -> None:
460 |         self.load_func = load_func
461 | 
462 |     def get_source(
463 |         self, environment: "Environment", template: str
464 |     ) -> t.Tuple[str, t.Optional[str], t.Optional[t.Callable[[], bool]]]:
465 |         rv = self.load_func(template)
466 | 
467 |         if rv is None:
468 |             raise TemplateNotFound(template)
469 | 
470 |         if isinstance(rv, str):
471 |             return rv, None, None
472 | 
473 |         return rv
474 | 
475 | 
476 | class PrefixLoader(BaseLoader):
477 |     """A loader that is passed a dict of loaders where each loader is bound
478 |     to a prefix.  The prefix is delimited from the template by a slash per
479 |     default, which can be changed by setting the `delimiter` argument to
480 |     something else::
481 | 
482 |         loader = PrefixLoader({
483 |             'app1':     PackageLoader('mypackage.app1'),
484 |             'app2':     PackageLoader('mypackage.app2')
485 |         })
486 | 
487 |     By loading ``'app1/index.html'`` the file from the app1 package is loaded,
488 |     by loading ``'app2/index.html'`` the file from the second.
489 |     """
490 | 
491 |     def __init__(
492 |         self, mapping: t.Mapping[str, BaseLoader], delimiter: str = "/"
493 |     ) -> None:
494 |         self.mapping = mapping
495 |         self.delimiter = delimiter
496 | 
497 |     def get_loader(self, template: str) -> t.Tuple[BaseLoader, str]:
498 |         try:
499 |             prefix, name = template.split(self.delimiter, 1)
500 |             loader = self.mapping[prefix]
501 |         except (ValueError, KeyError) as e:
502 |             raise TemplateNotFound(template) from e
503 |         return loader, name
504 | 
505 |     def get_source(
506 |         self, environment: "Environment", template: str
507 |     ) -> t.Tuple[str, t.Optional[str], t.Optional[t.Callable[[], bool]]]:
508 |         loader, name = self.get_loader(template)
509 |         try:
510 |             return loader.get_source(environment, name)
511 |         except TemplateNotFound as e:
512 |             # re-raise the exception with the correct filename here.
513 |             # (the one that includes the prefix)
514 |             raise TemplateNotFound(template) from e
515 | 
516 |     @internalcode
517 |     def load(
518 |         self,
519 |         environment: "Environment",
520 |         name: str,
521 |         globals: t.Optional[t.MutableMapping[str, t.Any]] = None,
522 |     ) -> "Template":
523 |         loader, local_name = self.get_loader(name)
524 |         try:
525 |             return loader.load(environment, local_name, globals)
526 |         except TemplateNotFound as e:
527 |             # re-raise the exception with the correct filename here.
528 |             # (the one that includes the prefix)
529 |             raise TemplateNotFound(name) from e
530 | 
531 |     def list_templates(self) -> t.List[str]:
532 |         result = []
533 |         for prefix, loader in self.mapping.items():
534 |             for template in loader.list_templates():
535 |                 result.append(prefix + self.delimiter + template)
536 |         return result
537 | 
538 | 
539 | class ChoiceLoader(BaseLoader):
540 |     """This loader works like the `PrefixLoader` just that no prefix is
541 |     specified.  If a template could not be found by one loader the next one
542 |     is tried.
543 | 
544 |     >>> loader = ChoiceLoader([
545 |     ...     FileSystemLoader('/path/to/user/templates'),
546 |     ...     FileSystemLoader('/path/to/system/templates')
547 |     ... ])
548 | 
549 |     This is useful if you want to allow users to override builtin templates
550 |     from a different location.
551 |     """
552 | 
553 |     def __init__(self, loaders: t.Sequence[BaseLoader]) -> None:
554 |         self.loaders = loaders
555 | 
556 |     def get_source(
557 |         self, environment: "Environment", template: str
558 |     ) -> t.Tuple[str, t.Optional[str], t.Optional[t.Callable[[], bool]]]:
559 |         for loader in self.loaders:
560 |             try:
561 |                 return loader.get_source(environment, template)
562 |             except TemplateNotFound:
563 |                 pass
564 |         raise TemplateNotFound(template)
565 | 
566 |     @internalcode
567 |     def load(
568 |         self,
569 |         environment: "Environment",
570 |         name: str,
571 |         globals: t.Optional[t.MutableMapping[str, t.Any]] = None,
572 |     ) -> "Template":
573 |         for loader in self.loaders:
574 |             try:
575 |                 return loader.load(environment, name, globals)
576 |             except TemplateNotFound:
577 |                 pass
578 |         raise TemplateNotFound(name)
579 | 
580 |     def list_templates(self) -> t.List[str]:
581 |         found = set()
582 |         for loader in self.loaders:
583 |             found.update(loader.list_templates())
584 |         return sorted(found)
585 | 
586 | 
587 | class _TemplateModule(ModuleType):
588 |     """Like a normal module but with support for weak references"""
589 | 
590 | 
591 | class ModuleLoader(BaseLoader):
592 |     """This loader loads templates from precompiled templates.
593 | 
594 |     Example usage:
595 | 
596 |     >>> loader = ChoiceLoader([
597 |     ...     ModuleLoader('/path/to/compiled/templates'),
598 |     ...     FileSystemLoader('/path/to/templates')
599 |     ... ])
600 | 
601 |     Templates can be precompiled with :meth:`Environment.compile_templates`.
602 |     """
603 | 
604 |     has_source_access = False
605 | 
606 |     def __init__(
607 |         self,
608 |         path: t.Union[
609 |             str, "os.PathLike[str]", t.Sequence[t.Union[str, "os.PathLike[str]"]]
610 |         ],
611 |     ) -> None:
612 |         package_name = f"_jinja2_module_templates_{id(self):x}"
613 | 
614 |         # create a fake module that looks for the templates in the
615 |         # path given.
616 |         mod = _TemplateModule(package_name)
617 | 
618 |         if not isinstance(path, abc.Iterable) or isinstance(path, str):
619 |             path = [path]
620 | 
621 |         mod.__path__ = [os.fspath(p) for p in path]
622 | 
623 |         sys.modules[package_name] = weakref.proxy(
624 |             mod, lambda x: sys.modules.pop(package_name, None)
625 |         )
626 | 
627 |         # the only strong reference, the sys.modules entry is weak
628 |         # so that the garbage collector can remove it once the
629 |         # loader that created it goes out of business.
630 |         self.module = mod
631 |         self.package_name = package_name
632 | 
633 |     @staticmethod
634 |     def get_template_key(name: str) -> str:
635 |         return "tmpl_" + sha1(name.encode("utf-8")).hexdigest()
636 | 
637 |     @staticmethod
638 |     def get_module_filename(name: str) -> str:
639 |         return ModuleLoader.get_template_key(name) + ".py"
640 | 
641 |     @internalcode
642 |     def load(
643 |         self,
644 |         environment: "Environment",
645 |         name: str,
646 |         globals: t.Optional[t.MutableMapping[str, t.Any]] = None,
647 |     ) -> "Template":
648 |         key = self.get_template_key(name)
649 |         module = f"{self.package_name}.{key}"
650 |         mod = getattr(self.module, module, None)
651 | 
652 |         if mod is None:
653 |             try:
654 |                 mod = __import__(module, None, None, ["root"])
655 |             except ImportError as e:
656 |                 raise TemplateNotFound(name) from e
657 | 
658 |             # remove the entry from sys.modules, we only want the attribute
659 |             # on the module object we have stored on the loader.
660 |             sys.modules.pop(module, None)
661 | 
662 |         if globals is None:
663 |             globals = {}
664 | 
665 |         return environment.template_class.from_module_dict(
666 |             environment, mod.__dict__, globals
667 |         )
668 | 
```
Page 77/168FirstPrevNextLast