From 1ad4ad4f825a1f4dd83e176ce2e9b30833937de1 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sun, 28 Apr 2024 11:46:46 +0300 Subject: [PATCH] first commit --- BDLab2-6.pdf | Bin 0 -> 197546 bytes __pycache__/dbconnection.cpython-311.pyc | Bin 0 -> 2154 bytes __pycache__/dbtable.cpython-311.pyc | Bin 0 -> 6815 bytes __pycache__/project_config.cpython-311.pyc | Bin 0 -> 1379 bytes config.yaml | 6 + dbconnection.py | 34 + dbtable.py | 87 + main.py | 213 + .../PyYAML-6.0.1.dist-info/INSTALLER | 1 + .../PyYAML-6.0.1.dist-info/LICENSE | 20 + .../PyYAML-6.0.1.dist-info/METADATA | 46 + .../PyYAML-6.0.1.dist-info/RECORD | 44 + .../PyYAML-6.0.1.dist-info/REQUESTED | 0 .../PyYAML-6.0.1.dist-info/WHEEL | 5 + .../PyYAML-6.0.1.dist-info/top_level.txt | 2 + .../site-packages/_distutils_hack/__init__.py | 222 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 11153 bytes .../__pycache__/override.cpython-311.pyc | Bin 0 -> 310 bytes .../site-packages/_distutils_hack/override.py | 1 + project/Lib/site-packages/_yaml/__init__.py | 33 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 927 bytes .../site-packages/distutils-precedence.pth | 1 + .../pip-24.0.dist-info/AUTHORS.txt | 760 ++ .../pip-24.0.dist-info/INSTALLER | 1 + .../pip-24.0.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.0.dist-info/METADATA | 88 + .../site-packages/pip-24.0.dist-info/RECORD | 1024 ++ .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 + .../pip-24.0.dist-info/entry_points.txt | 4 + .../pip-24.0.dist-info/top_level.txt | 1 + project/Lib/site-packages/pip/__init__.py | 13 + project/Lib/site-packages/pip/__main__.py | 24 + .../Lib/site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 763 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 882 bytes .../__pip-runner__.cpython-311.pyc | Bin 0 -> 2501 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 879 bytes .../__pycache__/build_env.cpython-311.pyc | Bin 0 -> 16068 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 14383 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 19774 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 37438 bytes .../__pycache__/main.cpython-311.pyc | Bin 0 -> 748 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 0 -> 5606 bytes .../self_outdated_check.cpython-311.pyc | Bin 0 -> 11763 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 0 -> 15164 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../Lib/site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 283 bytes .../autocompletion.cpython-311.pyc | Bin 0 -> 10238 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 0 -> 11857 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 0 -> 33763 bytes .../command_context.cpython-311.pyc | Bin 0 -> 2105 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 0 -> 2575 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 0 -> 5519 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 0 -> 16944 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 0 -> 3167 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 0 -> 20322 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 0 -> 8832 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 371 bytes .../pip/_internal/cli/autocompletion.py | 172 + .../pip/_internal/cli/base_command.py | 236 + .../pip/_internal/cli/cmdoptions.py | 1074 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 505 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4451 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 10871 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 2406 bytes .../__pycache__/completion.cpython-311.pyc | Bin 0 -> 5621 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 14849 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 12194 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 7940 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 4656 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 0 -> 3353 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 0 -> 1965 bytes .../__pycache__/index.cpython-311.pyc | Bin 0 -> 7719 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 0 -> 4441 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 31141 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 0 -> 17245 bytes .../__pycache__/search.cpython-311.pyc | Bin 0 -> 8947 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 0 -> 11290 bytes .../__pycache__/uninstall.cpython-311.pyc | Bin 0 -> 5141 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 9397 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 108 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 774 ++ .../pip/_internal/commands/list.py | 368 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1033 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 3125 bytes .../__pycache__/installed.cpython-311.pyc | Bin 0 -> 1842 bytes .../__pycache__/sdist.cpython-311.pyc | Bin 0 -> 9365 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 2433 bytes .../pip/_internal/distributions/base.py | 51 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 156 + .../pip/_internal/distributions/wheel.py | 40 + .../site-packages/pip/_internal/exceptions.py | 728 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 237 bytes .../__pycache__/collector.cpython-311.pyc | Bin 0 -> 24582 bytes .../package_finder.cpython-311.pyc | Bin 0 -> 44146 bytes .../index/__pycache__/sources.cpython-311.pyc | Bin 0 -> 13953 bytes .../pip/_internal/index/collector.py | 507 + .../pip/_internal/index/package_finder.py | 1027 ++ .../pip/_internal/index/sources.py | 285 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 18175 bytes .../__pycache__/_distutils.cpython-311.pyc | Bin 0 -> 7549 bytes .../__pycache__/_sysconfig.cpython-311.pyc | Bin 0 -> 8879 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 4000 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../Lib/site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6499 bytes .../__pycache__/_json.cpython-311.pyc | Bin 0 -> 3562 bytes .../metadata/__pycache__/base.cpython-311.pyc | Bin 0 -> 38676 bytes .../__pycache__/pkg_resources.cpython-311.pyc | Bin 0 -> 17533 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 702 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 388 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 3561 bytes .../__pycache__/_dists.cpython-311.pyc | Bin 0 -> 14871 bytes .../__pycache__/_envs.cpython-311.pyc | Bin 0 -> 12504 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 227 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 278 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 271 bytes .../__pycache__/candidate.cpython-311.pyc | Bin 0 -> 2079 bytes .../__pycache__/direct_url.cpython-311.pyc | Bin 0 -> 12764 bytes .../format_control.cpython-311.pyc | Bin 0 -> 4625 bytes .../models/__pycache__/index.cpython-311.pyc | Bin 0 -> 1896 bytes .../installation_report.cpython-311.pyc | Bin 0 -> 2602 bytes .../models/__pycache__/link.cpython-311.pyc | Bin 0 -> 28615 bytes .../models/__pycache__/scheme.cpython-311.pyc | Bin 0 -> 1262 bytes .../__pycache__/search_scope.cpython-311.pyc | Bin 0 -> 5825 bytes .../selection_prefs.cpython-311.pyc | Bin 0 -> 1993 bytes .../__pycache__/target_python.cpython-311.pyc | Bin 0 -> 5292 bytes .../models/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 6418 bytes .../pip/_internal/models/candidate.py | 30 + .../pip/_internal/models/direct_url.py | 235 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 579 ++ .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 132 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 259 bytes .../network/__pycache__/auth.cpython-311.pyc | Bin 0 -> 23986 bytes .../network/__pycache__/cache.cpython-311.pyc | Bin 0 -> 7927 bytes .../__pycache__/download.cpython-311.pyc | Bin 0 -> 9537 bytes .../__pycache__/lazy_wheel.cpython-311.pyc | Bin 0 -> 13020 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 21436 bytes .../network/__pycache__/utils.cpython-311.pyc | Bin 0 -> 2408 bytes .../__pycache__/xmlrpc.cpython-311.pyc | Bin 0 -> 3245 bytes .../pip/_internal/network/auth.py | 561 ++ .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 520 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 197 bytes .../__pycache__/check.cpython-311.pyc | Bin 0 -> 8460 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 0 -> 11593 bytes .../__pycache__/prepare.cpython-311.pyc | Bin 0 -> 27818 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 203 bytes .../__pycache__/build_tracker.cpython-311.pyc | Bin 0 -> 8924 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 2274 bytes .../metadata_editable.cpython-311.pyc | Bin 0 -> 2310 bytes .../metadata_legacy.cpython-311.pyc | Bin 0 -> 3710 bytes .../build/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 1940 bytes .../wheel_editable.cpython-311.pyc | Bin 0 -> 2384 bytes .../__pycache__/wheel_legacy.cpython-311.pyc | Bin 0 -> 4491 bytes .../operations/build/build_tracker.py | 139 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 187 + .../pip/_internal/operations/freeze.py | 255 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 271 bytes .../editable_legacy.cpython-311.pyc | Bin 0 -> 2184 bytes .../install/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 40165 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 734 ++ .../pip/_internal/operations/prepare.py | 730 ++ .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4384 bytes .../__pycache__/constructors.cpython-311.pyc | Bin 0 -> 23393 bytes .../req/__pycache__/req_file.cpython-311.pyc | Bin 0 -> 23105 bytes .../__pycache__/req_install.cpython-311.pyc | Bin 0 -> 40241 bytes .../req/__pycache__/req_set.cpython-311.pyc | Bin 0 -> 7953 bytes .../__pycache__/req_uninstall.cpython-311.pyc | Bin 0 -> 37318 bytes .../pip/_internal/req/constructors.py | 576 ++ .../pip/_internal/req/req_file.py | 554 ++ .../pip/_internal/req/req_install.py | 923 ++ .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 649 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 197 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 1368 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 204 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 23661 bytes .../_internal/resolution/legacy/resolver.py | 598 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 208 bytes .../__pycache__/base.cpython-311.pyc | Bin 0 -> 9296 bytes .../__pycache__/candidates.cpython-311.pyc | Bin 0 -> 31390 bytes .../__pycache__/factory.cpython-311.pyc | Bin 0 -> 35778 bytes .../found_candidates.cpython-311.pyc | Bin 0 -> 6756 bytes .../__pycache__/provider.cpython-311.pyc | Bin 0 -> 11447 bytes .../__pycache__/reporter.cpython-311.pyc | Bin 0 -> 5438 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 12210 bytes .../__pycache__/resolver.cpython-311.pyc | Bin 0 -> 13448 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 597 ++ .../resolution/resolvelib/factory.py | 812 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 248 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 192 bytes .../__pycache__/_jaraco_text.cpython-311.pyc | Bin 0 -> 4756 bytes .../utils/__pycache__/_log.cpython-311.pyc | Bin 0 -> 2013 bytes .../utils/__pycache__/appdirs.cpython-311.pyc | Bin 0 -> 2551 bytes .../utils/__pycache__/compat.cpython-311.pyc | Bin 0 -> 2259 bytes .../compatibility_tags.cpython-311.pyc | Bin 0 -> 6751 bytes .../__pycache__/datetime.cpython-311.pyc | Bin 0 -> 709 bytes .../__pycache__/deprecation.cpython-311.pyc | Bin 0 -> 4678 bytes .../direct_url_helpers.cpython-311.pyc | Bin 0 -> 3713 bytes .../__pycache__/egg_link.cpython-311.pyc | Bin 0 -> 3547 bytes .../__pycache__/encoding.cpython-311.pyc | Bin 0 -> 2315 bytes .../__pycache__/entrypoints.cpython-311.pyc | Bin 0 -> 4237 bytes .../__pycache__/filesystem.cpython-311.pyc | Bin 0 -> 8222 bytes .../__pycache__/filetypes.cpython-311.pyc | Bin 0 -> 1308 bytes .../utils/__pycache__/glibc.cpython-311.pyc | Bin 0 -> 2604 bytes .../utils/__pycache__/hashes.cpython-311.pyc | Bin 0 -> 8763 bytes .../utils/__pycache__/logging.cpython-311.pyc | Bin 0 -> 15363 bytes .../utils/__pycache__/misc.cpython-311.pyc | Bin 0 -> 38609 bytes .../utils/__pycache__/models.cpython-311.pyc | Bin 0 -> 2932 bytes .../__pycache__/packaging.cpython-311.pyc | Bin 0 -> 2799 bytes .../setuptools_build.cpython-311.pyc | Bin 0 -> 4864 bytes .../__pycache__/subprocess.cpython-311.pyc | Bin 0 -> 9891 bytes .../__pycache__/temp_dir.cpython-311.pyc | Bin 0 -> 13376 bytes .../__pycache__/unpacking.cpython-311.pyc | Bin 0 -> 12888 bytes .../utils/__pycache__/urls.cpython-311.pyc | Bin 0 -> 2684 bytes .../__pycache__/virtualenv.cpython-311.pyc | Bin 0 -> 4932 bytes .../utils/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 7020 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 151 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 783 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 627 bytes .../vcs/__pycache__/bazaar.cpython-311.pyc | Bin 0 -> 5852 bytes .../vcs/__pycache__/git.cpython-311.pyc | Bin 0 -> 21367 bytes .../vcs/__pycache__/mercurial.cpython-311.pyc | Bin 0 -> 8720 bytes .../__pycache__/subversion.cpython-311.pyc | Bin 0 -> 14595 bytes .../versioncontrol.cpython-311.pyc | Bin 0 -> 31759 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 354 + .../Lib/site-packages/pip/_vendor/__init__.py | 121 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5655 bytes .../_vendor/__pycache__/six.cpython-311.pyc | Bin 0 -> 46407 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 131577 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 971 bytes .../__pycache__/_cmd.cpython-311.pyc | Bin 0 -> 3022 bytes .../__pycache__/adapter.cpython-311.pyc | Bin 0 -> 6898 bytes .../__pycache__/cache.cpython-311.pyc | Bin 0 -> 4495 bytes .../__pycache__/controller.cpython-311.pyc | Bin 0 -> 18248 bytes .../__pycache__/filewrapper.cpython-311.pyc | Bin 0 -> 4751 bytes .../__pycache__/heuristics.cpython-311.pyc | Bin 0 -> 7554 bytes .../__pycache__/serialize.cpython-311.pyc | Bin 0 -> 7030 bytes .../__pycache__/wrapper.cpython-311.pyc | Bin 0 -> 1863 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 161 + .../pip/_vendor/cachecontrol/cache.py | 74 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 472 bytes .../__pycache__/file_cache.cpython-311.pyc | Bin 0 -> 8978 bytes .../__pycache__/redis_cache.cpython-311.pyc | Bin 0 -> 3079 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 494 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 206 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 334 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 735 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 0 -> 3357 bytes .../pip/_vendor/certifi/cacert.pem | 4635 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 108 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 5066 bytes .../__pycache__/big5freq.cpython-311.pyc | Bin 0 -> 27196 bytes .../__pycache__/big5prober.cpython-311.pyc | Bin 0 -> 1671 bytes .../chardistribution.cpython-311.pyc | Bin 0 -> 11263 bytes .../charsetgroupprober.cpython-311.pyc | Bin 0 -> 4293 bytes .../__pycache__/charsetprober.cpython-311.pyc | Bin 0 -> 5539 bytes .../codingstatemachine.cpython-311.pyc | Bin 0 -> 3990 bytes .../codingstatemachinedict.cpython-311.pyc | Bin 0 -> 946 bytes .../__pycache__/cp949prober.cpython-311.pyc | Bin 0 -> 1680 bytes .../chardet/__pycache__/enums.cpython-311.pyc | Bin 0 -> 3381 bytes .../__pycache__/escprober.cpython-311.pyc | Bin 0 -> 4897 bytes .../chardet/__pycache__/escsm.cpython-311.pyc | Bin 0 -> 12636 bytes .../__pycache__/eucjpprober.cpython-311.pyc | Bin 0 -> 4723 bytes .../__pycache__/euckrfreq.cpython-311.pyc | Bin 0 -> 12079 bytes .../__pycache__/euckrprober.cpython-311.pyc | Bin 0 -> 1672 bytes .../__pycache__/euctwfreq.cpython-311.pyc | Bin 0 -> 27201 bytes .../__pycache__/euctwprober.cpython-311.pyc | Bin 0 -> 1672 bytes .../__pycache__/gb2312freq.cpython-311.pyc | Bin 0 -> 19123 bytes .../__pycache__/gb2312prober.cpython-311.pyc | Bin 0 -> 1687 bytes .../__pycache__/hebrewprober.cpython-311.pyc | Bin 0 -> 5676 bytes .../__pycache__/jisfreq.cpython-311.pyc | Bin 0 -> 22152 bytes .../__pycache__/johabfreq.cpython-311.pyc | Bin 0 -> 84656 bytes .../__pycache__/johabprober.cpython-311.pyc | Bin 0 -> 1678 bytes .../__pycache__/jpcntx.cpython-311.pyc | Bin 0 -> 40160 bytes .../langbulgarianmodel.cpython-311.pyc | Bin 0 -> 85830 bytes .../langgreekmodel.cpython-311.pyc | Bin 0 -> 79252 bytes .../langhebrewmodel.cpython-311.pyc | Bin 0 -> 80014 bytes .../langhungarianmodel.cpython-311.pyc | Bin 0 -> 85784 bytes .../langrussianmodel.cpython-311.pyc | Bin 0 -> 108731 bytes .../__pycache__/langthaimodel.cpython-311.pyc | Bin 0 -> 80192 bytes .../langturkishmodel.cpython-311.pyc | Bin 0 -> 80031 bytes .../__pycache__/latin1prober.cpython-311.pyc | Bin 0 -> 7327 bytes .../macromanprober.cpython-311.pyc | Bin 0 -> 7494 bytes .../mbcharsetprober.cpython-311.pyc | Bin 0 -> 4115 bytes .../mbcsgroupprober.cpython-311.pyc | Bin 0 -> 1985 bytes .../__pycache__/mbcssm.cpython-311.pyc | Bin 0 -> 31725 bytes .../__pycache__/resultdict.cpython-311.pyc | Bin 0 -> 764 bytes .../sbcharsetprober.cpython-311.pyc | Bin 0 -> 6390 bytes .../sbcsgroupprober.cpython-311.pyc | Bin 0 -> 2935 bytes .../__pycache__/sjisprober.cpython-311.pyc | Bin 0 -> 4828 bytes .../universaldetector.cpython-311.pyc | Bin 0 -> 12456 bytes .../__pycache__/utf1632prober.cpython-311.pyc | Bin 0 -> 10576 bytes .../__pycache__/utf8prober.cpython-311.pyc | Bin 0 -> 3463 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 499 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 196 bytes .../__pycache__/chardetect.cpython-311.pyc | Bin 0 -> 4335 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 +++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 201 bytes .../__pycache__/languages.cpython-311.pyc | Bin 0 -> 10801 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/py.typed | 0 .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 568 bytes .../colorama/__pycache__/ansi.cpython-311.pyc | Bin 0 -> 4566 bytes .../__pycache__/ansitowin32.cpython-311.pyc | Bin 0 -> 16212 bytes .../__pycache__/initialise.cpython-311.pyc | Bin 0 -> 3929 bytes .../__pycache__/win32.cpython-311.pyc | Bin 0 -> 7917 bytes .../__pycache__/winterm.cpython-311.pyc | Bin 0 -> 9143 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 199 bytes .../__pycache__/ansi_test.cpython-311.pyc | Bin 0 -> 5844 bytes .../ansitowin32_test.cpython-311.pyc | Bin 0 -> 21511 bytes .../initialise_test.cpython-311.pyc | Bin 0 -> 14138 bytes .../__pycache__/isatty_test.cpython-311.pyc | Bin 0 -> 6703 bytes .../tests/__pycache__/utils.cpython-311.pyc | Bin 0 -> 2878 bytes .../__pycache__/winterm_test.cpython-311.pyc | Bin 0 -> 7231 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1461 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 52398 bytes .../__pycache__/database.cpython-311.pyc | Bin 0 -> 72179 bytes .../distlib/__pycache__/index.cpython-311.pyc | Bin 0 -> 26660 bytes .../__pycache__/locators.cpython-311.pyc | Bin 0 -> 65785 bytes .../__pycache__/manifest.cpython-311.pyc | Bin 0 -> 17010 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 8544 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 47425 bytes .../__pycache__/resources.cpython-311.pyc | Bin 0 -> 18986 bytes .../__pycache__/scripts.cpython-311.pyc | Bin 0 -> 21238 bytes .../distlib/__pycache__/util.cpython-311.pyc | Bin 0 -> 98189 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 34808 bytes .../distlib/__pycache__/wheel.cpython-311.pyc | Bin 0 -> 59471 bytes .../pip/_vendor/distlib/compat.py | 1138 +++ .../pip/_vendor/distlib/database.py | 1359 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1303 +++ .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 167 + .../pip/_vendor/distlib/metadata.py | 1068 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 452 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 2025 ++++ .../pip/_vendor/distlib/version.py | 751 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1099 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1190 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 324 bytes .../distro/__pycache__/distro.cpython-311.pyc | Bin 0 -> 57723 bytes .../pip/_vendor/distro/distro.py | 1399 +++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1091 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 0 -> 5382 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 0 -> 1008 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 0 -> 19443 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 0 -> 38967 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 0 -> 2976 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 0 -> 211 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 0 -> 163191 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 +++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2070 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 2371 bytes .../msgpack/__pycache__/ext.cpython-311.pyc | Bin 0 -> 9156 bytes .../__pycache__/fallback.cpython-311.pyc | Bin 0 -> 47143 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 635 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 556 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13222 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 7990 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3678 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16518 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7633 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34356 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21341 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6676 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21868 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3361 +++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 160136 bytes .../pip/_vendor/platformdirs/__init__.py | 566 ++ .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 17489 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 2269 bytes .../__pycache__/android.cpython-311.pyc | Bin 0 -> 10455 bytes .../__pycache__/api.cpython-311.pyc | Bin 0 -> 10548 bytes .../__pycache__/macos.cpython-311.pyc | Bin 0 -> 6060 bytes .../__pycache__/unix.cpython-311.pyc | Bin 0 -> 13766 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 306 bytes .../__pycache__/windows.cpython-311.pyc | Bin 0 -> 13934 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 223 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 255 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3825 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 774 bytes .../__pycache__/cmdline.cpython-311.pyc | Bin 0 -> 30285 bytes .../__pycache__/console.cpython-311.pyc | Bin 0 -> 3037 bytes .../__pycache__/filter.cpython-311.pyc | Bin 0 -> 3498 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 0 -> 4813 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 0 -> 42301 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 0 -> 1717 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 0 -> 3730 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 0 -> 5024 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 0 -> 4879 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 0 -> 12824 bytes .../__pycache__/style.cpython-311.pyc | Bin 0 -> 7417 bytes .../__pycache__/token.cpython-311.pyc | Bin 0 -> 7458 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 0 -> 33831 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 0 -> 15683 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 40098 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7756 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 4216 bytes .../__pycache__/bbcode.cpython-311.pyc | Bin 0 -> 4472 bytes .../__pycache__/groff.cpython-311.pyc | Bin 0 -> 7845 bytes .../__pycache__/html.cpython-311.pyc | Bin 0 -> 42634 bytes .../__pycache__/img.cpython-311.pyc | Bin 0 -> 28562 bytes .../__pycache__/irc.cpython-311.pyc | Bin 0 -> 6398 bytes .../__pycache__/latex.cpython-311.pyc | Bin 0 -> 21798 bytes .../__pycache__/other.cpython-311.pyc | Bin 0 -> 7626 bytes .../__pycache__/pangomarkup.cpython-311.pyc | Bin 0 -> 3170 bytes .../__pycache__/rtf.cpython-311.pyc | Bin 0 -> 6837 bytes .../__pycache__/svg.cpython-311.pyc | Bin 0 -> 9657 bytes .../__pycache__/terminal.cpython-311.pyc | Bin 0 -> 6036 bytes .../__pycache__/terminal256.cpython-311.pyc | Bin 0 -> 16402 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 ++ .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 943 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 16342 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 0 -> 64784 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 0 -> 43298 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 ++ .../pip/_vendor/pygments/lexers/python.py | 1198 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 217 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4673 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8222 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 9113 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14860 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 295433 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 13700 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 54119 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 37840 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19503 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15191 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 16774 bytes .../pip/_vendor/pyparsing/actions.py | 217 + .../pip/_vendor/pyparsing/common.py | 432 + .../pip/_vendor/pyparsing/core.py | 6115 ++++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28782 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 +++ .../pip/_vendor/pyparsing/py.typed | 0 .../pip/_vendor/pyparsing/results.py | 796 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 361 + .../pip/_vendor/pyparsing/util.py | 284 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 699 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 397 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 0 -> 16663 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1159 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 0 -> 16481 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6430 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 0 -> 580 bytes .../_internal_utils.cpython-311.pyc | Bin 0 -> 2144 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 0 -> 23197 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 0 -> 7497 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 0 -> 14624 bytes .../__pycache__/certs.cpython-311.pyc | Bin 0 -> 976 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 1802 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 0 -> 27104 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 8519 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 0 -> 4514 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 0 -> 1244 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 38775 bytes .../__pycache__/packages.cpython-311.pyc | Bin 0 -> 824 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 29687 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 6231 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 6216 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 40250 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 538 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1094 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 747 bytes .../__pycache__/providers.cpython-311.pyc | Bin 0 -> 7065 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 0 -> 2829 bytes .../__pycache__/resolvers.cpython-311.pyc | Bin 0 -> 29229 bytes .../__pycache__/structs.cpython-311.pyc | Bin 0 -> 11466 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 202 bytes .../collections_abc.cpython-311.pyc | Bin 0 -> 477 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 ++ .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7490 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 11568 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 0 -> 7829 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 0 -> 208516 bytes .../_emoji_replace.cpython-311.pyc | Bin 0 -> 1928 bytes .../_export_format.cpython-311.pyc | Bin 0 -> 2319 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 0 -> 629 bytes .../rich/__pycache__/_fileno.cpython-311.pyc | Bin 0 -> 971 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 0 -> 14181 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 0 -> 4763 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 0 -> 2109 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 0 -> 4168 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 0 -> 5245 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 0 -> 789 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 0 -> 7928 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 0 -> 13678 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 0 -> 1124 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 0 -> 977 bytes .../_win32_console.cpython-311.pyc | Bin 0 -> 30165 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 0 -> 2824 bytes .../_windows_renderer.cpython-311.pyc | Bin 0 -> 4015 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 0 -> 2780 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 0 -> 1921 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 0 -> 13463 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 0 -> 10494 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 0 -> 4543 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 0 -> 12985 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 0 -> 6615 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 0 -> 27799 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 0 -> 1869 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 0 -> 10640 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 0 -> 123735 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 0 -> 2461 bytes .../__pycache__/containers.cpython-311.pyc | Bin 0 -> 10802 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 0 -> 11893 bytes .../default_styles.cpython-311.pyc | Bin 0 -> 12596 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 0 -> 1816 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 0 -> 4794 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 0 -> 2325 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 0 -> 4029 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 0 -> 3297 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 0 -> 10983 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 0 -> 6540 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 0 -> 6400 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 0 -> 23307 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 0 -> 21293 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 0 -> 5141 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 0 -> 14512 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 0 -> 10434 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 0 -> 7267 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 0 -> 7483 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 0 -> 2241 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 0 -> 5974 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 0 -> 12730 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 0 -> 44343 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 0 -> 82610 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 0 -> 11008 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 0 -> 16374 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 0 -> 2092 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 0 -> 655 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 0 -> 7622 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 0 -> 7161 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 0 -> 4347 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 0 -> 2770 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 0 -> 31600 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 0 -> 6876 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 0 -> 6754 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 0 -> 35194 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 0 -> 2435 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 0 -> 42645 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 0 -> 48796 bytes .../terminal_theme.cpython-311.pyc | Bin 0 -> 3701 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 0 -> 64953 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 0 -> 7300 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 0 -> 351 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 0 -> 34563 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 0 -> 12522 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../Lib/site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../Lib/site-packages/pip/_vendor/rich/bar.py | 94 + .../Lib/site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 622 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 994 ++ .../pip/_vendor/rich/progress.py | 1702 ++++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 948 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1307 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 756 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + project/Lib/site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 608 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 29042 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 0 -> 5218 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 0 -> 2558 bytes .../__pycache__/after.cpython-311.pyc | Bin 0 -> 1753 bytes .../__pycache__/before.cpython-311.pyc | Bin 0 -> 1587 bytes .../__pycache__/before_sleep.cpython-311.pyc | Bin 0 -> 2370 bytes .../tenacity/__pycache__/nap.cpython-311.pyc | Bin 0 -> 1561 bytes .../__pycache__/retry.cpython-311.pyc | Bin 0 -> 15937 bytes .../tenacity/__pycache__/stop.cpython-311.pyc | Bin 0 -> 6290 bytes .../__pycache__/tornadoweb.cpython-311.pyc | Bin 0 -> 2907 bytes .../tenacity/__pycache__/wait.cpython-311.pyc | Bin 0 -> 13296 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 51 + .../pip/_vendor/tenacity/before.py | 46 + .../pip/_vendor/tenacity/before_sleep.py | 71 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/py.typed | 0 .../pip/_vendor/tenacity/retry.py | 272 + .../pip/_vendor/tenacity/stop.py | 103 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 228 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 406 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 30845 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4485 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 398 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 659 bytes .../__pycache__/_api.cpython-311.pyc | Bin 0 -> 16721 bytes .../__pycache__/_macos.cpython-311.pyc | Bin 0 -> 17401 bytes .../__pycache__/_openssl.cpython-311.pyc | Bin 0 -> 2340 bytes .../_ssl_constants.cpython-311.pyc | Bin 0 -> 1115 bytes .../__pycache__/_windows.cpython-311.pyc | Bin 0 -> 17243 bytes .../pip/_vendor/truststore/_api.py | 302 + .../pip/_vendor/truststore/_macos.py | 501 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 ++ .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/typing_extensions.py | 3072 ++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 3704 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 18292 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 214 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 22060 bytes .../connectionpool.cpython-311.pyc | Bin 0 -> 38272 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 16118 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 11411 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 0 -> 4492 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 0 -> 21610 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 7663 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 36538 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 ++ .../pip/_vendor/urllib3/connectionpool.py | 1132 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 200 bytes .../_appengine_environ.cpython-311.pyc | Bin 0 -> 1939 bytes .../__pycache__/appengine.cpython-311.pyc | Bin 0 -> 12146 bytes .../__pycache__/ntlmpool.cpython-311.pyc | Bin 0 -> 6223 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 0 -> 25732 bytes .../securetransport.cpython-311.pyc | Bin 0 -> 36838 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 0 -> 8084 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 217 bytes .../__pycache__/bindings.cpython-311.pyc | Bin 0 -> 16964 bytes .../__pycache__/low_level.cpython-311.pyc | Bin 0 -> 15601 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 201 bytes .../packages/__pycache__/six.cpython-311.pyc | Bin 0 -> 46443 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 211 bytes .../__pycache__/makefile.cpython-311.pyc | Bin 0 -> 1958 bytes .../weakref_finalize.cpython-311.pyc | Bin 0 -> 7986 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 +++ .../pip/_vendor/urllib3/poolmanager.py | 537 + .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1403 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 5130 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 0 -> 1712 bytes .../util/__pycache__/queue.cpython-311.pyc | Bin 0 -> 1495 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 0 -> 4615 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 0 -> 3484 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 0 -> 22764 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 0 -> 16815 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 0 -> 5794 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 0 -> 11623 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 0 -> 11337 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 0 -> 17578 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 0 -> 4997 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 620 ++ .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../Lib/site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12877 bytes .../__pycache__/labels.cpython-311.pyc | Bin 0 -> 7277 bytes .../__pycache__/mklabels.cpython-311.pyc | Bin 0 -> 3205 bytes .../__pycache__/tests.cpython-311.pyc | Bin 0 -> 11183 bytes .../x_user_defined.cpython-311.pyc | Bin 0 -> 3557 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + project/Lib/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 159566 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 194 bytes .../__pycache__/appdirs.cpython-311.pyc | Bin 0 -> 29442 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 15987 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 828 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10745 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4272 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5557 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1390 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6488 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7489 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8363 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6385 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 201 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 9424 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20287 bytes .../pkg_resources/_vendor/jaraco/context.py | 213 + .../pkg_resources/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26604 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 295 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 167956 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 26947 bytes .../_vendor/more_itertools/more.py | 4316 +++++++++ .../_vendor/more_itertools/recipes.py | 698 ++ .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 645 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 566 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13232 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 8000 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3688 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16537 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7652 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34366 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21351 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6686 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21878 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../pkg_resources/_vendor/packaging/tags.py | 487 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8339 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8465 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14787 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277639 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12929 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53630 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36313 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19509 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15367 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14266 bytes .../_vendor/pyparsing/actions.py | 207 + .../pkg_resources/_vendor/pyparsing/common.py | 424 + .../pkg_resources/_vendor/pyparsing/core.py | 5814 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 28002 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../_vendor/pyparsing/helpers.py | 1088 +++ .../_vendor/pyparsing/results.py | 760 ++ .../_vendor/pyparsing/testing.py | 331 + .../_vendor/pyparsing/unicode.py | 352 + .../pkg_resources/_vendor/pyparsing/util.py | 235 + .../pkg_resources/_vendor/zipp.py | 329 + .../pkg_resources/extern/__init__.py | 76 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4313 bytes .../psycopg2-2.9.9.dist-info/INSTALLER | 1 + .../psycopg2-2.9.9.dist-info/LICENSE | 49 + .../psycopg2-2.9.9.dist-info/METADATA | 110 + .../psycopg2-2.9.9.dist-info/RECORD | 30 + .../psycopg2-2.9.9.dist-info/REQUESTED | 0 .../psycopg2-2.9.9.dist-info/WHEEL | 5 + .../psycopg2-2.9.9.dist-info/top_level.txt | 1 + .../Lib/site-packages/psycopg2/__init__.py | 126 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4088 bytes .../__pycache__/_ipaddress.cpython-311.pyc | Bin 0 -> 2907 bytes .../__pycache__/_json.cpython-311.pyc | Bin 0 -> 7973 bytes .../__pycache__/_range.cpython-311.pyc | Bin 0 -> 22675 bytes .../__pycache__/errorcodes.cpython-311.pyc | Bin 0 -> 14496 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 569 bytes .../__pycache__/extensions.cpython-311.pyc | Bin 0 -> 9203 bytes .../__pycache__/extras.cpython-311.pyc | Bin 0 -> 68264 bytes .../psycopg2/__pycache__/pool.cpython-311.pyc | Bin 0 -> 8286 bytes .../psycopg2/__pycache__/sql.cpython-311.pyc | Bin 0 -> 20523 bytes .../psycopg2/__pycache__/tz.cpython-311.pyc | Bin 0 -> 6428 bytes .../Lib/site-packages/psycopg2/_ipaddress.py | 90 + project/Lib/site-packages/psycopg2/_json.py | 199 + .../psycopg2/_psycopg.cp311-win_amd64.pyd | Bin 0 -> 2416128 bytes project/Lib/site-packages/psycopg2/_range.py | 554 ++ .../Lib/site-packages/psycopg2/errorcodes.py | 449 + project/Lib/site-packages/psycopg2/errors.py | 38 + .../Lib/site-packages/psycopg2/extensions.py | 213 + project/Lib/site-packages/psycopg2/extras.py | 1340 +++ project/Lib/site-packages/psycopg2/pool.py | 187 + project/Lib/site-packages/psycopg2/sql.py | 455 + project/Lib/site-packages/psycopg2/tz.py | 158 + .../setuptools-65.5.0.dist-info/INSTALLER | 1 + .../setuptools-65.5.0.dist-info/LICENSE | 19 + .../setuptools-65.5.0.dist-info/METADATA | 144 + .../setuptools-65.5.0.dist-info/RECORD | 466 + .../setuptools-65.5.0.dist-info/REQUESTED | 0 .../setuptools-65.5.0.dist-info/WHEEL | 5 + .../entry_points.txt | 57 + .../setuptools-65.5.0.dist-info/top_level.txt | 3 + .../Lib/site-packages/setuptools/__init__.py | 247 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 12903 bytes .../_deprecation_warning.cpython-311.pyc | Bin 0 -> 638 bytes .../__pycache__/_entry_points.cpython-311.pyc | Bin 0 -> 4787 bytes .../__pycache__/_imp.cpython-311.pyc | Bin 0 -> 3651 bytes .../__pycache__/_importlib.cpython-311.pyc | Bin 0 -> 1951 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1150 bytes .../__pycache__/_path.cpython-311.pyc | Bin 0 -> 1471 bytes .../__pycache__/_reqs.cpython-311.pyc | Bin 0 -> 1132 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10160 bytes .../__pycache__/build_meta.cpython-311.pyc | Bin 0 -> 28093 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 1286 bytes .../__pycache__/depends.cpython-311.pyc | Bin 0 -> 7971 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 0 -> 31115 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 64052 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 2947 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 6803 bytes .../__pycache__/glob.cpython-311.pyc | Bin 0 -> 6560 bytes .../__pycache__/installer.cpython-311.pyc | Bin 0 -> 5610 bytes .../__pycache__/launch.cpython-311.pyc | Bin 0 -> 1526 bytes .../__pycache__/logging.cpython-311.pyc | Bin 0 -> 2044 bytes .../__pycache__/monkey.cpython-311.pyc | Bin 0 -> 7003 bytes .../__pycache__/msvc.cpython-311.pyc | Bin 0 -> 64176 bytes .../__pycache__/namespaces.cpython-311.pyc | Bin 0 -> 5658 bytes .../__pycache__/package_index.cpython-311.pyc | Bin 0 -> 60753 bytes .../__pycache__/py34compat.cpython-311.pyc | Bin 0 -> 713 bytes .../__pycache__/sandbox.cpython-311.pyc | Bin 0 -> 27329 bytes .../__pycache__/unicode_utils.cpython-311.pyc | Bin 0 -> 1815 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 433 bytes .../__pycache__/wheel.cpython-311.pyc | Bin 0 -> 15488 bytes .../windows_support.cpython-311.pyc | Bin 0 -> 1430 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 768 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 2918 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 859 bytes .../__pycache__/_macos_compat.cpython-311.pyc | Bin 0 -> 568 bytes .../__pycache__/_msvccompiler.cpython-311.pyc | Bin 0 -> 25103 bytes .../__pycache__/archive_util.cpython-311.pyc | Bin 0 -> 10655 bytes .../__pycache__/bcppcompiler.cpython-311.pyc | Bin 0 -> 13481 bytes .../__pycache__/ccompiler.cpython-311.pyc | Bin 0 -> 46380 bytes .../__pycache__/cmd.cpython-311.pyc | Bin 0 -> 18894 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 6043 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 9987 bytes .../cygwinccompiler.cpython-311.pyc | Bin 0 -> 13611 bytes .../__pycache__/debug.cpython-311.pyc | Bin 0 -> 320 bytes .../__pycache__/dep_util.cpython-311.pyc | Bin 0 -> 3987 bytes .../__pycache__/dir_util.cpython-311.pyc | Bin 0 -> 10362 bytes .../__pycache__/dist.cpython-311.pyc | Bin 0 -> 55409 bytes .../__pycache__/errors.cpython-311.pyc | Bin 0 -> 6793 bytes .../__pycache__/extension.cpython-311.pyc | Bin 0 -> 10174 bytes .../__pycache__/fancy_getopt.cpython-311.pyc | Bin 0 -> 17239 bytes .../__pycache__/file_util.cpython-311.pyc | Bin 0 -> 10682 bytes .../__pycache__/filelist.cpython-311.pyc | Bin 0 -> 17628 bytes .../__pycache__/log.cpython-311.pyc | Bin 0 -> 3928 bytes .../__pycache__/msvc9compiler.cpython-311.pyc | Bin 0 -> 33586 bytes .../__pycache__/msvccompiler.cpython-311.pyc | Bin 0 -> 26988 bytes .../__pycache__/py38compat.cpython-311.pyc | Bin 0 -> 620 bytes .../__pycache__/py39compat.cpython-311.pyc | Bin 0 -> 988 bytes .../__pycache__/spawn.cpython-311.pyc | Bin 0 -> 4457 bytes .../__pycache__/sysconfig.cpython-311.pyc | Bin 0 -> 21984 bytes .../__pycache__/text_file.cpython-311.pyc | Bin 0 -> 11269 bytes .../__pycache__/unixccompiler.cpython-311.pyc | Bin 0 -> 16525 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 20879 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 11344 bytes .../versionpredicate.cpython-311.pyc | Bin 0 -> 7745 bytes .../setuptools/_distutils/_collections.py | 56 + .../setuptools/_distutils/_functools.py | 20 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_msvccompiler.py | 572 ++ .../setuptools/_distutils/archive_util.py | 280 + .../setuptools/_distutils/bcppcompiler.py | 408 + .../setuptools/_distutils/ccompiler.py | 1220 +++ .../setuptools/_distutils/cmd.py | 436 + .../setuptools/_distutils/command/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 540 bytes .../_framework_compat.cpython-311.pyc | Bin 0 -> 2781 bytes .../command/__pycache__/bdist.cpython-311.pyc | Bin 0 -> 6034 bytes .../__pycache__/bdist_dumb.cpython-311.pyc | Bin 0 -> 5759 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 23293 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 6089 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 7792 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 30334 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 17610 bytes .../__pycache__/build_scripts.cpython-311.pyc | Bin 0 -> 7861 bytes .../command/__pycache__/check.cpython-311.pyc | Bin 0 -> 7523 bytes .../command/__pycache__/clean.cpython-311.pyc | Bin 0 -> 3191 bytes .../__pycache__/config.cpython-311.pyc | Bin 0 -> 16254 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 29442 bytes .../__pycache__/install_data.cpython-311.pyc | Bin 0 -> 3776 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 5202 bytes .../install_headers.cpython-311.pyc | Bin 0 -> 2359 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 8691 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 3156 bytes .../__pycache__/py37compat.cpython-311.pyc | Bin 0 -> 1537 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 15523 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 23831 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 10472 bytes .../_distutils/command/_framework_compat.py | 55 + .../setuptools/_distutils/command/bdist.py | 157 + .../_distutils/command/bdist_dumb.py | 144 + .../_distutils/command/bdist_rpm.py | 615 ++ .../setuptools/_distutils/command/build.py | 153 + .../_distutils/command/build_clib.py | 208 + .../_distutils/command/build_ext.py | 787 ++ .../setuptools/_distutils/command/build_py.py | 407 + .../_distutils/command/build_scripts.py | 173 + .../setuptools/_distutils/command/check.py | 151 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 377 + .../setuptools/_distutils/command/install.py | 814 ++ .../_distutils/command/install_data.py | 84 + .../_distutils/command/install_egg_info.py | 91 + .../_distutils/command/install_headers.py | 45 + .../_distutils/command/install_lib.py | 238 + .../_distutils/command/install_scripts.py | 61 + .../_distutils/command/py37compat.py | 31 + .../setuptools/_distutils/command/register.py | 319 + .../setuptools/_distutils/command/sdist.py | 531 + .../setuptools/_distutils/command/upload.py | 205 + .../setuptools/_distutils/config.py | 139 + .../setuptools/_distutils/core.py | 291 + .../setuptools/_distutils/cygwinccompiler.py | 364 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 96 + .../setuptools/_distutils/dir_util.py | 243 + .../setuptools/_distutils/dist.py | 1286 +++ .../setuptools/_distutils/errors.py | 127 + .../setuptools/_distutils/extension.py | 248 + .../setuptools/_distutils/fancy_getopt.py | 470 + .../setuptools/_distutils/file_util.py | 249 + .../setuptools/_distutils/filelist.py | 371 + .../setuptools/_distutils/log.py | 80 + .../setuptools/_distutils/msvc9compiler.py | 832 ++ .../setuptools/_distutils/msvccompiler.py | 695 ++ .../setuptools/_distutils/py38compat.py | 8 + .../setuptools/_distutils/py39compat.py | 22 + .../setuptools/_distutils/spawn.py | 109 + .../setuptools/_distutils/sysconfig.py | 558 ++ .../setuptools/_distutils/text_file.py | 287 + .../setuptools/_distutils/unixccompiler.py | 401 + .../setuptools/_distutils/util.py | 513 + .../setuptools/_distutils/version.py | 358 + .../setuptools/_distutils/versionpredicate.py | 175 + .../site-packages/setuptools/_entry_points.py | 86 + project/Lib/site-packages/setuptools/_imp.py | 82 + .../site-packages/setuptools/_importlib.py | 47 + .../site-packages/setuptools/_itertools.py | 23 + project/Lib/site-packages/setuptools/_path.py | 29 + project/Lib/site-packages/setuptools/_reqs.py | 19 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 191 bytes .../__pycache__/ordered_set.cpython-311.pyc | Bin 0 -> 21777 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 107608 bytes .../_vendor/__pycache__/zipp.cpython-311.pyc | Bin 0 -> 15984 bytes .../_vendor/importlib_metadata/__init__.py | 1047 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 58230 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 3843 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 2190 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 2712 bytes .../__pycache__/_functools.cpython-311.pyc | Bin 0 -> 3630 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 2593 bytes .../__pycache__/_meta.cpython-311.pyc | Bin 0 -> 2997 bytes .../__pycache__/_text.cpython-311.pyc | Bin 0 -> 4388 bytes .../_vendor/importlib_metadata/_adapters.py | 68 + .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 71 + .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 48 + .../_vendor/importlib_metadata/_text.py | 99 + .../_vendor/importlib_resources/__init__.py | 36 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 825 bytes .../__pycache__/_adapters.cpython-311.pyc | Bin 0 -> 10742 bytes .../__pycache__/_common.cpython-311.pyc | Bin 0 -> 4269 bytes .../__pycache__/_compat.cpython-311.pyc | Bin 0 -> 5554 bytes .../__pycache__/_itertools.cpython-311.pyc | Bin 0 -> 1387 bytes .../__pycache__/_legacy.cpython-311.pyc | Bin 0 -> 6485 bytes .../__pycache__/abc.cpython-311.pyc | Bin 0 -> 7486 bytes .../__pycache__/readers.cpython-311.pyc | Bin 0 -> 8360 bytes .../__pycache__/simple.cpython-311.pyc | Bin 0 -> 6382 bytes .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../setuptools/_vendor/jaraco/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 198 bytes .../__pycache__/context.cpython-311.pyc | Bin 0 -> 9421 bytes .../__pycache__/functools.cpython-311.pyc | Bin 0 -> 20278 bytes .../setuptools/_vendor/jaraco/context.py | 213 + .../setuptools/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 ++ .../text/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 26592 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 291 bytes .../__pycache__/more.cpython-311.pyc | Bin 0 -> 149178 bytes .../__pycache__/recipes.cpython-311.pyc | Bin 0 -> 23760 bytes .../setuptools/_vendor/more_itertools/more.py | 3824 ++++++++ .../_vendor/more_itertools/recipes.py | 620 ++ .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-311.pyc | Bin 0 -> 642 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 563 bytes .../__pycache__/_manylinux.cpython-311.pyc | Bin 0 -> 13229 bytes .../__pycache__/_musllinux.cpython-311.pyc | Bin 0 -> 7997 bytes .../__pycache__/_structures.cpython-311.pyc | Bin 0 -> 3685 bytes .../__pycache__/markers.cpython-311.pyc | Bin 0 -> 16531 bytes .../__pycache__/requirements.cpython-311.pyc | Bin 0 -> 7646 bytes .../__pycache__/specifiers.cpython-311.pyc | Bin 0 -> 34363 bytes .../__pycache__/tags.cpython-311.pyc | Bin 0 -> 21348 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 6683 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 21875 bytes .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 ++ .../setuptools/_vendor/packaging/tags.py | 487 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing/__init__.py | 331 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8336 bytes .../__pycache__/actions.cpython-311.pyc | Bin 0 -> 8462 bytes .../__pycache__/common.cpython-311.pyc | Bin 0 -> 14784 bytes .../__pycache__/core.cpython-311.pyc | Bin 0 -> 277636 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 12926 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 53627 bytes .../__pycache__/results.cpython-311.pyc | Bin 0 -> 36310 bytes .../__pycache__/testing.cpython-311.pyc | Bin 0 -> 19506 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 0 -> 15364 bytes .../__pycache__/util.cpython-311.pyc | Bin 0 -> 14263 bytes .../setuptools/_vendor/pyparsing/actions.py | 207 + .../setuptools/_vendor/pyparsing/common.py | 424 + .../setuptools/_vendor/pyparsing/core.py | 5814 +++++++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 ++ .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 27999 bytes .../_vendor/pyparsing/exceptions.py | 267 + .../setuptools/_vendor/pyparsing/helpers.py | 1088 +++ .../setuptools/_vendor/pyparsing/results.py | 760 ++ .../setuptools/_vendor/pyparsing/testing.py | 331 + .../setuptools/_vendor/pyparsing/unicode.py | 352 + .../setuptools/_vendor/pyparsing/util.py | 235 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 413 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 0 -> 30852 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 0 -> 4492 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 0 -> 405 bytes .../setuptools/_vendor/tomli/_parser.py | 691 ++ .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/typing_extensions.py | 2296 +++++ .../site-packages/setuptools/_vendor/zipp.py | 329 + .../site-packages/setuptools/archive_util.py | 213 + .../site-packages/setuptools/build_meta.py | 511 + .../Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes project/Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 632 bytes .../command/__pycache__/alias.cpython-311.pyc | Bin 0 -> 3899 bytes .../__pycache__/bdist_egg.cpython-311.pyc | Bin 0 -> 25581 bytes .../__pycache__/bdist_rpm.cpython-311.pyc | Bin 0 -> 2187 bytes .../command/__pycache__/build.cpython-311.pyc | Bin 0 -> 6993 bytes .../__pycache__/build_clib.cpython-311.pyc | Bin 0 -> 4120 bytes .../__pycache__/build_ext.cpython-311.pyc | Bin 0 -> 22007 bytes .../__pycache__/build_py.cpython-311.pyc | Bin 0 -> 23173 bytes .../__pycache__/develop.cpython-311.pyc | Bin 0 -> 10915 bytes .../__pycache__/dist_info.cpython-311.pyc | Bin 0 -> 7977 bytes .../__pycache__/easy_install.cpython-311.pyc | Bin 0 -> 119332 bytes .../editable_wheel.cpython-311.pyc | Bin 0 -> 51410 bytes .../__pycache__/egg_info.cpython-311.pyc | Bin 0 -> 39830 bytes .../__pycache__/install.cpython-311.pyc | Bin 0 -> 6812 bytes .../install_egg_info.cpython-311.pyc | Bin 0 -> 4125 bytes .../__pycache__/install_lib.cpython-311.pyc | Bin 0 -> 6407 bytes .../install_scripts.cpython-311.pyc | Bin 0 -> 4276 bytes .../__pycache__/py36compat.cpython-311.pyc | Bin 0 -> 8033 bytes .../__pycache__/register.cpython-311.pyc | Bin 0 -> 1123 bytes .../__pycache__/rotate.cpython-311.pyc | Bin 0 -> 4183 bytes .../__pycache__/saveopts.cpython-311.pyc | Bin 0 -> 1363 bytes .../command/__pycache__/sdist.cpython-311.pyc | Bin 0 -> 13435 bytes .../__pycache__/setopt.cpython-311.pyc | Bin 0 -> 7675 bytes .../command/__pycache__/test.cpython-311.pyc | Bin 0 -> 14616 bytes .../__pycache__/upload.cpython-311.pyc | Bin 0 -> 1087 bytes .../__pycache__/upload_docs.cpython-311.pyc | Bin 0 -> 11938 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 457 + .../setuptools/command/bdist_rpm.py | 40 + .../site-packages/setuptools/command/build.py | 146 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 383 + .../setuptools/command/build_py.py | 368 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 142 + .../setuptools/command/easy_install.py | 2312 +++++ .../setuptools/command/editable_wheel.py | 844 ++ .../setuptools/command/egg_info.py | 763 ++ .../setuptools/command/install.py | 139 + .../setuptools/command/install_egg_info.py | 63 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 70 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 210 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 251 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 213 + .../setuptools/config/__init__.py | 35 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2027 bytes .../_apply_pyprojecttoml.cpython-311.pyc | Bin 0 -> 22530 bytes .../config/__pycache__/expand.cpython-311.pyc | Bin 0 -> 28241 bytes .../__pycache__/pyprojecttoml.cpython-311.pyc | Bin 0 -> 27439 bytes .../__pycache__/setupcfg.cpython-311.pyc | Bin 0 -> 33023 bytes .../setuptools/config/_apply_pyprojecttoml.py | 377 + .../config/_validate_pyproject/__init__.py | 34 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2315 bytes .../error_reporting.cpython-311.pyc | Bin 0 -> 20206 bytes .../extra_validations.cpython-311.pyc | Bin 0 -> 1864 bytes .../fastjsonschema_exceptions.cpython-311.pyc | Bin 0 -> 3239 bytes ...fastjsonschema_validations.cpython-311.pyc | Bin 0 -> 192637 bytes .../__pycache__/formats.cpython-311.pyc | Bin 0 -> 14354 bytes .../_validate_pyproject/error_reporting.py | 318 + .../_validate_pyproject/extra_validations.py | 36 + .../fastjsonschema_exceptions.py | 51 + .../fastjsonschema_validations.py | 1035 ++ .../config/_validate_pyproject/formats.py | 259 + .../site-packages/setuptools/config/expand.py | 462 + .../setuptools/config/pyprojecttoml.py | 493 + .../setuptools/config/setupcfg.py | 762 ++ .../Lib/site-packages/setuptools/dep_util.py | 25 + .../Lib/site-packages/setuptools/depends.py | 176 + .../Lib/site-packages/setuptools/discovery.py | 600 ++ project/Lib/site-packages/setuptools/dist.py | 1222 +++ .../Lib/site-packages/setuptools/errors.py | 58 + .../Lib/site-packages/setuptools/extension.py | 148 + .../setuptools/extern/__init__.py | 76 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 4391 bytes project/Lib/site-packages/setuptools/glob.py | 167 + .../Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes project/Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/installer.py | 104 + .../Lib/site-packages/setuptools/launch.py | 36 + .../Lib/site-packages/setuptools/logging.py | 36 + .../Lib/site-packages/setuptools/monkey.py | 165 + project/Lib/site-packages/setuptools/msvc.py | 1703 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1126 +++ .../site-packages/setuptools/py34compat.py | 13 + .../Lib/site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../Lib/site-packages/setuptools/version.py | 6 + project/Lib/site-packages/setuptools/wheel.py | 222 + .../setuptools/windows_support.py | 29 + project/Lib/site-packages/yaml/__init__.py | 390 + .../yaml/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 17224 bytes .../yaml/__pycache__/composer.cpython-311.pyc | Bin 0 -> 7063 bytes .../__pycache__/constructor.cpython-311.pyc | Bin 0 -> 38654 bytes .../yaml/__pycache__/cyaml.cpython-311.pyc | Bin 0 -> 5398 bytes .../yaml/__pycache__/dumper.cpython-311.pyc | Bin 0 -> 2865 bytes .../yaml/__pycache__/emitter.cpython-311.pyc | Bin 0 -> 53391 bytes .../yaml/__pycache__/error.cpython-311.pyc | Bin 0 -> 4257 bytes .../yaml/__pycache__/events.cpython-311.pyc | Bin 0 -> 5856 bytes .../yaml/__pycache__/loader.cpython-311.pyc | Bin 0 -> 4252 bytes .../yaml/__pycache__/nodes.cpython-311.pyc | Bin 0 -> 2528 bytes .../yaml/__pycache__/parser.cpython-311.pyc | Bin 0 -> 25759 bytes .../yaml/__pycache__/reader.cpython-311.pyc | Bin 0 -> 8931 bytes .../__pycache__/representer.cpython-311.pyc | Bin 0 -> 18361 bytes .../yaml/__pycache__/resolver.cpython-311.pyc | Bin 0 -> 9901 bytes .../yaml/__pycache__/scanner.cpython-311.pyc | Bin 0 -> 57115 bytes .../__pycache__/serializer.cpython-311.pyc | Bin 0 -> 6714 bytes .../yaml/__pycache__/tokens.cpython-311.pyc | Bin 0 -> 7251 bytes .../yaml/_yaml.cp311-win_amd64.pyd | Bin 0 -> 233984 bytes project/Lib/site-packages/yaml/composer.py | 139 + project/Lib/site-packages/yaml/constructor.py | 748 ++ project/Lib/site-packages/yaml/cyaml.py | 101 + project/Lib/site-packages/yaml/dumper.py | 62 + project/Lib/site-packages/yaml/emitter.py | 1137 +++ project/Lib/site-packages/yaml/error.py | 75 + project/Lib/site-packages/yaml/events.py | 86 + project/Lib/site-packages/yaml/loader.py | 63 + project/Lib/site-packages/yaml/nodes.py | 49 + project/Lib/site-packages/yaml/parser.py | 589 ++ project/Lib/site-packages/yaml/reader.py | 185 + project/Lib/site-packages/yaml/representer.py | 389 + project/Lib/site-packages/yaml/resolver.py | 227 + project/Lib/site-packages/yaml/scanner.py | 1435 +++ project/Lib/site-packages/yaml/serializer.py | 111 + project/Lib/site-packages/yaml/tokens.py | 104 + project/Scripts/Activate.ps1 | 502 + project/Scripts/activate | 63 + project/Scripts/activate.bat | 34 + project/Scripts/deactivate.bat | 22 + project/Scripts/pip.exe | Bin 0 -> 108411 bytes project/Scripts/pip3.11.exe | Bin 0 -> 108411 bytes project/Scripts/pip3.exe | Bin 0 -> 108411 bytes project/Scripts/python.exe | Bin 0 -> 274712 bytes project/Scripts/pythonw.exe | Bin 0 -> 263448 bytes project/pyvenv.cfg | 5 + project_config.py | 21 + tables/__pycache__/cath_table.cpython-311.pyc | Bin 0 -> 1792 bytes tables/__pycache__/dish_table.cpython-311.pyc | Bin 0 -> 1911 bytes tables/cath_table.py | 25 + tables/dish_table.py | 29 + tables/people_table.py | 23 + tables/phones_table.py | 27 + test.sql | 1 + 1587 files changed, 287889 insertions(+) create mode 100644 BDLab2-6.pdf create mode 100644 __pycache__/dbconnection.cpython-311.pyc create mode 100644 __pycache__/dbtable.cpython-311.pyc create mode 100644 __pycache__/project_config.cpython-311.pyc create mode 100644 config.yaml create mode 100644 dbconnection.py create mode 100644 dbtable.py create mode 100644 main.py create mode 100644 project/Lib/site-packages/PyYAML-6.0.1.dist-info/INSTALLER create mode 100644 project/Lib/site-packages/PyYAML-6.0.1.dist-info/LICENSE create mode 100644 project/Lib/site-packages/PyYAML-6.0.1.dist-info/METADATA create mode 100644 project/Lib/site-packages/PyYAML-6.0.1.dist-info/RECORD create mode 100644 project/Lib/site-packages/PyYAML-6.0.1.dist-info/REQUESTED create mode 100644 project/Lib/site-packages/PyYAML-6.0.1.dist-info/WHEEL create mode 100644 project/Lib/site-packages/PyYAML-6.0.1.dist-info/top_level.txt create mode 100644 project/Lib/site-packages/_distutils_hack/__init__.py create mode 100644 project/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc create mode 100644 project/Lib/site-packages/_distutils_hack/override.py create mode 100644 project/Lib/site-packages/_yaml/__init__.py create mode 100644 project/Lib/site-packages/_yaml/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/distutils-precedence.pth create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/METADATA create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/RECORD create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 project/Lib/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 project/Lib/site-packages/pip/__init__.py create mode 100644 project/Lib/site-packages/pip/__main__.py create mode 100644 project/Lib/site-packages/pip/__pip-runner__.py create mode 100644 project/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/build_env.py create mode 100644 project/Lib/site-packages/pip/_internal/cache.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/main.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/spinners.py create mode 100644 project/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/commands/cache.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/index.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/inspect.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 project/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 project/Lib/site-packages/pip/_internal/configuration.py create mode 100644 project/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 project/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 project/Lib/site-packages/pip/_internal/distributions/sdist.py create mode 100644 project/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 project/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 project/Lib/site-packages/pip/_internal/index/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/index/collector.py create mode 100644 project/Lib/site-packages/pip/_internal/index/package_finder.py create mode 100644 project/Lib/site-packages/pip/_internal/index/sources.py create mode 100644 project/Lib/site-packages/pip/_internal/locations/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/locations/_distutils.py create mode 100644 project/Lib/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 project/Lib/site-packages/pip/_internal/locations/base.py create mode 100644 project/Lib/site-packages/pip/_internal/main.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/_json.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/base.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 project/Lib/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 project/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 project/Lib/site-packages/pip/_internal/models/direct_url.py create mode 100644 project/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 project/Lib/site-packages/pip/_internal/models/index.py create mode 100644 project/Lib/site-packages/pip/_internal/models/installation_report.py create mode 100644 project/Lib/site-packages/pip/_internal/models/link.py create mode 100644 project/Lib/site-packages/pip/_internal/models/scheme.py create mode 100644 project/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 project/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 project/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 project/Lib/site-packages/pip/_internal/models/wheel.py create mode 100644 project/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 project/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 project/Lib/site-packages/pip/_internal/network/download.py create mode 100644 project/Lib/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 project/Lib/site-packages/pip/_internal/network/session.py create mode 100644 project/Lib/site-packages/pip/_internal/network/utils.py create mode 100644 project/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 project/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 project/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 project/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 project/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 project/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 project/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 project/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/base.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 project/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 project/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/_log.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/datetime.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/egg_link.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 project/Lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 project/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 project/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 project/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 project/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 project/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 project/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 project/Lib/site-packages/pip/_internal/wheel_builder.py create mode 100644 project/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 project/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 project/Lib/site-packages/pip/_vendor/certifi/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 project/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 project/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 project/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 project/Lib/site-packages/pip/_vendor/distro/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/distro/__main__.py create mode 100644 project/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/distro/distro.py create mode 100644 project/Lib/site-packages/pip/_vendor/distro/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 project/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 project/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 project/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 project/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 project/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 project/Lib/site-packages/pip/_vendor/idna/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 project/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 project/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 project/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 project/Lib/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/console.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/filter.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/style.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/token.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 project/Lib/site-packages/pip/_vendor/pygments/util.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 project/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 project/Lib/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__main__.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_extension.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_loop.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_pick.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_stack.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_timer.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_windows.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/abc.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/align.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/ansi.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/bar.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/box.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/cells.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/color.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/columns.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/console.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/constrain.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/containers.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/control.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/emoji.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/errors.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/filesize.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/json.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/layout.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/live.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/live_render.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/logging.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/markup.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/measure.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/padding.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/pager.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/palette.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/panel.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/pretty.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/progress.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/prompt.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/protocol.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/rich/region.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/repr.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/rule.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/scope.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/screen.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/segment.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/spinner.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/status.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/style.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/styled.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/syntax.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/table.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/text.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/theme.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/themes.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/traceback.py create mode 100644 project/Lib/site-packages/pip/_vendor/rich/tree.py create mode 100644 project/Lib/site-packages/pip/_vendor/six.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/after.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/before.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 project/Lib/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/_re.py create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/_types.py create mode 100644 project/Lib/site-packages/pip/_vendor/tomli/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/_api.py create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 project/Lib/site-packages/pip/_vendor/truststore/py.typed create mode 100644 project/Lib/site-packages/pip/_vendor/typing_extensions.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 project/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 project/Lib/site-packages/pip/_vendor/vendor.txt create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 project/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 project/Lib/site-packages/pip/py.typed create mode 100644 project/Lib/site-packages/pkg_resources/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_common.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/abc.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/readers.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/importlib_resources/simple.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/context.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/functools.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/more_itertools/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/more_itertools/more.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/more_itertools/recipes.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/actions.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/common.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/core.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/helpers.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/results.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/testing.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/unicode.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/pyparsing/util.py create mode 100644 project/Lib/site-packages/pkg_resources/_vendor/zipp.py create mode 100644 project/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 project/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2-2.9.9.dist-info/INSTALLER create mode 100644 project/Lib/site-packages/psycopg2-2.9.9.dist-info/LICENSE create mode 100644 project/Lib/site-packages/psycopg2-2.9.9.dist-info/METADATA create mode 100644 project/Lib/site-packages/psycopg2-2.9.9.dist-info/RECORD create mode 100644 project/Lib/site-packages/psycopg2-2.9.9.dist-info/REQUESTED create mode 100644 project/Lib/site-packages/psycopg2-2.9.9.dist-info/WHEEL create mode 100644 project/Lib/site-packages/psycopg2-2.9.9.dist-info/top_level.txt create mode 100644 project/Lib/site-packages/psycopg2/__init__.py create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/_json.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/_range.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/errorcodes.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/errors.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/extensions.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/extras.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/pool.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/sql.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/__pycache__/tz.cpython-311.pyc create mode 100644 project/Lib/site-packages/psycopg2/_ipaddress.py create mode 100644 project/Lib/site-packages/psycopg2/_json.py create mode 100644 project/Lib/site-packages/psycopg2/_psycopg.cp311-win_amd64.pyd create mode 100644 project/Lib/site-packages/psycopg2/_range.py create mode 100644 project/Lib/site-packages/psycopg2/errorcodes.py create mode 100644 project/Lib/site-packages/psycopg2/errors.py create mode 100644 project/Lib/site-packages/psycopg2/extensions.py create mode 100644 project/Lib/site-packages/psycopg2/extras.py create mode 100644 project/Lib/site-packages/psycopg2/pool.py create mode 100644 project/Lib/site-packages/psycopg2/sql.py create mode 100644 project/Lib/site-packages/psycopg2/tz.py create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/INSTALLER create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/LICENSE create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/METADATA create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/RECORD create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/REQUESTED create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/WHEEL create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/entry_points.txt create mode 100644 project/Lib/site-packages/setuptools-65.5.0.dist-info/top_level.txt create mode 100644 project/Lib/site-packages/setuptools/__init__.py create mode 100644 project/Lib/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/_path.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/depends.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/dist.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/errors.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/extension.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/glob.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/installer.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/launch.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/logging.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/_collections.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/_functools.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/_macos_compat.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/archive_util.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/cmd.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/build.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/check.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/clean.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/config.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/install.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/register.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/command/upload.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/config.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/core.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/debug.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/dep_util.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/dir_util.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/dist.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/errors.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/extension.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/file_util.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/filelist.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/log.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/py38compat.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/py39compat.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/spawn.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/text_file.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/util.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/version.py create mode 100644 project/Lib/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 project/Lib/site-packages/setuptools/_entry_points.py create mode 100644 project/Lib/site-packages/setuptools/_imp.py create mode 100644 project/Lib/site-packages/setuptools/_importlib.py create mode 100644 project/Lib/site-packages/setuptools/_itertools.py create mode 100644 project/Lib/site-packages/setuptools/_path.py create mode 100644 project/Lib/site-packages/setuptools/_reqs.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/_compat.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/_legacy.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/context.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/functools.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/actions.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/common.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/core.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/exceptions.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/helpers.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/results.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/testing.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/unicode.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/pyparsing/util.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/_re.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/tomli/_types.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/typing_extensions.py create mode 100644 project/Lib/site-packages/setuptools/_vendor/zipp.py create mode 100644 project/Lib/site-packages/setuptools/archive_util.py create mode 100644 project/Lib/site-packages/setuptools/build_meta.py create mode 100644 project/Lib/site-packages/setuptools/cli-32.exe create mode 100644 project/Lib/site-packages/setuptools/cli-64.exe create mode 100644 project/Lib/site-packages/setuptools/cli-arm64.exe create mode 100644 project/Lib/site-packages/setuptools/cli.exe create mode 100644 project/Lib/site-packages/setuptools/command/__init__.py create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/command/alias.py create mode 100644 project/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 project/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 project/Lib/site-packages/setuptools/command/build.py create mode 100644 project/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 project/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 project/Lib/site-packages/setuptools/command/build_py.py create mode 100644 project/Lib/site-packages/setuptools/command/develop.py create mode 100644 project/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 project/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 project/Lib/site-packages/setuptools/command/editable_wheel.py create mode 100644 project/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 project/Lib/site-packages/setuptools/command/install.py create mode 100644 project/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 project/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 project/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 project/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 project/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 project/Lib/site-packages/setuptools/command/register.py create mode 100644 project/Lib/site-packages/setuptools/command/rotate.py create mode 100644 project/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 project/Lib/site-packages/setuptools/command/sdist.py create mode 100644 project/Lib/site-packages/setuptools/command/setopt.py create mode 100644 project/Lib/site-packages/setuptools/command/test.py create mode 100644 project/Lib/site-packages/setuptools/command/upload.py create mode 100644 project/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 project/Lib/site-packages/setuptools/config/__init__.py create mode 100644 project/Lib/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100644 project/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100644 project/Lib/site-packages/setuptools/config/expand.py create mode 100644 project/Lib/site-packages/setuptools/config/pyprojecttoml.py create mode 100644 project/Lib/site-packages/setuptools/config/setupcfg.py create mode 100644 project/Lib/site-packages/setuptools/dep_util.py create mode 100644 project/Lib/site-packages/setuptools/depends.py create mode 100644 project/Lib/site-packages/setuptools/discovery.py create mode 100644 project/Lib/site-packages/setuptools/dist.py create mode 100644 project/Lib/site-packages/setuptools/errors.py create mode 100644 project/Lib/site-packages/setuptools/extension.py create mode 100644 project/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 project/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/setuptools/glob.py create mode 100644 project/Lib/site-packages/setuptools/gui-32.exe create mode 100644 project/Lib/site-packages/setuptools/gui-64.exe create mode 100644 project/Lib/site-packages/setuptools/gui-arm64.exe create mode 100644 project/Lib/site-packages/setuptools/gui.exe create mode 100644 project/Lib/site-packages/setuptools/installer.py create mode 100644 project/Lib/site-packages/setuptools/launch.py create mode 100644 project/Lib/site-packages/setuptools/logging.py create mode 100644 project/Lib/site-packages/setuptools/monkey.py create mode 100644 project/Lib/site-packages/setuptools/msvc.py create mode 100644 project/Lib/site-packages/setuptools/namespaces.py create mode 100644 project/Lib/site-packages/setuptools/package_index.py create mode 100644 project/Lib/site-packages/setuptools/py34compat.py create mode 100644 project/Lib/site-packages/setuptools/sandbox.py create mode 100644 project/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 project/Lib/site-packages/setuptools/script.tmpl create mode 100644 project/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 project/Lib/site-packages/setuptools/version.py create mode 100644 project/Lib/site-packages/setuptools/wheel.py create mode 100644 project/Lib/site-packages/setuptools/windows_support.py create mode 100644 project/Lib/site-packages/yaml/__init__.py create mode 100644 project/Lib/site-packages/yaml/__pycache__/__init__.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/composer.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/constructor.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/cyaml.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/dumper.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/emitter.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/error.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/events.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/loader.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/nodes.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/parser.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/reader.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/representer.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/resolver.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/scanner.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/serializer.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/__pycache__/tokens.cpython-311.pyc create mode 100644 project/Lib/site-packages/yaml/_yaml.cp311-win_amd64.pyd create mode 100644 project/Lib/site-packages/yaml/composer.py create mode 100644 project/Lib/site-packages/yaml/constructor.py create mode 100644 project/Lib/site-packages/yaml/cyaml.py create mode 100644 project/Lib/site-packages/yaml/dumper.py create mode 100644 project/Lib/site-packages/yaml/emitter.py create mode 100644 project/Lib/site-packages/yaml/error.py create mode 100644 project/Lib/site-packages/yaml/events.py create mode 100644 project/Lib/site-packages/yaml/loader.py create mode 100644 project/Lib/site-packages/yaml/nodes.py create mode 100644 project/Lib/site-packages/yaml/parser.py create mode 100644 project/Lib/site-packages/yaml/reader.py create mode 100644 project/Lib/site-packages/yaml/representer.py create mode 100644 project/Lib/site-packages/yaml/resolver.py create mode 100644 project/Lib/site-packages/yaml/scanner.py create mode 100644 project/Lib/site-packages/yaml/serializer.py create mode 100644 project/Lib/site-packages/yaml/tokens.py create mode 100644 project/Scripts/Activate.ps1 create mode 100644 project/Scripts/activate create mode 100644 project/Scripts/activate.bat create mode 100644 project/Scripts/deactivate.bat create mode 100644 project/Scripts/pip.exe create mode 100644 project/Scripts/pip3.11.exe create mode 100644 project/Scripts/pip3.exe create mode 100644 project/Scripts/python.exe create mode 100644 project/Scripts/pythonw.exe create mode 100644 project/pyvenv.cfg create mode 100644 project_config.py create mode 100644 tables/__pycache__/cath_table.cpython-311.pyc create mode 100644 tables/__pycache__/dish_table.cpython-311.pyc create mode 100644 tables/cath_table.py create mode 100644 tables/dish_table.py create mode 100644 tables/people_table.py create mode 100644 tables/phones_table.py create mode 100644 test.sql diff --git a/BDLab2-6.pdf b/BDLab2-6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6724123abe5d42342fbef152f9bf8380ffe7e9a2 GIT binary patch literal 197546 zcmdqIWmKG7vo0Fkf(F+Hf=lBLp>YXG?(Pr>5=f9BfdqF5!QI{6-4h@{2ykAq zzHjff#yLOn2LjgD~RW@ zy9!vz*x5$j-rNBg{!F3| z`ukvy?f%PP!0LeMUH`Q_6_|^In=>E`Ais=*z3bx(C+N?}U>PpZANjyC+#t@sRx85; z;`}oous~@~S6Nk8V^|#Q!J<@J;~qM--ri)@u`MnCat~@^*kqxi~?<|6`-S zK5~P&{;ULO33YZbRfW0gf`L5(tHC^7|7s%f*Nfy|FY=G81N3TUWh~*~sSAw60pb

F#n(Jm3{mGRt2j$8{4}$K5D_#3oNM$ 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

Pyt;GG=DRWO!MEdH#rM%j*nyFNyNJ4?KZRF_ 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%0A*!?&=j#Qm)^%fRyz{xkyc4eV`C~sl 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

kK&?kM4lDLV&>_@iS=}-Q`2;y(M0HmIc2^ysp>E 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 T)yXxPCipjcZzympO)l`C#wEbJ literal 0 HcmV?d00001 diff --git a/__pycache__/dbconnection.cpython-311.pyc b/__pycache__/dbconnection.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cbb35483f8c163ff949690db2656deab92f46e7 GIT binary patch literal 2154 zcmb7F%}*Og6rWkI?J*ehQOBZ$I7^ZuHkC*}R70w&k^!fsrKZB}hY-@%-d(`XVw2gm znphxl$N?dww3Q`t=z$Y$1m~XmN7%?xtd$~F>M1uz6@++xcL0`LT%5zii?(nDcfr2E!iGkcJJkhy?Tn(u9Xd^Bf2W9YSxlMXccz zlEvq2npE3TKH&D`L;_|H=?HAmqM+f2Xwk#47Ddei)T@br;I)G@+38}TpsQA{SWsOL zu-FIP1O4P5AbV&7=V5HM4Wu|MlRG{U$WM8kchNw8%HupkQjr&zR=VMXK52 zYSFah0A(qmEC$LJ(*O{=N6T87tf8+{eK~jE_O(Z{Zaz?p>nk7GezlcfTV#wZ*rKT$ z%eD_@%efVkB}S57$=at&X+5K^E`9mK(oDw6Ol3@c$;f15OIoFrQ{=g=Rk}Kpa zMJZqEJiKv7%mOrj0SePwz%8f2oF`h1}4xLjQ-vWOwXw#GF*?`WJb@z!}aiu zKeeN~jrVUI-EQ3a_-K=JO~2<->;(eyk`acp4c`g)K&pGUsGhT9m%Xhk?o&(DEK=LA-`CZWrL(7EZ7pZnWLdY= z)r?`t9)A684_Mkhs+%RlGTCWLQo9;N23_tyQwmHJ0VDHoAW#RPf!*BGQ1mzyt%am| zNZR%^NcW@eo$hLQqDCg`WU@*oUC}2s604I~mBd_8tVSm4WTHwY8YH+IcuEG3$zY8P z)yYtm47p}wH6quETqSa&KfE{m+wiZ^N_5-j>ffu8(K;EelF>K9^hJKTR|z~GsRZ}& zaowg`&*=@2 jv9mX)fWW(hanpxz-&QaCn&M>)Ue1#jO!o2(3hv`S(>$ps literal 0 HcmV?d00001 diff --git a/__pycache__/dbtable.cpython-311.pyc b/__pycache__/dbtable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41ebd25efdf74608916f5ec030a9c404fe487b7e GIT binary patch literal 6815 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 literal 0 HcmV?d00001 diff --git a/__pycache__/project_config.cpython-311.pyc b/__pycache__/project_config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf4398ffc87b27c2ebaa497673e1598c23dff495 GIT binary patch literal 1379 zcmZ`&&1)M+6o0cj`mm#|NsHqT+^}xJMg1@-p-o~+L8<#isVTTnqKXbH&8n8OmekpG z>=*|W6NpND$f4j;dhp3@$t4YhI1Mf2KbS2#h=H7P%1yyJn4J1%rFE=^ywUvh=KbEj z{msnV-z;ko(5{`BDhm_fp>zO?rXg=)jJoDxA`a~kZP6_SAJwYm%J<9PVz&H6-jg@O%i(1k;i}vXH^OW3mb@u%ha0y1 z6P-KqA9)Ldw{7`%l)4c%FmzY`C3kJPEAQCh6->LU3)!Wp^z=n%$t%UOw8kV(JVe+7 zjBY`2h~uPxv+uzr66oBXEgl@>`u{R78S4f&#^OX+2X^orGG-qWUl|}n``lTFR79XWJTD#?pgXUSD` z*>{CX*B#$qsR^#=Ld_49#fyPc^xV2|%azq^TG3kFttzSySq=D3*=1hM;X+5r}ZTsn4e5UZV>y#D>pM6u9bpq$C)f&e?50BchbCnlIBjO?#~d!xokr3UtberYLKy| z8ejIbpJD8WWyk9=DaLrM#F)@!{=j}m6Gt`Z28=-Wo1aB!9E>(~C3QPAmB2kb4?=&~ z(X(2^l2fTNmQ9LG92Kvir^u>G)J3Hls6k#VSFmB6U_p%Nr099A;%WMWuJ8}VtGLvk zp&KzZp+>Gv2O1wY WCpX^?=}3!?$oSVu03FBFNYQ^Bp; ").strip() + + def after_main_menu(self, next_step): + if next_step == "2": + self.db_drop() + self.db_init() + self.db_insert_somethings() + print("Таблицы созданы заново!") + return "0" + elif next_step != "1" and next_step != "9": + print("Выбрано неверное число! Повторите ввод!") + return "0" + else: + return next_step + + def show_people(self): + self.person_id = -1 + menu = """Просмотр списка блюд! +№\tНазвание\tВремя приготовления\tКатегория""" + print(menu) + lst = DishTable().all() + for i in lst: + print(str(i[3]) + "\t" + str(i[2]) + "\t\t" + str(i[1]) + "\t\t\t" + str(i[0])) + menu = """Дальнейшие операции: + 0 - возврат в главное меню; + 3 - добавление нового человека; + 4 - удаление человека; + 5 - просмотр телефонов человека; + 9 - выход.""" + print(menu) + return + + def main_cycle(self): + current_menu = "0" + next_step = None + while(current_menu != "9"): + if current_menu == "0": + self.show_main_menu() + next_step = self.read_next_step() + current_menu = self.after_main_menu(next_step) + elif current_menu == "1": + self.show_people() + next_step = self.read_next_step() + current_menu = self.after_show_people(next_step) + elif current_menu == "2": + self.show_main_menu() + elif current_menu == "3": + self.show_add_person() + current_menu = "1" + print("До свидания!") + return + + def test(self): + DbTable.dbconn.test() + +m = Main() + +# Откоментируйте эту строку и закоментируйте следующую для теста +# соединения с БД +# m.test() +m.main_cycle() + + + # def after_show_people(self, next_step): + # while True: + # if next_step == "4": + # print("Пока не реализовано!") + # return "1" + # elif next_step == "6" or next_step == "7": + # print("Пока не реализовано!") + # next_step = "5" + # elif next_step == "5": + # next_step = self.show_phones_by_people() + # elif next_step != "0" and next_step != "9" and next_step != "3": + # print("Выбрано неверное число! Повторите ввод!") + # return "1" + # else: + # return next_step + + # def show_add_person(self): + # # Не реализована проверка на максимальную длину строк. Нужно доделать самостоятельно! + # data = [] + # data.append(input("Введите имя (1 - отмена): ").strip()) + # if data[0] == "1": + # return + # while len(data[0].strip()) == 0: + # data[0] = input("Имя не может быть пустым! Введите имя заново (1 - отмена):").strip() + # if data[0] == "1": + # return + # data.append(input("Введите фамилию (1 - отмена): ").strip()) + # if data[1] == "1": + # return + # while len(data[1].strip()) == 0: + # data[1] = input("Фамилия не может быть пустой! Введите фамилию заново (1 - отмена):").strip() + # if data[1] == "1": + # return + # data.append(input("Введите отчество (1 - отмена):").strip()) + # if data[2] == "1": + # return + # PeopleTable().insert_one(data) + # return + + + # def show_phones_by_people(self): + # if self.person_id == -1: + # while True: + # num = input("Укажите номер строки, в которой записана интересующая Вас персона (0 - отмена):") + # while len(num.strip()) == 0: + # num = input("Пустая строка. Повторите ввод! Укажите номер строки, в которой записана интересующая Вас персона (0 - отмена):") + # if num == "0": + # return "1" + # person = PeopleTable().find_by_position(int(num)) + # if not person: + # print("Введено число, неудовлетворяющее количеству людей!") + # else: + # self.person_id = int(person[1]) + # self.person_obj = person + # break + # print("Выбран человек: " + self.person_obj[2] + " " + self.person_obj[0] + " " + self.person_obj[3]) + # print("Телефоны:") + # lst = PhonesTable().all_by_person_id(self.person_id) + # for i in lst: + # print(i[1]) + # menu = """Дальнейшие операции: + # 0 - возврат в главное меню; + # 1 - возврат в просмотр людей; + # 6 - добавление нового телефона; + # 7 - удаление телефона; + # 9 - выход.""" + # print(menu) + # return self.read_next_step() + + + diff --git a/project/Lib/site-packages/PyYAML-6.0.1.dist-info/INSTALLER b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/Lib/site-packages/PyYAML-6.0.1.dist-info/LICENSE b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/LICENSE new file mode 100644 index 0000000..2f1b8e1 --- /dev/null +++ b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2017-2021 Ingy döt Net +Copyright (c) 2006-2016 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/project/Lib/site-packages/PyYAML-6.0.1.dist-info/METADATA b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/METADATA new file mode 100644 index 0000000..c890598 --- /dev/null +++ b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/METADATA @@ -0,0 +1,46 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 6.0.1 +Summary: YAML parser and emitter for Python +Home-page: https://pyyaml.org/ +Download-URL: https://pypi.org/project/PyYAML/ +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues +Project-URL: CI, https://github.com/yaml/pyyaml/actions +Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation +Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core +Project-URL: Source Code, https://github.com/yaml/pyyaml +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Cython +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup +Requires-Python: >=3.6 +License-File: LICENSE + +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistence. diff --git a/project/Lib/site-packages/PyYAML-6.0.1.dist-info/RECORD b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/RECORD new file mode 100644 index 0000000..fe95456 --- /dev/null +++ b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/RECORD @@ -0,0 +1,44 @@ +PyYAML-6.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-6.0.1.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101 +PyYAML-6.0.1.dist-info/METADATA,sha256=i3GoINVJ0RnmgIBLEFUIA75PtRGAhQAZGeWJNZFKogc,2104 +PyYAML-6.0.1.dist-info/RECORD,, +PyYAML-6.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +PyYAML-6.0.1.dist-info/WHEEL,sha256=9wvhO-5NhjjD8YmmxAvXTPQXMDOZ50W5vklzeoqFtkM,102 +PyYAML-6.0.1.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +_yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402 +_yaml/__pycache__/__init__.cpython-311.pyc,, +yaml/__init__.py,sha256=bhl05qSeO-1ZxlSRjGrvl2m9nrXb1n9-GQatTN0Mrqc,12311 +yaml/__pycache__/__init__.cpython-311.pyc,, +yaml/__pycache__/composer.cpython-311.pyc,, +yaml/__pycache__/constructor.cpython-311.pyc,, +yaml/__pycache__/cyaml.cpython-311.pyc,, +yaml/__pycache__/dumper.cpython-311.pyc,, +yaml/__pycache__/emitter.cpython-311.pyc,, +yaml/__pycache__/error.cpython-311.pyc,, +yaml/__pycache__/events.cpython-311.pyc,, +yaml/__pycache__/loader.cpython-311.pyc,, +yaml/__pycache__/nodes.cpython-311.pyc,, +yaml/__pycache__/parser.cpython-311.pyc,, +yaml/__pycache__/reader.cpython-311.pyc,, +yaml/__pycache__/representer.cpython-311.pyc,, +yaml/__pycache__/resolver.cpython-311.pyc,, +yaml/__pycache__/scanner.cpython-311.pyc,, +yaml/__pycache__/serializer.cpython-311.pyc,, +yaml/__pycache__/tokens.cpython-311.pyc,, +yaml/_yaml.cp311-win_amd64.pyd,sha256=oMYsA1zRMc4eV0dC2R1BXedhpcXVw1pPNqQbjgsKsZU,233984 +yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 +yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639 +yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851 +yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 +yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 +yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 +yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 +yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 +yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 +yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 +yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 +yaml/representer.py,sha256=IuWP-cAW9sHKEnS0gCqSa894k1Bg4cgTxaDwIcbRQ-Y,14190 +yaml/resolver.py,sha256=9L-VYfm4mWHxUD1Vg4X7rjDRK_7VZd6b92wzq7Y2IKY,9004 +yaml/scanner.py,sha256=YEM3iLZSaQwXcQRg2l2R4MdT0zGP2F9eHkKGKnHyWQY,51279 +yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 +yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/project/Lib/site-packages/PyYAML-6.0.1.dist-info/REQUESTED b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/project/Lib/site-packages/PyYAML-6.0.1.dist-info/WHEEL b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/WHEEL new file mode 100644 index 0000000..30c3ff1 --- /dev/null +++ b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: false +Tag: cp311-cp311-win_amd64 + diff --git a/project/Lib/site-packages/PyYAML-6.0.1.dist-info/top_level.txt b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..e6475e9 --- /dev/null +++ b/project/Lib/site-packages/PyYAML-6.0.1.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_yaml +yaml diff --git a/project/Lib/site-packages/_distutils_hack/__init__.py b/project/Lib/site-packages/_distutils_hack/__init__.py new file mode 100644 index 0000000..f987a53 --- /dev/null +++ b/project/Lib/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,222 @@ +# don't import any costly modules +import sys +import os + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + import warnings + + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils." + ) + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + import warnings + + warnings.warn("Setuptools is replacing distutils.") + mods = [ + name + for name in sys.modules + if name == "distutils" or name.startswith("distutils.") + ] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') + return which == 'local' + + +def ensure_local_distutils(): + import importlib + + clear_distutils() + + # With the DistutilsMetaFinder in place, + # perform an import to cause distutils to be + # loaded from setuptools._distutils. Ref #2906. + with shim(): + importlib.import_module('distutils') + + # check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + assert 'setuptools._distutils.log' not in sys.modules + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class _TrivialRe: + def __init__(self, *patterns): + self._patterns = patterns + + def match(self, string): + return all(pat in string for pat in self._patterns) + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + # optimization: only consider top level modules and those + # found in the CPython test suite. + if path is not None and not fullname.startswith('test.'): + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + if self.is_cpython(): + return + + import importlib + import importlib.abc + import importlib.util + + try: + mod = importlib.import_module('setuptools._distutils') + except Exception: + # There are a couple of cases where setuptools._distutils + # may not be present: + # - An older Setuptools without a local distutils is + # taking precedence. Ref #2957. + # - Path manipulation during sitecustomize removes + # setuptools from the path but only after the hook + # has been loaded. Ref #2980. + # In either case, fall back to stdlib behavior. + return + + class DistutilsLoader(importlib.abc.Loader): + def create_module(self, spec): + mod.__name__ = 'distutils' + return mod + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader( + 'distutils', DistutilsLoader(), origin=mod.__file__ + ) + + @staticmethod + def is_cpython(): + """ + Suppress supplying distutils for CPython (build and tests). + Ref #2965 and #3007. + """ + return os.path.isfile('pybuilddir.txt') + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @classmethod + def pip_imported_during_build(cls): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + + return any( + cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) + ) + + @staticmethod + def frame_file_is_setup(frame): + """ + Return True if the indicated frame suggests a setup.py file. + """ + # some frames may not have __file__ (#2940) + return frame.f_globals.get('__file__', '').endswith('setup.py') + + def spec_for_sensitive_tests(self): + """ + Ensure stdlib distutils when running select tests under CPython. + + python/cpython#91169 + """ + clear_distutils() + self.spec_for_distutils = lambda: None + + sensitive_tests = ( + [ + 'test.test_distutils', + 'test.test_peg_generator', + 'test.test_importlib', + ] + if sys.version_info < (3, 10) + else [ + 'test.test_distutils', + ] + ) + + +for name in DistutilsMetaFinder.sensitive_tests: + setattr( + DistutilsMetaFinder, + f'spec_for_{name}', + DistutilsMetaFinder.spec_for_sensitive_tests, + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + DISTUTILS_FINDER in sys.meta_path or insert_shim() + + +class shim: + def __enter__(self): + insert_shim() + + def __exit__(self, exc, value, tb): + remove_shim() + + +def insert_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/project/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a703aefa3524d4f5e0a21adbb803ba7c079c71e0 GIT binary patch literal 11153 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 I5eSC*UpJip<^TWy literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/project/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d36583b3b883d027904c5bfda91f60f8d7a9565 GIT binary patch literal 310 zcmZ3^%ge<81U_-PX*xjqF^B^L%uvQ>2OwiQ0~13kLkhz(Mh1q}Knwv3;4GL3h+YQ7 ztKkBS3@MDk44O>0_~TPDi%UvNGINUKGZK@t{eWUz@$s3t1^GoK@$t8~Q}W~U%TkMq zGE-7lGJFOZ@XO!DDkdZ~F*zf~BRs|>u_Vzcu{bp*Co#z^rl2T4D>b$K~2RXl314w*eW@Kc%!NAqPb%9&v dB7^J|2HEQjnwJ= (3, 6) else ImportError + raise exc("No module named '_yaml'") +else: + from yaml._yaml import * + import warnings + warnings.warn( + 'The _yaml extension module is now located at yaml._yaml' + ' and its location is subject to change. To use the' + ' LibYAML-based parser and emitter, import from `yaml`:' + ' `from yaml import CLoader as Loader, CDumper as Dumper`.', + DeprecationWarning + ) + del warnings + # Don't `del yaml` here because yaml is actually an existing + # namespace member of _yaml. + +__name__ = '_yaml' +# If the module is top-level (i.e. not a part of any specific package) +# then the attribute should be set to ''. +# https://docs.python.org/3.8/library/types.html +__package__ = '' diff --git a/project/Lib/site-packages/_yaml/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/_yaml/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4c1be943c6ef76ca2518435cdab4453d3f0f836 GIT binary patch literal 927 zcmY*XL2DC16rRa$lFcS*jinZ;!W0i_q)l%MMFeeHDzx=rpqMU9C)sJTZFV=zPE6ZV z5D)zag5b3(f_U_2q|!s&Q^8Yjk$URMH@gP$&6~IL=DqLDn{W0*K5rtB_u2B^aT1}Q z${7pzkzBol&s$_88@EvnB@o9P*$G=a)e!m&GnQZ$GW2%B)oL0>T(gr0Q3a9Ux`%nP zmI7qTPMu;v!HnfK22{G8uEzC^ngLnHer6oE4Q`$$00A==jCKq=Q_I?BEob8wsFb}_ zfvxZcr9DTsXxphDF}F?WS_y}_S6l>+?@`Cw^Gk_K)$U~q%<;^YPh8*bwmI>b%WYDm z3RVOVzJL6q+TtYIApB5rPt_QwI|1?h9%=gxCIQDJQNVJX%{-epGKixJ1ld8izRw$y zNS`!X%xm&8AyuDr15P9yv*FZVKH1z@tg`^hb(jdaAgT^`9Vxk3AdcJdg(Q2zcge0g zYIxpFn_My}MW_WwfzW}R zaB4GRX3Ljre%G^Ch44j~eHOJ5I~qT1gyz4ChenSH&+(c;sH;_Yv%))q14Tf>b{q-~ zN)^|XhFMBGtZ~4a;Cw{xY=lWSSMg}q_`@Iu6m@a;t zK1(m1ry}?BB%$z?r=Lh=yg??u+ z)}cPtf3C(*FZ9>nY>pCIrh?(f%Fd@fieXM +License: MIT +Project-URL: Homepage, https://pip.pypa.io/ +Project-URL: Documentation, https://pip.pypa.io +Project-URL: Source, https://github.com/pypa/pip +Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.txt +License-File: AUTHORS.txt + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + :alt: PyPI + +.. image:: https://img.shields.io/pypi/pyversions/pip + :target: https://pypi.org/project/pip + :alt: PyPI - Python Version + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + :alt: Documentation + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ + +We release updates regularly, with a new version every 3 months. Find more details in our documentation: + +* `Release notes`_ +* `Release process`_ + +If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Development documentation`_ +* `Development IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. + +.. _package installer: https://packaging.python.org/guides/tool-recommendations/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installation/ +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ +.. _GitHub page: https://github.com/pypa/pip +.. _Development documentation: https://pip.pypa.io/en/latest/development +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa +.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md diff --git a/project/Lib/site-packages/pip-24.0.dist-info/RECORD b/project/Lib/site-packages/pip-24.0.dist-info/RECORD new file mode 100644 index 0000000..2af4c7d --- /dev/null +++ b/project/Lib/site-packages/pip-24.0.dist-info/RECORD @@ -0,0 +1,1024 @@ +../../Scripts/pip.exe,sha256=6efuJBcfdTqKgntg6chmQLWSRuL634-NoKC1PboIx3M,108411 +../../Scripts/pip3.11.exe,sha256=6efuJBcfdTqKgntg6chmQLWSRuL634-NoKC1PboIx3M,108411 +../../Scripts/pip3.exe,sha256=6efuJBcfdTqKgntg6chmQLWSRuL634-NoKC1PboIx3M,108411 +pip-24.0.dist-info/AUTHORS.txt,sha256=SwXm4nkwRkmtnO1ZY-dLy7EPeoQNXMNLby5CN3GlNhY,10388 +pip-24.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-24.0.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 +pip-24.0.dist-info/METADATA,sha256=kNEfJ3_Vho2mee4lfJdlbd5RHIqsfQJSMUB-bOkIOeI,3581 +pip-24.0.dist-info/RECORD,, +pip-24.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-24.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +pip-24.0.dist-info/entry_points.txt,sha256=ynZN1_707_L23Oa8_O5LOxEoccj1nDa4xHT5galfN7o,125 +pip-24.0.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=oAk1nFpLmUVS5Ln7NxvNoGUn5Vkn6FGQjPaNDf8Q8pk,355 +pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854 +pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 +pip/__pycache__/__init__.cpython-311.pyc,, +pip/__pycache__/__main__.cpython-311.pyc,, +pip/__pycache__/__pip-runner__.cpython-311.pyc,, +pip/_internal/__init__.py,sha256=iqZ5-YQsQV08tkUc7L806Reop6tguLFWf70ySF6be0Y,515 +pip/_internal/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/__pycache__/build_env.cpython-311.pyc,, +pip/_internal/__pycache__/cache.cpython-311.pyc,, +pip/_internal/__pycache__/configuration.cpython-311.pyc,, +pip/_internal/__pycache__/exceptions.cpython-311.pyc,, +pip/_internal/__pycache__/main.cpython-311.pyc,, +pip/_internal/__pycache__/pyproject.cpython-311.pyc,, +pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,, +pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,, +pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243 +pip/_internal/cache.py,sha256=uiYD-9F0Bv1C8ZyWE85lpzDmQf7hcUkgL99GmI8I41Q,10370 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-311.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc,, +pip/_internal/cli/__pycache__/command_context.cpython-311.pyc,, +pip/_internal/cli/__pycache__/main.cpython-311.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-311.pyc,, +pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc,, +pip/_internal/cli/__pycache__/req_command.cpython-311.pyc,, +pip/_internal/cli/__pycache__/spinners.cpython-311.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc,, +pip/_internal/cli/autocompletion.py,sha256=_br_5NgSxSuvPjMF0MLHzS5s6BpSkQAQHKrLK89VauM,6690 +pip/_internal/cli/base_command.py,sha256=iuVWGa2oTq7gBReo0er3Z0tXJ2oqBIC6QjDHcnDhKXY,8733 +pip/_internal/cli/cmdoptions.py,sha256=1EIm8yMixQMELO4QzogdIoWkvIlQqlAW0YnPeOmnvEA,30064 +pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 +pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816 +pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 +pip/_internal/cli/parser.py,sha256=KW6C3-7-4ErTNB0TfLTKwOdHcd-qefCeGnrOoE2r0RQ,10781 +pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 +pip/_internal/cli/req_command.py,sha256=c7_XHABnXmD3_qlK9-r37KqdKBAcgmVKvQ2WcTrNLfc,18369 +pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 +pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 +pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 +pip/_internal/commands/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/commands/__pycache__/cache.cpython-311.pyc,, +pip/_internal/commands/__pycache__/check.cpython-311.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-311.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-311.pyc,, +pip/_internal/commands/__pycache__/debug.cpython-311.pyc,, +pip/_internal/commands/__pycache__/download.cpython-311.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-311.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-311.pyc,, +pip/_internal/commands/__pycache__/help.cpython-311.pyc,, +pip/_internal/commands/__pycache__/index.cpython-311.pyc,, +pip/_internal/commands/__pycache__/inspect.cpython-311.pyc,, +pip/_internal/commands/__pycache__/install.cpython-311.pyc,, +pip/_internal/commands/__pycache__/list.cpython-311.pyc,, +pip/_internal/commands/__pycache__/search.cpython-311.pyc,, +pip/_internal/commands/__pycache__/show.cpython-311.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944 +pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782 +pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287 +pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766 +pip/_internal/commands/debug.py,sha256=63972uUCeMIGOdMMVeIUGrOjTOqTVWplFC82a-hcKyA,6777 +pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335 +pip/_internal/commands/freeze.py,sha256=2qjQrH9KWi5Roav0CuR7vc7hWm4uOi_0l6tp3ESKDHM,3172 +pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 +pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 +pip/_internal/commands/index.py,sha256=CNXQer_PeZKSJooURcCFCBEKGfwyNoUWYP_MWczAcOM,4775 +pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188 +pip/_internal/commands/install.py,sha256=VxDd-BD3a27ApeE2OK34rfBXS6Zo2wtemK9-HCwPqxM,28782 +pip/_internal/commands/list.py,sha256=7wRUUmdyyOknl-WZYbO_LtFQxHlWod3pjOY9yYH435o,12450 +pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 +pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419 +pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886 +pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476 +pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006 +pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 +pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/base.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/installed.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc,, +pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/distributions/base.py,sha256=oRSEvnv2ZjBnargamnv2fcJa1n6gUDKaW0g6CWSEpWs,1743 +pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842 +pip/_internal/distributions/sdist.py,sha256=4K3V0VNMllHbBzCJibjwd_tylUKpmIdu2AQyhplvCQo,6709 +pip/_internal/distributions/wheel.py,sha256=-ma3sOtUQj0AxXCEb6_Fhmjl3nh4k3A0HC2taAb2N-4,1277 +pip/_internal/exceptions.py,sha256=TmF1iNFEneSWaemwlg6a5bpPuq2cMHK7d1-SvjsQHb0,23634 +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/index/__pycache__/collector.cpython-311.pyc,, +pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,, +pip/_internal/index/__pycache__/sources.cpython-311.pyc,, +pip/_internal/index/collector.py,sha256=sH0tL_cOoCk6pLLfCSGVjFM4rPEJtllF-VobvAvLSH4,16590 +pip/_internal/index/package_finder.py,sha256=S_nC8gzVIMY6ikWfKoSOzRtoesUqnfNhAPl_BwSOusA,37843 +pip/_internal/index/sources.py,sha256=dJegiR9f86kslaAHcv9-R5L_XBf5Rzm_FkyPteDuPxI,8688 +pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365 +pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,, +pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,, +pip/_internal/locations/__pycache__/base.cpython-311.pyc,, +pip/_internal/locations/_distutils.py,sha256=H9ZHK_35rdDV1Qsmi4QeaBULjFT4Mbu6QuoVGkJ6QHI,6009 +pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680 +pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556 +pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 +pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339 +pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/metadata/__pycache__/_json.cpython-311.pyc,, +pip/_internal/metadata/__pycache__/base.cpython-311.pyc,, +pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc,, +pip/_internal/metadata/_json.py,sha256=Rz5M5ciSNvITwaTQR6NfN8TgKgM5WfTws4D6CFknovE,2627 +pip/_internal/metadata/base.py,sha256=l3Wgku4xlgr8s4p6fS-3qQ4QKOpPbWLRwi5d9omEFG4,25907 +pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135 +pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc,, +pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,, +pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,, +pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 +pip/_internal/metadata/importlib/_dists.py,sha256=UPl1wUujFqiwiltRJ1tMF42WRINO1sSpNNlYQ2mX0mk,8297 +pip/_internal/metadata/importlib/_envs.py,sha256=XTaFIYERP2JF0QUZuPx2ETiugXbPEcZ8q8ZKeht6Lpc,7456 +pip/_internal/metadata/pkg_resources.py,sha256=opjw4IBSqHvie6sXJ_cbT42meygoPEUfNURJuWZY7sk,10035 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-311.pyc,, +pip/_internal/models/__pycache__/direct_url.cpython-311.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-311.pyc,, +pip/_internal/models/__pycache__/index.cpython-311.pyc,, +pip/_internal/models/__pycache__/installation_report.cpython-311.pyc,, +pip/_internal/models/__pycache__/link.cpython-311.pyc,, +pip/_internal/models/__pycache__/scheme.cpython-311.pyc,, +pip/_internal/models/__pycache__/search_scope.cpython-311.pyc,, +pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc,, +pip/_internal/models/__pycache__/target_python.cpython-311.pyc,, +pip/_internal/models/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/models/candidate.py,sha256=hEPu8VdGE5qVASv6vLz-R-Rgh5-7LMbai1jgthMCd8M,931 +pip/_internal/models/direct_url.py,sha256=FwouYBKcqckh7B-k2H3HVgRhhFTukFwqiS3kfvtFLSk,6889 +pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486 +pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 +pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818 +pip/_internal/models/link.py,sha256=XirOAGv1jgMu7vu87kuPbohGj7VHpwVrd2q3KUgVQNg,20777 +pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 +pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643 +pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 +pip/_internal/models/target_python.py,sha256=34EkorrMuRvRp-bjqHKJ-bOO71m9xdjN2b8WWFEC2HU,4272 +pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/network/__pycache__/auth.cpython-311.pyc,, +pip/_internal/network/__pycache__/cache.cpython-311.pyc,, +pip/_internal/network/__pycache__/download.cpython-311.pyc,, +pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc,, +pip/_internal/network/__pycache__/session.cpython-311.pyc,, +pip/_internal/network/__pycache__/utils.cpython-311.pyc,, +pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,, +pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541 +pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935 +pip/_internal/network/download.py,sha256=i0Tn55CD5D7XYEFY3TxiYaCf0OaaTQ6SScNgCsSeV14,6086 +pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638 +pip/_internal/network/session.py,sha256=9tqEDD8JiVaFdplOEXJxNo9cjRfBZ6RIa0yQQ_qBNiM,18698 +pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 +pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/operations/__pycache__/check.cpython-311.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-311.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-311.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc,, +pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc,, +pip/_internal/operations/build/build_tracker.py,sha256=z-H5DOknZdBa3dh2Vq6VBMY5qLYIKmlj2p6CGZK5Lc8,4832 +pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422 +pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474 +pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 +pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075 +pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417 +pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 +pip/_internal/operations/check.py,sha256=fsqA88iGaqftCr2tlP3sSU202CSkoODRtW0O-JU9M4Y,6806 +pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816 +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc,, +pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282 +pip/_internal/operations/install/wheel.py,sha256=9hGb1c4bRnPIb2FG7CtUSPfPxqprmHQBtwIAlWPNTtE,27311 +pip/_internal/operations/prepare.py,sha256=57Oq87HfunX3Rbqp47FdaJr9cHbAKUm_3gv7WhBAqbE,28128 +pip/_internal/pyproject.py,sha256=4Xszp11xgr126yzG6BbJA0oaQ9WXuhb0jyUb-y_6lPQ,7152 +pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738 +pip/_internal/req/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-311.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,, +pip/_internal/req/constructors.py,sha256=8hlY56imEthLORRwmloyKz3YOyXymIaKsNB6P9ewvNI,19018 +pip/_internal/req/req_file.py,sha256=M8ttOZL-PwAj7scPElhW3ZD2hiD9mm_6FJAGIbwAzEI,17790 +pip/_internal/req/req_install.py,sha256=wtOPxkyRSM8comTks8oL1Gp2oyGqbH7JwIDRci2QiPk,35460 +pip/_internal/req/req_set.py,sha256=iMYDUToSgkxFyrP_OrTtPSgw4dwjRyGRDpGooTqeA4Y,4704 +pip/_internal/req/req_uninstall.py,sha256=nmvTQaRCC0iu-5Tw0djlXJhSj6WmqHRvT3qkkEdC35E,24551 +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/resolution/__pycache__/base.cpython-311.pyc,, +pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc,, +pip/_internal/resolution/legacy/resolver.py,sha256=Xk24jQ62GvLr4Mc7IjN_qiO88qp0BImzVmPIFz9QLOE,24025 +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,, +pip/_internal/resolution/resolvelib/base.py,sha256=jg5COmHLhmBIKOR-4spdJD3jyULYa1BdsqiBu2YJnJ4,5173 +pip/_internal/resolution/resolvelib/candidates.py,sha256=19Ki91Po-MSxBknGIfOGkaWkFdOznN0W_nKv7jL28L0,21052 +pip/_internal/resolution/resolvelib/factory.py,sha256=vqqk-hjchdhShwWVdeW2_A-5ZblLhE_nC_v3Mhz4Svc,32292 +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 +pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824 +pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100 +pip/_internal/resolution/resolvelib/requirements.py,sha256=-kJONP0WjDfdTvBAs2vUXPgAnOyNIBEAXY4b72ogtPE,5696 +pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592 +pip/_internal/self_outdated_check.py,sha256=saxQLB8UzIFtMScquytG10TOTsYVFJQ_mkW1NY-46wE,8378 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc,, +pip/_internal/utils/__pycache__/_log.cpython-311.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-311.pyc,, +pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc,, +pip/_internal/utils/__pycache__/datetime.cpython-311.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc,, +pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc,, +pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-311.pyc,, +pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc,, +pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-311.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-311.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-311.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-311.pyc,, +pip/_internal/utils/__pycache__/models.cpython-311.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-311.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc,, +pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc,, +pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc,, +pip/_internal/utils/__pycache__/urls.cpython-311.pyc,, +pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc,, +pip/_internal/utils/__pycache__/wheel.cpython-311.pyc,, +pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351 +pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 +pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 +pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 +pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 +pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 +pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 +pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 +pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463 +pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 +pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 +pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 +pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 +pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113 +pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118 +pip/_internal/utils/logging.py,sha256=fdtuZJ-AKkqwDTANDvGcBEpssL8el7T1jnwk1CnZl3Y,11603 +pip/_internal/utils/misc.py,sha256=fNXwaeeikvnUt4CPMFIL4-IQbZDxxjj4jDpzCi4ZsOw,23623 +pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 +pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 +pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435 +pip/_internal/utils/subprocess.py,sha256=zzdimb75jVLE1GU4WlTZ055gczhD7n1y1xTcNc7vNZQ,9207 +pip/_internal/utils/temp_dir.py,sha256=DUAw22uFruQdK43i2L2K53C-CDjRCPeAsBKJpu-rHQ4,9312 +pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 +pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 +pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456 +pip/_internal/utils/wheel.py,sha256=i4BwUNHattzN0ixy3HBAF04tZPRh2CcxaT6t86viwkE,4499 +pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 +pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc,, +pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc,, +pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519 +pip/_internal/vcs/git.py,sha256=CeKBGJnl6uskvvjkAUXrJVxbHJrpS_B_pyfFdjL3CRc,18121 +pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249 +pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729 +pip/_internal/vcs/versioncontrol.py,sha256=3eIjtOMYvOY5qP6BMYIYDZ375CSuec6kSEB0bOo1cSs,22787 +pip/_internal/wheel_builder.py,sha256=qTTzQV8F6b1jNsFCda1TRQC8J7gK-m7iuRNgKo7Dj68,11801 +pip/_vendor/__init__.py,sha256=U51NPwXdA-wXOiANIQncYjcMp6txgeOL5nHxksJeyas,4993 +pip/_vendor/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/__pycache__/six.cpython-311.pyc,, +pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=ctHagMhQXuvQDdm4TirZrwDOT5H8oBNAJqzdKI6sovk,676 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737 +pip/_vendor/cachecontrol/adapter.py,sha256=_CcWvUP9048qAZjsNqViaHbdcLs9mmFNixVfpO7oebE,6392 +pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=3z8AWKD-vfKeiJqIzLmJyIYtR2yd6Tsh3u1TyLRQoIQ,5352 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386 +pip/_vendor/cachecontrol/controller.py,sha256=keCFA3ZaNVaWTwHd6F1zqWhb4vyvNx_UvZuo5iIYMfo,18384 +pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292 +pip/_vendor/cachecontrol/heuristics.py,sha256=fdFbk9W8IeLrjteIz_fK4mj2HD_Y7COXF2Uc8TgjT1c,4828 +pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/cachecontrol/serialize.py,sha256=0dHeMaDwysVAAnGVlhMOP4tDliohgNK0Jxk_zsOiWxw,7173 +pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417 +pip/_vendor/certifi/__init__.py,sha256=L_j-d0kYuA_MzA2_2hraF1ovf6KT6DTquRdV3paQwOk,94 +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 +pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=eU0Dn_3yd8BH4m8sfVj4Glhl2KDrcCSg-sEWT-pNJ88,281617 +pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279 +pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797 +pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-311.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 +pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763 +pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032 +pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915 +pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420 +pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242 +pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732 +pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542 +pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860 +pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683 +pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006 +pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176 +pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934 +pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 +pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753 +pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 +pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753 +pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 +pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759 +pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537 +pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 +pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 +pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752 +pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 +pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 +pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 +pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 +pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 +pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 +pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 +pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380 +pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077 +pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131 +pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391 +pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc,, +pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560 +pip/_vendor/chardet/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402 +pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137 +pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007 +pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848 +pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505 +pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812 +pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244 +pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 +pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 +pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 +pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 +pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc,, +pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc,, +pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 +pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 +pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 +pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 +pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 +pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 +pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 +pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 +pip/_vendor/distlib/__init__.py,sha256=hJKF7FHoqbmGckncDuEINWo_OYkDNiHODtYXSMcvjcc,625 +pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-311.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc,, +pip/_vendor/distlib/compat.py,sha256=Un-uIBvy02w-D267OG4VEhuddqWgKj9nNkxVltAb75w,41487 +pip/_vendor/distlib/database.py,sha256=0V9Qvs0Vrxa2F_-hLWitIyVyRifJ0pCxyOI-kEOBwsA,51965 +pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797 +pip/_vendor/distlib/locators.py,sha256=o1r_M86_bRLafSpetmyfX8KRtFu-_Q58abvQrnOSnbA,51767 +pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168 +pip/_vendor/distlib/markers.py,sha256=n3DfOh1yvZ_8EW7atMyoYeZFXjYla0Nz0itQlojCd0A,5268 +pip/_vendor/distlib/metadata.py,sha256=pB9WZ9mBfmQxc9OVIldLS5CjOoQRvKAvUwwQyKwKQtQ,39693 +pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 +pip/_vendor/distlib/scripts.py,sha256=nQFXN6G7nOWNDUyxirUep-3WOlJhB7McvCs9zOnkGTI,18315 +pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 +pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 +pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 +pip/_vendor/distlib/util.py,sha256=XSznxEi_i3T20UJuaVc0qXHz5ksGUCW1khYlBprN_QE,67530 +pip/_vendor/distlib/version.py,sha256=9pXkduchve_aN7JG6iL9VTYV_kqNSGoc2Dwl8JuySnQ,23747 +pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 +pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 +pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 +pip/_vendor/distlib/wheel.py,sha256=FVQCve8u-L0QYk5-YTZc7s4WmNQdvjRWTK08KXzZVX4,43958 +pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 +pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 +pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/distro/__pycache__/distro.cpython-311.pyc,, +pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330 +pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 +pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc,, +pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 +pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 +pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 +pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 +pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 +pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 +pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 +pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132 +pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc,, +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079 +pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544 +pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 +pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 +pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-311.pyc,, +pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 +pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 +pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 +pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 +pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 +pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 +pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 +pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 +pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 +pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155 +pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476 +pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc,, +pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc,, +pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211 +pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132 +pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678 +pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809 +pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160 +pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573 +pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983 +pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353 +pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/console.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/style.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/token.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc,, +pip/_vendor/pygments/__pycache__/util.cpython-311.pyc,, +pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685 +pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697 +pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938 +pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386 +pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178 +pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424 +pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc,, +pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 +pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314 +pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094 +pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610 +pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938 +pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981 +pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351 +pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073 +pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212 +pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014 +pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335 +pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674 +pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753 +pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618 +pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130 +pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc,, +pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc,, +pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281 +pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424 +pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986 +pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591 +pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072 +pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092 +pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882 +pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257 +pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700 +pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184 +pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223 +pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230 +pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116 +pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc,, +pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc,, +pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567 +pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387 +pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445 +pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215 +pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523 +pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646 +pip/_vendor/pyparsing/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692 +pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488 +pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646 +pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670 +pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491 +pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 +pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920 +pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546 +pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc,, +pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927 +pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169 +pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-311.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-311.pyc,, +pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435 +pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 +pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697 +pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449 +pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 +pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 +pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 +pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 +pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 +pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 +pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373 +pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 +pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460 +pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537 +pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc,, +pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc,, +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc,, +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 +pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871 +pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601 +pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511 +pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963 +pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 +pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478 +pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/abc.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/align.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/bar.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/box.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/cells.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/color.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/columns.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/console.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/containers.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/control.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/errors.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/json.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/layout.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/live.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/logging.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/markup.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/measure.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/padding.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/pager.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/palette.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/panel.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/progress.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/region.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/repr.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/rule.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/scope.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/screen.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/segment.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/status.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/style.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/styled.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/table.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/text.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/theme.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/themes.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc,, +pip/_vendor/rich/__pycache__/tree.cpython-311.pyc,, +pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 +pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 +pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 +pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100 +pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 +pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 +pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 +pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 +pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 +pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 +pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 +pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 +pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 +pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 +pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 +pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 +pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 +pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 +pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 +pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 +pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 +pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368 +pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 +pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 +pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842 +pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509 +pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224 +pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 +pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 +pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218 +pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 +pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 +pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 +pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082 +pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 +pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 +pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 +pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 +pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 +pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584 +pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032 +pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 +pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007 +pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273 +pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 +pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903 +pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 +pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 +pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 +pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 +pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 +pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574 +pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852 +pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706 +pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165 +pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 +pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 +pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 +pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431 +pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 +pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 +pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 +pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247 +pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 +pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 +pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 +pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 +pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173 +pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684 +pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 +pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525 +pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 +pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 +pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604 +pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 +pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 +pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493 +pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc,, +pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc,, +pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551 +pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179 +pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682 +pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562 +pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372 +pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 +pip/_vendor/tenacity/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746 +pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086 +pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142 +pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024 +pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 +pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc,, +pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc,, +pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc,, +pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 +pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 +pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 +pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26 +pip/_vendor/truststore/__init__.py,sha256=qzTLSH8PvAkY1fr6QQ2vV-KwE_M83wdXugtpJaP_AbM,403 +pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc,, +pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc,, +pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc,, +pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc,, +pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc,, +pip/_vendor/truststore/_api.py,sha256=xjuEu_rlH4hcdJTROImEyOEqdw-F8t5vO2H2BToY0Ro,9893 +pip/_vendor/truststore/_macos.py,sha256=BjvAKoAjXhdIPuxpY124HJIFswDb0pq8DjynzJOVwqc,17694 +pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324 +pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130 +pip/_vendor/truststore/_windows.py,sha256=1x_EhROeJ9QK1sMAjfnZC7awYI8UnBJYL-TjACUYI4A,17468 +pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130 +pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 +pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 +pip/_vendor/urllib3/_version.py,sha256=azoM7M7BUADl2kBhMVR6PPf2GhBDI90me1fcnzTwdcw,64 +pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300 +pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 +pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 +pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 +pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 +pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 +pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 +pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 +pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343 +pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 +pip/_vendor/urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752 +pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691 +pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641 +pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 +pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 +pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 +pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 +pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 +pip/_vendor/urllib3/util/retry.py,sha256=Z6WEf518eTOXP5jr5QSQ9gqJI0DVYt3Xs3EKnYaTmus,22013 +pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 +pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 +pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 +pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168 +pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296 +pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 +pip/_vendor/vendor.txt,sha256=4NKk7fQhVsZw0U-0zmm9Q2LgGyaPXacFbnJAaS0Q6EY,493 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/project/Lib/site-packages/pip-24.0.dist-info/REQUESTED b/project/Lib/site-packages/pip-24.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/project/Lib/site-packages/pip-24.0.dist-info/WHEEL b/project/Lib/site-packages/pip-24.0.dist-info/WHEEL new file mode 100644 index 0000000..98c0d20 --- /dev/null +++ b/project/Lib/site-packages/pip-24.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/project/Lib/site-packages/pip-24.0.dist-info/entry_points.txt b/project/Lib/site-packages/pip-24.0.dist-info/entry_points.txt new file mode 100644 index 0000000..5367846 --- /dev/null +++ b/project/Lib/site-packages/pip-24.0.dist-info/entry_points.txt @@ -0,0 +1,4 @@ +[console_scripts] +pip = pip._internal.cli.main:main +pip3 = pip._internal.cli.main:main +pip3.10 = pip._internal.cli.main:main diff --git a/project/Lib/site-packages/pip-24.0.dist-info/top_level.txt b/project/Lib/site-packages/pip-24.0.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/Lib/site-packages/pip-24.0.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/project/Lib/site-packages/pip/__init__.py b/project/Lib/site-packages/pip/__init__.py new file mode 100644 index 0000000..be0e3ed --- /dev/null +++ b/project/Lib/site-packages/pip/__init__.py @@ -0,0 +1,13 @@ +from typing import List, Optional + +__version__ = "24.0" + + +def main(args: Optional[List[str]] = None) -> int: + """This is an internal API only meant for use by pip's own console scripts. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/project/Lib/site-packages/pip/__main__.py b/project/Lib/site-packages/pip/__main__.py new file mode 100644 index 0000000..5991326 --- /dev/null +++ b/project/Lib/site-packages/pip/__main__.py @@ -0,0 +1,24 @@ +import os +import sys + +# Remove '' and current working directory from the first entry +# of sys.path, if present to avoid using current directory +# in pip commands check, freeze, install, list and show, +# when invoked as python -m pip +if sys.path[0] in ("", os.getcwd()): + sys.path.pop(0) + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == "": + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +if __name__ == "__main__": + from pip._internal.cli.main import main as _main + + sys.exit(_main()) diff --git a/project/Lib/site-packages/pip/__pip-runner__.py b/project/Lib/site-packages/pip/__pip-runner__.py new file mode 100644 index 0000000..49a148a --- /dev/null +++ b/project/Lib/site-packages/pip/__pip-runner__.py @@ -0,0 +1,50 @@ +"""Execute exactly this copy of pip, within a different environment. + +This file is named as it is, to ensure that this module can't be imported via +an import statement. +""" + +# /!\ This version compatibility check section must be Python 2 compatible. /!\ + +import sys + +# Copied from setup.py +PYTHON_REQUIRES = (3, 7) + + +def version_str(version): # type: ignore + return ".".join(str(v) for v in version) + + +if sys.version_info[:2] < PYTHON_REQUIRES: + raise SystemExit( + "This version of pip does not support python {} (requires >={}).".format( + version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES) + ) + ) + +# From here on, we can use Python 3 features, but the syntax must remain +# Python 2 compatible. + +import runpy # noqa: E402 +from importlib.machinery import PathFinder # noqa: E402 +from os.path import dirname # noqa: E402 + +PIP_SOURCES_ROOT = dirname(dirname(__file__)) + + +class PipImportRedirectingFinder: + @classmethod + def find_spec(self, fullname, path=None, target=None): # type: ignore + if fullname != "pip": + return None + + spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target) + assert spec, (PIP_SOURCES_ROOT, fullname) + return spec + + +sys.meta_path.insert(0, PipImportRedirectingFinder()) + +assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module" +runpy.run_module("pip", run_name="__main__", alter_sys=True) diff --git a/project/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eccb62fe78691cded5ca13e26abd89fc8128113f GIT binary patch literal 763 zcmZ`%&ubGw6rS1LY+_;+)JwfMiXZ{IDN-~oQc!~^lqj?ygvDjDGf74_yTi=Hx}`!7 z9x8b7)*d|j1OJ&EJjk93p1cKe>&Z9KR1f-i^Y*>vd+&X3-h5nGs3MT|)1_XF5&CX} zxs-l8(-t@fh#`g(G{hY|bUF@3%;~tS%slRJ%)P~V7W(6{5-;^U=D#j=eCBSVdgX^j z)t$oI5ZV-#N79HarOA$WVQ)Hw$>E=WVc}MY?z$4W?}gKCw4+y^LSO#Gru7&lZT`a02^lYuc(uQeKdVFsga5NE@N%q49=&4$o= z#C7A=%4##16;ck&P{&0j+E!FbuHZs00Wyf@EQ67O(g9D6%4G(BwW`=0N7CfpF+Pz%GCB#ocbKG&h86+t&)q9~Ag z;SH%sRShcoaJ0SSJv6DJ((2f2{;fx~^ZU(rtvBm$*T>%C6mT#|yIwAQlS`5ImEDo@ zz!bG8dcl>3{YFvYYNHAl2AMVajMQn1vrq51a(kGuQNq{NISB0rbqHqSVvN6`%j19P l(U}W-wTWNG7bghJ{>ww}aP$4CuV=5!;!pAH^ItRT{u83)$aeq$ literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc b/project/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a5adfc748b5c224da83fb86e3f3243252e1ecd0 GIT binary patch literal 882 zcma)4&1(}u6o0cj`Di{WN?J&pgXk%TMkuK*Du&t|a)`}AYauKy+w7#>bdxN*t2Xu$ zOTZ`vS12eV*i%&U&umH#VNV55-U7Y#cHVpQ-uwOL&Hju=LqKKwuJ|U()e!>t0y4-*h2nTeMMO}Ab3W2Lvj#+E_Yt>$(P%x!0gC&E}rt z>EVnbLx-Yv=^6_H;*+_<5u*N-)}LaZ``wt?{XZfCUIedIgnDk(KlOdsY+OtvZ6AVU#S^H zH<^c>P|u>KXem*tnS{owsgkOs7>>^V1jjc*cQ83p%-?XuSY2;r9|+HhR5}oHyFykn zr6-a>1XbF*FKBwbLQ1BPSM~%$G0Dn=iy=^ud+t?ITH`wSs9Kj_spPS~NNcheH+u9l z^7se9Y!!!w^K~PuD+XK4!kIeqaBQ`Ih;$(OXXUm(#uQT0gwj%#I5bP72nh zW%h8Qj}tadT=L=e+Y3H!^YH;r+unJJBh9T=uD#RV`LKJs+rtZeykNU?7y!IP^Yj?K F)jz^<$j$%& literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc b/project/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8549813c8434bed974b33f12612bb32e252225a GIT binary patch literal 2501 zcmaJ?%TF6e7@yf)KNm2;B#>9LRnjz$Y*SLwMiC`Z5)ufNAwXKyb-P-;V_2|vo!vF% zVI&k$300NqO0B|?Lq(~QLytZ7Pq5KOvGx?Hs#I=9|z%ewKKEdyuSHf^P6vf zZfy-BD2Xp)nV&oe{Xr-75;z>}zrYARLo!Mt8Oux-C$Y>X8JSx{NtWPQu6{sfWY5>k z>G~8AX3iPw0}LV_*}Lg&Y#kZE-v3J30`1S?bBn{xG_P$jzyY6In)jY!$7WyB2fZ)r z&jpeJO#Sd@gE>CQV+0a;`jM9Alg+baD}x>&Ik1N0V6(nt8^j<~*S^_aA06#w3>wWrVzvj|yKYu%-% zBN-)21n5;MM`S@V1jU4DR4_H*HVQfc$&%@c&uMZ2xYLsQt|?5xv0Pr$O*l5MNI^+G zoC}62nZ(txOU+J1m|g0@t`A7ManmrN$f7&@w}Aix@h0@gi_EN{BD#l~Bi4L>5EV9Y zfaAyHzYp^E`+$rf3_6PFi|`6Ik62N}&5}Mr&oD;ccFG83;zR`7tYPXA#%AL0*?8Wd zS11Sv!}o5cCW(}uNez9Px+j^^9myc6tTgpODz9s^ByFZXR;E&hVv<;1O3z8t#7M!# z^oSzRm|jp-qKjfYzjzSnpC&3<$m;`3Z_N|kP&8EpmGSZ9Mt$?gsw;{tx%v`BAzLyx@h+&1#AYz3))IK?5M@JW!iIqEn|DDA_OG7C7t%@|2?GKO2^>@#CZe%OKQI030}JBm8(DoUg&4C@7wqzg$C1^^dGFLRDc zouPm@3Y^&nh>F-eB4ZjC+2&`v!WB8=#6xtHtB5m9v$0Qckpp9ygv|m%BCJl6fgQ*| zI7A~)(sujU@R&F;`gr{A;Dk6nIyxEg*qlMK8QY&JWV19>HkXG8+Fn!Ar-=!>aL%AU z3A8x(t#`w8>C%4(B;L^Y4saSnKvvOfK3pp7@aM|>xoWtp)c0rTv=zFzIrOsURyltA z_sf;guoW6!=c=J_+20H8<*Cct{_@G*ioe(L_pY0;vCcba0S^;kxnC5i#iD2jMbS+y zFm4gWCk4sz1!jCYD;Y+P0Aysx?q852!gb^%Sf*2QiQ0M1v2zt{rM2p5uQ6UvXARZK z9*evu);|B&sw<8Pp$6q7MHR)R-n)`YF$<4WIQCp=l9T|_YK(FVuH||cNSK5q;fFJh zUv@ysn()GnMI#cneWEC9Y4C`Jxg8q&Y;tHcA&w6|dOSQnIN`iHyQTgP6*Z&T!HGo! z(&*rVV%pw}rspKn_JHvGq8)YI14WgU+1J$)8jCTmF&yS~`M z`PCq;H7^REUJcc}7{_X;LHvmGS!}p;r}U_F$6~uSdUn`InT=F~o$FVt{^3{tu^srEy}Z5r+pS8^h}AQ)$1;K78w6yJ<#_KK1O%+` zcxxR9x30F(T18jO&8>>gmYdt_@R`zw8&EfIRL(}Nvyk0lRybBh?KQ6-19*;;J-YVh zpN&%pb8D@yQ0ETnEIlfBUxQZZ?z6i4D(Jd}u9wmE*S=8c=8o@t*=-lbE57rVGp?fc bRgZ<*OD8wa{A!j_e+Bhhs2>Jyb8g{p>c(r0 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/__init__.py b/project/Lib/site-packages/pip/_internal/__init__.py new file mode 100644 index 0000000..96c6b88 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/__init__.py @@ -0,0 +1,18 @@ +from typing import List, Optional + +from pip._internal.utils import _log + +# init_logging() must be called before any call to logging.getLogger() +# which happens at import of most modules. +_log.init_logging() + + +def main(args: (Optional[List[str]]) = None) -> int: + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/project/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4cbca41e236abf07523403000f331678b8961af GIT binary patch literal 879 zcmZ`%ziSjh6rS1LyKH`edTCW4 zEEFu#nL;chlEy#fgcPz>z{>6*T`J$K=2VEo+qdrx-+b?TZ|2kd{0zah^>n%GI)r?; z$@!}N4o-J4cux|N(3E7fMKh=6P@6lcn|Upd5{H1dbB-s6h(9`KA&8txJaB+QeQ~n; zCrWBC)%BA4>srfC+{dKp|FEd0Q+k_1o6>(IjVN-SHfia#)1tRkdR+B%Syx~NDv#-e zln@tV`<*VKL(LR5qUKlBYTTu}_FEm4w3N)zakg#r{Sdk_yE^=L@ zz;vvHG@6+{H!R~rrj1Bb)&ZuV3kvdBb&OPFA$3hpBXPZIGc$~li9|b zmHmyk>+jY_-r_0Zu%)f$bXhk;iL+Do(v*j;Y+TTrvTv)Ls|w=_=;4Xd)kc*rc3ai| zOw_!km_>Ky-_43-kixoJz|`Kh-bFWdDW%`Y_0dIkLY7AV+Sn)b%AR*jE`KGBW6~Ir g#<=d&t7C$0-#=J5h(9bIU%FA{U)<{VUstL73BrKo`v3p{ literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94f54f4dd192d8f04dd4d79e730b3304e205c647 GIT binary patch literal 16068 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61dab10740efed6030aa2610e240e73aacb711cd GIT binary patch literal 19774 zcmbt+eQX;?mS^)*6iJDaD2bA+kJgtZ+7|s0J5C(0W7(1&$BL9#j=v zc2jo5p<_*uy;ZWhi<0r2g_-1rI3%+g#98QonS-%d;AXP7K!61nq|gTu4ftT(BEZi5 zr63s~$Uk?#S4}p%DJmbhR`Ydrb#--hRlWCq@6~JlZB31v!#4iop_%{oILG}fofNmK zLgGus!g2RFft%t4i(rjerY!7eowBl{ZOX=u_9;7#wwPnyIpv(MnyQ+2O}XZ)r>f`O zQ|@`slxN;M<+V^9_E^n)?Nsf&Z_3Bc9kIIk`l))BcE%d!{ZoFHu8K9zH%&FMv@6y; zAD9Zvw@kHIIMH&Wwb;z5Rx2mEg=(?w*H(`E7(Z>B+9&!YtKg1X1kY5v;GOC~xfY>D zs1A4_=^jJ6x0s%BO!bxBW2{TRf5tY|k9IVP z`+tpI{TM%On;H=OVw=z?w$0durZ??VgN1Xvm;S08t~KLY5ap`GeWLlA)lkkV1W@jP zmAl9ZEpKu{YgykM6s(h6ur1<21I{PnGtt>aDUysP;{1Fh9+?&A#dwmJ#pL3G+dY|> z7x|3CrP%V&45n z8jSH^m1-M~FRAvC=yXzbUBbIZuE#{xJ{FaeYSp-S>*~^isJbQ=sAZ9u>bSbN5EFw| zwZYVvqmq=6)NWJW1$55 ~YsPbANYV~L0$3PFon6moANuOuRISWc93= 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adc580466c4006bd984215c9a13f06504f7d7451 GIT binary patch literal 748 zcmZ`%y^9k;6rb7M#F)E7#OiDu#U|kGHln#hg2*8XM=UOI5EhTg&Py`7AH&Q`_9#yUU5x zeuKqL1aF8Sf~F*+eVTcFj}lQAK6pUEUq6W;e~<_u7zU#DqSmhoZ5)B zyWUtDhN?6e(2qc{VWC-(3YHYPDN!dZ;fua7*D%}RM} z$vD2V7jJXRZ*c>0$_LkCrHcoU*my?{Vk0eVD4smzBQUWmYnd#{xXeQ}EdvMi3i1Yc zj2rlKGG8UN%~{a?TfeQGJ8Zw+e%X1|nFZ?$^uu<#t$JCvQ-yQWZeiMyl)kaL^s$4A z_Y={p?vwlBjvF_!LQGQV=(Bir8#H@p=02tLE4euPm(J@AdVWsO96mV;j&|Rk{&MD0 Nb^n-DkN=t~@lPB8#5w=~ literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..318a1fbf5f551854d8dc5a22d6c2d863c76c2cf2 GIT binary patch literal 5606 zcmb7IU2NOd6~2_HUrLlM%C>Chhl!ooiW51Blcot0XZ7qP&Jx>eiWU{z3baVsOej(% zsU&u#RV(^n6a`ik0b-yl;1ye%Asvv%ybRd-(C(2cgjFD5z`#&!dt;Ce2=cUZN&Onh zhR|1s_vf5*@A>Yz=N|g2a5#wInS1w0)*3|UAGpzYsCwne-=T6B@rWlRlp^f6E9HW> zOLFJP6iMJQx8%urQ{J2}<;(d~e!Gv90=Zx+XxBXwl?$apxo|3Mx4jabi=-mCu2fg9 zJJk(+KEccTg=m)K10Rtoh7SrcXvd&ULA%F=1d2kanFU&1Nb>ls+Xq)knC@C zAU*=JUGVF+b@+we)>t;kM?qg7Ph3L@=HFOmEC^blvo-f?iPN4AHa|Ark6t_&s?S$X%qj zjTMpJgbATe*p#^LX=&k!k5Ca!qkGWxpxJ#7bUkS51HfE!9aCck6YzWTGa$b}1WaE< z@AQ|5jzthJUc{T|E6WIqhX9$wFeJIcC0`h zfZi_5lmt>nTU5`dnJ-RMD7H$m1~vbOYtB4>n}By^biNAoz(bM+c6D zOVLa+&*>{Bd0i1@upi=1hy6^ByCI~Tf@#dGvcMF>j2H}zLHLtXzd8HyStEYTnD}{x znyymQ208868@12XwN(vVW?IlWQPL8m=~tb@s+qnejE2mcp3I7nxnYLtZF?#+SkPd4 zA%F7NDYLcyG+w{y*Wmc&VR5#$G>#b=3|r&zLB&3b7ohhgAtX8vTZw$B4RGy{_7q7i zR`h659j~eW6y2Z0Mt!k^_d}vcLRbkjxL`X8-u1P+GhCcRC9mGN6M*%)x4~cZZnn+Q z=!I|t)fa`5l8-0xU*{YIlBpqd3~A&o*KPOP=oZ9=w;`$!sOa1Dw=}nEyl02qe%Zy7 zB|lgc2kU!_=-1svq($0M;JuwP9}>K;gyhwtU!CCnMgL8tj)UAGkQ?og3v9Mw)LKK) z&-+{VOQ-J6R(+=FA}UW6$^3a8yLA1z-o$n@)aYw}^TAGCA(Y?yQu5SJ`4Sx4vg=E`7r`al?Q)O{96d*$K?83|f3&DxdL}8&Wl(j>lo$S+9TTY%xkJ? z1mFLuz-EF=-A1M<3f9`u8bsd!5OLsc%w4}0a1O`b5=K;jxCsP1npM=Mk|qW$E8v6< zFw85e4k=s0*@4&XOk*bc^K_F)?izND~X4g=}PI(M^U*=T*akj3dM ziOxkkSm6BnCP1pR`w^=uir#X+ggyP*TP&{#8Y?S0%jNR|r(&rk4EMsSz5>oz&j`=3 zvLNEkU`HCxGy+o4Z2GZ%_D0yOQjq!Nnx~*=kGu-s2Yx|@4FzE4)IPLS(}{} zHEv0Qk>{K?R@4As`+MR{V-2mPu5e%;hY>I2!L8qT7Irk(ky%@MY1NGbs)1T(r|P=! ziFm&RYuVvZX3(BpR}@JzJ-1c_L0XHpx+c$^IGTJld34QLq|KJJ6{jH_ac9zL$Jx{A zgiFOyTE)q;T?5Q~^#pxw*Q}0_u(yZB2{K*|WZ(drmITRh5W?R-oTkWY!@!(TWXSCx z7;$m~zxKm%hJ{UVoXK$?M#a~Wy2sWdYB+ML`198!mAoLUIEOJk62w`^P+=P0bT13K z>4gZ8<8(9N_^2c%Y7sQA`OMAU=0K7z?8 zCJ7*B7$RpY%QXYIX=7>Lr5!i2Av3AA(`tI`K%@>~wfHhohkV+~#B@cDx!pUcS236}{uTOMgah z+^%$uR=Y;av)feMLZm0S*>AtL=)JW_pM{91Q^87U=TxtL1EhRquzn_;CiqY0K4KKIevf97&r}Or?9Jg_@Bdv zzPxb%?4w9^>{4ZTwmLlf*hgY@KmbEf7p$wZ;wTt10)yKj0M`{hxy9_dGx-BE_B}Ip z|4M~9U1d%ik<*qNhJI`tx>#XORGAY-rz0mhn)^?w_JnlH&rg#vbh@w#3poW}cg^)kGvCHrsfU-r8J-lSl=PLBMDt*rI zpR>HEYuCo*YGkB*X^R@zc(p5Z z%jFI9Z-x3cs7h$K8X7k2@^mY*50nM4o7Krybi5X4YkgNA-7xyDLIL#*4eA?v<3+K4 z%jXXFg9|*h+#rYFAru+>f!^~yy=UWt3O!z>$IBOM%-$cEq3@ZY&AEqD73NfxIaR(= z>+3Ji)O>XL1K0@Wiq&d5C~2&Incf?-mt*cbOFYHzS$82_LbF>O`*nZ9PdRrh;6uEm&wy zOv2I0jN9Ce|Ar)m+Znj1%zFia_D;5=0I47>!axfwKKqL;H=+QbPxg7ng0c+vqGcG-o`oSR_ff zz+Ya1&;+qSY%p*@;Jq1h-p`?af|wy5;(!J3NAYxxA*iTb6GHwi9cFJS7tJn1t z0%D-36@1f0Tp(&)@r~FW+HyOsqZ5tV`Kd;2?w9r2wkK@RY}K>R^4Q!K`oAxGcm504 Cjgy1` literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a23945b29f2ad0cb9387afa4bfe810337e7fc57 GIT binary patch literal 11763 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af74c36ee1436fecc916ab8a499e8549b5f36b4f GIT binary patch literal 15164 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/build_env.py b/project/Lib/site-packages/pip/_internal/build_env.py new file mode 100644 index 0000000..4f704a3 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/build_env.py @@ -0,0 +1,311 @@ +"""Build Environment used for isolation during sdist building +""" + +import logging +import os +import pathlib +import site +import sys +import textwrap +from collections import OrderedDict +from types import TracebackType +from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union + +from pip._vendor.certifi import where +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.version import Version + +from pip import __file__ as pip_location +from pip._internal.cli.spinners import open_spinner +from pip._internal.locations import get_platlib, get_purelib, get_scheme +from pip._internal.metadata import get_default_environment, get_environment +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds + +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + +logger = logging.getLogger(__name__) + + +def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]: + return (a, b) if a != b else (a,) + + +class _Prefix: + def __init__(self, path: str) -> None: + self.path = path + self.setup = False + scheme = get_scheme("", prefix=path) + self.bin_dir = scheme.scripts + self.lib_dirs = _dedup(scheme.purelib, scheme.platlib) + + +def get_runnable_pip() -> str: + """Get a file to pass to a Python executable, to run the currently-running pip. + + This is used to run a pip subprocess, for installing requirements into the build + environment. + """ + source = pathlib.Path(pip_location).resolve().parent + + if not source.is_dir(): + # This would happen if someone is using pip from inside a zip file. In that + # case, we can use that directly. + return str(source) + + return os.fsdecode(source / "__pip-runner__.py") + + +def _get_system_sitepackages() -> Set[str]: + """Get system site packages + + Usually from site.getsitepackages, + but fallback on `get_purelib()/get_platlib()` if unavailable + (e.g. in a virtualenv created by virtualenv<20) + + Returns normalized set of strings. + """ + if hasattr(site, "getsitepackages"): + system_sites = site.getsitepackages() + else: + # virtualenv < 20 overwrites site.py without getsitepackages + # fallback on get_purelib/get_platlib. + # this is known to miss things, but shouldn't in the cases + # where getsitepackages() has been removed (inside a virtualenv) + system_sites = [get_purelib(), get_platlib()] + return {os.path.normcase(path) for path in system_sites} + + +class BuildEnvironment: + """Creates and manages an isolated environment to install build deps""" + + def __init__(self) -> None: + temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True) + + self._prefixes = OrderedDict( + (name, _Prefix(os.path.join(temp_dir.path, name))) + for name in ("normal", "overlay") + ) + + self._bin_dirs: List[str] = [] + self._lib_dirs: List[str] = [] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = _get_system_sitepackages() + + self._site_dir = os.path.join(temp_dir.path, "site") + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open( + os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8" + ) as fp: + fp.write( + textwrap.dedent( + """ + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + """ + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs) + ) + + def __enter__(self) -> None: + self._save_env = { + name: os.environ.get(name, None) + for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH") + } + + path = self._bin_dirs[:] + old_path = self._save_env["PATH"] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update( + { + "PATH": os.pathsep.join(path), + "PYTHONNOUSERSITE": "1", + "PYTHONPATH": os.pathsep.join(pythonpath), + } + ) + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def check_requirements( + self, reqs: Iterable[str] + ) -> Tuple[Set[Tuple[str, str]], Set[str]]: + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + env = ( + get_environment(self._lib_dirs) + if hasattr(self, "_lib_dirs") + else get_default_environment() + ) + for req_str in reqs: + req = Requirement(req_str) + # We're explicitly evaluating with an empty extra value, since build + # environments are not provided any mechanism to select specific extras. + if req.marker is not None and not req.marker.evaluate({"extra": ""}): + continue + dist = env.get_distribution(req.name) + if not dist: + missing.add(req_str) + continue + if isinstance(dist.version, Version): + installed_req_str = f"{req.name}=={dist.version}" + else: + installed_req_str = f"{req.name}==={dist.version}" + if not req.specifier.contains(dist.version, prereleases=True): + conflicting.add((installed_req_str, req_str)) + # FIXME: Consider direct URL? + return conflicting, missing + + def install_requirements( + self, + finder: "PackageFinder", + requirements: Iterable[str], + prefix_as_string: str, + *, + kind: str, + ) -> None: + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + self._install_requirements( + get_runnable_pip(), + finder, + requirements, + prefix, + kind=kind, + ) + + @staticmethod + def _install_requirements( + pip_runnable: str, + finder: "PackageFinder", + requirements: Iterable[str], + prefix: _Prefix, + *, + kind: str, + ) -> None: + args: List[str] = [ + sys.executable, + pip_runnable, + "install", + "--ignore-installed", + "--no-user", + "--prefix", + prefix.path, + "--no-warn-script-location", + ] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append("-v") + for format_control in ("no_binary", "only_binary"): + formats = getattr(finder.format_control, format_control) + args.extend( + ( + "--" + format_control.replace("_", "-"), + ",".join(sorted(formats or {":none:"})), + ) + ) + + index_urls = finder.index_urls + if index_urls: + args.extend(["-i", index_urls[0]]) + for extra_index in index_urls[1:]: + args.extend(["--extra-index-url", extra_index]) + else: + args.append("--no-index") + for link in finder.find_links: + args.extend(["--find-links", link]) + + for host in finder.trusted_hosts: + args.extend(["--trusted-host", host]) + if finder.allow_all_prereleases: + args.append("--pre") + if finder.prefer_binary: + args.append("--prefer-binary") + args.append("--") + args.extend(requirements) + extra_environ = {"_PIP_STANDALONE_CERT": where()} + with open_spinner(f"Installing {kind}") as spinner: + call_subprocess( + args, + command_desc=f"pip subprocess to install {kind}", + spinner=spinner, + extra_environ=extra_environ, + ) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment""" + + def __init__(self) -> None: + pass + + def __enter__(self) -> None: + pass + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + pass + + def cleanup(self) -> None: + pass + + def install_requirements( + self, + finder: "PackageFinder", + requirements: Iterable[str], + prefix_as_string: str, + *, + kind: str, + ) -> None: + raise NotImplementedError() diff --git a/project/Lib/site-packages/pip/_internal/cache.py b/project/Lib/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..f45ac23 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cache.py @@ -0,0 +1,290 @@ +"""Cache Management +""" + +import hashlib +import json +import logging +import os +from pathlib import Path +from typing import Any, Dict, List, Optional + +from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InvalidWheelFilename +from pip._internal.models.direct_url import DirectUrl +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.urls import path_to_url + +logger = logging.getLogger(__name__) + +ORIGIN_JSON_NAME = "origin.json" + + +def _hash_dict(d: Dict[str, str]) -> str: + """Return a stable sha224 of a dictionary.""" + s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) + return hashlib.sha224(s.encode("ascii")).hexdigest() + + +class Cache: + """An abstract class - provides cache directories for data from links + + :param cache_dir: The root of the cache. + """ + + def __init__(self, cache_dir: str) -> None: + super().__init__() + assert not cache_dir or os.path.isabs(cache_dir) + self.cache_dir = cache_dir or None + + def _get_cache_path_parts(self, link: Link) -> List[str]: + """Get parts of part that must be os.path.joined with cache_dir""" + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = {"url": link.url_without_fragment} + if link.hash_name is not None and link.hash is not None: + key_parts[link.hash_name] = link.hash + if link.subdirectory_fragment: + key_parts["subdirectory"] = link.subdirectory_fragment + + # Include interpreter name, major and minor version in cache key + # to cope with ill-behaved sdists that build a different wheel + # depending on the python version their setup.py is being run on, + # and don't encode the difference in compatibility tags. + # https://github.com/pypa/pip/issues/7296 + key_parts["interpreter_name"] = interpreter_name() + key_parts["interpreter_version"] = interpreter_version() + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = _hash_dict(key_parts) + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]: + can_not_cache = not self.cache_dir or not canonical_package_name or not link + if can_not_cache: + return [] + + path = self.get_path_for_link(link) + if os.path.isdir(path): + return [(candidate, path) for candidate in os.listdir(path)] + return [] + + def get_path_for_link(self, link: Link) -> str: + """Return a directory to store cached items in for link.""" + raise NotImplementedError() + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs.""" + + def __init__(self, cache_dir: str) -> None: + super().__init__(cache_dir) + + def get_path_for_link(self, link: Link) -> str: + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + assert self.cache_dir + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + candidates = [] + + if not package_name: + return link + + canonical_package_name = canonicalize_name(package_name) + for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if canonicalize_name(wheel.name) != canonical_package_name: + logger.debug( + "Ignoring cached wheel %s for %s as it " + "does not match the expected distribution name %s.", + wheel_name, + link, + package_name, + ) + continue + if not wheel.supported(supported_tags): + # Built for a different python/arch/etc + continue + candidates.append( + ( + wheel.support_index_min(supported_tags), + wheel_name, + wheel_dir, + ) + ) + + if not candidates: + return link + + _, wheel_name, wheel_dir = min(candidates) + return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory""" + + def __init__(self) -> None: + self._temp_dir = TempDirectory( + kind=tempdir_kinds.EPHEM_WHEEL_CACHE, + globally_managed=True, + ) + + super().__init__(self._temp_dir.path) + + +class CacheEntry: + def __init__( + self, + link: Link, + persistent: bool, + ): + self.link = link + self.persistent = persistent + self.origin: Optional[DirectUrl] = None + origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME + if origin_direct_url_path.exists(): + try: + self.origin = DirectUrl.from_json( + origin_direct_url_path.read_text(encoding="utf-8") + ) + except Exception as e: + logger.warning( + "Ignoring invalid cache entry origin file %s for %s (%s)", + origin_direct_url_path, + link.filename, + e, + ) + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir: str) -> None: + super().__init__(cache_dir) + self._wheel_cache = SimpleWheelCache(cache_dir) + self._ephem_cache = EphemWheelCache() + + def get_path_for_link(self, link: Link) -> str: + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link: Link) -> str: + return self._ephem_cache.get_path_for_link(link) + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + cache_entry = self.get_cache_entry(link, package_name, supported_tags) + if cache_entry is None: + return link + return cache_entry.link + + def get_cache_entry( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Optional[CacheEntry]: + """Returns a CacheEntry with a link to a cached item if it exists or + None. The cache entry indicates if the item was found in the persistent + or ephemeral cache. + """ + retval = self._wheel_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=True) + + retval = self._ephem_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=False) + + return None + + @staticmethod + def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None: + origin_path = Path(cache_dir) / ORIGIN_JSON_NAME + if origin_path.exists(): + try: + origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8")) + except Exception as e: + logger.warning( + "Could not read origin file %s in cache entry (%s). " + "Will attempt to overwrite it.", + origin_path, + e, + ) + else: + # TODO: use DirectUrl.equivalent when + # https://github.com/pypa/pip/pull/10564 is merged. + if origin.url != download_info.url: + logger.warning( + "Origin URL %s in cache entry %s does not match download URL " + "%s. This is likely a pip bug or a cache corruption issue. " + "Will overwrite it with the new value.", + origin.url, + cache_dir, + download_info.url, + ) + origin_path.write_text(download_info.to_json(), encoding="utf-8") diff --git a/project/Lib/site-packages/pip/_internal/cli/__init__.py b/project/Lib/site-packages/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb073cc82f8e1c6f7ee62ad34ada42437299eb4a GIT binary patch literal 283 zcmY*U!Ab)$5KU@PDf9!pmHOR_Kk!|%=~v#FVM}KCf=vdmSBrHWKtIC@ zh4wB3IdUrj)(YQn@gnY*g#N8`RH)nIoOc7xhaLMzaai0RWCT$Y literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f684dda1ede30aad8c7196d68349827d79f09080 GIT binary patch literal 10238 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 F{|ir4LxTVS literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d38e98ed367cafa32bc436c0e8772aa2ed161f01 GIT binary patch literal 11857 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0366f217869a47738af81b14e4918876e2e9427 GIT binary patch literal 33763 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

L!htw=sG{Mf+@gD0`O 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 bs`bvFhj$>k(02{4EQ3D_Ldj1`UK9IY>jzFf literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4ac8e463664981674a8e4398f16e7f535280e99 GIT binary patch literal 2105 zcma)6&2Jl35TCbSUMF^)kc5VaqI|W=Ml=aRMSu`W()5EbA6l!WTPv%LcT={k*XHe} z`A`lKibN0`IDisV4mlN2i-ZIRj_@Bim8DuMRf@y~ZjRDJ)D!dG+KwG15^vwm&di&6 zJ8yn7@5f}a4REAq&(A9&z~4-$52?oN&myx47FfiEJkd#B&;`O|!4>n8F6Cui&MUe? zKmc2@L`!-kKM(*O;u{S;CcqW2ly$ITM^;ozy$)LZUuLKYVf@mP6I>6>+^6BGT)_+M zr66y5<{g`AVtDFer1>b)gz+o3XHzpM&@h%+F4{Lt8VW`xqmeM4E8H`wV|qcZ76bn@ z&SatZ1)jG2I%B6=G;S=e>4kjFDv_28YQ_q@O5;8mfljcurs#VFxls-b7Nv zhO%(OWQz__lziKr595ZBb4}kj44=i&zxMp&nYXhU+su8Ey?Qe{V+Q85>DyV?oO>f% zq=mb7F35i9%w>Hiu+JB<1`u~YTXc%!_}{>$p6QO~TxUENCA1#ISaF%A@CPd|ACu{^ zdhjY*_^%^5Sc9i(^2^xQu_tQpW3_ij?JKK&CAF{8e|AGEt7o2`IrshTA8s?Asd4V3 z8)#xW-HMlj+97=Rw~%}Q1nX%P?jj!zD!dP$6OKV$1#xE4!0rP2Sa1V23GXN5Tf2jR z*FFTVfiEozOX4k9M7vw)gVq9K*4UL{HgrU{2$2Vdow=+Dv;(baClZa&7x3e=DEetP z(lF7C=}P}`X>7JgGWTDQ{DaRL>~@_lca4-(K2syR{lh$sRY8i6RyupiokLY1$rm}P zbo6{9v!^Q7Rb0QvES@#Y4jqng2L}g7G?A#l+0l)ea$=yw=fU=+nxvHywdtS3h`)_Z z0o<2g6}J<}Jd!42zlzBGMkZpvGv+UdPsPQsqgLMrmgPOivT3f-MYstodfum3k!i); z=a@HRyxr`H_R&}+4+!2S_(lVJj-)m55T!6_vy!jZI0DE(qrFI?Zi=9zeW+L&I1aHE zf9|KD?HW{4UFFnpN#!#&yvxLaC#mtrsqxapnvaKycSUq5^Ir^%n!qVNBwJV`v-G~V=WwW@KQIesznRD?>fTy(rUQ6hL=*vX=l zuyg(l(JrhLpR4agseP9YqR7g_{|X6q3n3MlC>=K|aG`Ya+?5k+H#ag{nUXxXBM+A4 X!8M_(bdzaPh2!ZS*FQU9l?VGDX!YNq literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..123235362df81539c7d6f76aa00e79cc8b2ff122 GIT binary patch literal 2575 zcmah~O>7fK6rTO{*pBVQgd_ygIFO*2CUgHp2hp%1|yVVZWOEB?}o;?jBY9ZA}dasG9|F)FqQ~66M8d!>4pjuX; zixDNC*R`}_X*nZ842v%2bDCkrd@q=sc$9a<8O^jDd_K=u6g|p09m<@QOXsqAomd3s zfxJRZk^)LrF;pM~)08OIb_%|r<qp<2%NuHAWFC9^#8Pky|vF50eZk`DK%`7j# z_wr|+S-yaZ-4;w6Wwyx+c12(Ftc8rgKjMrH2Xg?tiBfWY@mVPlGwB}*fQAQQn{UcS0FZ)g*G8( zj~0Y0Xr2R`3^w+GjLrtO-f1A9Hm#=0Yha~y`09m2#tE?2cHXAtz-}YUqIIyr3)bpx z;TBRo1#zcTS6}g#=;{k&OJ8fOwX?vfxWL~;kG<{tm!*RAu&2e>LWLc70@3D+zhFjm zWG!RlC|L@{4&`rTQk0mvIhrPBRB&V^&BDvU5Edkpql=E5&8c%bS@N8@c=7zjQxOL( zjhtosH6s%tER-T6W@P?4F(M|hEJoFHX$5xp#>X`?r-L9Ci@1q<9l=~Q-H5yC;CY1_ zu*r0S*EHQCv^ft?x5D#sor!vx`aPOqT8gfxwpdeoE|URGSg=tREtG|qBb$~AR7aYp znnfHwXF48TGl)s@jz|_X%aQAfI$ltG3(7N7smYlcM{<({<6xp4NhMe3GStK5idjW7 zqB3P(4R*?^DMQJUI&zbUKo-&tM;y;qA~Kmy5x2bgZ2DC4bE2fLCqKQMoK`I5W5py% zUAg*RGEZ}}ByA;Uw5v%IG#<|@=^ILhn901BKb(SONGRmJ!)aYR%v6Zw7wHH{cDon= zlck~}s(Spz!bT{(x=`Xue2HHztcb5VkQAthd#j<|-}fK4KZw@^UXuSp(EZK28tY#9 zkknZb50=Hzia2VEqtC_8uj04k#duAWr0$J@LywM^2aZ$*j+Al#3cfdbZ}jzse^(6& zQg^G{!2VU=AGq%~+*cZWc&s#78Z6^z1xIZh-M021e80bphbws4#>0$`?{$6SU-hqS ztFNKdJRqHoK~b9IHgK?l`yTY%A9%!<@mK|q*=_?px>hIHDJHq?{c{|=+i|DE-aYY? zQpO)u@JIGr&HanSb^>}OqtHO(q|t%YX{GjgXb#2bHz_K{o%V4cP2`>>>sN5 zhiq}kJPI~{vO7FEik^)6ruGU?-kltr>JgsyNHBRiI5>40Jv|+oJ|;X1?wyVa&tekb zC>M|JaXhJ%noFlrlqDo^OYky?0lJS}C(9g^g|s7Ei+M(7F9Q`BB?7JxYq~-VTp_mY z4TQjTgTNVhn~ix)%6%WH8zWB74xaj>Y1VzbuYD05nz+xdSr4sU?aOnPrknNH^k#@P zQ;!*(asvYnd4Q=dm=<*e@M70re?TvRh$u^OZ}3Dt$9zan!IY&a^9^)0f#bLu&v9Z6 zLAQwlMYmQ_u;|t*@)q4%MZTh2t0+`-YZVRI|JF9qNxQvO(Fwb~Rnbwqy;ae;-QKEb z%x-U+-u{)|inqV?e%U)*@eUW|+QbmIzlNY&StyC6OZUB%P<{R=?UMhqqbK3`{{V7C Bdhh@M literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d3866baaab235c351a5e87170ccaacea13980cf GIT binary patch literal 5519 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 DjXVx# literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bebf4bbccd0d0e8ed15bb6d89a77a017317a3e4 GIT binary patch literal 16944 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88f54b5c087645c38e40dde9d8afb2edc966a275 GIT binary patch literal 20322 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 Riygb4@<(610DpCdd` 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 None: + """Entry Point for completion of main and subcommand options.""" + # Don't complete if user hasn't sourced bash_completion file. + if "PIP_AUTO_COMPLETE" not in os.environ: + return + cwords = os.environ["COMP_WORDS"].split()[1:] + cword = int(os.environ["COMP_CWORD"]) + try: + current = cwords[cword - 1] + except IndexError: + current = "" + + parser = create_main_parser() + subcommands = list(commands_dict) + options = [] + + # subcommand + subcommand_name: Optional[str] = None + for word in cwords: + if word in subcommands: + subcommand_name = word + break + # subcommand options + if subcommand_name is not None: + # special case: 'help' subcommand has no options + if subcommand_name == "help": + sys.exit(1) + # special case: list locally installed dists for show and uninstall + should_list_installed = not current.startswith("-") and subcommand_name in [ + "show", + "uninstall", + ] + if should_list_installed: + env = get_default_environment() + lc = current.lower() + installed = [ + dist.canonical_name + for dist in env.iter_installed_distributions(local_only=True) + if dist.canonical_name.startswith(lc) + and dist.canonical_name not in cwords[1:] + ] + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + should_list_installables = ( + not current.startswith("-") and subcommand_name == "install" + ) + if should_list_installables: + for path in auto_complete_paths(current, "path"): + print(path) + sys.exit(1) + + subcommand = create_command(subcommand_name) + + for opt in subcommand.parser.option_list_all: + if opt.help != optparse.SUPPRESS_HELP: + options += [ + (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts + ] + + # filter out previously specified options from available options + prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + # get completion type given cwords and available subcommand options + completion_type = get_path_completion_type( + cwords, + cword, + subcommand.parser.option_list_all, + ) + # get completion files and directories if ``completion_type`` is + # ````, ``

`` or ```` + if completion_type: + paths = auto_complete_paths(current, completion_type) + options = [(path, 0) for path in paths] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += "=" + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + flattened_opts = chain.from_iterable(opts) + if current.startswith("-"): + for opt in flattened_opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, flattened_opts) + if completion_type: + subcommands = list(auto_complete_paths(current, completion_type)) + + print(" ".join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type( + cwords: List[str], cword: int, opts: Iterable[Any] +) -> Optional[str]: + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith("-"): + return None + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split("/"): + if cwords[cword - 2].split("=")[0] == o: + if not opt.metavar or any( + x in ("path", "file", "dir") for x in opt.metavar.split("/") + ): + return opt.metavar + return None + + +def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]: + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(``file``, ``path`` or ``dir``) + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = ( + x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename) + ) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != "dir" and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, "") diff --git a/project/Lib/site-packages/pip/_internal/cli/base_command.py b/project/Lib/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..db9d5cc --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,236 @@ +"""Base Command class, and related routines""" + +import functools +import logging +import logging.config +import optparse +import os +import sys +import traceback +from optparse import Values +from typing import Any, Callable, List, Optional, Tuple + +from pip._vendor.rich import traceback as rich_traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip._internal.cli.status_codes import ( + ERROR, + PREVIOUS_BUILD_DIR_ERROR, + UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.exceptions import ( + BadCommand, + CommandError, + DiagnosticPipError, + InstallationError, + NetworkConnectionError, + PreviousBuildDirError, + UninstallationError, +) +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry +from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry +from pip._internal.utils.virtualenv import running_under_virtualenv + +__all__ = ["Command"] + +logger = logging.getLogger(__name__) + + +class Command(CommandContextMixIn): + usage: str = "" + ignore_require_venv: bool = False + + def __init__(self, name: str, summary: str, isolated: bool = False) -> None: + super().__init__() + + self.name = name + self.summary = summary + self.parser = ConfigOptionParser( + usage=self.usage, + prog=f"{get_prog()} {name}", + formatter=UpdatingDefaultsHelpFormatter(), + add_help_option=False, + name=name, + description=self.__doc__, + isolated=isolated, + ) + + self.tempdir_registry: Optional[TempDirRegistry] = None + + # Commands should add options to this option group + optgroup_name = f"{self.name.capitalize()} Options" + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + self.add_options() + + def add_options(self) -> None: + pass + + def handle_pip_version_check(self, options: Values) -> None: + """ + This is a no-op so that commands by default do not do the pip version + check. + """ + # Make sure we do the pip version check if the index_group options + # are present. + assert not hasattr(options, "no_index") + + def run(self, options: Values, args: List[str]) -> int: + raise NotImplementedError + + def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]: + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args: List[str]) -> int: + try: + with self.main_context(): + return self._main(args) + finally: + logging.shutdown() + + def _main(self, args: List[str]) -> int: + # We must initialize this before the tempdir manager, otherwise the + # configuration would not be accessible by the time we clean up the + # tempdir manager. + self.tempdir_registry = self.enter_context(tempdir_registry()) + # Intentionally set as early as possible so globally-managed temporary + # directories are available to the rest of the code. + self.enter_context(global_tempdir_manager()) + + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + always_enabled_features = set(options.features_enabled) & set( + cmdoptions.ALWAYS_ENABLED_FEATURES + ) + if always_enabled_features: + logger.warning( + "The following features are always enabled: %s. ", + ", ".join(sorted(always_enabled_features)), + ) + + # Make sure that the --python argument isn't specified after the + # subcommand. We can tell, because if --python was specified, + # we should only reach this point if we're running in the created + # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment + # variable set. + if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: + logger.critical( + "The --python option must be placed before the pip subcommand name" + ) + sys.exit(ERROR) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ["PIP_NO_INPUT"] = "1" + + if options.exists_action: + os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical("Could not find an activated virtualenv (required).") + sys.exit(VIRTUALENV_NOT_FOUND) + + if options.cache_dir: + options.cache_dir = normalize_path(options.cache_dir) + if not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "or is not writable by the current user. The cache " + "has been disabled. Check the permissions and owner of " + "that directory. If executing pip with sudo, you should " + "use sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + def intercepts_unhandled_exc( + run_func: Callable[..., int] + ) -> Callable[..., int]: + @functools.wraps(run_func) + def exc_logging_wrapper(*args: Any) -> int: + try: + status = run_func(*args) + assert isinstance(status, int) + return status + except DiagnosticPipError as exc: + logger.error("%s", exc, extra={"rich": True}) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except ( + InstallationError, + UninstallationError, + BadCommand, + NetworkConnectionError, + ) as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical("%s", exc) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to + # stderr because stdout no longer works. + print("ERROR: Pipe to stdout was broken", file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical("Operation cancelled by user") + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BaseException: + logger.critical("Exception:", exc_info=True) + + return UNKNOWN_ERROR + + return exc_logging_wrapper + + try: + if not options.debug_mode: + run = intercepts_unhandled_exc(self.run) + else: + run = self.run + rich_traceback.install(show_locals=True) + return run(options, args) + finally: + self.handle_pip_version_check(options) diff --git a/project/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/project/Lib/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..d05e502 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,1074 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import importlib.util +import logging +import os +import textwrap +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values +from textwrap import dedent +from typing import Any, Callable, Dict, Optional, Tuple + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.parser import ConfigOptionParser +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, get_src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.target_python import TargetPython +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.misc import strtobool + +logger = logging.getLogger(__name__) + + +def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None: + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = f"{option} error: {msg}" + msg = textwrap.fill(" ".join(msg.split())) + parser.error(msg) + + +def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup: + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group["name"]) + for option in group["options"]: + option_group.add_option(option()) + return option_group + + +def check_dist_restriction(options: Values, check_target: bool = False) -> None: + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any( + [ + options.python_version, + options.platforms, + options.abis, + options.implementation, + ] + ) + + binary_only = FormatControl(set(), {":all:"}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # guaranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if not options.dry_run and dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target' or using '--dry-run'" + ) + + +def _path_option_check(option: Option, opt: str, value: str) -> str: + return os.path.expanduser(value) + + +def _package_name_option_check(option: Option, opt: str, value: str) -> str: + return canonicalize_name(value) + + +class PipOption(Option): + TYPES = Option.TYPES + ("path", "package_name") + TYPE_CHECKER = Option.TYPE_CHECKER.copy() + TYPE_CHECKER["package_name"] = _package_name_option_check + TYPE_CHECKER["path"] = _path_option_check + + +########### +# options # +########### + +help_: Callable[..., Option] = partial( + Option, + "-h", + "--help", + dest="help", + action="help", + help="Show help.", +) + +debug_mode: Callable[..., Option] = partial( + Option, + "--debug", + dest="debug_mode", + action="store_true", + default=False, + help=( + "Let unhandled exceptions propagate outside the main subroutine, " + "instead of logging them to stderr." + ), +) + +isolated_mode: Callable[..., Option] = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) + +require_virtualenv: Callable[..., Option] = partial( + Option, + "--require-virtualenv", + "--require-venv", + dest="require_venv", + action="store_true", + default=False, + help=( + "Allow pip to only run in a virtual environment; " + "exit with an error otherwise." + ), +) + +override_externally_managed: Callable[..., Option] = partial( + Option, + "--break-system-packages", + dest="override_externally_managed", + action="store_true", + help="Allow pip to modify an EXTERNALLY-MANAGED Python installation", +) + +python: Callable[..., Option] = partial( + Option, + "--python", + dest="python", + help="Run pip with the specified Python interpreter.", +) + +verbose: Callable[..., Option] = partial( + Option, + "-v", + "--verbose", + dest="verbose", + action="count", + default=0, + help="Give more output. Option is additive, and can be used up to 3 times.", +) + +no_color: Callable[..., Option] = partial( + Option, + "--no-color", + dest="no_color", + action="store_true", + default=False, + help="Suppress colored output.", +) + +version: Callable[..., Option] = partial( + Option, + "-V", + "--version", + dest="version", + action="store_true", + help="Show version and exit.", +) + +quiet: Callable[..., Option] = partial( + Option, + "-q", + "--quiet", + dest="quiet", + action="count", + default=0, + help=( + "Give less output. Option is additive, and can be used up to 3" + " times (corresponding to WARNING, ERROR, and CRITICAL logging" + " levels)." + ), +) + +progress_bar: Callable[..., Option] = partial( + Option, + "--progress-bar", + dest="progress_bar", + type="choice", + choices=["on", "off"], + default="on", + help="Specify whether the progress bar should be used [on, off] (default: on)", +) + +log: Callable[..., Option] = partial( + PipOption, + "--log", + "--log-file", + "--local-log", + dest="log", + metavar="path", + type="path", + help="Path to a verbose appending log.", +) + +no_input: Callable[..., Option] = partial( + Option, + # Don't ask for input + "--no-input", + dest="no_input", + action="store_true", + default=False, + help="Disable prompting for input.", +) + +keyring_provider: Callable[..., Option] = partial( + Option, + "--keyring-provider", + dest="keyring_provider", + choices=["auto", "disabled", "import", "subprocess"], + default="auto", + help=( + "Enable the credential lookup via the keyring library if user input is allowed." + " Specify which mechanism to use [disabled, import, subprocess]." + " (default: disabled)" + ), +) + +proxy: Callable[..., Option] = partial( + Option, + "--proxy", + dest="proxy", + type="str", + default="", + help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.", +) + +retries: Callable[..., Option] = partial( + Option, + "--retries", + dest="retries", + type="int", + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) + +timeout: Callable[..., Option] = partial( + Option, + "--timeout", + "--default-timeout", + metavar="sec", + dest="timeout", + type="float", + default=15, + help="Set the socket timeout (default %default seconds).", +) + + +def exists_action() -> Option: + return Option( + # Option when path already exist + "--exists-action", + dest="exists_action", + type="choice", + choices=["s", "i", "w", "b", "a"], + default=[], + action="append", + metavar="action", + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + ) + + +cert: Callable[..., Option] = partial( + PipOption, + "--cert", + dest="cert", + type="path", + metavar="path", + help=( + "Path to PEM-encoded CA certificate bundle. " + "If provided, overrides the default. " + "See 'SSL Certificate Verification' in pip documentation " + "for more information." + ), +) + +client_cert: Callable[..., Option] = partial( + PipOption, + "--client-cert", + dest="client_cert", + type="path", + default=None, + metavar="path", + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) + +index_url: Callable[..., Option] = partial( + Option, + "-i", + "--index-url", + "--pypi-url", + dest="index_url", + metavar="URL", + default=PyPI.simple_url, + help="Base URL of the Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) + + +def extra_index_url() -> Option: + return Option( + "--extra-index-url", + dest="extra_index_urls", + metavar="URL", + action="append", + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index: Callable[..., Option] = partial( + Option, + "--no-index", + dest="no_index", + action="store_true", + default=False, + help="Ignore package index (only looking at --find-links URLs instead).", +) + + +def find_links() -> Option: + return Option( + "-f", + "--find-links", + dest="find_links", + action="append", + default=[], + metavar="url", + help="If a URL or path to an html file, then parse for links to " + "archives such as sdist (.tar.gz) or wheel (.whl) files. " + "If a local path or file:// URL that's a directory, " + "then look for archives in the directory listing. " + "Links to VCS project URLs are not supported.", + ) + + +def trusted_host() -> Option: + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host or host:port pair as trusted, even though it " + "does not have valid or any HTTPS.", + ) + + +def constraints() -> Option: + return Option( + "-c", + "--constraint", + dest="constraints", + action="append", + default=[], + metavar="file", + help="Constrain versions using the given constraints file. " + "This option can be used multiple times.", + ) + + +def requirements() -> Option: + return Option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help="Install from the given requirements file. " + "This option can be used multiple times.", + ) + + +def editable() -> Option: + return Option( + "-e", + "--editable", + dest="editables", + action="append", + default=[], + metavar="path/url", + help=( + "Install a project in editable mode (i.e. setuptools " + '"develop mode") from a local project path or a VCS url.' + ), + ) + + +def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None: + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +src: Callable[..., Option] = partial( + PipOption, + "--src", + "--source", + "--source-dir", + "--source-directory", + dest="src_dir", + type="path", + metavar="dir", + default=get_src_prefix(), + action="callback", + callback=_handle_src, + help="Directory to check out editable projects into. " + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".', +) + + +def _get_format_control(values: Values, option: Option) -> Any: + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, + existing.no_binary, + existing.only_binary, + ) + + +def _handle_only_binary( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, + existing.only_binary, + existing.no_binary, + ) + + +def no_binary() -> Option: + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", + dest="format_control", + action="callback", + callback=_handle_no_binary, + type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all binary packages, ":none:" to empty the set (notice ' + "the colons), or one or more package names with commas between " + "them (no colons). Note that some packages are tricky to compile " + "and may fail to install when this option is used on them.", + ) + + +def only_binary() -> Option: + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", + dest="format_control", + action="callback", + callback=_handle_only_binary, + type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all source packages, ":none:" to empty the set, or one ' + "or more package names with commas between them. Packages " + "without binary distributions will fail to install when this " + "option is used on them.", + ) + + +platforms: Callable[..., Option] = partial( + Option, + "--platform", + dest="platforms", + metavar="platform", + action="append", + default=None, + help=( + "Only use wheels compatible with . Defaults to the " + "platform of the running system. Use this option multiple times to " + "specify multiple platforms supported by the target interpreter." + ), +) + + +# This was made a separate function for unit-testing purposes. +def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]: + """ + Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. + + :return: A 2-tuple (version_info, error_msg), where `error_msg` is + non-None if and only if there was a parsing error. + """ + if not value: + # The empty string is the same as not providing a value. + return (None, None) + + parts = value.split(".") + if len(parts) > 3: + return ((), "at most three version parts are allowed") + + if len(parts) == 1: + # Then we are in the case of "3" or "37". + value = parts[0] + if len(value) > 1: + parts = [value[0], value[1:]] + + try: + version_info = tuple(int(part) for part in parts) + except ValueError: + return ((), "each version part must be an integer") + + return (version_info, None) + + +def _handle_python_version( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + """ + Handle a provided --python-version value. + """ + version_info, error_msg = _convert_python_version(value) + if error_msg is not None: + msg = f"invalid --python-version value: {value!r}: {error_msg}" + raise_option_error(parser, option=option, msg=msg) + + parser.values.python_version = version_info + + +python_version: Callable[..., Option] = partial( + Option, + "--python-version", + dest="python_version", + metavar="python_version", + action="callback", + callback=_handle_python_version, + type="str", + default=None, + help=dedent( + """\ + The Python interpreter version to use for wheel and "Requires-Python" + compatibility checks. Defaults to a version derived from the running + interpreter. The version can be specified using up to three dot-separated + integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor + version can also be given as a string without dots (e.g. "37" for 3.7.0). + """ + ), +) + + +implementation: Callable[..., Option] = partial( + Option, + "--implementation", + dest="implementation", + metavar="implementation", + default=None, + help=( + "Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels." + ), +) + + +abis: Callable[..., Option] = partial( + Option, + "--abi", + dest="abis", + metavar="abi", + action="append", + default=None, + help=( + "Only use wheels compatible with Python abi , e.g. 'pypy_41'. " + "If not specified, then the current interpreter abi tag is used. " + "Use this option multiple times to specify multiple abis supported " + "by the target interpreter. Generally you will need to specify " + "--implementation, --platform, and --python-version when using this " + "option." + ), +) + + +def add_target_python_options(cmd_opts: OptionGroup) -> None: + cmd_opts.add_option(platforms()) + cmd_opts.add_option(python_version()) + cmd_opts.add_option(implementation()) + cmd_opts.add_option(abis()) + + +def make_target_python(options: Values) -> TargetPython: + target_python = TargetPython( + platforms=options.platforms, + py_version_info=options.python_version, + abis=options.abis, + implementation=options.implementation, + ) + + return target_python + + +def prefer_binary() -> Option: + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help=( + "Prefer binary packages over source packages, even if the " + "source packages are newer." + ), + ) + + +cache_dir: Callable[..., Option] = partial( + PipOption, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + type="path", + help="Store the cache data in .", +) + + +def _handle_no_cache_dir( + option: Option, opt: str, value: str, parser: OptionParser +) -> None: + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache: Callable[..., Option] = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=_handle_no_cache_dir, + help="Disable the cache.", +) + +no_deps: Callable[..., Option] = partial( + Option, + "--no-deps", + "--no-dependencies", + dest="ignore_dependencies", + action="store_true", + default=False, + help="Don't install package dependencies.", +) + +ignore_requires_python: Callable[..., Option] = partial( + Option, + "--ignore-requires-python", + dest="ignore_requires_python", + action="store_true", + help="Ignore the Requires-Python information.", +) + +no_build_isolation: Callable[..., Option] = partial( + Option, + "--no-build-isolation", + dest="build_isolation", + action="store_false", + default=True, + help="Disable isolation when building a modern source distribution. " + "Build dependencies specified by PEP 518 must be already installed " + "if this option is used.", +) + +check_build_deps: Callable[..., Option] = partial( + Option, + "--check-build-dependencies", + dest="check_build_deps", + action="store_true", + default=False, + help="Check the build dependencies when PEP517 is used.", +) + + +def _handle_no_use_pep517( + option: Option, opt: str, value: str, parser: OptionParser +) -> None: + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # If user doesn't wish to use pep517, we check if setuptools and wheel are installed + # and raise error if it is not. + packages = ("setuptools", "wheel") + if not all(importlib.util.find_spec(package) for package in packages): + msg = ( + f"It is not possible to use --no-use-pep517 " + f"without {' and '.join(packages)} installed." + ) + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517: Any = partial( + Option, + "--use-pep517", + dest="use_pep517", + action="store_true", + default=None, + help="Use PEP 517 for building source distributions " + "(use --no-use-pep517 to force legacy behaviour).", +) + +no_use_pep517: Any = partial( + Option, + "--no-use-pep517", + dest="use_pep517", + action="callback", + callback=_handle_no_use_pep517, + default=None, + help=SUPPRESS_HELP, +) + + +def _handle_config_settings( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + key, sep, val = value.partition("=") + if sep != "=": + parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") + dest = getattr(parser.values, option.dest) + if dest is None: + dest = {} + setattr(parser.values, option.dest, dest) + if key in dest: + if isinstance(dest[key], list): + dest[key].append(val) + else: + dest[key] = [dest[key], val] + else: + dest[key] = val + + +config_settings: Callable[..., Option] = partial( + Option, + "-C", + "--config-settings", + dest="config_settings", + type=str, + action="callback", + callback=_handle_config_settings, + metavar="settings", + help="Configuration settings to be passed to the PEP 517 build backend. " + "Settings take the form KEY=VALUE. Use multiple --config-settings options " + "to pass multiple keys to the backend.", +) + +build_options: Callable[..., Option] = partial( + Option, + "--build-option", + dest="build_options", + metavar="options", + action="append", + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", +) + +global_options: Callable[..., Option] = partial( + Option, + "--global-option", + dest="global_options", + action="append", + metavar="options", + help="Extra global options to be supplied to the setup.py " + "call before the install or bdist_wheel command.", +) + +no_clean: Callable[..., Option] = partial( + Option, + "--no-clean", + action="store_true", + default=False, + help="Don't clean up build directories.", +) + +pre: Callable[..., Option] = partial( + Option, + "--pre", + action="store_true", + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) + +disable_pip_version_check: Callable[..., Option] = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) + +root_user_action: Callable[..., Option] = partial( + Option, + "--root-user-action", + dest="root_user_action", + default="warn", + choices=["warn", "ignore"], + help="Action if pip is run as a root user. By default, a warning message is shown.", +) + + +def _handle_merge_hash( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(":", 1) + except ValueError: + parser.error( + f"Arguments to {opt_str} must be a hash name " + "followed by a value, like --hash=sha256:" + "abcde..." + ) + if algo not in STRONG_HASHES: + parser.error( + "Allowed hash algorithms for {} are {}.".format( + opt_str, ", ".join(STRONG_HASHES) + ) + ) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash: Callable[..., Option] = partial( + Option, + "--hash", + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest="hashes", + action="callback", + callback=_handle_merge_hash, + type="string", + help="Verify that the package's archive matches this " + "hash before installing. Example: --hash=sha256:abcdef...", +) + + +require_hashes: Callable[..., Option] = partial( + Option, + "--require-hashes", + dest="require_hashes", + action="store_true", + default=False, + help="Require a hash to check each requirement against, for " + "repeatable installs. This option is implied when any package in a " + "requirements file has a --hash option.", +) + + +list_path: Callable[..., Option] = partial( + PipOption, + "--path", + dest="path", + type="path", + action="append", + help="Restrict to the specified installation path for listing " + "packages (can be used multiple times).", +) + + +def check_list_path_option(options: Values) -> None: + if options.path and (options.user or options.local): + raise CommandError("Cannot combine '--path' with '--user' or '--local'") + + +list_exclude: Callable[..., Option] = partial( + PipOption, + "--exclude", + dest="excludes", + action="append", + metavar="package", + type="package_name", + help="Exclude specified package from the output", +) + + +no_python_version_warning: Callable[..., Option] = partial( + Option, + "--no-python-version-warning", + dest="no_python_version_warning", + action="store_true", + default=False, + help="Silence deprecation warnings for upcoming unsupported Pythons.", +) + + +# Features that are now always on. A warning is printed if they are used. +ALWAYS_ENABLED_FEATURES = [ + "no-binary-enable-wheel-cache", # always on since 23.1 +] + +use_new_feature: Callable[..., Option] = partial( + Option, + "--use-feature", + dest="features_enabled", + metavar="feature", + action="append", + default=[], + choices=[ + "fast-deps", + "truststore", + ] + + ALWAYS_ENABLED_FEATURES, + help="Enable new functionality, that may be backward incompatible.", +) + +use_deprecated_feature: Callable[..., Option] = partial( + Option, + "--use-deprecated", + dest="deprecated_features_enabled", + metavar="feature", + action="append", + default=[], + choices=[ + "legacy-resolver", + ], + help=("Enable deprecated functionality, that will be removed in the future."), +) + + +########## +# groups # +########## + +general_group: Dict[str, Any] = { + "name": "General Options", + "options": [ + help_, + debug_mode, + isolated_mode, + require_virtualenv, + python, + verbose, + version, + quiet, + log, + no_input, + keyring_provider, + proxy, + retries, + timeout, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + no_python_version_warning, + use_new_feature, + use_deprecated_feature, + ], +} + +index_group: Dict[str, Any] = { + "name": "Package Index Options", + "options": [ + index_url, + extra_index_url, + no_index, + find_links, + ], +} diff --git a/project/Lib/site-packages/pip/_internal/cli/command_context.py b/project/Lib/site-packages/pip/_internal/cli/command_context.py new file mode 100644 index 0000000..139995a --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/command_context.py @@ -0,0 +1,27 @@ +from contextlib import ExitStack, contextmanager +from typing import ContextManager, Generator, TypeVar + +_T = TypeVar("_T", covariant=True) + + +class CommandContextMixIn: + def __init__(self) -> None: + super().__init__() + self._in_main_context = False + self._main_context = ExitStack() + + @contextmanager + def main_context(self) -> Generator[None, None, None]: + assert not self._in_main_context + + self._in_main_context = True + try: + with self._main_context: + yield + finally: + self._in_main_context = False + + def enter_context(self, context_provider: ContextManager[_T]) -> _T: + assert self._in_main_context + + return self._main_context.enter_context(context_provider) diff --git a/project/Lib/site-packages/pip/_internal/cli/main.py b/project/Lib/site-packages/pip/_internal/cli/main.py new file mode 100644 index 0000000..7e061f5 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/main.py @@ -0,0 +1,79 @@ +"""Primary application entrypoint. +""" +import locale +import logging +import os +import sys +import warnings +from typing import List, Optional + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import create_command +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation + +logger = logging.getLogger(__name__) + + +# Do not import and use main() directly! Using it directly is actively +# discouraged by pip's maintainers. The name, location and behavior of +# this function is subject to change, so calling it directly is not +# portable across different pip versions. + +# In addition, running pip in-process is unsupported and unsafe. This is +# elaborated in detail at +# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program. +# That document also provides suggestions that should work for nearly +# all users that are considering importing and using main() directly. + +# However, we know that certain users will still want to invoke pip +# in-process. If you understand and accept the implications of using pip +# in an unsupported manner, the best approach is to use runpy to avoid +# depending on the exact location of this entry point. + +# The following example shows how to use runpy to invoke pip in that +# case: +# +# sys.argv = ["pip", your, args, here] +# runpy.run_module("pip", run_name="__main__") +# +# Note that this will exit the process after running, unlike a direct +# call to main. As it is not safe to do any processing after calling +# main, this should not be an issue in practice. + + +def main(args: Optional[List[str]] = None) -> int: + if args is None: + args = sys.argv[1:] + + # Suppress the pkg_resources deprecation warning + # Note - we use a module of .*pkg_resources to cover + # the normal case (pip._vendor.pkg_resources) and the + # devendored case (a bare pkg_resources) + warnings.filterwarnings( + action="ignore", category=DeprecationWarning, module=".*pkg_resources" + ) + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write(f"ERROR: {exc}") + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, "") + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) + + return command.main(cmd_args) diff --git a/project/Lib/site-packages/pip/_internal/cli/main_parser.py b/project/Lib/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..5ade356 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,134 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import subprocess +import sys +from typing import List, Optional, Tuple + +from pip._internal.build_env import get_runnable_pip +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip._internal.commands import commands_dict, get_similar_commands +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_pip_version, get_prog + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser() -> ConfigOptionParser: + """Creates and returns the main parser for pip's CLI""" + + parser = ConfigOptionParser( + usage="\n%prog [options]", + add_help_option=False, + formatter=UpdatingDefaultsHelpFormatter(), + name="global", + prog=get_prog(), + ) + parser.disable_interspersed_args() + + parser.version = get_pip_version() + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + description = [""] + [ + f"{name:27} {command_info.summary}" + for name, command_info in commands_dict.items() + ] + parser.description = "\n".join(description) + + return parser + + +def identify_python_interpreter(python: str) -> Optional[str]: + # If the named file exists, use it. + # If it's a directory, assume it's a virtual environment and + # look for the environment's Python executable. + if os.path.exists(python): + if os.path.isdir(python): + # bin/python for Unix, Scripts/python.exe for Windows + # Try both in case of odd cases like cygwin. + for exe in ("bin/python", "Scripts/python.exe"): + py = os.path.join(python, exe) + if os.path.exists(py): + return py + else: + return python + + # Could not find the interpreter specified + return None + + +def parse_command(args: List[str]) -> Tuple[str, List[str]]: + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --python + if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: + # Re-invoke pip using the specified Python interpreter + interpreter = identify_python_interpreter(general_options.python) + if interpreter is None: + raise CommandError( + f"Could not locate Python interpreter {general_options.python}" + ) + + pip_cmd = [ + interpreter, + get_runnable_pip(), + ] + pip_cmd.extend(args) + + # Set a flag so the child doesn't re-invoke itself, causing + # an infinite loop. + os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1" + returncode = 0 + try: + proc = subprocess.run(pip_cmd) + returncode = proc.returncode + except (subprocess.SubprocessError, OSError) as exc: + raise CommandError(f"Failed to run pip under {interpreter}: {exc}") + sys.exit(returncode) + + # --version + if general_options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == "help" and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = [f'unknown command "{cmd_name}"'] + if guess: + msg.append(f'maybe you meant "{guess}"') + + raise CommandError(" - ".join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/project/Lib/site-packages/pip/_internal/cli/parser.py b/project/Lib/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..ae554b2 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,294 @@ +"""Base option parser setup""" + +import logging +import optparse +import shutil +import sys +import textwrap +from contextlib import suppress +from typing import Any, Dict, Generator, List, Tuple + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.misc import redact_auth_from_url, strtobool + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + # help position must be aligned with __init__.parseopts.description + kwargs["max_help_position"] = 30 + kwargs["indent_increment"] = 1 + kwargs["width"] = shutil.get_terminal_size()[0] - 2 + super().__init__(*args, **kwargs) + + def format_option_strings(self, option: optparse.Option) -> str: + return self._format_option_strings(option) + + def _format_option_strings( + self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", " + ) -> str: + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + assert option.dest is not None + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt.format(metavar.lower())) + + return "".join(opts) + + def format_heading(self, heading: str) -> str: + if heading == "Options": + return "" + return heading + ":\n" + + def format_usage(self, usage: str) -> str: + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " ")) + return msg + + def format_description(self, description: str) -> str: + # leave full control over description to us + if description: + if hasattr(self.parser, "main"): + label = "Commands" + else: + label = "Description" + # some doc strings have initial newlines, some don't + description = description.lstrip("\n") + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = f"{label}:\n{description}\n" + return description + else: + return "" + + def format_epilog(self, epilog: str) -> str: + # leave full control over epilog to us + if epilog: + return epilog + else: + return "" + + def indent_lines(self, text: str, indent: str) -> str: + new_lines = [indent + line for line in text.split("\n")] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + + Also redact auth from url type options + """ + + def expand_default(self, option: optparse.Option) -> str: + default_values = None + if self.parser is not None: + assert isinstance(self.parser, ConfigOptionParser) + self.parser._update_defaults(self.parser.defaults) + assert option.dest is not None + default_values = self.parser.defaults.get(option.dest) + help_text = super().expand_default(option) + + if default_values and option.metavar == "URL": + if isinstance(default_values, str): + default_values = [default_values] + + # If its not a list, we should abort and just return the help text + if not isinstance(default_values, list): + default_values = [] + + for val in default_values: + help_text = help_text.replace(val, redact_auth_from_url(val)) + + return help_text + + +class CustomOptionParser(optparse.OptionParser): + def insert_option_group( + self, idx: int, *args: Any, **kwargs: Any + ) -> optparse.OptionGroup: + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self) -> List[optparse.Option]: + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__( + self, + *args: Any, + name: str, + isolated: bool = False, + **kwargs: Any, + ) -> None: + self.name = name + self.config = Configuration(isolated) + + assert self.name + super().__init__(*args, **kwargs) + + def check_default(self, option: optparse.Option, key: str, val: Any) -> Any: + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print(f"An error occurred during configuration: {exc}") + sys.exit(3) + + def _get_ordered_configuration_items( + self, + ) -> Generator[Tuple[str, Any], None, None]: + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items: Dict[str, List[Tuple[str, Any]]] = { + name: [] for name in override_order + } + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key, + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]: + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option("--" + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + assert option.dest is not None + + if option.action in ("store_true", "store_false"): + try: + val = strtobool(val) + except ValueError: + self.error( + f"{val} is not a valid value for {key} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead." + ) + elif option.action == "count": + with suppress(ValueError): + val = strtobool(val) + with suppress(ValueError): + val = int(val) + if not isinstance(val, int) or val < 0: + self.error( + f"{val} is not a valid value for {key} option, " + "please instead specify either a non-negative integer " + "or a boolean value like yes/no or false/true " + "which is equivalent to 1/0." + ) + elif option.action == "append": + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == "callback": + assert option.callback is not None + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self) -> optparse.Values: + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + assert option.dest is not None + default = defaults.get(option.dest) + if isinstance(default, str): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg: str) -> None: + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, f"{msg}\n") diff --git a/project/Lib/site-packages/pip/_internal/cli/progress_bars.py b/project/Lib/site-packages/pip/_internal/cli/progress_bars.py new file mode 100644 index 0000000..0ad1403 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/progress_bars.py @@ -0,0 +1,68 @@ +import functools +from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple + +from pip._vendor.rich.progress import ( + BarColumn, + DownloadColumn, + FileSizeColumn, + Progress, + ProgressColumn, + SpinnerColumn, + TextColumn, + TimeElapsedColumn, + TimeRemainingColumn, + TransferSpeedColumn, +) + +from pip._internal.utils.logging import get_indentation + +DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]] + + +def _rich_progress_bar( + iterable: Iterable[bytes], + *, + bar_type: str, + size: int, +) -> Generator[bytes, None, None]: + assert bar_type == "on", "This should only be used in the default mode." + + if not size: + total = float("inf") + columns: Tuple[ProgressColumn, ...] = ( + TextColumn("[progress.description]{task.description}"), + SpinnerColumn("line", speed=1.5), + FileSizeColumn(), + TransferSpeedColumn(), + TimeElapsedColumn(), + ) + else: + total = size + columns = ( + TextColumn("[progress.description]{task.description}"), + BarColumn(), + DownloadColumn(), + TransferSpeedColumn(), + TextColumn("eta"), + TimeRemainingColumn(), + ) + + progress = Progress(*columns, refresh_per_second=30) + task_id = progress.add_task(" " * (get_indentation() + 2), total=total) + with progress: + for chunk in iterable: + yield chunk + progress.update(task_id, advance=len(chunk)) + + +def get_download_progress_renderer( + *, bar_type: str, size: Optional[int] = None +) -> DownloadProgressRenderer: + """Get an object that can be used to render the download progress. + + Returns a callable, that takes an iterable to "wrap". + """ + if bar_type == "on": + return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size) + else: + return iter # no-op, when passed an iterator diff --git a/project/Lib/site-packages/pip/_internal/cli/req_command.py b/project/Lib/site-packages/pip/_internal/cli/req_command.py new file mode 100644 index 0000000..6f2f79c --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/req_command.py @@ -0,0 +1,505 @@ +"""Contains the Command base classes that depend on PipSession. + +The classes in this module are in a separate module so the commands not +needing download / PackageFinder capability don't unnecessarily import the +PackageFinder machinery and all its vendored dependencies, etc. +""" + +import logging +import os +import sys +from functools import partial +from optparse import Values +from typing import TYPE_CHECKING, Any, List, Optional, Tuple + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.network.session import PipSession +from pip._internal.operations.build.build_tracker import BuildTracker +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, + install_req_from_parsed_requirement, + install_req_from_req_string, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.req.req_install import InstallRequirement +from pip._internal.resolution.base import BaseResolver +from pip._internal.self_outdated_check import pip_self_version_check +from pip._internal.utils.temp_dir import ( + TempDirectory, + TempDirectoryTypeRegistry, + tempdir_kinds, +) +from pip._internal.utils.virtualenv import running_under_virtualenv + +if TYPE_CHECKING: + from ssl import SSLContext + +logger = logging.getLogger(__name__) + + +def _create_truststore_ssl_context() -> Optional["SSLContext"]: + if sys.version_info < (3, 10): + raise CommandError("The truststore feature is only available for Python 3.10+") + + try: + import ssl + except ImportError: + logger.warning("Disabling truststore since ssl support is missing") + return None + + try: + from pip._vendor import truststore + except ImportError as e: + raise CommandError(f"The truststore feature is unavailable: {e}") + + return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + + +class SessionCommandMixin(CommandContextMixIn): + + """ + A class mixin for command classes needing _build_session(). + """ + + def __init__(self) -> None: + super().__init__() + self._session: Optional[PipSession] = None + + @classmethod + def _get_index_urls(cls, options: Values) -> Optional[List[str]]: + """Return a list of index urls from user-provided options.""" + index_urls = [] + if not getattr(options, "no_index", False): + url = getattr(options, "index_url", None) + if url: + index_urls.append(url) + urls = getattr(options, "extra_index_urls", None) + if urls: + index_urls.extend(urls) + # Return None rather than an empty list + return index_urls or None + + def get_default_session(self, options: Values) -> PipSession: + """Get a default-managed session.""" + if self._session is None: + self._session = self.enter_context(self._build_session(options)) + # there's no type annotation on requests.Session, so it's + # automatically ContextManager[Any] and self._session becomes Any, + # then https://github.com/python/mypy/issues/7696 kicks in + assert self._session is not None + return self._session + + def _build_session( + self, + options: Values, + retries: Optional[int] = None, + timeout: Optional[int] = None, + fallback_to_certifi: bool = False, + ) -> PipSession: + cache_dir = options.cache_dir + assert not cache_dir or os.path.isabs(cache_dir) + + if "truststore" in options.features_enabled: + try: + ssl_context = _create_truststore_ssl_context() + except Exception: + if not fallback_to_certifi: + raise + ssl_context = None + else: + ssl_context = None + + session = PipSession( + cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, + retries=retries if retries is not None else options.retries, + trusted_hosts=options.trusted_hosts, + index_urls=self._get_index_urls(options), + ssl_context=ssl_context, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = timeout if timeout is not None else options.timeout + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + session.auth.keyring_provider = options.keyring_provider + + return session + + +class IndexGroupCommand(Command, SessionCommandMixin): + + """ + Abstract base class for commands with the index_group options. + + This also corresponds to the commands that permit the pip version check. + """ + + def handle_pip_version_check(self, options: Values) -> None: + """ + Do the pip version check if not disabled. + + This overrides the default behavior of not doing the check. + """ + # Make sure the index_group options are present. + assert hasattr(options, "no_index") + + if options.disable_pip_version_check or options.no_index: + return + + # Otherwise, check if we're using the latest version of pip available. + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout), + # This is set to ensure the function does not fail when truststore is + # specified in use-feature but cannot be loaded. This usually raises a + # CommandError and shows a nice user-facing error, but this function is not + # called in that try-except block. + fallback_to_certifi=True, + ) + with session: + pip_self_version_check(session, options) + + +KEEPABLE_TEMPDIR_TYPES = [ + tempdir_kinds.BUILD_ENV, + tempdir_kinds.EPHEM_WHEEL_CACHE, + tempdir_kinds.REQ_BUILD, +] + + +def warn_if_run_as_root() -> None: + """Output a warning for sudo users on Unix. + + In a virtual environment, sudo pip still writes to virtualenv. + On Windows, users may run pip as Administrator without issues. + This warning only applies to Unix root users outside of virtualenv. + """ + if running_under_virtualenv(): + return + if not hasattr(os, "getuid"): + return + # On Windows, there are no "system managed" Python packages. Installing as + # Administrator via pip is the correct way of updating system environments. + # + # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform + # checks: https://mypy.readthedocs.io/en/stable/common_issues.html + if sys.platform == "win32" or sys.platform == "cygwin": + return + + if os.getuid() != 0: + return + + logger.warning( + "Running pip as the 'root' user can result in broken permissions and " + "conflicting behaviour with the system package manager. " + "It is recommended to use a virtual environment instead: " + "https://pip.pypa.io/warnings/venv" + ) + + +def with_cleanup(func: Any) -> Any: + """Decorator for common logic related to managing temporary + directories. + """ + + def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None: + for t in KEEPABLE_TEMPDIR_TYPES: + registry.set_delete(t, False) + + def wrapper( + self: RequirementCommand, options: Values, args: List[Any] + ) -> Optional[int]: + assert self.tempdir_registry is not None + if options.no_clean: + configure_tempdir_registry(self.tempdir_registry) + + try: + return func(self, options, args) + except PreviousBuildDirError: + # This kind of conflict can occur when the user passes an explicit + # build directory with a pre-existing folder. In that case we do + # not want to accidentally remove it. + configure_tempdir_registry(self.tempdir_registry) + raise + + return wrapper + + +class RequirementCommand(IndexGroupCommand): + def __init__(self, *args: Any, **kw: Any) -> None: + super().__init__(*args, **kw) + + self.cmd_opts.add_option(cmdoptions.no_clean()) + + @staticmethod + def determine_resolver_variant(options: Values) -> str: + """Determines which resolver should be used, based on the given options.""" + if "legacy-resolver" in options.deprecated_features_enabled: + return "legacy" + + return "resolvelib" + + @classmethod + def make_requirement_preparer( + cls, + temp_build_dir: TempDirectory, + options: Values, + build_tracker: BuildTracker, + session: PipSession, + finder: PackageFinder, + use_user_site: bool, + download_dir: Optional[str] = None, + verbosity: int = 0, + ) -> RequirementPreparer: + """ + Create a RequirementPreparer instance for the given parameters. + """ + temp_build_dir_path = temp_build_dir.path + assert temp_build_dir_path is not None + legacy_resolver = False + + resolver_variant = cls.determine_resolver_variant(options) + if resolver_variant == "resolvelib": + lazy_wheel = "fast-deps" in options.features_enabled + if lazy_wheel: + logger.warning( + "pip is using lazily downloaded wheels using HTTP " + "range requests to obtain dependency information. " + "This experimental feature is enabled through " + "--use-feature=fast-deps and it is not ready for " + "production." + ) + else: + legacy_resolver = True + lazy_wheel = False + if "fast-deps" in options.features_enabled: + logger.warning( + "fast-deps has no effect when used with the legacy resolver." + ) + + return RequirementPreparer( + build_dir=temp_build_dir_path, + src_dir=options.src_dir, + download_dir=download_dir, + build_isolation=options.build_isolation, + check_build_deps=options.check_build_deps, + build_tracker=build_tracker, + session=session, + progress_bar=options.progress_bar, + finder=finder, + require_hashes=options.require_hashes, + use_user_site=use_user_site, + lazy_wheel=lazy_wheel, + verbosity=verbosity, + legacy_resolver=legacy_resolver, + ) + + @classmethod + def make_resolver( + cls, + preparer: RequirementPreparer, + finder: PackageFinder, + options: Values, + wheel_cache: Optional[WheelCache] = None, + use_user_site: bool = False, + ignore_installed: bool = True, + ignore_requires_python: bool = False, + force_reinstall: bool = False, + upgrade_strategy: str = "to-satisfy-only", + use_pep517: Optional[bool] = None, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> BaseResolver: + """ + Create a Resolver instance for the given parameters. + """ + make_install_req = partial( + install_req_from_req_string, + isolated=options.isolated_mode, + use_pep517=use_pep517, + ) + resolver_variant = cls.determine_resolver_variant(options) + # The long import name and duplicated invocation is needed to convince + # Mypy into correctly typechecking. Otherwise it would complain the + # "Resolver" class being redefined. + if resolver_variant == "resolvelib": + import pip._internal.resolution.resolvelib.resolver + + return pip._internal.resolution.resolvelib.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + import pip._internal.resolution.legacy.resolver + + return pip._internal.resolution.legacy.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + + def get_requirements( + self, + args: List[str], + options: Values, + finder: PackageFinder, + session: PipSession, + ) -> List[InstallRequirement]: + """ + Parse command-line arguments into the corresponding requirements. + """ + requirements: List[InstallRequirement] = [] + for filename in options.constraints: + for parsed_req in parse_requirements( + filename, + constraint=True, + finder=finder, + options=options, + session=session, + ): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + user_supplied=False, + ) + requirements.append(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, + comes_from=None, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + config_settings=getattr(options, "config_settings", None), + ) + requirements.append(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + user_supplied=True, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + config_settings=getattr(options, "config_settings", None), + ) + requirements.append(req_to_add) + + # NOTE: options.require_hashes may be set if --require-hashes is True + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, finder=finder, options=options, session=session + ): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + config_settings=parsed_req.options.get("config_settings") + if parsed_req.options + else None, + ) + requirements.append(req_to_add) + + # If any requirement has hash options, enable hash checking. + if any(req.has_hash_options for req in requirements): + options.require_hashes = True + + if not (args or options.editables or options.requirements): + opts = {"name": self.name} + if options.find_links: + raise CommandError( + "You must give at least one requirement to {name} " + '(maybe you meant "pip {name} {links}"?)'.format( + **dict(opts, links=" ".join(options.find_links)) + ) + ) + else: + raise CommandError( + "You must give at least one requirement to {name} " + '(see "pip help {name}")'.format(**opts) + ) + + return requirements + + @staticmethod + def trace_basic_info(finder: PackageFinder) -> None: + """ + Trace basic information about the provided objects. + """ + # Display where finder is looking for packages + search_scope = finder.search_scope + locations = search_scope.get_formatted_locations() + if locations: + logger.info(locations) + + def _build_package_finder( + self, + options: Values, + session: PipSession, + target_python: Optional[TargetPython] = None, + ignore_requires_python: Optional[bool] = None, + ) -> PackageFinder: + """ + Create a package finder appropriate to this requirement command. + + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + link_collector = LinkCollector.create(session, options=options) + selection_prefs = SelectionPreferences( + allow_yanked=True, + format_control=options.format_control, + allow_all_prereleases=options.pre, + prefer_binary=options.prefer_binary, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + ) diff --git a/project/Lib/site-packages/pip/_internal/cli/spinners.py b/project/Lib/site-packages/pip/_internal/cli/spinners.py new file mode 100644 index 0000000..cf2b976 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/spinners.py @@ -0,0 +1,159 @@ +import contextlib +import itertools +import logging +import sys +import time +from typing import IO, Generator, Optional + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation + +logger = logging.getLogger(__name__) + + +class SpinnerInterface: + def spin(self) -> None: + raise NotImplementedError() + + def finish(self, final_status: str) -> None: + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__( + self, + message: str, + file: Optional[IO[str]] = None, + spin_chars: str = "-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds: float = 0.125, + ): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status: str) -> None: + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self) -> None: + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status: str) -> None: + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None: + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status: str) -> None: + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self) -> None: + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status: str) -> None: + if self._finished: + return + self._update(f"finished with status '{final_status}'") + self._finished = True + + +class RateLimiter: + def __init__(self, min_update_interval_seconds: float) -> None: + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update: float = 0 + + def ready(self) -> bool: + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self) -> None: + self._last_update = time.time() + + +@contextlib.contextmanager +def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]: + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner: SpinnerInterface = InteractiveSpinner(message) + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") + + +HIDE_CURSOR = "\x1b[?25l" +SHOW_CURSOR = "\x1b[?25h" + + +@contextlib.contextmanager +def hidden_cursor(file: IO[str]) -> Generator[None, None, None]: + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) diff --git a/project/Lib/site-packages/pip/_internal/cli/status_codes.py b/project/Lib/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..5e29502 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/cli/status_codes.py @@ -0,0 +1,6 @@ +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/project/Lib/site-packages/pip/_internal/commands/__init__.py b/project/Lib/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..858a410 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,132 @@ +""" +Package containing all pip commands +""" + +import importlib +from collections import namedtuple +from typing import Any, Dict, Optional + +from pip._internal.cli.base_command import Command + +CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary") + +# This dictionary does a bunch of heavy lifting for help output: +# - Enables avoiding additional (costly) imports for presenting `--help`. +# - The ordering matters for help display. +# +# Even though the module path starts with the same "pip._internal.commands" +# prefix, the full path makes testing easier (specifically when modifying +# `commands_dict` in test setup / teardown). +commands_dict: Dict[str, CommandInfo] = { + "install": CommandInfo( + "pip._internal.commands.install", + "InstallCommand", + "Install packages.", + ), + "download": CommandInfo( + "pip._internal.commands.download", + "DownloadCommand", + "Download packages.", + ), + "uninstall": CommandInfo( + "pip._internal.commands.uninstall", + "UninstallCommand", + "Uninstall packages.", + ), + "freeze": CommandInfo( + "pip._internal.commands.freeze", + "FreezeCommand", + "Output installed packages in requirements format.", + ), + "inspect": CommandInfo( + "pip._internal.commands.inspect", + "InspectCommand", + "Inspect the python environment.", + ), + "list": CommandInfo( + "pip._internal.commands.list", + "ListCommand", + "List installed packages.", + ), + "show": CommandInfo( + "pip._internal.commands.show", + "ShowCommand", + "Show information about installed packages.", + ), + "check": CommandInfo( + "pip._internal.commands.check", + "CheckCommand", + "Verify installed packages have compatible dependencies.", + ), + "config": CommandInfo( + "pip._internal.commands.configuration", + "ConfigurationCommand", + "Manage local and global configuration.", + ), + "search": CommandInfo( + "pip._internal.commands.search", + "SearchCommand", + "Search PyPI for packages.", + ), + "cache": CommandInfo( + "pip._internal.commands.cache", + "CacheCommand", + "Inspect and manage pip's wheel cache.", + ), + "index": CommandInfo( + "pip._internal.commands.index", + "IndexCommand", + "Inspect information available from package indexes.", + ), + "wheel": CommandInfo( + "pip._internal.commands.wheel", + "WheelCommand", + "Build wheels from your requirements.", + ), + "hash": CommandInfo( + "pip._internal.commands.hash", + "HashCommand", + "Compute hashes of package archives.", + ), + "completion": CommandInfo( + "pip._internal.commands.completion", + "CompletionCommand", + "A helper command used for command completion.", + ), + "debug": CommandInfo( + "pip._internal.commands.debug", + "DebugCommand", + "Show information useful for debugging.", + ), + "help": CommandInfo( + "pip._internal.commands.help", + "HelpCommand", + "Show help for commands.", + ), +} + + +def create_command(name: str, **kwargs: Any) -> Command: + """ + Create an instance of the Command class with the given name. + """ + module_path, class_name, summary = commands_dict[name] + module = importlib.import_module(module_path) + command_class = getattr(module, class_name) + command = command_class(name=name, summary=summary, **kwargs) + + return command + + +def get_similar_commands(name: str) -> Optional[str]: + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return None diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fc4c17d4bcb1fed4219e9f14c9a322dd4cb3aea GIT binary patch literal 4451 zcmaJ^-)|Gi9iLs>>rEWn`3ZsWV}THGf*r!a(FP70lH&-0K#v33kgK)vjN>KiUEl1Q zT#O@GRaLoF)kbP1^3aDooaj}k5|8~ek}6VHE1eXnPkr-=_T`@XomsDOV%*hwc6L6W z`Fy|go$t)7{}PRMBDm&%k<5<95&9Q<@vm^b^6r-+La)$cgwX=R0v2^)L4apK7xRII zfWX>(DIZ=4^R|#K=Q|cU1SBF7z!DC>2AwzX^R9(X4PhCuPTYYzapZLX zQ22S*9|hdSu_%t=cnj9eu^!xu`&zJmjt$^L_;3q0$gv~%C?0CTj&bZbK7miRU<$`h z;nVm`3pUKLvv>rbYr)QQEP+SySPOQ6V@aIC<1N@lj!oc8_@fr=GRLmqkMY$O>_;5? zF`mTNTCnRJ`vl*>H(RiuaBK?S!qY9-497mjxAA8!*d30|;=6e6Ahr-866qqHS@DQJ zsfa}Jz3cFX?~^V(PeS+s>Bvg>;je-VG2Zrogh|(Xem01I3RoPAk5JH!zoAL5 zqX?1lyknvHkarD++x^%l`;vW)mL^RpO9?5F((yKe9_&VMbDA$T@t|lIindaBhv0@H zG%1vPRn#cS6T`NYtV#2#o#KHlkc|ER0?Tk7SXS|EorJ)$cg4;TrLbn_OhX~Y3yqov zvygIwx@Os>p*90xpc}adr7t+hUOwPDC|NmkwXG5Z-N+*-eWg+M0!rQ(A@vk>$^2kg zQf?@dBbk-bu{LgU)a{yPBwzmO6GFA@+6P=!a_S4VTJn&{+LBHbObW!n#K>p_5>JA4 zl+~6?!|jZ5xJaS1X}JB<&9A=kk^8E_mZWZGR9%4;s4VN|5>!3ydS|d@5tU|gZ4=0Y z-RL7u^VN@dugb%;2a2H(DE9Ex&iX0B+=ShN`3*xqXDO>WLcnE4 z24xLG^mSWhj=Ej5jN~hSAs}|`I%F#T-*F)pc}aZrLTGhDzHomq>Gg!mSScb&ayevUNCPv zGeFV_ONG*@wh7}?+#aUs(S0+?DJ4hr0-^q9trRWT64Bl#9aS{52u$QE^OgLhblGlK;P{AeE_03kq7`nrd?F6-3nEd(W6cic*2cCrN7 zA>m3Zt14Z#T!|99NR5opH~>O`ihRiS&Hs%x;NQm?Tn0LeVQ}VAU5u{_R zr9;aXOls@ek{k7^Y43=2!^^~0ZJQ=!-j^mBJ<@dkLgF>fUwVxU;ZlZ#&vSlEkqo-WR)wt7po$RaGuj~5Hnd=3Z3;yrC?(b8;^^pE64Nbm8+ znLh68j;Enbv(xERVa<(Yc(l@WkX{3$dH7k6p{St$%IN%+w_og@o7@QwSLQa3Za)1k zdT2K~y!C7+I@{@!kIM%6%s`RLyV4rndUOU4;kSe;@IlmCyDf zy_NZQAdL1UQwSPZdc6A+6tBFGbCeg>1p$@ORwG#eY+SFQ_NMW+4j<=bp^R*nmi22Z z=+~N``}-Y8F0m|9xh!JgeF8s1H~^^?EFJZ8hoy<47Hu<`F)4+(rzrCfzQKAR1z-+M zi=^Qb0JdOjJ`r-mSj%Q1VdxEDxgp(LCDco%;0jr@5&J__T@j5 zH~*2mxs#mQO-}6$+}a(uRhi!l57bZ~)bGTPZ>qa-Wm{JE;(b+{vX9+Fw;N8Uv6)Gy z=_Pn~BNT9kR}O7>a-_9e<9PuZkWHXrW6PfJ}(EkW}7W1wusQ;b6D)9|T1$!0=iZ3dJ`f8xcoNIPwukJ_d{)#^{l1QO-DoLfsof8$*sf z>c~eO`8Y6o8KYOK9p(%Lg`(A!>WU+ubL7L0d<__J#)wO`Q=Bo1La}B)5>0-LamHm7 zid5&SbB=u0kp~?4G%%t}BP!LdaK?=TjLS`oo1Ae+K%uVcv+6TP9&zMDjywgF7!!#} zwON64J_k=-|ry?KMJaBq8#x}+r8E%-YtH9}FWABq{4?ND#fU_??Z0vq~ ze(rIW4%#}^WGlltm1x!8nBE-P?jPQbpRJ)Mf*^Y3_g#O4fDsr aVlX1~Z(213kFBrY2EJM6)wTs+YyShXKr9Ua literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b1bcfb839578ac4467cb08b0a2d3ce667c5bc4c GIT binary patch literal 10871 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 Rd$=<3gtYvyLp#CBe*>+fu;%~( literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ea6107abb753e408c6cf7d0b379d137fb7a03c0 GIT binary patch literal 2406 zcmb7F%Wo4$7@zg7_u&WRVI?GnWGSR=csK^}rASCsrS@hN)B~q}vwq|ORn_tAZ@&5F@%!eR z?;HP|PA3qQ`5!J8{uUAXoprh;-VyeG0^upLki|JjV{Odg+?W>Qn9Mu8D`-L_3r^e> zH8GOoj^xUk>?)cP^+hM)CbguS(o$|(OGi4%Ip!YMj&mr6FuLE@CC2?b9750GYZq-G zhHfKEevB*yi#t4w!PglZw73N{nfQx!=O?*Pyk|INOhFRnY#Kl-&HAouc-CYrjNiI@ z_v^c%wD9fh?5%}`Nj~g1m$A8`mke{oC}N%BAUtgnYy|kAPA?GO)oqUkhT~u>JoCsP zp6=kHVXo>AF`>5aQ5`sRTEeDXut5dPsYk?yjr?*@DhFoA;-~>%M`iCSG*9958fPIb zW^o#C#Wca{-||ZA^1(LkTr16D8so)$jdMz>c#RN*yT_3{s?_NN`Xl zp4sy~n8u=q_4n4{ww|J(cV`IgfciOn?UIinROPEeaA0+XKYY&|3c4`|i;j*)JH)GE zC4LhvUam?NzH-1j_j~(RDuL3q1U$)Aq>5Zotk}MHcLcB&zINfzlkAf# z74bir#G_1ku%nu&CabAKj9@D;rYea_atH4IdH4QNhbc~lib!J>fk;7=k!?E`(4k#~ zxBQjrT8t1xM0|ej+yqsj68xZS6U^ib>Z4`bTvlzWdVa7U9XSG5g4Qm!7c3jSMK1P& zXx&mdP*?qOJ9?sNxwTXCzPd#G73_66*mSBE{IX}|CMClBOxO{K3=m44>>x>|V#g*D zz+^fUD0T|u7}FdF2$KhMFkLbrsl1{NA-P0D$+ao#hDp=+3XW|CtdoMl``8S0&u}pr zV4Ea*k-ZwqAV))Cl1UvyLLPiW(=fRm^c{S&aP#B*H`p+j^LM_>-!uZ_bA#f%V=P_G zcWCl+_EMfgLSO9WRla1Grr=o!F!2m$3KERHGju9?Q*xzM;3|7-eFw8N2by6Zr|(0m ztfSqDFX|I_8WVTw@_QS}&Ba~${If6X@^nLEZsx9?;#^I0>aHZ$2~W^C)h zk6*n~;{5}!5kPAnc($Yuo%*na5^Q&Xqr2y3e!I}f-3Dg1J3zhf+@`#Bew#)lvt5$m zW(GLNU!^5R1JK$Bo~_NG)L;t0oHrJrf{Ps+-M10dSv}pOB|19x30DjG|w{6%wI<$ z@db^Ve}y&`W0}l^lH(VPEPQ2nURjv8jSR(LwFK(6v11Tfxn5-DOvlbGK|Jc65F_lJ z4Bs&c{-A;~g=rS1``LDMreDGY{t4ib&qbjcrRsj>h9?fQmjm0OIY>b>%HmKd;$RLA zfeBHW9U?msbRsu?0GfT*zL7s^U(~1M5)81v2l^*Ki|075iH@yDzb4Ao4%a3ct{tu~ z(dF9V+C($8chy!*;9?L`{{s?;gWWG3tS^<(jp2qex;0%_&Nh^@>tais;Ib|BHf&yd M#k8;AF%)^?AKB1yT>t<8 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92e8435ceb761dd6e966211950ec417b4b72f067 GIT binary patch literal 5621 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba38c5ad2b80bc3d942107d8efc5ab41ab4e3b0b GIT binary patch literal 12194 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39d718f1b7507e39d3dfc8bcbce450229e831177 GIT binary patch literal 7940 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d72220dfc121584abff942699f9ca8f96c87f07 GIT binary patch literal 3353 zcmZ`*O>7&-6`uX&E`KB{l1=@%@+z`mv#qE$Xw=GZ1UQlsw-#hTQWJz#x>)Uw$W@kH zW@c%{j0EVAgAk}_+KY7wphK&uun)Pk=O(8fNrQli1q2u zc!as_*IMf%Jb1z(^a$RtWQTb4F0z!*kfmbfL;xMUE!`z6iZ5F+c;oo;mTV0PnH0R6j8BQ5f=!wfV^`MO`xP^jIw9>pUEv>HJTlFJrzg}2aT3Z82;+@;? z-COc@A8?P1+5d!@2xwssXXo%4Jf z*oO!sc7||%Tvo97tY`^Y$%{qrTIASSS!Rkn721~?I_#PGXF-wB)iTSZR2FAg903^i#0>bgHCg|py#-z;bNT1)Bv zo)aF%!y6WcfAFWeQsJkKN^E-CaB?o7C|~f^^R7fam*C1Z@L1^Ej*9sMTz6A*ih86U{ zmZ+d43J_o3a!J8}LEElf^yQL4C?@_OxE&LZ4Fq#NN8ECW#TCWQ7G+-3zFS?qxv`E7 zGrw`?{f$LH%-aUV8;-F#y8#f{#-_KiY;SH*2%G5^Na;q&F3sq6(Zi%@I5TD#opgqw zGE;is$IiD%E2*w9$aE=2VR^a(WFIw@_+jFyqCHWxMm*Vwk2D6ZoDEGh21gkk`1#X; z`6mPOjpWcn^^fY8)3xM{dh*6|fq$*NBdb!D#Ft}kF|z`- zB9ucO^I5B`p>p~Fcp zd2SB~=2t4oDS9&+W{+KeHx#95}*9@!k>Osi_g^KGu8Oa+2HWO^0T3_`q0#Y+87#cB0=p7$id=S ze7KREJYGMY`)lFvi~mU1X4mVp>j0AkgGmC++T_17N~R9_hz4t>dC~{XN;>WBPD>Nfb;~tDEQMz^Xy=L$_-TZ-KDi1L66Sou`~m0b z5nq7wC23&)f`WB}^B~N}0b#DC4v_uM)8r*dX(C4YP$Ip*)EFJFim9d;mu@yuFS!zx zQb)6Zd?|H0bZR~x3A$g?p!vTf+(@to=7Z49>@>_y_5+3?Ac%u7^Lt&{eiyQQFACp8 zd%V}dJwn@^nRdC}DA*Icu3Ws!_i7;qQhR{$V|IeyE4yN^HK2W1g+Cqk^zMg4#n>eJ zDWc*I|B3Jc+Tl3#0pj3+xjRwUy}$`Dk2(T~8=*3>8eE8)*G}%1orByR-rp<^GCof> zSJJXCx+M%LoW+P^Z~8(J?+}(pe7Rh*3=jKi9)A*!hOp@zx*uuX`;hcus4s=TE4{%( zuERtDc@sMHZ$S3ZztqHm^~GXM9jU9}bV0g$^!{1@<-<>p=4$;@_5P^?@$8azoT^<) z*Ds};h*PfyA~WA)frRUD%Ou=PLOx;-jtAb68#r5Y*`tn@0%*ou9BcX|) QISrey!zK`2M1u4BA67jgG5`Po literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36952db707903bef028e8ae94881ff958a36332c GIT binary patch literal 1965 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 b|0>+t6d2}61?>*i*8b+3fVP=o$I!w+7g literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12ad42d9eb241bca18d3d873da003a0865b52418 GIT binary patch literal 4441 zcma)9-D@1l5$~Cuot^!XR^OktX8k4YVXb|N(knT&Qu(#o?R z*E8!NAssp}L;*iI;KNSvgB}t^!G16#4}Q#_uxl1PGzbJC4|xe=bb;WfRP}z#He7E{ zO?7v5O?P$us(SwtjfM!6*dp40`gl8R^=AiC1DuaogV~|fkU&IYl9l25qRo*Vfsm*0R7+}9BtIoa z^d2!f%-D_(#^9-q9WjJClIZ+5HfIw8lYgmOMbl3BnD1(Cl}Xc?w8NxZ8QX!u9>ZMJ ziBvrZkyBa4VqafqA2TJG7o>uuMuYNJ=z>l+O@TlHp7Fjff%NlTxw~Faw5SDrRt~p}~;M(4uSvVLWVv z%m}ojX3*?d6q_=Ok`adSPQwqji?WUzIlEw{o!Z{kQXv&ety6WDO*Ng*IbbU_zo_c! zFIJu9d`@k#p$ZmJ3p8&O(Kh=$LQp80nq@Dq5dMfg5* z!Jd4!@+`Om$az{v5BWZ`orW|aE4XG}c7Q&u@r1PdHP_l$;daaX#sp%7TKBvof;M=n z1u+EY7oJ@UOio()v~IDG?c}McIkaeAUz@wJh-aXy;OkCNx8T6wFm*>=)@^mk$}i}a zs;ASYZJ$<+yqe29ss%n=8?sg>GdbJQEz5+n)zf$MCDTp|j0R!Cq&eL>ldgsV z`wV;yp_44EvT$>C_S*1`HcTa3#ztWg_BN1B;wq8*(N~K4Qc>MVpW8F$_6~WH&~?TO zlVJQcQG%iGka(PQlVG$d-s^S^RA;zdKdQ;gC=bNrq@zXt&%>4Y56kh7D)EoX%7uz@ zp`={EuZLeL<1dx*U19g!v&&`Wk@=Gu_oXC?Po%J0@;9| z>U1}yx5%Pk`0gp|zG>19UZ<}q)jncKPoxdWLC39?bqqjldl86(K3yvSTX`0+6ymVe z@&FbVL_kzo$-a{*FyX_tScseMf#={NkZ*-YWC>#0mjfHZ@5F8BdAl4o`|rj3gLCAs z1ke!G3XU^Fnsa6zXZ1 z1p#E$K*Yi=SqD*V0D2SAYB1^}klGwmte6(zAdURI_m%2Y|2+KY{C2mTZ($0jSW$yc$PFJm{|fuj#M-2NjE zt-Y?^Z@(ya#VcKLFF?9}CcGw67hoUAmfwqz!I8a@Q*PbzVCNS_AmyQ%%FxW-NU}U~ zwlZ?o3(DOXD!M~k@_!*%^gNbJ%2-($t0-f@>~;2Ub?}p+XJC!#M&f}6ItV@o{{aGt zS!gC^;2X#{geT&L2tAFt8@_elH-qcGZJhm9X~)&NXo#0UCZ~diMl9Hn)}?O-oN#mU zy3~#}yZ~eb!~aCAYk>KUII-bxZBhTaAEadb4)o(W^Fl+=!UN|8Bm!JQ1mr5SaOG37 zrlX_xv93C&q5JUE7&0;xk^)}sm|_|kM_;ha+c3+=dtelNa53L>Y|4Vv{0i=^j%g%< zEZR_s@MKXGZfK`hVM#1d!!8@D>(^?zt0{; z8Bgx^U-U>jndtNnJU;Iccfm&Ok0_1mZ&Ok?N7p4X|)R-#jwJTzBM-q z8N(^sAO;szoayHFjn)pO)IXSiJg{ux?!67#5DO)YHjT>=myY>LojLHHAS3oK_+ z`g3kBG$S;)8??K|8|6~fGq2Dzh++V?&ja;*f*`o0W0U_}GE!=wk!yJVu&US0BGslB>ns?=UxGF^ICeV63f5^1aZ!QrieN^tn`g>vvjC3s>} Z_T(Fa(BqMJ(+8iw<|E&|XPi6l{{c`&bdCT3 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f54c5743c550db83f4f97d09b0f221da4f7d2a97 GIT binary patch literal 31141 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c77bec2bf00ec83adbf5c3857c561e85793bc463 GIT binary patch literal 8947 zcmb6;S!^3emeuU$eTt&)t7S>HXj^g|U$Nxau_eWqq($X!@9sZ)y)FdL_&@gDJX?>@|By=gah3|-{x5^jeIy`(Nur36GZBW? zEfEXN*$7K>E@Fk;lC-7l5j#V0*`y=oj5ukTOS)3-h&$zpcv9YoH|2}?XuCD(PX!`1 zv}{WTQ?-#=TDB)csk%rVEjyC+sfI{Hsxi_?>&|3TsyWh3%dTWgsx{I|%kE@bsy)(9 z%bsLMijVNL>`iv2_C)s3vMW*|XNOa>6?9mVV>WTC)$b!xzA@Cs*YQ&z0EJB~d z-*_T>El5PS_Lb{m??X71&*5L{57V(h7+WjWiggb;=!Ji&cfSx4y`o1vARf4BX(~6P zN=c{_y+Tc;ev=dGKjb0@g$D6}&` z!kq4%eD}&obm+p!(B+Hc=XH)C=-g;Rl6A*hSviqO$C5C>nvG#ego1r2lS;+X0u*Z} zL`edKQp;H4ZXzAF=z;OKqGM+#Vakc&v zf_O7Fla!-k`c498(kU@b_Q+kCyK)io;FU!7om3KMXM0C>@4W(sPa zS)7o?Xl6#v&X8W`OiU zha@qEZkc?^3J^TBd1mq%6syjk33qiep$K~Rvaym3KT*C z^W|ww$Gt6jehuA~;}#eYGnNP(D2N%4U;}cs33kygI7El&tQ@((i7sFkC-l1o*N#4d z&q13Pi`bt;I z$1`a;mPkwdsrP3@Ja@W(zTL&srw7h|ivMMXa*Om{8DUblVNssJ>GAlse1UUtz@O0J zxBpBJC5LW7Zak~ic;!Zr*Mdc01y0_ULkQg}Q!)~)k8BTZAf@1MJPd+4w{cgk<@V}a zuvf49&;sM(Z#+b{!ht!)=PiASd3#?U;k3KD)yUYZzZjiALTHbN5}&yVhbK>G()<;J z=J<;Qo9`|0G~ZJyghAGDf(T;8o)YEQofy{br7oSD7L!>_HbA%~o)V&PmXhv@3A6;v zfCJE}JF;`xM05rxbsH5&Sg(Z(5wT400V_I%Gc#FWe@+sUHzjhKJnkeT-Ib}N`6d$~ z^jCF-0av;PU=e8!&yx44gWquQnkS%n>a?0hE!4CbYP>h5)x25sB4_7wWOus0BcMn@ z5IMa|?x&7@8;*Tz%-YdMuNNFARmVxCoG72@_7bJ&TntZ1@$IXGb;-3+;@AtDzmIYj z$uCzCg}|8A)$f>`Wr5A1-3ceh<{0zUE^u-cIpjF=Yzv_D7i{u2Apx2F3>iIy?S2k_ z8A137^1Q2PfTj|DhCnasV7DpgH4xJJ?LPN%s=$OSb>G>Kn{X)|*g8WYafNuS@ zMZ`EqnayCk(s8K}ysQQ`!1 zlPFuT{(q<$_{F+oyv>Pnw$&<*fL)iK9Ft=N=7B}9>=ubDB@*cVOHsIDYMzWoFS`_FXi~$Q9*^a(217 zGS>VKlI0Qt*6kp!0eWjrH@1N;Xh zTX@g)0a!G^k_%uFa-@l{4`~Sd@Ln=gZMEem8I~j_(m=P}rPiKqizgGn!n%7x#9&Wd z!I`^r_yobQzDevw-9{KRChJaWJ`RyZ+_X4BS29@Il>o^g$+2`?)VUz@YqZv^+RohSs4sKFz7`?JvA)w%V3h0uT+8X){xx3uuo-@D=O zU29suSn!`#{ipL>(PDS@YPAjb2R|8Hvp()oI^KZvq`OdiUadW!AI=Z|Ku4@k`=@c26z)=yW4xVN9KJ&QSbavPkw_^l#?3Vr@Z%bD)=k6x5`5n#kgIu)D|Bage zlhYzkqzZo%XHq1x9k&AMEF^iTrE~43q6XI!(p-NXXN?T%NRQ zBrnOp5CWe_ClhJ0pP!tDb-*csnPrKLp!4k9N?OkFnKUdZ^6^-jpOM6VidQAl?WMhi z*-9fOH$_3%h6$PJ+-;GVK(TCAObfbyIx#g3vLE=8`nmWD!Li*jq6#)cSUSotrL$nt zR84*zkR?LEhUhf7^fjns0^T9L{{>(Xfu!ks?Jr}G#uhJ7yCz^gN;u|dp4I%p<>N~q zZyZ0A9S@`%j_kN?e_d?ogY}H!!Xl>mq7mIeT-B&~a@)wpT zKN`=E7d^;Zw>-HtzA~VC_CEFWZFu_DrV5_ps^_@kIbO7(K*MK;)_T{EKI(tmtnME! zG>@pwBOCq^#Xq7QJhJRq3ElIp%oPIRAD+S5j{E*k{DnZL8t5#z_o(hY3b)5#XQD=R zTQVlY$;GP~fSd(o=DR<~%)rFEvt$mLNfg+d{q4PKbKgwR#}F_VTk#`vOo?ggtC>Rp zhO6M1jRXdzFPU&HKZPs1;T=m4xFsewzeV1kKDfp-<4X<OzN+#LZd^V~9cT!WkIeF7xf|kW%9~P4$c*TRjpkQqzll&~<G1QA-`xlLDR!PTX@x)z5tx9_RDW5eCC$`#x_s=H@#ShKqod&8!; z;iKzI*Ne#G1WgG5xN|ADa%Tgq0e{bCpjBx*wl4oQR|pKNfnkNFXMxt0=$h~-SqKcO zfk7oOxLM1u))#7fRgw;Z3tcm?8RCl;rs>#LWBYSES6BZX0s!1v0w53SI#)Z^_ZC7Y z)zC>Lbh6k~-U8jnbF!K5wzpN;;BF;i()=_kiyV#cx)QmFzn(pKu8;kyk2`nR{?$&+=*4YB{A%ty)k(o)&Y$90Z zVX~4w{~KX&lfLGl&Q&yQmJzJr|B$syPmbMP>k1Hko7%xf=9L$0Im>U)<}5j89xPtL zLEwTtXBV8e38jGGw+T;OJ9KRMuJVH z2mCaa2#TeDEBjDXR0Pa1JtEr(i+=k6z1*ZCf;gzet6PUMEjc2+r=0`3J zB7#4CVdnYC5r1r1x&&rRNyig1dBOCBS)EOaX&i;B&Vu{_XU)?83cdk#i72R&1bN{) zMGOmwA7@X`cbZ}w{il+dcq}QMhC&(TV=_DfU=bA&TNA8+t;Uw`Syb1!!mhmez+DJ+ ztD){cNnf0KeB?h){QHR~1Im?&uV)H_SJlC*g#&M^2i`91yQc2DRtQ}yvZjfsLj8si zU&XG_4T}Y*q4gUQU-*W&XD=An3x@xO@WH%=?|s39=UKjw4?A@>6}wAc9cQ6acgW&h zc^1dAI%mLJnM9gOUMeE>;MH`3II<&Y3h4(7H??%|Z5U5kpPpQ0N0`cGj||Z$2ocdp zlkP1Al%vFqlXN$gA%>nI{wcH(Y9hkB^cd#RX|ew^;p}!#lpg5cUgiM4vc$pZj(k3aC-Yx4$*EOIs%Lnr{jn;L5k z1uvUeN^tM$xx9U|hF`7ybHg7S)|%Jj>sJe%gKFnsq2`oYa|*WLZc^MmT1!|t_p{;PLwYCTurhgE)f*{ij5tad5kfye()2%j$OIa6pk z^AwD$=8-3)7Oy5o)BOz8?zrQ8icRkX&W&J=!5`fiErOBOMDiHn_+iz;JvMK$xM6 zNO0MuK(;}ygk8UYzf=bRG`8E9zx&yHiu*vpeL!^|P`Cq>Jz&!D@L}B!pU9>l@PbbP zHaC?swy^_MS(m=`;DXkergQrr+hB<4*&)ag!;C8Kbq zBBntUa43vQ7r`Jg5$Z)znT3fErc%Qo9CKjgh2xa*HS#pR4|s&iq<;Z21r}f!4fz)7 zPea~C`qPkWk^VH~U!*?`g_LsAP?us(8fsC@Nkhk#pG#Zl4aJ}nk Pb8rnd0NIZMD%<`KOhi~N literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8401790dec0dfae1046451b4b41ef20ebf179936 GIT binary patch literal 11290 zcmb_CTWlLwb~EIV9FoI__>e?BXSadf)Kf1t-F$)s|2rya%-To9boCVx` z^_)9=jVyb&i(X!yxsP*S=bn4-Ip^NbTrLL%Zu&=qbN&!T{Rc*Bj;#hB56~2Ko8l>+ zPEj%Zno@My6f@BnHmA&KCdQ;KF-zJSv!-n^TbhlrX?x60@|lz)?Tk4|*plMXu9%C2 zttoff6Z53KF)xYRQY~p;%$N4Z{3On%0_k8ZNK+y?%?pt{C**MgyD6`OcL_G369!#%yjx&|4xZ-eIdda*j^RD;GqEn- zD_De%Mmpajbn`y=yM^vKmiGfr4^N+`B7y(H`lchaW_=@(S`?&+RkKeB89_|svZBVG z&OvA^aSL{`Jw(@$=^)#d{(l31d*Fn4DR}dbGBAAs6R`xx`{B7Z)O|bE-zzX&z3NeCX&I&Wb#GJeZDC5+e=dWb1S9_j+&k+WPDdA*hE-R)J*wt`i z2D%c?W`uB745zcA0J%~wkxB`Ccp)+SPGVk=q7G8_!WBRw{SGH3KntHcIXXC-O)sR9 ziA*k>P9#&|D?)-7#IRm}loZSNkxw|hb3x3`hu_W;T1%J1N2~Q84@aZX3z}6Fa*JYS zdbZANKnGkD$Y78Enh>QxU4^giO3iq+L|8Pui8u2MZ{e+XZJz>BzpN3KqA4hEs-c$Z zj9W{=FV8l&@hM<`SucSL1qf@O&YK43^0vXjxnxR^G>iUmNWfe|JSQ#+C-a90p>sg7 zxy4i}oC59$XXlz|OUfXf!a`#9N{!Uf2%|B)0PJZ^%o0|zRoO^mt_Z0G5&Hr->};Bk z10f~Nk>E)P+0MF<5G6s>{4j-rm_r0ej?atP#RXtJMiNqU5>hSv{kgG`OBb-^OQ+tv zG?vIEkcTg&5;F%c!7N=BW^kwH*@(Zy3giBTD;vL36gDdd zvSM84Slcy0oXJW;gw?F6?EE~ij_rCv%p^1Oq6?bR0+NsrXRpL-8~~F)m(^SgA}~Q* z6eQT*BoWUFaR32!FJckH816%`6M$xUcTo^;XtpZ8ghR)zC@gNnY_qtS$$Of)1rl~a zjx+-RxWwbHP$qk5gY*4#`on3tb5h}^RBlS5a#0XcNY^WBqPLZ@i?EIg@9#If(;TD+|mXQi&1no{s+uFej1)uf6`t02h3Eq>)=b1q72sS?p|GLATqkG%|J4WL;dYux? z0>jfsA&Z1e^^lo_EJD+94wwu{wQfqaY?*4U*JZ1R*ex;b^?XM?%g zS9jQWJ&Ua}j-)xOAwE8HL$lY8Vo~#^g$dg>Hl|?Zn!Ev&fy8^Ngr+?!Dp4OTzm7Epetk5_RPQ)AWg)H!=zM`iiHt_`* zqqq;jegp>rXr6dHk;!CpWK2>#F5=EcI9xo8AzV#5SC3!_!2$S7{|TVM)v&A`uI1Cq zr*EDvyS&R&%TqU}%I=osSC(J7`AWIBf8G4alFaM{uP}SdZr|$gN)ospyu!4VTY{^z zw?Z=00bXG`${yeH^z!u0>2fP1qE{F=LN*~i-HfkwRk{_CnNIKu(^=*`%ahBKHz&)! zpv<6Gm|&xKo3Wk#)v-1It<$O#)+2g_KnUnGAj2O-8sN@i5Nc2dKsr4>0DIw2+>;=f z+@^9(;>@Rz`6c{yw*)fs`&5D6`fxJhj#0+=hi={kWvR{SOQu}?2%@N>dyeMK@3V$O z430IU__Mi=O^2MhU>2jfnid0HFEzDL8w)HN5Y0-~M!XT)d~6z92jR=wd;s#coVQUn z=WB!;3w4emBV*s^mY9NRj9R5HKU}idsSn%*O9N}kn(^+SayU&@*9RLnO}*GT=%6l?C~RjyX?fY& zPdVOctZ~U+u$P*|i$(#SyX)G7>&W(6N<{okd>(!Q8ElaN4&RQ6FY9LAR9>~X2jJTiEyf;^mQ9y^Q_4zf9 z1~6M7H&`pVK=VFG^Fvx)3x;^0U;`K|umD>judRj;@ivIJ*W%Uk?FCn-W1|9h+?4D=#q<4#+gr8aWwk_)3{!Hv0TVVG+6MN?t z*t-f2piF;(`#Jr$^c&P|nuhhe^6$JG4&6xpzll;gkpLA-4D)a}CR0*)PRyp8bS%C} zCzqn(S5a&YHzyLYcrU4`daUjZ*AC^qVNh?Q9qSrg?c@$8NHw4$h39qa z11Qk_wF8{jRmEuTy<9(P&ZrnRcSH*JM}_(ML6ooiNku%!k+Yys-q4k3!}-Agn;>sL z#wB>0O2Ynr*|9`}DpBX30{wH-it{{04rS2&+;yvlZqhJmrsxZxY668M)G4dd`1g*Z zd~!C2O8xQtz*f?K^e7T2B^{48FkgcTq;3Gqljv=K~qX zUI^TV{R76)vP3tZgaz8TT7PC*0ijD5HSib(!Tl_J#FqeU8VD*nf8IdqnCGw-)Jk9= zzGJ#y&;8!tSGu71cdP#0_0*>aQ=b%+`#+|u!*N~$>Mqesrh@4M^ELV_dx3@_aJ39FK~-ATMXK`<`;*gBAI$~8mihraf#I-cb^o)-YTugq>m9$o zD345oF9!54Kr*I$dsUbnkRoA_^T0&0nBhmlJEiYUd&3$xyC{kvEXE1_OzXlEFwWs6`U6vA z0r1pcDl%Q8zUqgigsXx$o^I^pu(_M`t!U*4Z-&k>TQf9@%D1U2$k45u8Tx8n&@;03 zN2Zmw+JZHSC|wY)u5!3W^9KI5AC-hEd!Kv$I*p?-Qs1UPv9Ig$O$!+}toIf~SkkpR ze*~>dD53)Ac&2o}p7_0YTWQ;!U5YoNdL#98!ZsQ+P1K&(rzfY+zBxS|F^khsTx$UX zk_e{I1tG%=nb{4#{o&Kf@T59C31d|}Q>tgGVy3;X&=rb63*~BA zd1Y;v%59UmXz5~wY0A`5bZDzJLP!O>vGtm6sy2~fi*I1Bkl%i+uXC;K8FQ9@@h>98 zMXVop$S1H9R7|zrG!4Fe+k^Ij`|Sft`);*;cf|rIkB};%mcE7jq7tMcbo#hZeAPy7$4mzIY6PMv2EU`~w6(MDQ|#69`5DXpYgk zDlU#;g6+Jnj*H_E%iB+ZP7YR7u&?2^n0LOaTUZBQKQ|>#AiniwqMeJUFq_jOgG5Ca zPh-AqO4rlHGZ51aZsg?X6j8v|TFD{6fx%PT)0jKDi)9u;^|?XRd;p zFQTnUv?9RGN@FL58{?vw6~!N8)RM|x2XmlZ1bcowC%gyuB@)>AbE#womT=2SFnmvE zb0_g^Af>cmb)kb*LKJwo^nlwCK@t<#0II?oD<-ZJ*`q;Novd|YYBt=dU>KSi0uhgh z+OuW`Tbkx1Hbhb!j2-DD7(T#8$z#5wktLFyq&`hrOY=07Q4j)Z4kEh6vBx?wNiWGN zM5@4f+vI+zAH91ZLqvdcB;ig~-9rB8rkvXq#}3u8V|nx;5r6JU4-UO{|Ilm7q4VmY z^B@2z-V3Vt!t&`d5i0I2f*7Irj;X$5%aa@KK)H4{!wLNhsr2Id9;Nr7+ItY93VT*% z&ptAnJXWw?daTP66)VMhU<0yD&>O7#r|u8ka@)Rp2Yz+rACG+frZPOP4v#DBNtHb* zvnMNz)#CVl^mv7W?>C2kH~QOSB=~ILrP{Vvz=jK}A3)JjF`4bbvcGFBruqkpW5uy2 z8=f|3-5zX!G8ZVGf{oE0eDdT8T2?!%D>3(AX#D=rxH2@M4oyIs(s4@dIQ6^Pe@n{# zw-o5!R6rB}@vG6V9H zR>CLL@CljgE_d#I(0S;7=b>K*<<3J&=Y-lhQJgAHK?lRwx1I(lcXne=5qEEU4|Eb} z*xKz=5zkErbBAQZVDimVTQ?NdTW)zDEnbhHw}%nmBhb^GW?M@#JbcEvxa z`UhqIV5JkYx}eGN953vN;hWpY}t`s%nDN-yVklY+c3PH^0%+< ztn9!r<-^OK8hAuPL%@rKE6HyEFC*-z+4LK;W7KQ;jfV#K+o3(ayf4{VxsJ_Z|DuwW}SS!`=<1Ls2U%X;*w zR(Bd|+4MGrj03e#;>b8y13p;qo~qGbpvChBtoAL&Qnwv0w-|6kn{ii7D>x5zd@^>s zp-d1gt$)$jq3)LpsC0JZM~RI{H)x?Psrg06^Ne7+Hm{qMPF^6d3G(K_!NEL>>KkhL zdFLDY1(P1B3bG{Ps>`t?>d@s>681LBta{0+$VwvIRP_=JW7GNW@#;+&URdK>gSyd8 z$3CZDqe>VP--OxBd#XwN;LHtz6L_V1A2!(BU02OIC+Zb72>_TQSjW3P_5xKree;C6k zY5_#hCjveZ>4{>Y%fIhpZe3{A)e0gLk75Q&{F(*d7A+9%fe5S-hj&Kersot)` z-69w{LFT8EL>kr{jcY>9LgZo1*>p3gF+`%ry|f|o>Jl#+TiP`fOL9wGR^R-}su${jsLPua;8-~I5#;)@$x`&v-pdR4Ah=6b(n z1FNx8;7&+k_o(b1nccGiDVIxQccv6}pUUo&*?n85#7q30w89=x*#k0r0C6sr4%~T3 zVTV+9NM?s1MGp3_2h_-j!oH-kFUjmnTi5iX(uF&h6?Rx+uUL#Gd}-tGIL1vx}oIH_6G)!k^}f4Ng*&2h zM`Z2@rt~P>fXWTX+&~%RzMd#ZvaWputU5NlU2AWYVv6?#)%$`>JgG$CA}SY=xkx$G zt%i0Z_5lJ`EqamHKYRO^Z~wz(7`t~^^$yF#Zz|fmL+yP5OYJ9M)u|VKTk-Bwz58V1 zK~M(u!F~vfwkzCrmD?_J+u@PMN?!JCg938*8O1xPdM9P?Bm^FIg+Dn1)wLWVV0COG z5H7W@2fpg~qT}a?HLZtW;BvwDOwrj? zGCBjVXyVm}O(Kc_TOq;oxZI)yXz);ryptghU$jDe??Qzj-GbJDz7mfhKA?(Lgn3CYw!>rMc%ON=)he9eahs@OtuV z?$`Xkj>(5#Rim%zX%T877Kae}H*0iCs9pK?Ur>2~6r>0mDzRUmCg{GBPhfSw z=GOzI0IvtMpdKoPcs;0vb+IJ!dPs}t(NdJx!&*#_m*RS&l;CYqOX@?VAzqJYDLq|E z^LkXv=-E=1*JD~v-&5M750{2{JFboBqoq-OtTZMdA0p`1-j32_d`m#+Gk9C2w9kj$ zKuY2xq$Ej{#J2)43U7OKzaq?`siFU{=JhGT4gFTus>Fg?;F@aL@S85nhH0o}SyR`E zWXL*!&S+Uz%!;j=24f9hGId=xlqsK^ogrAt@l=GY>$hGol|CNq&&C^ac`W-2nZh(yVURh1H*7`6o~>`_~+tY2EBrY>o! zLEOX7b@SOu|8$r=T3#mQ+Y-5B6KcSMYZ53fFA>E(R-vX%%C=NdD=oRYsi=#vai)_5 z&#G!D=Bib0pB?|{`p674AAluFf`UpuMJV|dUn!tOl;B5!QcwwzkP;?gB93)uD}EAL z3@IXvN0k6rA?l`X80~Ge&riMxhKyn;-4R@o%eO&es~F`2pe|M|EH7vT+a|7dBw*dN zY}^({l-@M_mSL_MnA|ComIbj)$=Q~$0{%^v60CsftG23H-C2EtR#kf$-@I8_vzJW+ zTg0wbij}nv!_Av7;niieyv&uuSR?WZ!3$&=4i6h9)`=}EvMn=R6#`b!!Fn)5w(+8> z5eu&pP@t=Jk&7wdxiVENHeRK2r9!CHW55e*FHlAyD?~FZH*dD)uit2Ea}`!Hv4vDjk8_*tF;#pn8ckn71OxFHI=r^fYiH{8Iw5qSOZeoLYE0ji-}U6XJ2 z^L2X_LGdYmC9s4PaFm_!Rv1DQ-c}KQiUbiHEvm$n_)cOg2(#h+>9g%FH$u0V=DchH z{j6O_Xb@C>icSMkyMXhfQoFirc0#MG1FI;>{`1`OfsXLD3WG)lX4lt!1-hOn6#A^@ z#`_wU8)9x`C~koH-1@CvZ~-J>dztk7UV~78=ur*cy`-)X1NV#K-cZE&on;8ZmS15& zOz?PIwP2!N)oiuGVpG*2W~YK~Kp~b58k8BXxM77X%E04>S!Arp)D0{XtpZzETMrfr zYs7N>j6^Nlq(ri5m8`#V*)%3?EL*qnqDgVtG!|8=bDYBFVjl!3L?axei&K6&3a3OF z{Lp=juw$DFyCNXD1bV{?vchYi6=i4drWj63unQ`+l^r)%2&Jk*UId^a4!G3KLhur5 zGocJPm#A5-0GbCZqAgl10Py$kUOqej4w1{t^H<-UzYJ(_QMSmuCNG?xhXB0=C_H~n zU6{92n-n^5HxEGfvZNX<;C{K>x^k?SyMPBEh?u-5l=&DuuOV&CX7P{jHtkh{nc z^Ro@{&8GNf zU3`-b#~z83yW-@wuzhOhd_#P#DZWP_%rr4@^klg|5`0zVS7(+JtY9Z*45|Fa1}h$4*exKcuIc|K*Lx^f|ay; zsRbH@SpnJO9X^22a4oQccEmwx0O^6vWRI&?8-=j%;syFM|IremK3@(Q_OL9fk zG9lF@%KF@_u>y&$(huop@llG^B?I7A!37TcU5o*&<(V#IPZdBZ3$uK9U^YO!k1~DS zu+>V1*Qehzt8foMHpZ?G44DojMbI)K@#(utSVpv-!pAH^@FAAfv3mfo`wmUHerST; z37(Ozsm2mZQd6HLKG=NKfA z3lrF0D7$~%kY+9|5$cAS3|NjbN2PH_n2S*6b@UJ;%nK+pxf_Cmgf9m-(mgD?pY=yt z3aR#*8)B!Y+BDB5F(jZY#HXV4D66wWqs&^g0K`qh(O44ftS9f6tltm)uE_3frmq|A zrTK2U%PLi5dl^zwi!H#?=T@N;EeTa)J$Iv%D0eOg_&E6$3|m?7D!3Ff!;do4yP4_j zGmXs2X6EF*@Ynke)WtC;H|n88B*V$Q%a1dYPAcb&;pSM;3;MIkCkV(>M($nmM3lk#R0uuBY-}9Xk2>rGH#)96H}TbiR?Asi$VXNew?p{xRwKe0z?1A+%@gNhFxg zJVijf9*HAZV)P{t6`2)U^xoCS2TnMt(ap)v&v<^{L0B5dQ${=#PB1n`KaT!4ghtLf zxdYoH&8ZpS9LWIZ2rL2QV?V5!8~M|#9um^Cf^+3+J$Ll0i8EjLzZ4r27n&0n8o7(# zc|%-Y3Z?QM3Ph5RGlxB&kUsv!J72!XCLZU+*`I&-p6Bm0dEXO%=Qup%Pb9r4N{uv! zUV*X5C)drnd6S1JCsr7a$J=DB~DQ*)8twf1U{dpvxly4~G)> z1=8SO3U<{3UdXsP)VQOA(t6*(9MarpG=+sY=shbN`ip?KV7+P?vT}>VDM!X<7vQH* z)K#n8hm;XOlU7`MkZw%f+o#@Oa!LpLnVXa{=fuJLRtsSMi%S(lE? zg0{CjLZjBoTCvjZ2&s8m`C*1(1rI##Png-KOe&r#%r_m30C7 zB0)MTGA<|1IdLK~;yV%kOE?_h;JNyb6B}20IPQOGruKNMiEn;@#Mhj}Ne-DyS#L+m z!Sc?O6W&hQm361w4qE4uJy~zc%hGPymqjVW(jM8L4Wt4r?UjSsP%4xSr@}1nliRY9 zRD`9G9L>g3F_!kr?b&!L&e8$7Biotk%qCI^mJiBZ+3r+#wkOrY@*%l5+n4HN>9E|N z9Y_si2UCL%&dFi!){$DLF#pKGaZli9J*lLV`-qd;zT%_^4n1-~9sH_wM16XQQ;l9v4yd`DyFwE&84$azMy9EIc3yow*LlyQOppW#W{5~ zpUsLn$qe1is9Qo>#$v8mfEK=MpRTT6xONSap(@Pz6lZ(~Av zUdkz|D9a73%>fXezAeajQ%r9Q3Ra5+p|CB~6$#*+QY2WAGQ@1l@v#t6_E*#kKO6V*1BPe-NE9O!`$qnWYm?6u^ zmR#}QVeA4tJm;xxcvi=YB)yfngB2e1O=wTEN)`TB`d1OS-bqk1||xxZed=O?ua>+6681dTwY~Nz;O9&AtPsUo0eoH zzoFh03Ff6Dp@sMkCfj_*8n{XRB50V+(`u}W8Cf~bD;QJuj2p8tFXhw9BEO}o1!Zw+ zij_?gEJ{E{t0pt~DV&>$y@HZqv3@RO61Z)q_>ni|27W@P+h4SqX;LC&4D!h`HvFpc>l zk$<{@oKK6g-GqJ&Kh|ccI>RXMDVx~z68PLm?rPdzP+a6L)ul6B7(OO;C*NXGsQ^U69|oVj)dds!$k}=a-;-Ko+4E zGQDD&IwhnJGNd1(9nZu>f#99bFXhs5QNjR&@C3o&mMDM@8Cbr9<$Qsws@U7AV$ z{C2IM$9W1j^Er7N;8{*mcnc)fX-8dz`doF9gpT)UpNYUnqP~e@21JRafVb()E2bBW z26iG|AY>iCnaPP{+YC}MLNyZxO#z42vh83W21kXAk_S9Yc?AIe3I$v^IX!QNp}rv- zwOl2u1vmtX8B9aZz`ue~RZN7X3GrHb1To2W!M zfASR<@CUx7QH4bb&L6Hd`*W|6JgFz=jpV$J77VnYp@jynw0d4oo-&fBbhK!oMGY;s zRG-q5r;X%k9W5DXNkdC5)hl}PtdTscqjLs2r=fE#)pL4s!ALIX=#+s@Y3Ni-^-nNg z(vvGjaz#gH40J|AXIfhSgyyq)a?VK3>1f_S^BS6OX}zE)7mehij!qlsw1!SMRsU&F zPfi=jX&ucNXhuUbO|?eyyq;V$l50A;V4w>cy3kU6LQkHghDUP-n$yr+OLeR07mef0 z204BN#zCtfLhJt!QYaMcPjoc~MU;8ObFbEgNWA zL(5Id#LG+*I@xBbx*)0xL=_fwwCK{x?Pcc?qjUOsC}D(-!W_Q;cdtCI1TcVTFHi~4 z*1prYRiOMB%4aw_64DidI!wA{3DRs+b!Rrs~m*8tYvHi_m7f{-{M*5PYUya%C1MX5jWG#MjIhGpp=|XUCoDhyIzoJ`)PG~(AEh(cSGNsu+pwi zwec9`U-C8E#=)sJ(qZ!J9#FHr5y)-mQ(bb&3tT-V7szg~tmFn1WP2!2J&&MYPwc+! z`hiwKUu?&i^ju?pt>&Jjr-l|ZnzY_Wg||KDEaprEL?9{3b*Qa|A;#M_IlD;3hmnn zu}%j)eVx-9NPQ#n{G~l=)v*-Zr?Bg_r`ZlLt4`HPN+C9$1GSP6{RRhXxq@Sp=ItYG zntzI#{iSu-?RVRDBc(R5@V_z(^R@OQ1opObb;~Qx%iJFvP?xMxS|xr?y-+IwL_btZ zH&TK=_DazDz1%-H#Hka}};WF&j7a?SgaoW zn?5+ur5N1wQnU@IFC^vf=H$F6F)t-dAujxgKw+Ed2gH6e56SIOuZaLK160I>Tmr@x z_aM_xNYiTzGDVAj1rgi@BrJTa6bpqsQL$tl`77W@(1U%`Yxx`G1Z^@4(T;TpPdyyQ zk{!Pf!;viTze) zG}WVd!7>1$YayY_1fgrD83soMx(}FJ#b2s~o^=tr9GVEwIlFEF;{*3bSWoEcOz380 z`k5)1EqfU5ZlDuv174w|;c7j&8(@vP^~@+8EDYFR$)o`*Z{$rMI0KAof;RMmPX?Dq zCdw$5S>fMl9{V4l8(%TT zSM=^PM)#S$@XL;5xognq8qwk-N^m!58ta!}#<;e7f9s ztlZI8?j50VyrI6wmrH|iblJ$l$XcF;Tac=oSut#?fC z{lw_~WH0h!W_B-JjvqDRQ-|@ngZP{tUohee70&G+W6|DfInsW=RN-9Vv2wKgF#6#^ z^uuRyJ$llJp43=)9-DgR(qpqmY_`HVDA~Ya^w>f4*#0#=I%-5mwdm;gFHrOlO&_4? zXH&+^)x()j4`x2qXKolXH+1xwfj-mFXJyoNh)y3Ma0RQL!gpS7{6p%MLZ7>j7~P{< z$7s1XY4lEMy(gc|l>3evebZXs{IlOwg5Gf$EQr9384u`aWH0h?u+qkL3{|+0f1E|o zmw4jAf)<+Icl`+&{4}I!fMJOzjQ9syh=uqE6*mfxKaVCJ1Rt&%{Zr4njOp`wbk&Hi zYAk&JJl+eQQW)6QBB1`d?T>Bcj=6G2*MpDC9i6Xy?pQlaome{<5~2VXJ8~EuK8OzQ zr}gNV5gpTB3*W<22?I}ff7ix^B748rgM&tJa6fqv9MXbA&)WyJBddD*n$f2{2i6fWd&cDS2mj^t58<@M??fLI+52Qz(gyO%eqahOs0$nKt!3+qnVo60< zXaqAP2wxOMxmx2B1i0CRVoyRlxMNRHAiD7j(f8wy z$LXg%R{EJ@y&L0KE@<-Ay49$$!cvUtG&*GZ=&}jRB{@oUOhaTM@b0YR8`?S3t8N!4 z0qbO(-oDyrEtA$B%{Hl6OO2edj>-mJD~G${FKYMngx;qyOPYhP6T-2bT2z1*jwIRo zZFV;k;V;wJ`i};-#+%2RtMdg+*r}T`$rfKLuKmLT+lS2-{XjRSU-d$qQ2&W-#jT?0 z9;8fWGjLH&_jtDDoBhr5EgFWPD0X67eqS?*g>{&AuwS!nknOL2zynvmd$v}DcM74k1oL0xD?g}CB!I2>iJ?H>CpbN+kmugrz-vA;6cr!|K%*QGUw z7u=ZE9Ln6UwB}IeE^BWJWo|}m4rOjyYYwlstvFo{CoHNz86nPb)}e7{UJqq%PHPTj v?i1}z;f23`` can be a glob expression or a package name. + """ + + ignore_require_venv = True + usage = """ + %prog dir + %prog info + %prog list [] [--format=[human, abspath]] + %prog remove + %prog purge + """ + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--format", + action="store", + dest="list_format", + default="human", + choices=("human", "abspath"), + help="Select the output format among: human (default) or abspath", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "dir": self.get_cache_dir, + "info": self.get_cache_info, + "list": self.list_cache_items, + "remove": self.remove_cache_items, + "purge": self.purge_cache, + } + + if not options.cache_dir: + logger.error("pip cache commands can not function since cache is disabled.") + return ERROR + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def get_cache_dir(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + logger.info(options.cache_dir) + + def get_cache_info(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + num_http_files = len(self._find_http_files(options)) + num_packages = len(self._find_wheels(options, "*")) + + http_cache_location = self._cache_dir(options, "http-v2") + old_http_cache_location = self._cache_dir(options, "http") + wheels_cache_location = self._cache_dir(options, "wheels") + http_cache_size = filesystem.format_size( + filesystem.directory_size(http_cache_location) + + filesystem.directory_size(old_http_cache_location) + ) + wheels_cache_size = filesystem.format_directory_size(wheels_cache_location) + + message = ( + textwrap.dedent( + """ + Package index page cache location (pip v23.3+): {http_cache_location} + Package index page cache location (older pips): {old_http_cache_location} + Package index page cache size: {http_cache_size} + Number of HTTP files: {num_http_files} + Locally built wheels location: {wheels_cache_location} + Locally built wheels size: {wheels_cache_size} + Number of locally built wheels: {package_count} + """ # noqa: E501 + ) + .format( + http_cache_location=http_cache_location, + old_http_cache_location=old_http_cache_location, + http_cache_size=http_cache_size, + num_http_files=num_http_files, + wheels_cache_location=wheels_cache_location, + package_count=num_packages, + wheels_cache_size=wheels_cache_size, + ) + .strip() + ) + + logger.info(message) + + def list_cache_items(self, options: Values, args: List[Any]) -> None: + if len(args) > 1: + raise CommandError("Too many arguments") + + if args: + pattern = args[0] + else: + pattern = "*" + + files = self._find_wheels(options, pattern) + if options.list_format == "human": + self.format_for_human(files) + else: + self.format_for_abspath(files) + + def format_for_human(self, files: List[str]) -> None: + if not files: + logger.info("No locally built wheels cached.") + return + + results = [] + for filename in files: + wheel = os.path.basename(filename) + size = filesystem.format_file_size(filename) + results.append(f" - {wheel} ({size})") + logger.info("Cache contents:\n") + logger.info("\n".join(sorted(results))) + + def format_for_abspath(self, files: List[str]) -> None: + if files: + logger.info("\n".join(sorted(files))) + + def remove_cache_items(self, options: Values, args: List[Any]) -> None: + if len(args) > 1: + raise CommandError("Too many arguments") + + if not args: + raise CommandError("Please provide a pattern") + + files = self._find_wheels(options, args[0]) + + no_matching_msg = "No matching packages" + if args[0] == "*": + # Only fetch http files if no specific pattern given + files += self._find_http_files(options) + else: + # Add the pattern to the log message + no_matching_msg += f' for pattern "{args[0]}"' + + if not files: + logger.warning(no_matching_msg) + + for filename in files: + os.unlink(filename) + logger.verbose("Removed %s", filename) + logger.info("Files removed: %s", len(files)) + + def purge_cache(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + return self.remove_cache_items(options, ["*"]) + + def _cache_dir(self, options: Values, subdir: str) -> str: + return os.path.join(options.cache_dir, subdir) + + def _find_http_files(self, options: Values) -> List[str]: + old_http_dir = self._cache_dir(options, "http") + new_http_dir = self._cache_dir(options, "http-v2") + return filesystem.find_files(old_http_dir, "*") + filesystem.find_files( + new_http_dir, "*" + ) + + def _find_wheels(self, options: Values, pattern: str) -> List[str]: + wheel_dir = self._cache_dir(options, "wheels") + + # The wheel filename format, as specified in PEP 427, is: + # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl + # + # Additionally, non-alphanumeric values in the distribution are + # normalized to underscores (_), meaning hyphens can never occur + # before `-{version}`. + # + # Given that information: + # - If the pattern we're given contains a hyphen (-), the user is + # providing at least the version. Thus, we can just append `*.whl` + # to match the rest of it. + # - If the pattern we're given doesn't contain a hyphen (-), the + # user is only providing the name. Thus, we append `-*.whl` to + # match the hyphen before the version, followed by anything else. + # + # PEP 427: https://www.python.org/dev/peps/pep-0427/ + pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl") + + return filesystem.find_files(wheel_dir, pattern) diff --git a/project/Lib/site-packages/pip/_internal/commands/check.py b/project/Lib/site-packages/pip/_internal/commands/check.py new file mode 100644 index 0000000..5efd0a3 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/check.py @@ -0,0 +1,54 @@ +import logging +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.operations.check import ( + check_package_set, + create_package_set_from_installed, + warn_legacy_versions_and_specifiers, +) +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + + usage = """ + %prog [options]""" + + def run(self, options: Values, args: List[str]) -> int: + package_set, parsing_probs = create_package_set_from_installed() + warn_legacy_versions_and_specifiers(package_set) + missing, conflicting = check_package_set(package_set) + + for project_name in missing: + version = package_set[project_name].version + for dependency in missing[project_name]: + write_output( + "%s %s requires %s, which is not installed.", + project_name, + version, + dependency[0], + ) + + for project_name in conflicting: + version = package_set[project_name].version + for dep_name, dep_version, req in conflicting[project_name]: + write_output( + "%s %s has requirement %s, but you have %s %s.", + project_name, + version, + req, + dep_name, + dep_version, + ) + + if missing or conflicting or parsing_probs: + return ERROR + else: + write_output("No broken requirements found.") + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/commands/completion.py b/project/Lib/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..9e89e27 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/completion.py @@ -0,0 +1,130 @@ +import sys +import textwrap +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip {shell} completion start{script}# pip {shell} completion end +""" + +COMPLETION_SCRIPTS = { + "bash": """ + _pip_completion() + {{ + COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) + }} + complete -o default -F _pip_completion {prog} + """, + "zsh": """ + #compdef -P pip[0-9.]# + __pip() {{ + compadd $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$((CURRENT-1)) \\ + PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ) + }} + if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + __pip "$@" + else + # eval/source/. command, register function for later + compdef __pip -P 'pip[0-9.]#' + fi + """, + "fish": """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c {prog} + """, + "powershell": """ + if ((Test-Path Function:\\TabExpansion) -and -not ` + (Test-Path Function:\\_pip_completeBackup)) {{ + Rename-Item Function:\\TabExpansion _pip_completeBackup + }} + function TabExpansion($line, $lastWord) {{ + $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() + if ($lastBlock.StartsWith("{prog} ")) {{ + $Env:COMP_WORDS=$lastBlock + $Env:COMP_CWORD=$lastBlock.Split().Length - 1 + $Env:PIP_AUTO_COMPLETE=1 + (& {prog}).Split() + Remove-Item Env:COMP_WORDS + Remove-Item Env:COMP_CWORD + Remove-Item Env:PIP_AUTO_COMPLETE + }} + elseif (Test-Path Function:\\_pip_completeBackup) {{ + # Fall back on existing tab expansion + _pip_completeBackup $line $lastWord + }} + }} + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--bash", + "-b", + action="store_const", + const="bash", + dest="shell", + help="Emit completion code for bash", + ) + self.cmd_opts.add_option( + "--zsh", + "-z", + action="store_const", + const="zsh", + dest="shell", + help="Emit completion code for zsh", + ) + self.cmd_opts.add_option( + "--fish", + "-f", + action="store_const", + const="fish", + dest="shell", + help="Emit completion code for fish", + ) + self.cmd_opts.add_option( + "--powershell", + "-p", + action="store_const", + const="powershell", + dest="shell", + help="Emit completion code for powershell", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ["--" + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog()) + ) + print(BASE_COMPLETION.format(script=script, shell=options.shell)) + return SUCCESS + else: + sys.stderr.write( + "ERROR: You must pass {}\n".format(" or ".join(shell_options)) + ) + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/commands/configuration.py b/project/Lib/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..1a1dc6b --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,280 @@ +import logging +import os +import subprocess +from optparse import Values +from typing import Any, List, Optional + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import ( + Configuration, + Kind, + get_configuration_files, + kinds, +) +from pip._internal.exceptions import PipError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import get_prog, write_output + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """ + Manage local and global configuration. + + Subcommands: + + - list: List the active configuration (or from the file specified) + - edit: Edit the configuration file in an editor + - get: Get the value associated with command.option + - set: Set the command.option=value + - unset: Unset the value associated with command.option + - debug: List the configuration files and values defined under them + + Configuration keys should be dot separated command and option name, + with the special prefix "global" affecting any command. For example, + "pip config set global.index-url https://example.org/" would configure + the index url for all commands, but "pip config set download.timeout 10" + would configure a 10 second timeout only for "pip download" commands. + + If none of --user, --global and --site are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen to the user file by + default. + """ + + ignore_require_venv = True + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get command.option + %prog [] set command.option value + %prog [] unset command.option + %prog [] debug + """ + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--editor", + dest="editor", + action="store", + default=None, + help=( + "Editor to use to edit the file. Uses VISUAL or EDITOR " + "environment variables if not provided." + ), + ) + + self.cmd_opts.add_option( + "--global", + dest="global_file", + action="store_true", + default=False, + help="Use the system-wide configuration file only", + ) + + self.cmd_opts.add_option( + "--user", + dest="user_file", + action="store_true", + default=False, + help="Use the user configuration file only", + ) + + self.cmd_opts.add_option( + "--site", + dest="site_file", + action="store_true", + default=False, + help="Use the current environment configuration file only", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name, + "debug": self.list_config_values, + } + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]: + file_options = [ + key + for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) + if value + ] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif any( + os.path.exists(site_config_file) + for site_config_file in get_configuration_files()[kinds.SITE] + ): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --global) to perform." + ) + + def list_values(self, options: Values, args: List[str]) -> None: + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + write_output("%s=%r", key, value) + + def get_name(self, options: Values, args: List[str]) -> None: + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + write_output("%s", value) + + def set_name_value(self, options: Values, args: List[str]) -> None: + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options: Values, args: List[str]) -> None: + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def list_config_values(self, options: Values, args: List[str]) -> None: + """List config key-value pairs across different config files""" + self._get_n_args(args, "debug", n=0) + + self.print_env_var_values() + # Iterate over config files and print if they exist, and the + # key-value pairs present in them if they do + for variant, files in sorted(self.configuration.iter_config_files()): + write_output("%s:", variant) + for fname in files: + with indent_log(): + file_exists = os.path.exists(fname) + write_output("%s, exists: %r", fname, file_exists) + if file_exists: + self.print_config_file_values(variant) + + def print_config_file_values(self, variant: Kind) -> None: + """Get key-value pairs from the file of a variant""" + for name, value in self.configuration.get_values_in_config(variant).items(): + with indent_log(): + write_output("%s: %s", name, value) + + def print_env_var_values(self) -> None: + """Get key-values pairs present as environment variables""" + write_output("%s:", "env_var") + with indent_log(): + for key, value in sorted(self.configuration.get_environ_vars()): + env_var = f"PIP_{key.upper()}" + write_output("%s=%r", env_var, value) + + def open_in_editor(self, options: Values, args: List[str]) -> None: + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + elif '"' in fname: + # This shouldn't happen, unless we see a username like that. + # If that happens, we'd appreciate a pull request fixing this. + raise PipError( + f'Can not open an editor for a file name containing "\n{fname}' + ) + + try: + subprocess.check_call(f'{editor} "{fname}"', shell=True) + except FileNotFoundError as e: + if not e.filename: + e.filename = editor + raise + except subprocess.CalledProcessError as e: + raise PipError(f"Editor Subprocess exited with exit code {e.returncode}") + + def _get_n_args(self, args: List[str], example: str, n: int) -> Any: + """Helper to make sure the command got the right number of arguments""" + if len(args) != n: + msg = ( + f"Got unexpected number of arguments, expected {n}. " + f'(example: "{get_prog()} config {example}")' + ) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self) -> None: + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.exception( + "Unable to save configuration. Please report this as a bug." + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options: Values) -> str: + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/project/Lib/site-packages/pip/_internal/commands/debug.py b/project/Lib/site-packages/pip/_internal/commands/debug.py new file mode 100644 index 0000000..7e5271c --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/debug.py @@ -0,0 +1,201 @@ +import importlib.resources +import locale +import logging +import os +import sys +from optparse import Values +from types import ModuleType +from typing import Any, Dict, List, Optional + +import pip._vendor +from pip._vendor.certifi import where +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.configuration import Configuration +from pip._internal.metadata import get_environment +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import get_pip_version + +logger = logging.getLogger(__name__) + + +def show_value(name: str, value: Any) -> None: + logger.info("%s: %s", name, value) + + +def show_sys_implementation() -> None: + logger.info("sys.implementation:") + implementation_name = sys.implementation.name + with indent_log(): + show_value("name", implementation_name) + + +def create_vendor_txt_map() -> Dict[str, str]: + with importlib.resources.open_text("pip._vendor", "vendor.txt") as f: + # Purge non version specifying lines. + # Also, remove any space prefix or suffixes (including comments). + lines = [ + line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line + ] + + # Transform into "module" -> version dict. + return dict(line.split("==", 1) for line in lines) + + +def get_module_from_module_name(module_name: str) -> Optional[ModuleType]: + # Module name can be uppercase in vendor.txt for some reason... + module_name = module_name.lower().replace("-", "_") + # PATCH: setuptools is actually only pkg_resources. + if module_name == "setuptools": + module_name = "pkg_resources" + + try: + __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0) + return getattr(pip._vendor, module_name) + except ImportError: + # We allow 'truststore' to fail to import due + # to being unavailable on Python 3.9 and earlier. + if module_name == "truststore" and sys.version_info < (3, 10): + return None + raise + + +def get_vendor_version_from_module(module_name: str) -> Optional[str]: + module = get_module_from_module_name(module_name) + version = getattr(module, "__version__", None) + + if module and not version: + # Try to find version in debundled module info. + assert module.__file__ is not None + env = get_environment([os.path.dirname(module.__file__)]) + dist = env.get_distribution(module_name) + if dist: + version = str(dist.version) + + return version + + +def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None: + """Log the actual version and print extra info if there is + a conflict or if the actual version could not be imported. + """ + for module_name, expected_version in vendor_txt_versions.items(): + extra_message = "" + actual_version = get_vendor_version_from_module(module_name) + if not actual_version: + extra_message = ( + " (Unable to locate actual module version, using" + " vendor.txt specified version)" + ) + actual_version = expected_version + elif parse_version(actual_version) != parse_version(expected_version): + extra_message = ( + " (CONFLICT: vendor.txt suggests version should" + f" be {expected_version})" + ) + logger.info("%s==%s%s", module_name, actual_version, extra_message) + + +def show_vendor_versions() -> None: + logger.info("vendored library versions:") + + vendor_txt_versions = create_vendor_txt_map() + with indent_log(): + show_actual_vendor_versions(vendor_txt_versions) + + +def show_tags(options: Values) -> None: + tag_limit = 10 + + target_python = make_target_python(options) + tags = target_python.get_sorted_tags() + + # Display the target options that were explicitly provided. + formatted_target = target_python.format_given() + suffix = "" + if formatted_target: + suffix = f" (target: {formatted_target})" + + msg = f"Compatible tags: {len(tags)}{suffix}" + logger.info(msg) + + if options.verbose < 1 and len(tags) > tag_limit: + tags_limited = True + tags = tags[:tag_limit] + else: + tags_limited = False + + with indent_log(): + for tag in tags: + logger.info(str(tag)) + + if tags_limited: + msg = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]" + logger.info(msg) + + +def ca_bundle_info(config: Configuration) -> str: + levels = {key.split(".", 1)[0] for key, _ in config.items()} + if not levels: + return "Not specified" + + levels_that_override_global = ["install", "wheel", "download"] + global_overriding_level = [ + level for level in levels if level in levels_that_override_global + ] + if not global_overriding_level: + return "global" + + if "global" in levels: + levels.remove("global") + return ", ".join(levels) + + +class DebugCommand(Command): + """ + Display debug information. + """ + + usage = """ + %prog """ + ignore_require_venv = True + + def add_options(self) -> None: + cmdoptions.add_target_python_options(self.cmd_opts) + self.parser.insert_option_group(0, self.cmd_opts) + self.parser.config.load() + + def run(self, options: Values, args: List[str]) -> int: + logger.warning( + "This command is only meant for debugging. " + "Do not use this with automation for parsing and getting these " + "details, since the output and options of this command may " + "change without notice." + ) + show_value("pip version", get_pip_version()) + show_value("sys.version", sys.version) + show_value("sys.executable", sys.executable) + show_value("sys.getdefaultencoding", sys.getdefaultencoding()) + show_value("sys.getfilesystemencoding", sys.getfilesystemencoding()) + show_value( + "locale.getpreferredencoding", + locale.getpreferredencoding(), + ) + show_value("sys.platform", sys.platform) + show_sys_implementation() + + show_value("'cert' config value", ca_bundle_info(self.parser.config)) + show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE")) + show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE")) + show_value("pip._vendor.certifi.where()", where()) + show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED) + + show_vendor_versions() + + show_tags(options) + + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/commands/download.py b/project/Lib/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..54247a7 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,147 @@ +import logging +import os +from optparse import Values +from typing import List + +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.operations.build.build_tracker import get_build_tracker +from pip._internal.req.req_install import check_legacy_setup_py_options +from pip._internal.utils.misc import ensure_dir, normalize_path, write_output +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.global_options()) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.pre()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + + self.cmd_opts.add_option( + "-d", + "--dest", + "--destination-dir", + "--destination-directory", + dest="download_dir", + metavar="dir", + default=os.curdir, + help="Download packages into .", + ) + + cmdoptions.add_target_python_options(self.cmd_opts) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + cmdoptions.check_dist_restriction(options) + + options.download_dir = normalize_path(options.download_dir) + ensure_dir(options.download_dir) + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + + build_tracker = self.enter_context(get_build_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="download", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options(options, reqs) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + build_tracker=build_tracker, + session=session, + finder=finder, + download_dir=options.download_dir, + use_user_site=False, + verbosity=self.verbosity, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + py_version_info=options.python_version, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve(reqs, check_supported_wheels=True) + + downloaded: List[str] = [] + for req in requirement_set.requirements.values(): + if req.satisfied_by is None: + assert req.name is not None + preparer.save_linked_requirement(req) + downloaded.append(req.name) + + preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) + requirement_set.warn_legacy_versions_and_specifiers() + + if downloaded: + write_output("Successfully downloaded %s", " ".join(downloaded)) + + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/commands/freeze.py b/project/Lib/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..fd9d88a --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,108 @@ +import sys +from optparse import Values +from typing import AbstractSet, List + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + + +def _should_suppress_build_backends() -> bool: + return sys.version_info < (3, 12) + + +def _dev_pkgs() -> AbstractSet[str]: + pkgs = {"pip"} + + if _should_suppress_build_backends(): + pkgs |= {"setuptools", "distribute", "wheel"} + + return pkgs + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help=( + "Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times." + ), + ) + self.cmd_opts.add_option( + "-l", + "--local", + dest="local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not output " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + "--all", + dest="freeze_all", + action="store_true", + help=( + "Do not skip these packages in the output:" + " {}".format(", ".join(_dev_pkgs())) + ), + ) + self.cmd_opts.add_option( + "--exclude-editable", + dest="exclude_editable", + action="store_true", + help="Exclude editable package from output.", + ) + self.cmd_opts.add_option(cmdoptions.list_exclude()) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(_dev_pkgs()) + + if options.excludes: + skip.update(options.excludes) + + cmdoptions.check_list_path_option(options) + + for line in freeze( + requirement=options.requirements, + local_only=options.local, + user_only=options.user, + paths=options.path, + isolated=options.isolated_mode, + skip=skip, + exclude_editable=options.exclude_editable, + ): + sys.stdout.write(line + "\n") + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/commands/hash.py b/project/Lib/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..042dac8 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,59 @@ +import hashlib +import logging +import sys +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks, write_output + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + """ + + usage = "%prog [options] ..." + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-a", + "--algorithm", + dest="algorithm", + choices=STRONG_HASHES, + action="store", + default=FAVORITE_HASH, + help="The hash algorithm to use: one of {}".format( + ", ".join(STRONG_HASHES) + ), + ) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + write_output( + "%s:\n--hash=%s:%s", path, algorithm, _hash_of_file(path, algorithm) + ) + return SUCCESS + + +def _hash_of_file(path: str, algorithm: str) -> str: + """Return the hash digest of a file.""" + with open(path, "rb") as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/project/Lib/site-packages/pip/_internal/commands/help.py b/project/Lib/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..6206631 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,41 @@ +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + + usage = """ + %prog """ + ignore_require_venv = True + + def run(self, options: Values, args: List[str]) -> int: + from pip._internal.commands import ( + commands_dict, + create_command, + get_similar_commands, + ) + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = [f'unknown command "{cmd_name}"'] + if guess: + msg.append(f'maybe you meant "{guess}"') + + raise CommandError(" - ".join(msg)) + + command = create_command(cmd_name) + command.parser.print_help() + + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/commands/index.py b/project/Lib/site-packages/pip/_internal/commands/index.py new file mode 100644 index 0000000..f55e9e4 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/index.py @@ -0,0 +1,139 @@ +import logging +from optparse import Values +from typing import Any, Iterable, List, Optional, Union + +from pip._vendor.packaging.version import LegacyVersion, Version + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.commands.search import print_dist_installation_info +from pip._internal.exceptions import CommandError, DistributionNotFound, PipError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.network.session import PipSession +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class IndexCommand(IndexGroupCommand): + """ + Inspect information available from package indexes. + """ + + ignore_require_venv = True + usage = """ + %prog versions + """ + + def add_options(self) -> None: + cmdoptions.add_target_python_options(self.cmd_opts) + + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.pre()) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "versions": self.get_available_package_versions, + } + + logger.warning( + "pip index is currently an experimental command. " + "It may be removed/changed in a future release " + "without prior warning." + ) + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _build_package_finder( + self, + options: Values, + session: PipSession, + target_python: Optional[TargetPython] = None, + ignore_requires_python: Optional[bool] = None, + ) -> PackageFinder: + """ + Create a package finder appropriate to the index command. + """ + link_collector = LinkCollector.create(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + ) + + def get_available_package_versions(self, options: Values, args: List[Any]) -> None: + if len(args) != 1: + raise CommandError("You need to specify exactly one argument") + + target_python = cmdoptions.make_target_python(options) + query = args[0] + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + + versions: Iterable[Union[LegacyVersion, Version]] = ( + candidate.version for candidate in finder.find_all_candidates(query) + ) + + if not options.pre: + # Remove prereleases + versions = ( + version for version in versions if not version.is_prerelease + ) + versions = set(versions) + + if not versions: + raise DistributionNotFound( + f"No matching distribution found for {query}" + ) + + formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)] + latest = formatted_versions[0] + + write_output(f"{query} ({latest})") + write_output("Available versions: {}".format(", ".join(formatted_versions))) + print_dist_installation_info(query, latest) diff --git a/project/Lib/site-packages/pip/_internal/commands/inspect.py b/project/Lib/site-packages/pip/_internal/commands/inspect.py new file mode 100644 index 0000000..27c8fa3 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/inspect.py @@ -0,0 +1,92 @@ +import logging +from optparse import Values +from typing import Any, Dict, List + +from pip._vendor.packaging.markers import default_environment +from pip._vendor.rich import print_json + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.utils.compat import stdlib_pkgs +from pip._internal.utils.urls import path_to_url + +logger = logging.getLogger(__name__) + + +class InspectCommand(Command): + """ + Inspect the content of a Python environment and produce a report in JSON format. + """ + + ignore_require_venv = True + usage = """ + %prog [options]""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not list " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + cmdoptions.check_list_path_option(options) + dists = get_environment(options.path).iter_installed_distributions( + local_only=options.local, + user_only=options.user, + skip=set(stdlib_pkgs), + ) + output = { + "version": "1", + "pip_version": __version__, + "installed": [self._dist_to_dict(dist) for dist in dists], + "environment": default_environment(), + # TODO tags? scheme? + } + print_json(data=output) + return SUCCESS + + def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]: + res: Dict[str, Any] = { + "metadata": dist.metadata_dict, + "metadata_location": dist.info_location, + } + # direct_url. Note that we don't have download_info (as in the installation + # report) since it is not recorded in installed metadata. + direct_url = dist.direct_url + if direct_url is not None: + res["direct_url"] = direct_url.to_dict() + else: + # Emulate direct_url for legacy editable installs. + editable_project_location = dist.editable_project_location + if editable_project_location is not None: + res["direct_url"] = { + "url": path_to_url(editable_project_location), + "dir_info": { + "editable": True, + }, + } + # installer + installer = dist.installer + if dist.installer: + res["installer"] = installer + # requested + if dist.installed_with_dist_info: + res["requested"] = dist.requested + return res diff --git a/project/Lib/site-packages/pip/_internal/commands/install.py b/project/Lib/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..e944bb9 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,774 @@ +import errno +import json +import operator +import os +import shutil +import site +from optparse import SUPPRESS_HELP, Values +from typing import List, Optional + +from pip._vendor.rich import print_json + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import ( + RequirementCommand, + warn_if_run_as_root, + with_cleanup, +) +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import get_scheme +from pip._internal.metadata import get_environment +from pip._internal.models.installation_report import InstallationReport +from pip._internal.operations.build.build_tracker import get_build_tracker +from pip._internal.operations.check import ConflictDetails, check_install_conflicts +from pip._internal.req import install_given_reqs +from pip._internal.req.req_install import ( + InstallRequirement, + check_legacy_setup_py_options, +) +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.filesystem import test_writable_dir +from pip._internal.utils.logging import getLogger +from pip._internal.utils.misc import ( + check_externally_managed, + ensure_dir, + get_pip_version, + protect_pip_from_modification_on_windows, + write_output, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.virtualenv import ( + running_under_virtualenv, + virtualenv_no_global, +) +from pip._internal.wheel_builder import build, should_build_for_install_command + +logger = getLogger(__name__) + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.pre()) + + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option( + "--dry-run", + action="store_true", + dest="dry_run", + default=False, + help=( + "Don't actually install anything, just print what would be. " + "Can be used in combination with --ignore-installed " + "to 'resolve' the requirements." + ), + ) + self.cmd_opts.add_option( + "-t", + "--target", + dest="target_dir", + metavar="dir", + default=None, + help=( + "Install packages into . " + "By default this will not replace existing files/folders in " + ". Use --upgrade to replace existing packages in " + "with new versions." + ), + ) + cmdoptions.add_target_python_options(self.cmd_opts) + + self.cmd_opts.add_option( + "--user", + dest="use_user_site", + action="store_true", + help=( + "Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)" + ), + ) + self.cmd_opts.add_option( + "--no-user", + dest="use_user_site", + action="store_false", + help=SUPPRESS_HELP, + ) + self.cmd_opts.add_option( + "--root", + dest="root_path", + metavar="dir", + default=None, + help="Install everything relative to this alternate root directory.", + ) + self.cmd_opts.add_option( + "--prefix", + dest="prefix_path", + metavar="dir", + default=None, + help=( + "Installation prefix where lib, bin and other top-level " + "folders are placed. Note that the resulting installation may " + "contain scripts and other resources which reference the " + "Python interpreter of pip, and not that of ``--prefix``. " + "See also the ``--python`` option if the intention is to " + "install packages into another (possibly pip-free) " + "environment." + ), + ) + + self.cmd_opts.add_option(cmdoptions.src()) + + self.cmd_opts.add_option( + "-U", + "--upgrade", + dest="upgrade", + action="store_true", + help=( + "Upgrade all specified packages to the newest available " + "version. The handling of dependencies depends on the " + "upgrade-strategy used." + ), + ) + + self.cmd_opts.add_option( + "--upgrade-strategy", + dest="upgrade_strategy", + default="only-if-needed", + choices=["only-if-needed", "eager"], + help=( + "Determines how dependency upgrading should be handled " + "[default: %default]. " + '"eager" - dependencies are upgraded regardless of ' + "whether the currently installed version satisfies the " + "requirements of the upgraded package(s). " + '"only-if-needed" - are upgraded only when they do not ' + "satisfy the requirements of the upgraded package(s)." + ), + ) + + self.cmd_opts.add_option( + "--force-reinstall", + dest="force_reinstall", + action="store_true", + help="Reinstall all packages even if they are already up-to-date.", + ) + + self.cmd_opts.add_option( + "-I", + "--ignore-installed", + dest="ignore_installed", + action="store_true", + help=( + "Ignore the installed packages, overwriting them. " + "This can break your system if the existing package " + "is of a different version or was installed " + "with a different package manager!" + ), + ) + + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.override_externally_managed()) + + self.cmd_opts.add_option(cmdoptions.config_settings()) + self.cmd_opts.add_option(cmdoptions.global_options()) + + self.cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + self.cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + self.cmd_opts.add_option(cmdoptions.root_user_action()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + self.cmd_opts.add_option( + "--report", + dest="json_report_file", + metavar="file", + default=None, + help=( + "Generate a JSON file describing what pip did to install " + "the provided requirements. " + "Can be used in combination with --dry-run and --ignore-installed " + "to 'resolve' the requirements. " + "When - is used as file name it writes to stdout. " + "When writing to stdout, please combine with the --quiet option " + "to avoid mixing pip logging output with JSON output." + ), + ) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + if options.use_user_site and options.target_dir is not None: + raise CommandError("Can not combine '--user' and '--target'") + + # Check whether the environment we're installing into is externally + # managed, as specified in PEP 668. Specifying --root, --target, or + # --prefix disables the check, since there's no reliable way to locate + # the EXTERNALLY-MANAGED file for those cases. An exception is also + # made specifically for "--dry-run --report" for convenience. + installing_into_current_environment = ( + not (options.dry_run and options.json_report_file) + and options.root_path is None + and options.target_dir is None + and options.prefix_path is None + ) + if ( + installing_into_current_environment + and not options.override_externally_managed + ): + check_externally_managed() + + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + cmdoptions.check_dist_restriction(options, check_target=True) + + logger.verbose("Using %s", get_pip_version()) + options.use_user_site = decide_user_install( + options.use_user_site, + prefix_path=options.prefix_path, + target_dir=options.target_dir, + root_path=options.root_path, + isolated_mode=options.isolated_mode, + ) + + target_temp_dir: Optional[TempDirectory] = None + target_temp_dir_path: Optional[str] = None + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if ( + # fmt: off + os.path.exists(options.target_dir) and + not os.path.isdir(options.target_dir) + # fmt: on + ): + raise CommandError( + "Target path exists but is not a directory, will not continue." + ) + + # Create a target directory for using with the target option + target_temp_dir = TempDirectory(kind="target") + target_temp_dir_path = target_temp_dir.path + self.enter_context(target_temp_dir) + + global_options = options.global_options or [] + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + build_tracker = self.enter_context(get_build_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="install", + globally_managed=True, + ) + + try: + reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options(options, reqs) + + wheel_cache = WheelCache(options.cache_dir) + + # Only when installing is it permitted to use PEP 660. + # In other circumstances (pip wheel, pip download) we generate + # regular (i.e. non editable) metadata and wheels. + for req in reqs: + req.permit_editable_wheels = True + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + build_tracker=build_tracker, + session=session, + finder=finder, + use_user_site=options.use_user_site, + verbosity=self.verbosity, + ) + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + ignore_installed=options.ignore_installed, + ignore_requires_python=options.ignore_requires_python, + force_reinstall=options.force_reinstall, + upgrade_strategy=upgrade_strategy, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve( + reqs, check_supported_wheels=not options.target_dir + ) + + if options.json_report_file: + report = InstallationReport(requirement_set.requirements_to_install) + if options.json_report_file == "-": + print_json(data=report.to_dict()) + else: + with open(options.json_report_file, "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + if options.dry_run: + # In non dry-run mode, the legacy versions and specifiers check + # will be done as part of conflict detection. + requirement_set.warn_legacy_versions_and_specifiers() + would_install_items = sorted( + (r.metadata["name"], r.metadata["version"]) + for r in requirement_set.requirements_to_install + ) + if would_install_items: + write_output( + "Would install %s", + " ".join("-".join(item) for item in would_install_items), + ) + return SUCCESS + + try: + pip_req = requirement_set.get_requirement("pip") + except KeyError: + modifying_pip = False + else: + # If we're not replacing an already installed pip, + # we're not modifying it. + modifying_pip = pip_req.satisfied_by is None + protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) + + reqs_to_build = [ + r + for r in requirement_set.requirements.values() + if should_build_for_install_command(r) + ] + + _, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + verify=True, + build_options=[], + global_options=global_options, + ) + + if build_failures: + raise InstallationError( + "Could not build wheels for {}, which is required to " + "install pyproject.toml-based projects".format( + ", ".join(r.name for r in build_failures) # type: ignore + ) + ) + + to_install = resolver.get_installation_order(requirement_set) + + # Check for conflicts in the package set we're installing. + conflicts: Optional[ConflictDetails] = None + should_warn_about_conflicts = ( + not options.ignore_dependencies and options.warn_about_conflicts + ) + if should_warn_about_conflicts: + conflicts = self._determine_conflicts(to_install) + + # Don't warn about script install locations if + # --target or --prefix has been specified + warn_script_location = options.warn_script_location + if options.target_dir or options.prefix_path: + warn_script_location = False + + installed = install_given_reqs( + to_install, + global_options, + root=options.root_path, + home=target_temp_dir_path, + prefix=options.prefix_path, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + pycompile=options.compile, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir_path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + env = get_environment(lib_locations) + + installed.sort(key=operator.attrgetter("name")) + items = [] + for result in installed: + item = result.name + try: + installed_dist = env.get_distribution(item) + if installed_dist is not None: + item = f"{item}-{installed_dist.version}" + except Exception: + pass + items.append(item) + + if conflicts is not None: + self._warn_about_conflicts( + conflicts, + resolver_variant=self.determine_resolver_variant(options), + ) + + installed_desc = " ".join(items) + if installed_desc: + write_output( + "Successfully installed %s", + installed_desc, + ) + except OSError as error: + show_traceback = self.verbosity >= 1 + + message = create_os_error_message( + error, + show_traceback, + options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + + if options.target_dir: + assert target_temp_dir + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + if options.root_user_action == "warn": + warn_if_run_as_root() + return SUCCESS + + def _handle_target_dir( + self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool + ) -> None: + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = get_scheme("", home=target_temp_dir.path) + purelib_dir = scheme.purelib + platlib_dir = scheme.platlib + data_dir = scheme.data + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + "Target directory %s already exists. Specify " + "--upgrade to force replacement.", + target_item_dir, + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + "Target directory %s already exists and is " + "a link. pip will not automatically replace " + "links, please remove if replacement is " + "desired.", + target_item_dir, + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move(os.path.join(lib_dir, item), target_item_dir) + + def _determine_conflicts( + self, to_install: List[InstallRequirement] + ) -> Optional[ConflictDetails]: + try: + return check_install_conflicts(to_install) + except Exception: + logger.exception( + "Error while checking for conflicts. Please file an issue on " + "pip's issue tracker: https://github.com/pypa/pip/issues/new" + ) + return None + + def _warn_about_conflicts( + self, conflict_details: ConflictDetails, resolver_variant: str + ) -> None: + package_set, (missing, conflicting) = conflict_details + if not missing and not conflicting: + return + + parts: List[str] = [] + if resolver_variant == "legacy": + parts.append( + "pip's legacy dependency resolver does not consider dependency " + "conflicts when selecting packages. This behaviour is the " + "source of the following dependency conflicts." + ) + else: + assert resolver_variant == "resolvelib" + parts.append( + "pip's dependency resolver does not currently take into account " + "all the packages that are installed. This behaviour is the " + "source of the following dependency conflicts." + ) + + # NOTE: There is some duplication here, with commands/check.py + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + message = ( + f"{project_name} {version} requires {dependency[1]}, " + "which is not installed." + ) + parts.append(message) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + message = ( + "{name} {version} requires {requirement}, but {you} have " + "{dep_name} {dep_version} which is incompatible." + ).format( + name=project_name, + version=version, + requirement=req, + dep_name=dep_name, + dep_version=dep_version, + you=("you" if resolver_variant == "resolvelib" else "you'll"), + ) + parts.append(message) + + logger.critical("\n".join(parts)) + + +def get_lib_location_guesses( + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> List[str]: + scheme = get_scheme( + "", + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + return [scheme.purelib, scheme.platlib] + + +def site_packages_writable(root: Optional[str], isolated: bool) -> bool: + return all( + test_writable_dir(d) + for d in set(get_lib_location_guesses(root=root, isolated=isolated)) + ) + + +def decide_user_install( + use_user_site: Optional[bool], + prefix_path: Optional[str] = None, + target_dir: Optional[str] = None, + root_path: Optional[str] = None, + isolated_mode: bool = False, +) -> bool: + """Determine whether to do a user install based on the input options. + + If use_user_site is False, no additional checks are done. + If use_user_site is True, it is checked for compatibility with other + options. + If use_user_site is None, the default behaviour depends on the environment, + which is provided by the other arguments. + """ + # In some cases (config from tox), use_user_site can be set to an integer + # rather than a bool, which 'use_user_site is False' wouldn't catch. + if (use_user_site is not None) and (not use_user_site): + logger.debug("Non-user install by explicit request") + return False + + if use_user_site: + if prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + logger.debug("User install by explicit request") + return True + + # If we are here, user installs have not been explicitly requested/avoided + assert use_user_site is None + + # user install incompatible with --prefix/--target + if prefix_path or target_dir: + logger.debug("Non-user install due to --prefix or --target option") + return False + + # If user installs are not enabled, choose a non-user install + if not site.ENABLE_USER_SITE: + logger.debug("Non-user install because user site-packages disabled") + return False + + # If we have permission for a non-user install, do that, + # otherwise do a user install. + if site_packages_writable(root=root_path, isolated=isolated_mode): + logger.debug("Non-user install because site-packages writeable") + return False + + logger.info( + "Defaulting to user installation because normal site-packages " + "is not writeable" + ) + return True + + +def create_os_error_message( + error: OSError, show_traceback: bool, using_user_site: bool +) -> str: + """Format an error message for an OSError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an OSError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not running_under_virtualenv() and not using_user_site: + parts.extend( + [ + user_option_part, + " or ", + permissions_part.lower(), + ] + ) + else: + parts.append(permissions_part) + parts.append(".\n") + + # Suggest the user to enable Long Paths if path length is + # more than 260 + if ( + WINDOWS + and error.errno == errno.ENOENT + and error.filename + and len(error.filename) > 260 + ): + parts.append( + "HINT: This error might have occurred since " + "this system does not have Windows Long Path " + "support enabled. You can find information on " + "how to enable this at " + "https://pip.pypa.io/warnings/enable-long-paths\n" + ) + + return "".join(parts).strip() + "\n" diff --git a/project/Lib/site-packages/pip/_internal/commands/list.py b/project/Lib/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..e551dda --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,368 @@ +import json +import logging +from optparse import Values +from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.session import PipSession +from pip._internal.utils.compat import stdlib_pkgs +from pip._internal.utils.misc import tabulate, write_output + +if TYPE_CHECKING: + from pip._internal.metadata.base import DistributionVersion + + class _DistWithLatestInfo(BaseDistribution): + """Give the distribution object a couple of extra fields. + + These will be populated during ``get_outdated()``. This is dirty but + makes the rest of the code much cleaner. + """ + + latest_version: DistributionVersion + latest_filetype: str + + _ProcessedDists = Sequence[_DistWithLatestInfo] + + +logger = logging.getLogger(__name__) + + +class ListCommand(IndexGroupCommand): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + + ignore_require_venv = True + usage = """ + %prog [options]""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-o", + "--outdated", + action="store_true", + default=False, + help="List outdated packages", + ) + self.cmd_opts.add_option( + "-u", + "--uptodate", + action="store_true", + default=False, + help="List uptodate packages", + ) + self.cmd_opts.add_option( + "-e", + "--editable", + action="store_true", + default=False, + help="List editable projects.", + ) + self.cmd_opts.add_option( + "-l", + "--local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not list " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + "--pre", + action="store_true", + default=False, + help=( + "Include pre-release and development versions. By default, " + "pip only finds stable versions." + ), + ) + + self.cmd_opts.add_option( + "--format", + action="store", + dest="list_format", + default="columns", + choices=("columns", "freeze", "json"), + help=( + "Select the output format among: columns (default), freeze, or json. " + "The 'freeze' format cannot be used with the --outdated option." + ), + ) + + self.cmd_opts.add_option( + "--not-required", + action="store_true", + dest="not_required", + help="List packages that are not dependencies of installed packages.", + ) + + self.cmd_opts.add_option( + "--exclude-editable", + action="store_false", + dest="include_editable", + help="Exclude editable package from output.", + ) + self.cmd_opts.add_option( + "--include-editable", + action="store_true", + dest="include_editable", + help="Include editable package from output.", + default=True, + ) + self.cmd_opts.add_option(cmdoptions.list_exclude()) + index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + def _build_package_finder( + self, options: Values, session: PipSession + ) -> PackageFinder: + """ + Create a package finder appropriate to this list command. + """ + link_collector = LinkCollector.create(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + + def run(self, options: Values, args: List[str]) -> int: + if options.outdated and options.uptodate: + raise CommandError("Options --outdated and --uptodate cannot be combined.") + + if options.outdated and options.list_format == "freeze": + raise CommandError( + "List format 'freeze' cannot be used with the --outdated option." + ) + + cmdoptions.check_list_path_option(options) + + skip = set(stdlib_pkgs) + if options.excludes: + skip.update(canonicalize_name(n) for n in options.excludes) + + packages: "_ProcessedDists" = [ + cast("_DistWithLatestInfo", d) + for d in get_environment(options.path).iter_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + skip=skip, + ) + ] + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + return SUCCESS + + def get_outdated( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + return [ + dist + for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.version + ] + + def get_uptodate( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + return [ + dist + for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.version + ] + + def get_not_required( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + dep_keys = { + canonicalize_name(dep.name) + for dist in packages + for dep in (dist.iter_dependencies() or ()) + } + + # Create a set to remove duplicate packages, and cast it to a list + # to keep the return type consistent with get_outdated and + # get_uptodate + return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys}) + + def iter_packages_latest_infos( + self, packages: "_ProcessedDists", options: Values + ) -> Generator["_DistWithLatestInfo", None, None]: + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + + def latest_info( + dist: "_DistWithLatestInfo", + ) -> Optional["_DistWithLatestInfo"]: + all_candidates = finder.find_all_candidates(dist.canonical_name) + if not options.pre: + # Remove prereleases + all_candidates = [ + candidate + for candidate in all_candidates + if not candidate.version.is_prerelease + ] + + evaluator = finder.make_candidate_evaluator( + project_name=dist.canonical_name, + ) + best_candidate = evaluator.sort_best_candidate(all_candidates) + if best_candidate is None: + return None + + remote_version = best_candidate.version + if best_candidate.link.is_wheel: + typ = "wheel" + else: + typ = "sdist" + dist.latest_version = remote_version + dist.latest_filetype = typ + return dist + + for dist in map(latest_info, packages): + if dist is not None: + yield dist + + def output_package_listing( + self, packages: "_ProcessedDists", options: Values + ) -> None: + packages = sorted( + packages, + key=lambda dist: dist.canonical_name, + ) + if options.list_format == "columns" and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == "freeze": + for dist in packages: + if options.verbose >= 1: + write_output( + "%s==%s (%s)", dist.raw_name, dist.version, dist.location + ) + else: + write_output("%s==%s", dist.raw_name, dist.version) + elif options.list_format == "json": + write_output(format_for_json(packages, options)) + + def output_package_listing_columns( + self, data: List[List[str]], header: List[str] + ) -> None: + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join("-" * x for x in sizes)) + + for val in pkg_strings: + write_output(val) + + +def format_for_columns( + pkgs: "_ProcessedDists", options: Values +) -> Tuple[List[List[str]], List[str]]: + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + header = ["Package", "Version"] + + running_outdated = options.outdated + if running_outdated: + header.extend(["Latest", "Type"]) + + has_editables = any(x.editable for x in pkgs) + if has_editables: + header.append("Editable project location") + + if options.verbose >= 1: + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + data = [] + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.raw_name, str(proj.version)] + + if running_outdated: + row.append(str(proj.latest_version)) + row.append(proj.latest_filetype) + + if has_editables: + row.append(proj.editable_project_location or "") + + if options.verbose >= 1: + row.append(proj.location or "") + if options.verbose >= 1: + row.append(proj.installer) + + data.append(row) + + return data, header + + +def format_for_json(packages: "_ProcessedDists", options: Values) -> str: + data = [] + for dist in packages: + info = { + "name": dist.raw_name, + "version": str(dist.version), + } + if options.verbose >= 1: + info["location"] = dist.location or "" + info["installer"] = dist.installer + if options.outdated: + info["latest_version"] = str(dist.latest_version) + info["latest_filetype"] = dist.latest_filetype + editable_project_location = dist.editable_project_location + if editable_project_location: + info["editable_project_location"] = editable_project_location + data.append(info) + return json.dumps(data) diff --git a/project/Lib/site-packages/pip/_internal/commands/search.py b/project/Lib/site-packages/pip/_internal/commands/search.py new file mode 100644 index 0000000..03ed925 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,174 @@ +import logging +import shutil +import sys +import textwrap +import xmlrpc.client +from collections import OrderedDict +from optparse import Values +from typing import TYPE_CHECKING, Dict, List, Optional + +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.cli.base_command import Command +from pip._internal.cli.req_command import SessionCommandMixin +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.metadata import get_default_environment +from pip._internal.models.index import PyPI +from pip._internal.network.xmlrpc import PipXmlrpcTransport +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import write_output + +if TYPE_CHECKING: + from typing import TypedDict + + class TransformedHit(TypedDict): + name: str + summary: str + versions: List[str] + + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command, SessionCommandMixin): + """Search for PyPI packages whose name or summary contains .""" + + usage = """ + %prog [options] """ + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-i", + "--index", + dest="index", + metavar="URL", + default=PyPI.pypi_url, + help="Base URL of Python Package Index (default %default)", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + if not args: + raise CommandError("Missing required argument (search query).") + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = shutil.get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query: List[str], options: Values) -> List[Dict[str, str]]: + index_url = options.index + + session = self.get_default_session(options) + + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc.client.ServerProxy(index_url, transport) + try: + hits = pypi.search({"name": query, "summary": query}, "or") + except xmlrpc.client.Fault as fault: + message = "XMLRPC request failed [code: {code}]\n{string}".format( + code=fault.faultCode, + string=fault.faultString, + ) + raise CommandError(message) + assert isinstance(hits, list) + return hits + + +def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]: + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages: Dict[str, "TransformedHit"] = OrderedDict() + for hit in hits: + name = hit["name"] + summary = hit["summary"] + version = hit["version"] + + if name not in packages.keys(): + packages[name] = { + "name": name, + "summary": summary, + "versions": [version], + } + else: + packages[name]["versions"].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]["versions"]): + packages[name]["summary"] = summary + + return list(packages.values()) + + +def print_dist_installation_info(name: str, latest: str) -> None: + env = get_default_environment() + dist = env.get_distribution(name) + if dist is not None: + with indent_log(): + if dist.version == latest: + write_output("INSTALLED: %s (latest)", dist.version) + else: + write_output("INSTALLED: %s", dist.version) + if parse_version(latest).pre: + write_output( + "LATEST: %s (pre-release; install" + " with `pip install --pre`)", + latest, + ) + else: + write_output("LATEST: %s", latest) + + +def print_results( + hits: List["TransformedHit"], + name_column_width: Optional[int] = None, + terminal_width: Optional[int] = None, +) -> None: + if not hits: + return + if name_column_width is None: + name_column_width = ( + max( + [ + len(hit["name"]) + len(highest_version(hit.get("versions", ["-"]))) + for hit in hits + ] + ) + + 4 + ) + + for hit in hits: + name = hit["name"] + summary = hit["summary"] or "" + latest = highest_version(hit.get("versions", ["-"])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary_lines = textwrap.wrap(summary, target_width) + summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines) + + name_latest = f"{name} ({latest})" + line = f"{name_latest:{name_column_width}} - {summary}" + try: + write_output(line) + print_dist_installation_info(name, latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions: List[str]) -> str: + return max(versions, key=parse_version) diff --git a/project/Lib/site-packages/pip/_internal/commands/show.py b/project/Lib/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..3f10701 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,189 @@ +import logging +from optparse import Values +from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.metadata import BaseDistribution, get_default_environment +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + + usage = """ + %prog [options] ...""" + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-f", + "--files", + dest="files", + action="store_true", + default=False, + help="Show the full list of installed files for each package.", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + if not args: + logger.warning("ERROR: Please provide a package name or names.") + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose + ): + return ERROR + return SUCCESS + + +class _PackageInfo(NamedTuple): + name: str + version: str + location: str + editable_project_location: Optional[str] + requires: List[str] + required_by: List[str] + installer: str + metadata_version: str + classifiers: List[str] + summary: str + homepage: str + project_urls: List[str] + author: str + author_email: str + license: str + entry_points: List[str] + files: Optional[List[str]] + + +def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]: + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + env = get_default_environment() + + installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()} + query_names = [canonicalize_name(name) for name in query] + missing = sorted( + [name for name, pkg in zip(query, query_names) if pkg not in installed] + ) + if missing: + logger.warning("Package(s) not found: %s", ", ".join(missing)) + + def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: + return ( + dist.metadata["Name"] or "UNKNOWN" + for dist in installed.values() + if current_dist.canonical_name + in {canonicalize_name(d.name) for d in dist.iter_dependencies()} + ) + + for query_name in query_names: + try: + dist = installed[query_name] + except KeyError: + continue + + requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower) + required_by = sorted(_get_requiring_packages(dist), key=str.lower) + + try: + entry_points_text = dist.read_text("entry_points.txt") + entry_points = entry_points_text.splitlines(keepends=False) + except FileNotFoundError: + entry_points = [] + + files_iter = dist.iter_declared_entries() + if files_iter is None: + files: Optional[List[str]] = None + else: + files = sorted(files_iter) + + metadata = dist.metadata + + yield _PackageInfo( + name=dist.raw_name, + version=str(dist.version), + location=dist.location or "", + editable_project_location=dist.editable_project_location, + requires=requires, + required_by=required_by, + installer=dist.installer, + metadata_version=dist.metadata_version or "", + classifiers=metadata.get_all("Classifier", []), + summary=metadata.get("Summary", ""), + homepage=metadata.get("Home-page", ""), + project_urls=metadata.get_all("Project-URL", []), + author=metadata.get("Author", ""), + author_email=metadata.get("Author-email", ""), + license=metadata.get("License", ""), + entry_points=entry_points, + files=files, + ) + + +def print_results( + distributions: Iterable[_PackageInfo], + list_files: bool, + verbose: bool, +) -> bool: + """ + Print the information from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + write_output("---") + + write_output("Name: %s", dist.name) + write_output("Version: %s", dist.version) + write_output("Summary: %s", dist.summary) + write_output("Home-page: %s", dist.homepage) + write_output("Author: %s", dist.author) + write_output("Author-email: %s", dist.author_email) + write_output("License: %s", dist.license) + write_output("Location: %s", dist.location) + if dist.editable_project_location is not None: + write_output( + "Editable project location: %s", dist.editable_project_location + ) + write_output("Requires: %s", ", ".join(dist.requires)) + write_output("Required-by: %s", ", ".join(dist.required_by)) + + if verbose: + write_output("Metadata-Version: %s", dist.metadata_version) + write_output("Installer: %s", dist.installer) + write_output("Classifiers:") + for classifier in dist.classifiers: + write_output(" %s", classifier) + write_output("Entry-points:") + for entry in dist.entry_points: + write_output(" %s", entry.strip()) + write_output("Project-URLs:") + for project_url in dist.project_urls: + write_output(" %s", project_url) + if list_files: + write_output("Files:") + if dist.files is None: + write_output("Cannot locate RECORD or installed-files.txt") + else: + for line in dist.files: + write_output(" %s", line.strip()) + return results_printed diff --git a/project/Lib/site-packages/pip/_internal/commands/uninstall.py b/project/Lib/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..f198fc3 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,113 @@ +import logging +from optparse import Values +from typing import List + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import ( + install_req_from_line, + install_req_from_parsed_requirement, +) +from pip._internal.utils.misc import ( + check_externally_managed, + protect_pip_from_modification_on_windows, +) + +logger = logging.getLogger(__name__) + + +class UninstallCommand(Command, SessionCommandMixin): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + + usage = """ + %prog [options] ... + %prog [options] -r ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help=( + "Uninstall all the packages listed in the given requirements " + "file. This option can be used multiple times." + ), + ) + self.cmd_opts.add_option( + "-y", + "--yes", + dest="yes", + action="store_true", + help="Don't ask for confirmation of uninstall deletions.", + ) + self.cmd_opts.add_option(cmdoptions.root_user_action()) + self.cmd_opts.add_option(cmdoptions.override_externally_managed()) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + session = self.get_default_session(options) + + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, + isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + else: + logger.warning( + "Invalid requirement: %r ignored -" + " the uninstall command expects named" + " requirements.", + name, + ) + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, options=options, session=session + ): + req = install_req_from_parsed_requirement( + parsed_req, isolated=options.isolated_mode + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + f"You must give at least one requirement to {self.name} (see " + f'"pip help {self.name}")' + ) + + if not options.override_externally_managed: + check_externally_managed() + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, + verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() + if options.root_user_action == "warn": + warn_if_run_as_root() + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/commands/wheel.py b/project/Lib/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..ed578aa --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,183 @@ +import logging +import os +import shutil +from optparse import Values +from typing import List + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.operations.build.build_tracker import get_build_tracker +from pip._internal.req.req_install import ( + InstallRequirement, + check_legacy_setup_py_options, +) +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel_builder import build, should_build_for_wheel_command + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + 'pip wheel' uses the build system interface as described here: + https://pip.pypa.io/en/stable/reference/build-system/ + + """ + + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-w", + "--wheel-dir", + dest="wheel_dir", + metavar="dir", + default=os.curdir, + help=( + "Build wheels into , where the default is the " + "current working directory." + ), + ) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + + self.cmd_opts.add_option( + "--no-verify", + dest="no_verify", + action="store_true", + default=False, + help="Don't verify if built wheel is valid.", + ) + + self.cmd_opts.add_option(cmdoptions.config_settings()) + self.cmd_opts.add_option(cmdoptions.build_options()) + self.cmd_opts.add_option(cmdoptions.global_options()) + + self.cmd_opts.add_option( + "--pre", + action="store_true", + default=False, + help=( + "Include pre-release and development versions. By default, " + "pip only finds stable versions." + ), + ) + + self.cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + session = self.get_default_session(options) + + finder = self._build_package_finder(options, session) + + options.wheel_dir = normalize_path(options.wheel_dir) + ensure_dir(options.wheel_dir) + + build_tracker = self.enter_context(get_build_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="wheel", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + check_legacy_setup_py_options(options, reqs) + + wheel_cache = WheelCache(options.cache_dir) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + build_tracker=build_tracker, + session=session, + finder=finder, + download_dir=options.wheel_dir, + use_user_site=False, + verbosity=self.verbosity, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve(reqs, check_supported_wheels=True) + + reqs_to_build: List[InstallRequirement] = [] + for req in requirement_set.requirements.values(): + if req.is_wheel: + preparer.save_linked_requirement(req) + elif should_build_for_wheel_command(req): + reqs_to_build.append(req) + + preparer.prepare_linked_requirements_more(requirement_set.requirements.values()) + requirement_set.warn_legacy_versions_and_specifiers() + + # build wheels + build_successes, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + verify=(not options.no_verify), + build_options=options.build_options or [], + global_options=options.global_options or [], + ) + for req in build_successes: + assert req.link and req.link.is_wheel + assert req.local_file_path + # copy from cache to target directory + try: + shutil.copy(req.local_file_path, options.wheel_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, + e, + ) + build_failures.append(req) + if len(build_failures) != 0: + raise CommandError("Failed to build one or more wheels") + + return SUCCESS diff --git a/project/Lib/site-packages/pip/_internal/configuration.py b/project/Lib/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..c25273d --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/configuration.py @@ -0,0 +1,383 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import configparser +import locale +import os +import sys +from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple + +from pip._internal.exceptions import ( + ConfigurationError, + ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import getLogger +from pip._internal.utils.misc import ensure_dir, enum + +RawConfigParser = configparser.RawConfigParser # Shorthand +Kind = NewType("Kind", str) + +CONFIG_BASENAME = "pip.ini" if WINDOWS else "pip.conf" +ENV_NAMES_IGNORED = "version", "help" + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [Virtual] Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) +OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR +VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE + +logger = getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name: str) -> str: + """Make a name consistent regardless of source (environment or file)""" + name = name.lower().replace("_", "-") + if name.startswith("--"): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name: str) -> List[str]: + if "." not in name: + error_message = ( + "Key does not contain dot separated section and key. " + f"Perhaps you wanted to use 'global.{name}' instead?" + ) + raise ConfigurationError(error_message) + return name.split(".", 1) + + +def get_configuration_files() -> Dict[Kind, List[str]]: + global_config_files = [ + os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip") + ] + + site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) + legacy_config_file = os.path.join( + os.path.expanduser("~"), + "pip" if WINDOWS else ".pip", + CONFIG_BASENAME, + ) + new_config_file = os.path.join(appdirs.user_config_dir("pip"), CONFIG_BASENAME) + return { + kinds.GLOBAL: global_config_files, + kinds.SITE: [site_config_file], + kinds.USER: [legacy_config_file, new_config_file], + } + + +class Configuration: + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None: + super().__init__() + + if load_only is not None and load_only not in VALID_LOAD_ONLY: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, VALID_LOAD_ONLY)) + ) + ) + self.isolated = isolated + self.load_only = load_only + + # Because we keep track of where we got the data from + self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = { + variant: [] for variant in OVERRIDE_ORDER + } + self._config: Dict[Kind, Dict[str, Any]] = { + variant: {} for variant in OVERRIDE_ORDER + } + self._modified_parsers: List[Tuple[str, RawConfigParser]] = [] + + def load(self) -> None: + """Loads configuration from configuration files and environment""" + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self) -> Optional[str]: + """Returns the file with highest priority in configuration""" + assert self.load_only is not None, "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self) -> Iterable[Tuple[str, Any]]: + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key: str) -> Any: + """Get a value from the configuration.""" + orig_key = key + key = _normalize_name(key) + try: + return self._dictionary[key] + except KeyError: + # disassembling triggers a more useful error message than simply + # "No such key" in the case that the key isn't in the form command.option + _disassemble_key(key) + raise ConfigurationError(f"No such key - {orig_key}") + + def set_value(self, key: str, value: Any) -> None: + """Modify a value in the configuration.""" + key = _normalize_name(key) + self._ensure_have_load_only() + + assert self.load_only + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key: str) -> None: + """Unset a value in the configuration.""" + orig_key = key + key = _normalize_name(key) + self._ensure_have_load_only() + + assert self.load_only + if key not in self._config[self.load_only]: + raise ConfigurationError(f"No such key - {orig_key}") + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + if not ( + parser.has_section(section) and parser.remove_option(section, name) + ): + # The option was not removed. + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + # The section may be empty after the option was removed. + if not parser.items(section): + parser.remove_section(section) + self._mark_as_modified(fname, parser) + + del self._config[self.load_only][key] + + def save(self) -> None: + """Save the current in-memory state.""" + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + # Ensure directory's permission(need to be writeable) + try: + with open(fname, "w") as f: + parser.write(f) + except OSError as error: + raise ConfigurationError( + f"An error occurred while writing to the configuration file " + f"{fname}: {error}" + ) + + # + # Private routines + # + + def _ensure_have_load_only(self) -> None: + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self) -> Dict[str, Any]: + """A dictionary representing the loaded configuration.""" + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in OVERRIDE_ORDER: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self) -> None: + """Loads configuration from configuration files""" + config_files = dict(self.iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug("Skipping file '%s' (variant: %s)", fname, variant) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant: Kind, fname: str) -> RawConfigParser: + logger.verbose("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname: str) -> RawConfigParser: + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + locale_encoding = locale.getpreferredencoding(False) + try: + parser.read(fname, encoding=locale_encoding) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason=f"contains invalid {locale_encoding} characters", + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self) -> None: + """Loads configuration from environment variables""" + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self.get_environ_vars()) + ) + + def _normalized_keys( + self, section: str, items: Iterable[Tuple[str, Any]] + ) -> Dict[str, Any]: + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def get_environ_vars(self) -> Iterable[Tuple[str, str]]: + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + if key.startswith("PIP_"): + name = key[4:].lower() + if name not in ENV_NAMES_IGNORED: + yield name, val + + # XXX: This is patched in the tests. + def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]: + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. The order + here doesn't affect what gets overridden. That is controlled + by OVERRIDE_ORDER. However this does control the order they are + displayed to the user. It's probably most ergononmic to display + things in the same order as OVERRIDE_ORDER + """ + # SMELL: Move the conditions out of this function + + env_config_file = os.environ.get("PIP_CONFIG_FILE", None) + config_files = get_configuration_files() + + yield kinds.GLOBAL, config_files[kinds.GLOBAL] + + # per-user config is not loaded when env_config_file exists + should_load_user_config = not self.isolated and not ( + env_config_file and os.path.exists(env_config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, config_files[kinds.USER] + + # virtualenv config + yield kinds.SITE, config_files[kinds.SITE] + + if env_config_file is not None: + yield kinds.ENV, [env_config_file] + else: + yield kinds.ENV, [] + + def get_values_in_config(self, variant: Kind) -> Dict[str, Any]: + """Get values present in a config file""" + return self._config[variant] + + def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]: + # Determine which parser to modify + assert self.load_only + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None: + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self._dictionary!r})" diff --git a/project/Lib/site-packages/pip/_internal/distributions/__init__.py b/project/Lib/site-packages/pip/_internal/distributions/__init__.py new file mode 100644 index 0000000..9a89a83 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/distributions/__init__.py @@ -0,0 +1,21 @@ +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.distributions.sdist import SourceDistribution +from pip._internal.distributions.wheel import WheelDistribution +from pip._internal.req.req_install import InstallRequirement + + +def make_distribution_for_install_requirement( + install_req: InstallRequirement, +) -> AbstractDistribution: + """Returns a Distribution for the given InstallRequirement""" + # Editable requirements will always be source distributions. They use the + # legacy logic until we create a modern standard for them. + if install_req.editable: + return SourceDistribution(install_req) + + # If it's a wheel, it's a WheelDistribution + if install_req.is_wheel: + return WheelDistribution(install_req) + + # Otherwise, a SourceDistribution + return SourceDistribution(install_req) diff --git a/project/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ae6fbed75d8d20fc3dfee69c9c3e7f90376bc2e GIT binary patch literal 1033 zcmaJ;O>5gg5Z$#US!wKuq`8#PqR^8PEZ2vODU=+NLckRjYik{EEXmGl-On6) z=zmC$IklAj85w*qfU9`dk{0$jsb;+&rg^0j=1^S%zekUIjMIRI zB3WdAV=kx1iN>ku@vwnMLZkzc*>~|4z$rRGM>3i%ZU~tjtrPSG?tQGIAIZ3yQ%t2+@BwA>|)HaVn` z(`DU?%R)hUNc@U7F`ua7LV^j`wY%>UD`(b@s<5v4_> z-y9UyQiRpYxv_q>**ENgVaK|iYS$_I+%V79`bK$Rlw-a8TSLV=pWFS#jltqZtZZCB zFSKhdBqlJnuNd2tj3T=Zin*L?vOcdY%5G&3I=AlnrIXv!{Xnk`-&jA_;GdcBZ-_5R zT!igX-wHZj&!-RhDjemMq7Sg8d5rN8ZO79#M33WX8=^Dx*ePEbN#v*^qau^q|P&#k;{DS2N!m78C4c7Kwbo{`u?GO32wk3FrJAv6%E+5I! z+dshcb8v{0s=`P$#guBArFe#=S*DR$Ck=(EH%F@~&tAvEG*(T`XxX*erE zbEhOo* zsObv9&A?uX&5k7<*O_g5i^5>Y=JRsbXgC!e^kP)_blD1;)aOCl8}j8;&o;yM-NeA; z_{Z(E#E`I5>b8Rt*q`rsibGJMy;aEZ1v8(6T!xW@s#j%jhf zyjSo{5Dp-gbTGrztzU)kP=4KWeKZA*N^CId?x&Cg9vI9BjDCo$2Kw)C&SXwpy6lQ2 za7UV1Z(BC31Co}w=m%;biHqFfBDSRMSl8OU^RVjB0+(9g55Q?#~q^-A9usU3+xp!r9toZkWy5J6CEKAkx@_YPL~- zx#kHMvr~K5s@Hrg;Ij!VYM$kthEt#%pp%_u10BmhjpbVLRzwjFSUtX5T~`tdj{%E6 z4dm}N@~bxXMebJa7wyPT+L8O(#HKdU(I&PI99qxZ($?X(4Sd8Lj8HGKCtzo2`>fCDjQ08VBQTb zwme(D95{PZ2v=+`pFzzC#5MAJ@#$g1!)!yo zcf;}6Vas=I1KVI&GMn67(&J@laK4!V70LA}&W1h#jVD+U*i*tZRGB!8qhi7U7;d^u;Fp)cj}3u-hnc$T+5&4g9P9Qa zliRkgmlc6$={|^vo8Obk7l~gSvNTyTj;m)y2MBw@TOY-q#qLFNV zQ#~4`RCW5!%r`IIos9?#`{ZGoWG51is3_SFM=3>}?mYi$MBv#c$a`c{jklw0!kbm6 zAC!(qDm-Cv;zX3gkwzw;it;!rkU}vU!4XMFUsJNu-;*O*cQP9AeVE4vA)9)6L`*?o z!fdeO!J913#z|<^m0qi^AmXoAx_w-a3n0$Mb}HD;W#+BC`P(9so#FcdIoBD!x5z7<;d_gm d=?vdd_BjQjxRczuboXPq{t!3++=WA${4chaR?z?e literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6e6132a51812dde7e3006eaaa504f57f5aed662 GIT binary patch literal 1842 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 iuW^YkFlyp zcLo|qbyy-JWxWUo2o;2$vy6Oe|$LQc80Y)(QT?^W-N(|!a}+w=O>t5;R;{oY6K z&$F`@fl6-;Yw&0hI#y)CZCDqbjIISv)d8HeBQRw=> z?{B+d6nbsf_Xf-f-GG5`{(MWs+-=7fJa~Jp9;$N*XFv8U?0NmFdhl zJkjr{w6Lyi!hCBYYZO7tgcWUFYm}(YENZYBKw^ff)a;nF1o8|8E7>m%o3?sz?+4c9 zOt3H(wrfjk?P+UkmSw}Zw&Dq!MoidY6x$(V)ON$Z4O_b|cM&Ap71?%S1F&|B!7-e* zW4~|r!Y-i4XiXlK7@WmD9=4T<6NDg-QQI|uU{+iu&z1UfjF~2w-w~)_zrK0l%jPxa zwpW_p-e_KMV;7^)^xf7M%`T7bz;(?_UaKj*m@VR+5HZp0dfg?*3uDG1@JrLqi6!Z9 zt=ms3t)Ayo2V;MiamS;B6Yqdkds}B7j1om4kH}8>z(%|aEXnzW?nu89V4jeNOg_m5Qqpgf{6Dag{Yk+10T;VsC)>{5)8;Al3JuP z|9Ev&J~=e6<5Ru9ZC)P%Q$G2!eBklw=#gqX1hP*1k^7>7wkQ%0bMH!y@DkaFght3=N>`vuqs>3@q z$dO}d5jm4A98XKgS;U%4XOJTwAejSbdmSJ%;(ixOD8pa@x^B(6&q5mUTGonTtp?vy zU&zWxY^gEs%e7ozuC<`AbNp8!IgwYx#9Q4vkU{a`=QsoRU|w-tSy>F;RHZ~ZkN#`( zY!=~j{1jY?St@=7k`@$2c}W(A`Dcfm8RnlIa( None: + super().__init__() + self.req = req + + @abc.abstractproperty + def build_tracker_id(self) -> Optional[str]: + """A string that uniquely identifies this requirement to the build tracker. + + If None, then this dist has no work to do in the build tracker, and + ``.prepare_distribution_metadata()`` will not be called.""" + raise NotImplementedError() + + @abc.abstractmethod + def get_metadata_distribution(self) -> BaseDistribution: + raise NotImplementedError() + + @abc.abstractmethod + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + raise NotImplementedError() diff --git a/project/Lib/site-packages/pip/_internal/distributions/installed.py b/project/Lib/site-packages/pip/_internal/distributions/installed.py new file mode 100644 index 0000000..ab8d53b --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/distributions/installed.py @@ -0,0 +1,29 @@ +from typing import Optional + +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution + + +class InstalledDistribution(AbstractDistribution): + """Represents an installed package. + + This does not need any preparation as the required information has already + been computed. + """ + + @property + def build_tracker_id(self) -> Optional[str]: + return None + + def get_metadata_distribution(self) -> BaseDistribution: + assert self.req.satisfied_by is not None, "not actually installed" + return self.req.satisfied_by + + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + pass diff --git a/project/Lib/site-packages/pip/_internal/distributions/sdist.py b/project/Lib/site-packages/pip/_internal/distributions/sdist.py new file mode 100644 index 0000000..15ff42b --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/distributions/sdist.py @@ -0,0 +1,156 @@ +import logging +from typing import Iterable, Optional, Set, Tuple + +from pip._internal.build_env import BuildEnvironment +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.exceptions import InstallationError +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution +from pip._internal.utils.subprocess import runner_with_spinner_message + +logger = logging.getLogger(__name__) + + +class SourceDistribution(AbstractDistribution): + """Represents a source distribution. + + The preparation step for these needs metadata for the packages to be + generated, either using PEP 517 or using the legacy `setup.py egg_info`. + """ + + @property + def build_tracker_id(self) -> Optional[str]: + """Identify this requirement uniquely by its link.""" + assert self.req.link + return self.req.link.url_without_fragment + + def get_metadata_distribution(self) -> BaseDistribution: + return self.req.get_dist() + + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + # Load pyproject.toml, to determine whether PEP 517 is to be used + self.req.load_pyproject_toml() + + # Set up the build isolation, if this requirement should be isolated + should_isolate = self.req.use_pep517 and build_isolation + if should_isolate: + # Setup an isolated environment and install the build backend static + # requirements in it. + self._prepare_build_backend(finder) + # Check that if the requirement is editable, it either supports PEP 660 or + # has a setup.py or a setup.cfg. This cannot be done earlier because we need + # to setup the build backend to verify it supports build_editable, nor can + # it be done later, because we want to avoid installing build requirements + # needlessly. Doing it here also works around setuptools generating + # UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory + # without setup.py nor setup.cfg. + self.req.isolated_editable_sanity_check() + # Install the dynamic build requirements. + self._install_build_reqs(finder) + # Check if the current environment provides build dependencies + should_check_deps = self.req.use_pep517 and check_build_deps + if should_check_deps: + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + conflicting, missing = self.req.build_env.check_requirements( + pyproject_requires + ) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + if missing: + self._raise_missing_reqs(missing) + self.req.prepare_metadata() + + def _prepare_build_backend(self, finder: PackageFinder) -> None: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, pyproject_requires, "overlay", kind="build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + self._raise_conflicts("PEP 517/518 supported requirements", conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))), + ) + + def _get_build_requires_wheel(self) -> Iterable[str]: + with self.req.build_env: + runner = runner_with_spinner_message("Getting requirements to build wheel") + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + return backend.get_requires_for_build_wheel() + + def _get_build_requires_editable(self) -> Iterable[str]: + with self.req.build_env: + runner = runner_with_spinner_message( + "Getting requirements to build editable" + ) + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + return backend.get_requires_for_build_editable() + + def _install_build_reqs(self, finder: PackageFinder) -> None: + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + if ( + self.req.editable + and self.req.permit_editable_wheels + and self.req.supports_pyproject_editable() + ): + build_reqs = self._get_build_requires_editable() + else: + build_reqs = self._get_build_requires_wheel() + conflicting, missing = self.req.build_env.check_requirements(build_reqs) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, "normal", kind="backend dependencies" + ) + + def _raise_conflicts( + self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]] + ) -> None: + format_string = ( + "Some build dependencies for {requirement} " + "conflict with {conflicting_with}: {description}." + ) + error_message = format_string.format( + requirement=self.req, + conflicting_with=conflicting_with, + description=", ".join( + f"{installed} is incompatible with {wanted}" + for installed, wanted in sorted(conflicting_reqs) + ), + ) + raise InstallationError(error_message) + + def _raise_missing_reqs(self, missing: Set[str]) -> None: + format_string = ( + "Some build dependencies for {requirement} are missing: {missing}." + ) + error_message = format_string.format( + requirement=self.req, missing=", ".join(map(repr, sorted(missing))) + ) + raise InstallationError(error_message) diff --git a/project/Lib/site-packages/pip/_internal/distributions/wheel.py b/project/Lib/site-packages/pip/_internal/distributions/wheel.py new file mode 100644 index 0000000..eb16e25 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/distributions/wheel.py @@ -0,0 +1,40 @@ +from typing import Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import ( + BaseDistribution, + FilesystemWheel, + get_wheel_distribution, +) + + +class WheelDistribution(AbstractDistribution): + """Represents a wheel distribution. + + This does not need any preparation as wheels can be directly unpacked. + """ + + @property + def build_tracker_id(self) -> Optional[str]: + return None + + def get_metadata_distribution(self) -> BaseDistribution: + """Loads the metadata from the wheel file into memory and returns a + Distribution that uses it, not relying on the wheel file or + requirement. + """ + assert self.req.local_file_path, "Set as part of preparation during download" + assert self.req.name, "Wheels are never unnamed" + wheel = FilesystemWheel(self.req.local_file_path) + return get_wheel_distribution(wheel, canonicalize_name(self.req.name)) + + def prepare_distribution_metadata( + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, + ) -> None: + pass diff --git a/project/Lib/site-packages/pip/_internal/exceptions.py b/project/Lib/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..5007a62 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,728 @@ +"""Exceptions used throughout package. + +This module MUST NOT try to import from anything within `pip._internal` to +operate. This is expected to be importable from any/all files within the +subpackage and, thus, should not depend on them. +""" + +import configparser +import contextlib +import locale +import logging +import pathlib +import re +import sys +from itertools import chain, groupby, repeat +from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union + +from pip._vendor.requests.models import Request, Response +from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult +from pip._vendor.rich.markup import escape +from pip._vendor.rich.text import Text + +if TYPE_CHECKING: + from hashlib import _Hash + from typing import Literal + + from pip._internal.metadata import BaseDistribution + from pip._internal.req.req_install import InstallRequirement + +logger = logging.getLogger(__name__) + + +# +# Scaffolding +# +def _is_kebab_case(s: str) -> bool: + return re.match(r"^[a-z]+(-[a-z]+)*$", s) is not None + + +def _prefix_with_indent( + s: Union[Text, str], + console: Console, + *, + prefix: str, + indent: str, +) -> Text: + if isinstance(s, Text): + text = s + else: + text = console.render_str(s) + + return console.render_str(prefix, overflow="ignore") + console.render_str( + f"\n{indent}", overflow="ignore" + ).join(text.split(allow_blank=True)) + + +class PipError(Exception): + """The base pip error.""" + + +class DiagnosticPipError(PipError): + """An error, that presents diagnostic information to the user. + + This contains a bunch of logic, to enable pretty presentation of our error + messages. Each error gets a unique reference. Each error can also include + additional context, a hint and/or a note -- which are presented with the + main error message in a consistent style. + + This is adapted from the error output styling in `sphinx-theme-builder`. + """ + + reference: str + + def __init__( + self, + *, + kind: 'Literal["error", "warning"]' = "error", + reference: Optional[str] = None, + message: Union[str, Text], + context: Optional[Union[str, Text]], + hint_stmt: Optional[Union[str, Text]], + note_stmt: Optional[Union[str, Text]] = None, + link: Optional[str] = None, + ) -> None: + # Ensure a proper reference is provided. + if reference is None: + assert hasattr(self, "reference"), "error reference not provided!" + reference = self.reference + assert _is_kebab_case(reference), "error reference must be kebab-case!" + + self.kind = kind + self.reference = reference + + self.message = message + self.context = context + + self.note_stmt = note_stmt + self.hint_stmt = hint_stmt + + self.link = link + + super().__init__(f"<{self.__class__.__name__}: {self.reference}>") + + def __repr__(self) -> str: + return ( + f"<{self.__class__.__name__}(" + f"reference={self.reference!r}, " + f"message={self.message!r}, " + f"context={self.context!r}, " + f"note_stmt={self.note_stmt!r}, " + f"hint_stmt={self.hint_stmt!r}" + ")>" + ) + + def __rich_console__( + self, + console: Console, + options: ConsoleOptions, + ) -> RenderResult: + colour = "red" if self.kind == "error" else "yellow" + + yield f"[{colour} bold]{self.kind}[/]: [bold]{self.reference}[/]" + yield "" + + if not options.ascii_only: + # Present the main message, with relevant context indented. + if self.context is not None: + yield _prefix_with_indent( + self.message, + console, + prefix=f"[{colour}]×[/] ", + indent=f"[{colour}]│[/] ", + ) + yield _prefix_with_indent( + self.context, + console, + prefix=f"[{colour}]╰─>[/] ", + indent=f"[{colour}] [/] ", + ) + else: + yield _prefix_with_indent( + self.message, + console, + prefix="[red]×[/] ", + indent=" ", + ) + else: + yield self.message + if self.context is not None: + yield "" + yield self.context + + if self.note_stmt is not None or self.hint_stmt is not None: + yield "" + + if self.note_stmt is not None: + yield _prefix_with_indent( + self.note_stmt, + console, + prefix="[magenta bold]note[/]: ", + indent=" ", + ) + if self.hint_stmt is not None: + yield _prefix_with_indent( + self.hint_stmt, + console, + prefix="[cyan bold]hint[/]: ", + indent=" ", + ) + + if self.link is not None: + yield "" + yield f"Link: {self.link}" + + +# +# Actual Errors +# +class ConfigurationError(PipError): + """General exception in configuration""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class MissingPyProjectBuildRequires(DiagnosticPipError): + """Raised when pyproject.toml has `build-system`, but no `build-system.requires`.""" + + reference = "missing-pyproject-build-system-requires" + + def __init__(self, *, package: str) -> None: + super().__init__( + message=f"Can not process {escape(package)}", + context=Text( + "This package has an invalid pyproject.toml file.\n" + "The [build-system] table is missing the mandatory `requires` key." + ), + note_stmt="This is an issue with the package mentioned above, not pip.", + hint_stmt=Text("See PEP 518 for the detailed specification."), + ) + + +class InvalidPyProjectBuildRequires(DiagnosticPipError): + """Raised when pyproject.toml an invalid `build-system.requires`.""" + + reference = "invalid-pyproject-build-system-requires" + + def __init__(self, *, package: str, reason: str) -> None: + super().__init__( + message=f"Can not process {escape(package)}", + context=Text( + "This package has an invalid `build-system.requires` key in " + f"pyproject.toml.\n{reason}" + ), + note_stmt="This is an issue with the package mentioned above, not pip.", + hint_stmt=Text("See PEP 518 for the detailed specification."), + ) + + +class NoneMetadataError(PipError): + """Raised when accessing a Distribution's "METADATA" or "PKG-INFO". + + This signifies an inconsistency, when the Distribution claims to have + the metadata file (if not, raise ``FileNotFoundError`` instead), but is + not actually able to produce its content. This may be due to permission + errors. + """ + + def __init__( + self, + dist: "BaseDistribution", + metadata_name: str, + ) -> None: + """ + :param dist: A Distribution object. + :param metadata_name: The name of the metadata being accessed + (can be "METADATA" or "PKG-INFO"). + """ + self.dist = dist + self.metadata_name = metadata_name + + def __str__(self) -> str: + # Use `dist` in the error message because its stringification + # includes more information, like the version and location. + return f"None {self.metadata_name} metadata found for distribution: {self.dist}" + + +class UserInstallationInvalid(InstallationError): + """A --user install is requested on an environment without user site.""" + + def __str__(self) -> str: + return "User base directory is not specified" + + +class InvalidSchemeCombination(InstallationError): + def __str__(self) -> str: + before = ", ".join(str(a) for a in self.args[:-1]) + return f"Cannot set {before} and {self.args[-1]} together" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class NetworkConnectionError(PipError): + """HTTP connection error""" + + def __init__( + self, + error_msg: str, + response: Optional[Response] = None, + request: Optional[Request] = None, + ) -> None: + """ + Initialize NetworkConnectionError with `request` and `response` + objects. + """ + self.response = response + self.request = request + self.error_msg = error_msg + if ( + self.response is not None + and not self.request + and hasattr(response, "request") + ): + self.request = self.response.request + super().__init__(error_msg, response, request) + + def __str__(self) -> str: + return str(self.error_msg) + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class InvalidWheel(InstallationError): + """Invalid (e.g. corrupt) wheel.""" + + def __init__(self, location: str, name: str): + self.location = location + self.name = name + + def __str__(self) -> str: + return f"Wheel '{self.name}' located at {self.location} is invalid." + + +class MetadataInconsistent(InstallationError): + """Built metadata contains inconsistent information. + + This is raised when the metadata contains values (e.g. name and version) + that do not match the information previously obtained from sdist filename, + user-supplied ``#egg=`` value, or an install requirement name. + """ + + def __init__( + self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str + ) -> None: + self.ireq = ireq + self.field = field + self.f_val = f_val + self.m_val = m_val + + def __str__(self) -> str: + return ( + f"Requested {self.ireq} has inconsistent {self.field}: " + f"expected {self.f_val!r}, but metadata has {self.m_val!r}" + ) + + +class InstallationSubprocessError(DiagnosticPipError, InstallationError): + """A subprocess call failed.""" + + reference = "subprocess-exited-with-error" + + def __init__( + self, + *, + command_description: str, + exit_code: int, + output_lines: Optional[List[str]], + ) -> None: + if output_lines is None: + output_prompt = Text("See above for output.") + else: + output_prompt = ( + Text.from_markup(f"[red][{len(output_lines)} lines of output][/]\n") + + Text("".join(output_lines)) + + Text.from_markup(R"[red]\[end of output][/]") + ) + + super().__init__( + message=( + f"[green]{escape(command_description)}[/] did not run successfully.\n" + f"exit code: {exit_code}" + ), + context=output_prompt, + hint_stmt=None, + note_stmt=( + "This error originates from a subprocess, and is likely not a " + "problem with pip." + ), + ) + + self.command_description = command_description + self.exit_code = exit_code + + def __str__(self) -> str: + return f"{self.command_description} exited with {self.exit_code}" + + +class MetadataGenerationFailed(InstallationSubprocessError, InstallationError): + reference = "metadata-generation-failed" + + def __init__( + self, + *, + package_details: str, + ) -> None: + super(InstallationSubprocessError, self).__init__( + message="Encountered error while generating package metadata.", + context=escape(package_details), + hint_stmt="See above for details.", + note_stmt="This is an issue with the package mentioned above, not pip.", + ) + + def __str__(self) -> str: + return "metadata generation failed" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self) -> None: + self.errors: List["HashError"] = [] + + def append(self, error: "HashError") -> None: + self.errors.append(error) + + def __str__(self) -> str: + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return "\n".join(lines) + return "" + + def __bool__(self) -> bool: + return bool(self.errors) + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + + req: Optional["InstallRequirement"] = None + head = "" + order: int = -1 + + def body(self) -> str: + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + its link already populated by the resolver's _populate_link(). + + """ + return f" {self._requirement_name()}" + + def __str__(self) -> str: + return f"{self.head}\n{self.body()}" + + def _requirement_name(self) -> str: + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else "unknown package" + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ( + "Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:" + ) + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ( + "Can't verify hashes for these file:// requirements because they " + "point to directories:" + ) + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ( + "Hashes are required in --require-hashes mode, but they are " + "missing from some requirements. Here is a list of those " + "requirements along with the hashes their downloaded archives " + "actually had. Add lines like these to your requirements files to " + "prevent tampering. (If you did not enable --require-hashes " + "manually, note that it turns on automatically when any package " + "has a hash.)" + ) + + def __init__(self, gotten_hash: str) -> None: + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self) -> str: + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = ( + self.req.original_link + if self.req.is_direct + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, "req", None) + ) + return " {} --hash={}:{}".format( + package or "unknown package", FAVORITE_HASH, self.gotten_hash + ) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ( + "In --require-hashes mode, all requirements must have their " + "versions pinned with ==. These do not:" + ) + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + + order = 4 + head = ( + "THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS " + "FILE. If you have updated the package versions, please update " + "the hashes. Otherwise, examine the package contents carefully; " + "someone may have tampered with them." + ) + + def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None: + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self) -> str: + return f" {self._requirement_name()}:\n{self._hash_comparison()}" + + def _hash_comparison(self) -> str: + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + + def hash_then_or(hash_name: str) -> "chain[str]": + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(" or")) + + lines: List[str] = [] + for hash_name, expecteds in self.allowed.items(): + prefix = hash_then_or(hash_name) + lines.extend((f" Expected {next(prefix)} {e}") for e in expecteds) + lines.append( + f" Got {self.gots[hash_name].hexdigest()}\n" + ) + return "\n".join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file""" + + def __init__( + self, + reason: str = "could not be loaded", + fname: Optional[str] = None, + error: Optional[configparser.Error] = None, + ) -> None: + super().__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self) -> str: + if self.fname is not None: + message_part = f" in {self.fname}." + else: + assert self.error is not None + message_part = f".\n{self.error}\n" + return f"Configuration file {self.reason}{message_part}" + + +_DEFAULT_EXTERNALLY_MANAGED_ERROR = f"""\ +The Python environment under {sys.prefix} is managed externally, and may not be +manipulated by the user. Please use specific tooling from the distributor of +the Python installation to interact with this environment instead. +""" + + +class ExternallyManagedEnvironment(DiagnosticPipError): + """The current environment is externally managed. + + This is raised when the current environment is externally managed, as + defined by `PEP 668`_. The ``EXTERNALLY-MANAGED`` configuration is checked + and displayed when the error is bubbled up to the user. + + :param error: The error message read from ``EXTERNALLY-MANAGED``. + """ + + reference = "externally-managed-environment" + + def __init__(self, error: Optional[str]) -> None: + if error is None: + context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR) + else: + context = Text(error) + super().__init__( + message="This environment is externally managed", + context=context, + note_stmt=( + "If you believe this is a mistake, please contact your " + "Python installation or OS distribution provider. " + "You can override this, at the risk of breaking your Python " + "installation or OS, by passing --break-system-packages." + ), + hint_stmt=Text("See PEP 668 for the detailed specification."), + ) + + @staticmethod + def _iter_externally_managed_error_keys() -> Iterator[str]: + # LC_MESSAGES is in POSIX, but not the C standard. The most common + # platform that does not implement this category is Windows, where + # using other categories for console message localization is equally + # unreliable, so we fall back to the locale-less vendor message. This + # can always be re-evaluated when a vendor proposes a new alternative. + try: + category = locale.LC_MESSAGES + except AttributeError: + lang: Optional[str] = None + else: + lang, _ = locale.getlocale(category) + if lang is not None: + yield f"Error-{lang}" + for sep in ("-", "_"): + before, found, _ = lang.partition(sep) + if not found: + continue + yield f"Error-{before}" + yield "Error" + + @classmethod + def from_config( + cls, + config: Union[pathlib.Path, str], + ) -> "ExternallyManagedEnvironment": + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read(config, encoding="utf-8") + section = parser["externally-managed"] + for key in cls._iter_externally_managed_error_keys(): + with contextlib.suppress(KeyError): + return cls(section[key]) + except KeyError: + pass + except (OSError, UnicodeDecodeError, configparser.ParsingError): + from pip._internal.utils._log import VERBOSE + + exc_info = logger.isEnabledFor(VERBOSE) + logger.warning("Failed to read %s", config, exc_info=exc_info) + return cls(None) diff --git a/project/Lib/site-packages/pip/_internal/index/__init__.py b/project/Lib/site-packages/pip/_internal/index/__init__.py new file mode 100644 index 0000000..7a17b7b --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/index/__init__.py @@ -0,0 +1,2 @@ +"""Index interaction code +""" diff --git a/project/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..198f1e2caac5306552948fdc6e22ce9222ff4c97 GIT binary patch literal 237 zcmZ3^%ge<81b%V4X>vgNF^B^Lj8MjBkdo;PDGX5zDU87knoL#Vo_Q&$6$+VoC8bQ=D0ns#}nloSm4SS{zf5S)d;eHa;&gM?Vu}n|?e{AhRSs uUaz3?7l%!5eoARhs$CHq&<>D8izR`?2WCb_#t%%4j4U4*P>3QHpez71=|AlN literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d733744bb09fa2e359896d5bd51dc83d1e55e190 GIT binary patch literal 24582 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 literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c044931f9f8c62685a34db38a7bad7046a8929d GIT binary patch literal 44146 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 I7#{rp0uxB%ng9R* literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce6c118ee2f81180ce0f0879761a981e1e6cb729 GIT binary patch literal 13953 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 aZS3Ei*7~PPfho;(sM<-H+zx Optional[str]: + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + for scheme in vcs.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in "+:": + return scheme + return None + + +class _NotAPIContent(Exception): + def __init__(self, content_type: str, request_desc: str) -> None: + super().__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_api_header(response: Response) -> None: + """ + Check the Content-Type header to ensure the response contains a Simple + API Response. + + Raises `_NotAPIContent` if the content type is not a valid content-type. + """ + content_type = response.headers.get("Content-Type", "Unknown") + + content_type_l = content_type.lower() + if content_type_l.startswith( + ( + "text/html", + "application/vnd.pypi.simple.v1+html", + "application/vnd.pypi.simple.v1+json", + ) + ): + return + + raise _NotAPIContent(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_api_response(url: str, session: PipSession) -> None: + """ + Send a HEAD request to the URL, and ensure the response contains a simple + API Response. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotAPIContent` if the content type is not a valid content type. + """ + scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) + if scheme not in {"http", "https"}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + raise_for_status(resp) + + _ensure_api_header(resp) + + +def _get_simple_response(url: str, session: PipSession) -> Response: + """Access an Simple API response with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML or Simple API, to avoid downloading a + large file. Raise `_NotHTTP` if the content type cannot be determined, or + `_NotAPIContent` if it is not HTML or a Simple API. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got a Simple API response, + and raise `_NotAPIContent` otherwise. + """ + if is_archive_file(Link(url).filename): + _ensure_api_response(url, session=session) + + logger.debug("Getting page %s", redact_auth_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": ", ".join( + [ + "application/vnd.pypi.simple.v1+json", + "application/vnd.pypi.simple.v1+html; q=0.1", + "text/html; q=0.01", + ] + ), + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + raise_for_status(resp) + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is a + # Simple API response or not. However we can check after we've + # downloaded it. + _ensure_api_header(resp) + + logger.debug( + "Fetched page %s as %s", + redact_auth_from_url(url), + resp.headers.get("Content-Type", "Unknown"), + ) + + return resp + + +def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]: + """Determine if we have any encoding information in our headers.""" + if headers and "Content-Type" in headers: + m = email.message.Message() + m["content-type"] = headers["Content-Type"] + charset = m.get_param("charset") + if charset: + return str(charset) + return None + + +class CacheablePageContent: + def __init__(self, page: "IndexContent") -> None: + assert page.cache_link_parsing + self.page = page + + def __eq__(self, other: object) -> bool: + return isinstance(other, type(self)) and self.page.url == other.page.url + + def __hash__(self) -> int: + return hash(self.page.url) + + +class ParseLinks(Protocol): + def __call__(self, page: "IndexContent") -> Iterable[Link]: + ... + + +def with_cached_index_content(fn: ParseLinks) -> ParseLinks: + """ + Given a function that parses an Iterable[Link] from an IndexContent, cache the + function's result (keyed by CacheablePageContent), unless the IndexContent + `page` has `page.cache_link_parsing == False`. + """ + + @functools.lru_cache(maxsize=None) + def wrapper(cacheable_page: CacheablePageContent) -> List[Link]: + return list(fn(cacheable_page.page)) + + @functools.wraps(fn) + def wrapper_wrapper(page: "IndexContent") -> List[Link]: + if page.cache_link_parsing: + return wrapper(CacheablePageContent(page)) + return list(fn(page)) + + return wrapper_wrapper + + +@with_cached_index_content +def parse_links(page: "IndexContent") -> Iterable[Link]: + """ + Parse a Simple API's Index Content, and yield its anchor elements as Link objects. + """ + + content_type_l = page.content_type.lower() + if content_type_l.startswith("application/vnd.pypi.simple.v1+json"): + data = json.loads(page.content) + for file in data.get("files", []): + link = Link.from_json(file, page.url) + if link is None: + continue + yield link + return + + parser = HTMLLinkParser(page.url) + encoding = page.encoding or "utf-8" + parser.feed(page.content.decode(encoding)) + + url = page.url + base_url = parser.base_url or url + for anchor in parser.anchors: + link = Link.from_element(anchor, page_url=url, base_url=base_url) + if link is None: + continue + yield link + + +class IndexContent: + """Represents one response (or page), along with its URL""" + + def __init__( + self, + content: bytes, + content_type: str, + encoding: Optional[str], + url: str, + cache_link_parsing: bool = True, + ) -> None: + """ + :param encoding: the encoding to decode the given content. + :param url: the URL from which the HTML was downloaded. + :param cache_link_parsing: whether links parsed from this page's url + should be cached. PyPI index urls should + have this set to False, for example. + """ + self.content = content + self.content_type = content_type + self.encoding = encoding + self.url = url + self.cache_link_parsing = cache_link_parsing + + def __str__(self) -> str: + return redact_auth_from_url(self.url) + + +class HTMLLinkParser(HTMLParser): + """ + HTMLParser that keeps the first base HREF and a list of all anchor + elements' attributes. + """ + + def __init__(self, url: str) -> None: + super().__init__(convert_charrefs=True) + + self.url: str = url + self.base_url: Optional[str] = None + self.anchors: List[Dict[str, Optional[str]]] = [] + + def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None: + if tag == "base" and self.base_url is None: + href = self.get_href(attrs) + if href is not None: + self.base_url = href + elif tag == "a": + self.anchors.append(dict(attrs)) + + def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]: + for name, value in attrs: + if name == "href": + return value + return None + + +def _handle_get_simple_fail( + link: Link, + reason: Union[str, Exception], + meth: Optional[Callable[..., None]] = None, +) -> None: + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _make_index_content( + response: Response, cache_link_parsing: bool = True +) -> IndexContent: + encoding = _get_encoding_from_headers(response.headers) + return IndexContent( + response.content, + response.headers["Content-Type"], + encoding=encoding, + url=response.url, + cache_link_parsing=cache_link_parsing, + ) + + +def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]: + url = link.url.split("#", 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.warning( + "Cannot look at %s URL %s because it does not support lookup as web pages.", + vcs_scheme, + link, + ) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib.parse.urlparse(url) + if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith("/"): + url += "/" + # TODO: In the future, it would be nice if pip supported PEP 691 + # style responses in the file:// URLs, however there's no + # standard file extension for application/vnd.pypi.simple.v1+json + # so we'll need to come up with something on our own. + url = urllib.parse.urljoin(url, "index.html") + logger.debug(" file: URL is directory, getting %s", url) + + try: + resp = _get_simple_response(url, session=session) + except _NotHTTP: + logger.warning( + "Skipping page %s because it looks like an archive, and cannot " + "be checked by a HTTP HEAD request.", + link, + ) + except _NotAPIContent as exc: + logger.warning( + "Skipping page %s because the %s request got Content-Type: %s. " + "The only supported Content-Types are application/vnd.pypi.simple.v1+json, " + "application/vnd.pypi.simple.v1+html, and text/html", + link, + exc.request_desc, + exc.content_type, + ) + except NetworkConnectionError as exc: + _handle_get_simple_fail(link, exc) + except RetryError as exc: + _handle_get_simple_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_simple_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_simple_fail(link, f"connection error: {exc}") + except requests.Timeout: + _handle_get_simple_fail(link, "timed out") + else: + return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing) + return None + + +class CollectedSources(NamedTuple): + find_links: Sequence[Optional[LinkSource]] + index_urls: Sequence[Optional[LinkSource]] + + +class LinkCollector: + + """ + Responsible for collecting Link objects from all configured locations, + making network requests as needed. + + The class's main method is its collect_sources() method. + """ + + def __init__( + self, + session: PipSession, + search_scope: SearchScope, + ) -> None: + self.search_scope = search_scope + self.session = session + + @classmethod + def create( + cls, + session: PipSession, + options: Values, + suppress_no_index: bool = False, + ) -> "LinkCollector": + """ + :param session: The Session to use to make requests. + :param suppress_no_index: Whether to ignore the --no-index option + when constructing the SearchScope object. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index and not suppress_no_index: + logger.debug( + "Ignoring indexes: %s", + ",".join(redact_auth_from_url(url) for url in index_urls), + ) + index_urls = [] + + # Make sure find_links is a list before passing to create(). + find_links = options.find_links or [] + + search_scope = SearchScope.create( + find_links=find_links, + index_urls=index_urls, + no_index=options.no_index, + ) + link_collector = LinkCollector( + session=session, + search_scope=search_scope, + ) + return link_collector + + @property + def find_links(self) -> List[str]: + return self.search_scope.find_links + + def fetch_response(self, location: Link) -> Optional[IndexContent]: + """ + Fetch an HTML page containing package links. + """ + return _get_index_content(location, session=self.session) + + def collect_sources( + self, + project_name: str, + candidates_from_page: CandidatesFromPage, + ) -> CollectedSources: + # The OrderedDict calls deduplicate sources by URL. + index_url_sources = collections.OrderedDict( + build_source( + loc, + candidates_from_page=candidates_from_page, + page_validator=self.session.is_secure_origin, + expand_dir=False, + cache_link_parsing=False, + project_name=project_name, + ) + for loc in self.search_scope.get_index_urls_locations(project_name) + ).values() + find_links_sources = collections.OrderedDict( + build_source( + loc, + candidates_from_page=candidates_from_page, + page_validator=self.session.is_secure_origin, + expand_dir=True, + cache_link_parsing=True, + project_name=project_name, + ) + for loc in self.find_links + ).values() + + if logger.isEnabledFor(logging.DEBUG): + lines = [ + f"* {s.link}" + for s in itertools.chain(find_links_sources, index_url_sources) + if s is not None and s.link is not None + ] + lines = [ + f"{len(lines)} location(s) to search " + f"for versions of {project_name}:" + ] + lines + logger.debug("\n".join(lines)) + + return CollectedSources( + find_links=list(find_links_sources), + index_urls=list(index_url_sources), + ) diff --git a/project/Lib/site-packages/pip/_internal/index/package_finder.py b/project/Lib/site-packages/pip/_internal/index/package_finder.py new file mode 100644 index 0000000..ec9ebc3 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/index/package_finder.py @@ -0,0 +1,1027 @@ +"""Routines related to PyPI, indexes""" + +import enum +import functools +import itertools +import logging +import re +from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union + +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.tags import Tag +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import _BaseVersion +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, + DistributionNotFound, + InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.index.collector import LinkCollector, parse_links +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.link import Link +from pip._internal.models.search_scope import SearchScope +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.models.wheel import Wheel +from pip._internal.req import InstallRequirement +from pip._internal.utils._log import getLogger +from pip._internal.utils.filetypes import WHEEL_EXTENSION +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import build_netloc +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS + +if TYPE_CHECKING: + from pip._vendor.typing_extensions import TypeGuard + +__all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"] + + +logger = getLogger(__name__) + +BuildTag = Union[Tuple[()], Tuple[int, str]] +CandidateSortingKey = Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag] + + +def _check_link_requires_python( + link: Link, + version_info: Tuple[int, int, int], + ignore_requires_python: bool = False, +) -> bool: + """ + Return whether the given Python version is compatible with a link's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + """ + try: + is_compatible = check_requires_python( + link.requires_python, + version_info=version_info, + ) + except specifiers.InvalidSpecifier: + logger.debug( + "Ignoring invalid Requires-Python (%r) for link: %s", + link.requires_python, + link, + ) + else: + if not is_compatible: + version = ".".join(map(str, version_info)) + if not ignore_requires_python: + logger.verbose( + "Link requires a different Python (%s not in: %r): %s", + version, + link.requires_python, + link, + ) + return False + + logger.debug( + "Ignoring failed Requires-Python check (%s not in: %r) for link: %s", + version, + link.requires_python, + link, + ) + + return True + + +class LinkType(enum.Enum): + candidate = enum.auto() + different_project = enum.auto() + yanked = enum.auto() + format_unsupported = enum.auto() + format_invalid = enum.auto() + platform_mismatch = enum.auto() + requires_python_mismatch = enum.auto() + + +class LinkEvaluator: + + """ + Responsible for evaluating links for a particular project. + """ + + _py_version_re = re.compile(r"-py([123]\.?[0-9]?)$") + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + project_name: str, + canonical_name: str, + formats: FrozenSet[str], + target_python: TargetPython, + allow_yanked: bool, + ignore_requires_python: Optional[bool] = None, + ) -> None: + """ + :param project_name: The user supplied package name. + :param canonical_name: The canonical package name. + :param formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. + :param target_python: The target Python interpreter to use when + evaluating link compatibility. This is used, for example, to + check wheel compatibility, as well as when checking the Python + version, e.g. the Python version embedded in a link filename + (or egg fragment) and against an HTML link's optional PEP 503 + "data-requires-python" attribute. + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param ignore_requires_python: Whether to ignore incompatible + PEP 503 "data-requires-python" values in HTML links. Defaults + to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self._allow_yanked = allow_yanked + self._canonical_name = canonical_name + self._ignore_requires_python = ignore_requires_python + self._formats = formats + self._target_python = target_python + + self.project_name = project_name + + def evaluate_link(self, link: Link) -> Tuple[LinkType, str]: + """ + Determine whether a link is a candidate for installation. + + :return: A tuple (result, detail), where *result* is an enum + representing whether the evaluation found a candidate, or the reason + why one is not found. If a candidate is found, *detail* will be the + candidate's version string; if one is not found, it contains the + reason the link fails to qualify. + """ + version = None + if link.is_yanked and not self._allow_yanked: + reason = link.yanked_reason or "" + return (LinkType.yanked, f"yanked for reason: {reason}") + + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + return (LinkType.format_unsupported, "not a file") + if ext not in SUPPORTED_EXTENSIONS: + return ( + LinkType.format_unsupported, + f"unsupported archive format: {ext}", + ) + if "binary" not in self._formats and ext == WHEEL_EXTENSION: + reason = f"No binaries permitted for {self.project_name}" + return (LinkType.format_unsupported, reason) + if "macosx10" in link.path and ext == ".zip": + return (LinkType.format_unsupported, "macosx10 one") + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + return ( + LinkType.format_invalid, + "invalid wheel filename", + ) + if canonicalize_name(wheel.name) != self._canonical_name: + reason = f"wrong project name (not {self.project_name})" + return (LinkType.different_project, reason) + + supported_tags = self._target_python.get_unsorted_tags() + if not wheel.supported(supported_tags): + # Include the wheel's tags in the reason string to + # simplify troubleshooting compatibility issues. + file_tags = ", ".join(wheel.get_formatted_file_tags()) + reason = ( + f"none of the wheel's tags ({file_tags}) are compatible " + f"(run pip debug --verbose to show compatible tags)" + ) + return (LinkType.platform_mismatch, reason) + + version = wheel.version + + # This should be up by the self.ok_binary check, but see issue 2700. + if "source" not in self._formats and ext != WHEEL_EXTENSION: + reason = f"No sources permitted for {self.project_name}" + return (LinkType.format_unsupported, reason) + + if not version: + version = _extract_version_from_fragment( + egg_info, + self._canonical_name, + ) + if not version: + reason = f"Missing project version for {self.project_name}" + return (LinkType.format_invalid, reason) + + match = self._py_version_re.search(version) + if match: + version = version[: match.start()] + py_version = match.group(1) + if py_version != self._target_python.py_version: + return ( + LinkType.platform_mismatch, + "Python version is incorrect", + ) + + supports_python = _check_link_requires_python( + link, + version_info=self._target_python.py_version_info, + ignore_requires_python=self._ignore_requires_python, + ) + if not supports_python: + reason = f"{version} Requires-Python {link.requires_python}" + return (LinkType.requires_python_mismatch, reason) + + logger.debug("Found link %s, version: %s", link, version) + + return (LinkType.candidate, version) + + +def filter_unallowed_hashes( + candidates: List[InstallationCandidate], + hashes: Optional[Hashes], + project_name: str, +) -> List[InstallationCandidate]: + """ + Filter out candidates whose hashes aren't allowed, and return a new + list of candidates. + + If at least one candidate has an allowed hash, then all candidates with + either an allowed hash or no hash specified are returned. Otherwise, + the given candidates are returned. + + Including the candidates with no hash specified when there is a match + allows a warning to be logged if there is a more preferred candidate + with no hash specified. Returning all candidates in the case of no + matches lets pip report the hash of the candidate that would otherwise + have been installed (e.g. permitting the user to more easily update + their requirements file with the desired hash). + """ + if not hashes: + logger.debug( + "Given no hashes to check %s links for project %r: " + "discarding no candidates", + len(candidates), + project_name, + ) + # Make sure we're not returning back the given value. + return list(candidates) + + matches_or_no_digest = [] + # Collect the non-matches for logging purposes. + non_matches = [] + match_count = 0 + for candidate in candidates: + link = candidate.link + if not link.has_hash: + pass + elif link.is_hash_allowed(hashes=hashes): + match_count += 1 + else: + non_matches.append(candidate) + continue + + matches_or_no_digest.append(candidate) + + if match_count: + filtered = matches_or_no_digest + else: + # Make sure we're not returning back the given value. + filtered = list(candidates) + + if len(filtered) == len(candidates): + discard_message = "discarding no candidates" + else: + discard_message = "discarding {} non-matches:\n {}".format( + len(non_matches), + "\n ".join(str(candidate.link) for candidate in non_matches), + ) + + logger.debug( + "Checked %s links for project %r against %s hashes " + "(%s matches, %s no digest): %s", + len(candidates), + project_name, + hashes.digest_count, + match_count, + len(matches_or_no_digest) - match_count, + discard_message, + ) + + return filtered + + +class CandidatePreferences: + + """ + Encapsulates some of the preferences for filtering and sorting + InstallationCandidate objects. + """ + + def __init__( + self, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + ) -> None: + """ + :param allow_all_prereleases: Whether to allow all pre-releases. + """ + self.allow_all_prereleases = allow_all_prereleases + self.prefer_binary = prefer_binary + + +class BestCandidateResult: + """A collection of candidates, returned by `PackageFinder.find_best_candidate`. + + This class is only intended to be instantiated by CandidateEvaluator's + `compute_best_candidate()` method. + """ + + def __init__( + self, + candidates: List[InstallationCandidate], + applicable_candidates: List[InstallationCandidate], + best_candidate: Optional[InstallationCandidate], + ) -> None: + """ + :param candidates: A sequence of all available candidates found. + :param applicable_candidates: The applicable candidates. + :param best_candidate: The most preferred candidate found, or None + if no applicable candidates were found. + """ + assert set(applicable_candidates) <= set(candidates) + + if best_candidate is None: + assert not applicable_candidates + else: + assert best_candidate in applicable_candidates + + self._applicable_candidates = applicable_candidates + self._candidates = candidates + + self.best_candidate = best_candidate + + def iter_all(self) -> Iterable[InstallationCandidate]: + """Iterate through all candidates.""" + return iter(self._candidates) + + def iter_applicable(self) -> Iterable[InstallationCandidate]: + """Iterate through the applicable candidates.""" + return iter(self._applicable_candidates) + + +class CandidateEvaluator: + + """ + Responsible for filtering and sorting candidates for installation based + on what tags are valid. + """ + + @classmethod + def create( + cls, + project_name: str, + target_python: Optional[TargetPython] = None, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> "CandidateEvaluator": + """Create a CandidateEvaluator object. + + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + :param hashes: An optional collection of allowed hashes. + """ + if target_python is None: + target_python = TargetPython() + if specifier is None: + specifier = specifiers.SpecifierSet() + + supported_tags = target_python.get_sorted_tags() + + return cls( + project_name=project_name, + supported_tags=supported_tags, + specifier=specifier, + prefer_binary=prefer_binary, + allow_all_prereleases=allow_all_prereleases, + hashes=hashes, + ) + + def __init__( + self, + project_name: str, + supported_tags: List[Tag], + specifier: specifiers.BaseSpecifier, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + hashes: Optional[Hashes] = None, + ) -> None: + """ + :param supported_tags: The PEP 425 tags supported by the target + Python in order of preference (most preferred first). + """ + self._allow_all_prereleases = allow_all_prereleases + self._hashes = hashes + self._prefer_binary = prefer_binary + self._project_name = project_name + self._specifier = specifier + self._supported_tags = supported_tags + # Since the index of the tag in the _supported_tags list is used + # as a priority, precompute a map from tag to index/priority to be + # used in wheel.find_most_preferred_tag. + self._wheel_tag_preferences = { + tag: idx for idx, tag in enumerate(supported_tags) + } + + def get_applicable_candidates( + self, + candidates: List[InstallationCandidate], + ) -> List[InstallationCandidate]: + """ + Return the applicable candidates from a list of candidates. + """ + # Using None infers from the specifier instead. + allow_prereleases = self._allow_all_prereleases or None + specifier = self._specifier + versions = { + str(v) + for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=allow_prereleases, + ) + } + + # Again, converting version to str to deal with debundling. + applicable_candidates = [c for c in candidates if str(c.version) in versions] + + filtered_applicable_candidates = filter_unallowed_hashes( + candidates=applicable_candidates, + hashes=self._hashes, + project_name=self._project_name, + ) + + return sorted(filtered_applicable_candidates, key=self._sort_key) + + def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: + """ + Function to pass as the `key` argument to a call to sorted() to sort + InstallationCandidates by preference. + + Returns a tuple such that tuples sorting as greater using Python's + default comparison operator are more preferred. + + The preference is as follows: + + First and foremost, candidates with allowed (matching) hashes are + always preferred over candidates without matching hashes. This is + because e.g. if the only candidate with an allowed hash is yanked, + we still want to use that candidate. + + Second, excepting hash considerations, candidates that have been + yanked (in the sense of PEP 592) are always less preferred than + candidates that haven't been yanked. Then: + + If not finding wheels, they are sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self._supported_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + valid_tags = self._supported_tags + support_num = len(valid_tags) + build_tag: BuildTag = () + binary_preference = 0 + link = candidate.link + if link.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(link.filename) + try: + pri = -( + wheel.find_most_preferred_tag( + valid_tags, self._wheel_tag_preferences + ) + ) + except ValueError: + raise UnsupportedWheel( + f"{wheel.filename} is not a supported wheel for this platform. It " + "can't be sorted." + ) + if self._prefer_binary: + binary_preference = 1 + if wheel.build_tag is not None: + match = re.match(r"^(\d+)(.*)$", wheel.build_tag) + assert match is not None, "guaranteed by filename validation" + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + has_allowed_hash = int(link.is_hash_allowed(self._hashes)) + yank_value = -1 * int(link.is_yanked) # -1 for yanked. + return ( + has_allowed_hash, + yank_value, + binary_preference, + candidate.version, + pri, + build_tag, + ) + + def sort_best_candidate( + self, + candidates: List[InstallationCandidate], + ) -> Optional[InstallationCandidate]: + """ + Return the best candidate per the instance's sort order, or None if + no candidate is acceptable. + """ + if not candidates: + return None + best_candidate = max(candidates, key=self._sort_key) + return best_candidate + + def compute_best_candidate( + self, + candidates: List[InstallationCandidate], + ) -> BestCandidateResult: + """ + Compute and return a `BestCandidateResult` instance. + """ + applicable_candidates = self.get_applicable_candidates(candidates) + + best_candidate = self.sort_best_candidate(applicable_candidates) + + return BestCandidateResult( + candidates, + applicable_candidates=applicable_candidates, + best_candidate=best_candidate, + ) + + +class PackageFinder: + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + link_collector: LinkCollector, + target_python: TargetPython, + allow_yanked: bool, + format_control: Optional[FormatControl] = None, + candidate_prefs: Optional[CandidatePreferences] = None, + ignore_requires_python: Optional[bool] = None, + ) -> None: + """ + This constructor is primarily meant to be used by the create() class + method and from tests. + + :param format_control: A FormatControl object, used to control + the selection of source packages / binary packages when consulting + the index and links. + :param candidate_prefs: Options to use when creating a + CandidateEvaluator object. + """ + if candidate_prefs is None: + candidate_prefs = CandidatePreferences() + + format_control = format_control or FormatControl(set(), set()) + + self._allow_yanked = allow_yanked + self._candidate_prefs = candidate_prefs + self._ignore_requires_python = ignore_requires_python + self._link_collector = link_collector + self._target_python = target_python + + self.format_control = format_control + + # These are boring links that have already been logged somehow. + self._logged_links: Set[Tuple[Link, LinkType, str]] = set() + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + @classmethod + def create( + cls, + link_collector: LinkCollector, + selection_prefs: SelectionPreferences, + target_python: Optional[TargetPython] = None, + ) -> "PackageFinder": + """Create a PackageFinder. + + :param selection_prefs: The candidate selection preferences, as a + SelectionPreferences object. + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + """ + if target_python is None: + target_python = TargetPython() + + candidate_prefs = CandidatePreferences( + prefer_binary=selection_prefs.prefer_binary, + allow_all_prereleases=selection_prefs.allow_all_prereleases, + ) + + return cls( + candidate_prefs=candidate_prefs, + link_collector=link_collector, + target_python=target_python, + allow_yanked=selection_prefs.allow_yanked, + format_control=selection_prefs.format_control, + ignore_requires_python=selection_prefs.ignore_requires_python, + ) + + @property + def target_python(self) -> TargetPython: + return self._target_python + + @property + def search_scope(self) -> SearchScope: + return self._link_collector.search_scope + + @search_scope.setter + def search_scope(self, search_scope: SearchScope) -> None: + self._link_collector.search_scope = search_scope + + @property + def find_links(self) -> List[str]: + return self._link_collector.find_links + + @property + def index_urls(self) -> List[str]: + return self.search_scope.index_urls + + @property + def trusted_hosts(self) -> Iterable[str]: + for host_port in self._link_collector.session.pip_trusted_origins: + yield build_netloc(*host_port) + + @property + def allow_all_prereleases(self) -> bool: + return self._candidate_prefs.allow_all_prereleases + + def set_allow_all_prereleases(self) -> None: + self._candidate_prefs.allow_all_prereleases = True + + @property + def prefer_binary(self) -> bool: + return self._candidate_prefs.prefer_binary + + def set_prefer_binary(self) -> None: + self._candidate_prefs.prefer_binary = True + + def requires_python_skipped_reasons(self) -> List[str]: + reasons = { + detail + for _, result, detail in self._logged_links + if result == LinkType.requires_python_mismatch + } + return sorted(reasons) + + def make_link_evaluator(self, project_name: str) -> LinkEvaluator: + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + + return LinkEvaluator( + project_name=project_name, + canonical_name=canonical_name, + formats=formats, + target_python=self._target_python, + allow_yanked=self._allow_yanked, + ignore_requires_python=self._ignore_requires_python, + ) + + def _sort_links(self, links: Iterable[Link]) -> List[Link]: + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen: Set[Link] = set() + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _log_skipped_link(self, link: Link, result: LinkType, detail: str) -> None: + entry = (link, result, detail) + if entry not in self._logged_links: + # Put the link at the end so the reason is more visible and because + # the link string is usually very long. + logger.debug("Skipping link: %s: %s", detail, link) + self._logged_links.add(entry) + + def get_install_candidate( + self, link_evaluator: LinkEvaluator, link: Link + ) -> Optional[InstallationCandidate]: + """ + If the link is a candidate for install, convert it to an + InstallationCandidate and return it. Otherwise, return None. + """ + result, detail = link_evaluator.evaluate_link(link) + if result != LinkType.candidate: + self._log_skipped_link(link, result, detail) + return None + + return InstallationCandidate( + name=link_evaluator.project_name, + link=link, + version=detail, + ) + + def evaluate_links( + self, link_evaluator: LinkEvaluator, links: Iterable[Link] + ) -> List[InstallationCandidate]: + """ + Convert links that are candidates to InstallationCandidate objects. + """ + candidates = [] + for link in self._sort_links(links): + candidate = self.get_install_candidate(link_evaluator, link) + if candidate is not None: + candidates.append(candidate) + + return candidates + + def process_project_url( + self, project_url: Link, link_evaluator: LinkEvaluator + ) -> List[InstallationCandidate]: + logger.debug( + "Fetching project page and analyzing links: %s", + project_url, + ) + index_response = self._link_collector.fetch_response(project_url) + if index_response is None: + return [] + + page_links = list(parse_links(index_response)) + + with indent_log(): + package_links = self.evaluate_links( + link_evaluator, + links=page_links, + ) + + return package_links + + @functools.lru_cache(maxsize=None) + def find_all_candidates(self, project_name: str) -> List[InstallationCandidate]: + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See LinkEvaluator.evaluate_link() for details on which files + are accepted. + """ + link_evaluator = self.make_link_evaluator(project_name) + + collected_sources = self._link_collector.collect_sources( + project_name=project_name, + candidates_from_page=functools.partial( + self.process_project_url, + link_evaluator=link_evaluator, + ), + ) + + page_candidates_it = itertools.chain.from_iterable( + source.page_candidates() + for sources in collected_sources + for source in sources + if source is not None + ) + page_candidates = list(page_candidates_it) + + file_links_it = itertools.chain.from_iterable( + source.file_links() + for sources in collected_sources + for source in sources + if source is not None + ) + file_candidates = self.evaluate_links( + link_evaluator, + sorted(file_links_it, reverse=True), + ) + + if logger.isEnabledFor(logging.DEBUG) and file_candidates: + paths = [] + for candidate in file_candidates: + assert candidate.link.url # we need to have a URL + try: + paths.append(candidate.link.file_path) + except Exception: + paths.append(candidate.link.url) # it's not a local file + + logger.debug("Local files found: %s", ", ".join(paths)) + + # This is an intentional priority ordering + return file_candidates + page_candidates + + def make_candidate_evaluator( + self, + project_name: str, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> CandidateEvaluator: + """Create a CandidateEvaluator object to use.""" + candidate_prefs = self._candidate_prefs + return CandidateEvaluator.create( + project_name=project_name, + target_python=self._target_python, + prefer_binary=candidate_prefs.prefer_binary, + allow_all_prereleases=candidate_prefs.allow_all_prereleases, + specifier=specifier, + hashes=hashes, + ) + + @functools.lru_cache(maxsize=None) + def find_best_candidate( + self, + project_name: str, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> BestCandidateResult: + """Find matches for the given project and specifier. + + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + + :return: A `BestCandidateResult` instance. + """ + candidates = self.find_all_candidates(project_name) + candidate_evaluator = self.make_candidate_evaluator( + project_name=project_name, + specifier=specifier, + hashes=hashes, + ) + return candidate_evaluator.compute_best_candidate(candidates) + + def find_requirement( + self, req: InstallRequirement, upgrade: bool + ) -> Optional[InstallationCandidate]: + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a InstallationCandidate if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + hashes = req.hashes(trust_internet=False) + best_candidate_result = self.find_best_candidate( + req.name, + specifier=req.specifier, + hashes=hashes, + ) + best_candidate = best_candidate_result.best_candidate + + installed_version: Optional[_BaseVersion] = None + if req.satisfied_by is not None: + installed_version = req.satisfied_by.version + + def _format_versions(cand_iter: Iterable[InstallationCandidate]) -> str: + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ( + ", ".join( + sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + ) + ) + or "none" + ) + + if installed_version is None and best_candidate is None: + logger.critical( + "Could not find a version that satisfies the requirement %s " + "(from versions: %s)", + req, + _format_versions(best_candidate_result.iter_all()), + ) + + raise DistributionNotFound(f"No matching distribution found for {req}") + + def _should_install_candidate( + candidate: Optional[InstallationCandidate], + ) -> "TypeGuard[InstallationCandidate]": + if installed_version is None: + return True + if best_candidate is None: + return False + return best_candidate.version > installed_version + + if not upgrade and installed_version is not None: + if _should_install_candidate(best_candidate): + logger.debug( + "Existing installed version (%s) satisfies requirement " + "(most up-to-date version is %s)", + installed_version, + best_candidate.version, + ) + else: + logger.debug( + "Existing installed version (%s) is most up-to-date and " + "satisfies requirement", + installed_version, + ) + return None + + if _should_install_candidate(best_candidate): + logger.debug( + "Using version %s (newest of versions: %s)", + best_candidate.version, + _format_versions(best_candidate_result.iter_applicable()), + ) + return best_candidate + + # We have an existing version, and its the best version + logger.debug( + "Installed version (%s) is most up-to-date (past versions: %s)", + installed_version, + _format_versions(best_candidate_result.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + +def _find_name_version_sep(fragment: str, canonical_name: str) -> int: + """Find the separator's index based on the package's canonical name. + + :param fragment: A + filename "fragment" (stem) or + egg fragment. + :param canonical_name: The package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> fragment = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(fragment, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(fragment): + if c != "-": + continue + if canonicalize_name(fragment[:i]) == canonical_name: + return i + raise ValueError(f"{fragment} does not match {canonical_name}") + + +def _extract_version_from_fragment(fragment: str, canonical_name: str) -> Optional[str]: + """Parse the version string from a + filename + "fragment" (stem) or egg fragment. + + :param fragment: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(fragment, canonical_name) + 1 + except ValueError: + return None + version = fragment[version_start:] + if not version: + return None + return version diff --git a/project/Lib/site-packages/pip/_internal/index/sources.py b/project/Lib/site-packages/pip/_internal/index/sources.py new file mode 100644 index 0000000..f4626d7 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/index/sources.py @@ -0,0 +1,285 @@ +import logging +import mimetypes +import os +from collections import defaultdict +from typing import Callable, Dict, Iterable, List, Optional, Tuple + +from pip._vendor.packaging.utils import ( + InvalidSdistFilename, + InvalidVersion, + InvalidWheelFilename, + canonicalize_name, + parse_sdist_filename, + parse_wheel_filename, +) + +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.link import Link +from pip._internal.utils.urls import path_to_url, url_to_path +from pip._internal.vcs import is_url + +logger = logging.getLogger(__name__) + +FoundCandidates = Iterable[InstallationCandidate] +FoundLinks = Iterable[Link] +CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]] +PageValidator = Callable[[Link], bool] + + +class LinkSource: + @property + def link(self) -> Optional[Link]: + """Returns the underlying link, if there's one.""" + raise NotImplementedError() + + def page_candidates(self) -> FoundCandidates: + """Candidates found by parsing an archive listing HTML file.""" + raise NotImplementedError() + + def file_links(self) -> FoundLinks: + """Links found by specifying archives directly.""" + raise NotImplementedError() + + +def _is_html_file(file_url: str) -> bool: + return mimetypes.guess_type(file_url, strict=False)[0] == "text/html" + + +class _FlatDirectoryToUrls: + """Scans directory and caches results""" + + def __init__(self, path: str) -> None: + self._path = path + self._page_candidates: List[str] = [] + self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list) + self._scanned_directory = False + + def _scan_directory(self) -> None: + """Scans directory once and populates both page_candidates + and project_name_to_urls at the same time + """ + for entry in os.scandir(self._path): + url = path_to_url(entry.path) + if _is_html_file(url): + self._page_candidates.append(url) + continue + + # File must have a valid wheel or sdist name, + # otherwise not worth considering as a package + try: + project_filename = parse_wheel_filename(entry.name)[0] + except (InvalidWheelFilename, InvalidVersion): + try: + project_filename = parse_sdist_filename(entry.name)[0] + except (InvalidSdistFilename, InvalidVersion): + continue + + self._project_name_to_urls[project_filename].append(url) + self._scanned_directory = True + + @property + def page_candidates(self) -> List[str]: + if not self._scanned_directory: + self._scan_directory() + + return self._page_candidates + + @property + def project_name_to_urls(self) -> Dict[str, List[str]]: + if not self._scanned_directory: + self._scan_directory() + + return self._project_name_to_urls + + +class _FlatDirectorySource(LinkSource): + """Link source specified by ``--find-links=``. + + This looks the content of the directory, and returns: + + * ``page_candidates``: Links listed on each HTML file in the directory. + * ``file_candidates``: Archives in the directory. + """ + + _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {} + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + path: str, + project_name: str, + ) -> None: + self._candidates_from_page = candidates_from_page + self._project_name = canonicalize_name(project_name) + + # Get existing instance of _FlatDirectoryToUrls if it exists + if path in self._paths_to_urls: + self._path_to_urls = self._paths_to_urls[path] + else: + self._path_to_urls = _FlatDirectoryToUrls(path=path) + self._paths_to_urls[path] = self._path_to_urls + + @property + def link(self) -> Optional[Link]: + return None + + def page_candidates(self) -> FoundCandidates: + for url in self._path_to_urls.page_candidates: + yield from self._candidates_from_page(Link(url)) + + def file_links(self) -> FoundLinks: + for url in self._path_to_urls.project_name_to_urls[self._project_name]: + yield Link(url) + + +class _LocalFileSource(LinkSource): + """``--find-links=`` or ``--[extra-]index-url=``. + + If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to + the option, it is converted to a URL first. This returns: + + * ``page_candidates``: Links listed on an HTML file. + * ``file_candidates``: The non-HTML file. + """ + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + link: Link, + ) -> None: + self._candidates_from_page = candidates_from_page + self._link = link + + @property + def link(self) -> Optional[Link]: + return self._link + + def page_candidates(self) -> FoundCandidates: + if not _is_html_file(self._link.url): + return + yield from self._candidates_from_page(self._link) + + def file_links(self) -> FoundLinks: + if _is_html_file(self._link.url): + return + yield self._link + + +class _RemoteFileSource(LinkSource): + """``--find-links=`` or ``--[extra-]index-url=``. + + This returns: + + * ``page_candidates``: Links listed on an HTML file. + * ``file_candidates``: The non-HTML file. + """ + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + page_validator: PageValidator, + link: Link, + ) -> None: + self._candidates_from_page = candidates_from_page + self._page_validator = page_validator + self._link = link + + @property + def link(self) -> Optional[Link]: + return self._link + + def page_candidates(self) -> FoundCandidates: + if not self._page_validator(self._link): + return + yield from self._candidates_from_page(self._link) + + def file_links(self) -> FoundLinks: + yield self._link + + +class _IndexDirectorySource(LinkSource): + """``--[extra-]index-url=``. + + This is treated like a remote URL; ``candidates_from_page`` contains logic + for this by appending ``index.html`` to the link. + """ + + def __init__( + self, + candidates_from_page: CandidatesFromPage, + link: Link, + ) -> None: + self._candidates_from_page = candidates_from_page + self._link = link + + @property + def link(self) -> Optional[Link]: + return self._link + + def page_candidates(self) -> FoundCandidates: + yield from self._candidates_from_page(self._link) + + def file_links(self) -> FoundLinks: + return () + + +def build_source( + location: str, + *, + candidates_from_page: CandidatesFromPage, + page_validator: PageValidator, + expand_dir: bool, + cache_link_parsing: bool, + project_name: str, +) -> Tuple[Optional[str], Optional[LinkSource]]: + path: Optional[str] = None + url: Optional[str] = None + if os.path.exists(location): # Is a local path. + url = path_to_url(location) + path = location + elif location.startswith("file:"): # A file: URL. + url = location + path = url_to_path(location) + elif is_url(location): + url = location + + if url is None: + msg = ( + "Location '%s' is ignored: " + "it is either a non-existing path or lacks a specific scheme." + ) + logger.warning(msg, location) + return (None, None) + + if path is None: + source: LinkSource = _RemoteFileSource( + candidates_from_page=candidates_from_page, + page_validator=page_validator, + link=Link(url, cache_link_parsing=cache_link_parsing), + ) + return (url, source) + + if os.path.isdir(path): + if expand_dir: + source = _FlatDirectorySource( + candidates_from_page=candidates_from_page, + path=path, + project_name=project_name, + ) + else: + source = _IndexDirectorySource( + candidates_from_page=candidates_from_page, + link=Link(url, cache_link_parsing=cache_link_parsing), + ) + return (url, source) + elif os.path.isfile(path): + source = _LocalFileSource( + candidates_from_page=candidates_from_page, + link=Link(url, cache_link_parsing=cache_link_parsing), + ) + return (url, source) + logger.warning( + "Location '%s' is ignored: it is neither a file nor a directory.", + location, + ) + return (url, None) diff --git a/project/Lib/site-packages/pip/_internal/locations/__init__.py b/project/Lib/site-packages/pip/_internal/locations/__init__.py new file mode 100644 index 0000000..d54bc63 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/locations/__init__.py @@ -0,0 +1,467 @@ +import functools +import logging +import os +import pathlib +import sys +import sysconfig +from typing import Any, Dict, Generator, Optional, Tuple + +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.virtualenv import running_under_virtualenv + +from . import _sysconfig +from .base import ( + USER_CACHE_DIR, + get_major_minor_version, + get_src_prefix, + is_osx_framework, + site_packages, + user_site, +) + +__all__ = [ + "USER_CACHE_DIR", + "get_bin_prefix", + "get_bin_user", + "get_major_minor_version", + "get_platlib", + "get_purelib", + "get_scheme", + "get_src_prefix", + "site_packages", + "user_site", +] + + +logger = logging.getLogger(__name__) + + +_PLATLIBDIR: str = getattr(sys, "platlibdir", "lib") + +_USE_SYSCONFIG_DEFAULT = sys.version_info >= (3, 10) + + +def _should_use_sysconfig() -> bool: + """This function determines the value of _USE_SYSCONFIG. + + By default, pip uses sysconfig on Python 3.10+. + But Python distributors can override this decision by setting: + sysconfig._PIP_USE_SYSCONFIG = True / False + Rationale in https://github.com/pypa/pip/issues/10647 + + This is a function for testability, but should be constant during any one + run. + """ + return bool(getattr(sysconfig, "_PIP_USE_SYSCONFIG", _USE_SYSCONFIG_DEFAULT)) + + +_USE_SYSCONFIG = _should_use_sysconfig() + +if not _USE_SYSCONFIG: + # Import distutils lazily to avoid deprecation warnings, + # but import it soon enough that it is in memory and available during + # a pip reinstall. + from . import _distutils + +# Be noisy about incompatibilities if this platforms "should" be using +# sysconfig, but is explicitly opting out and using distutils instead. +if _USE_SYSCONFIG_DEFAULT and not _USE_SYSCONFIG: + _MISMATCH_LEVEL = logging.WARNING +else: + _MISMATCH_LEVEL = logging.DEBUG + + +def _looks_like_bpo_44860() -> bool: + """The resolution to bpo-44860 will change this incorrect platlib. + + See . + """ + from distutils.command.install import INSTALL_SCHEMES + + try: + unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"] + except KeyError: + return False + return unix_user_platlib == "$usersite" + + +def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool: + platlib = scheme["platlib"] + if "/$platlibdir/" in platlib: + platlib = platlib.replace("/$platlibdir/", f"/{_PLATLIBDIR}/") + if "/lib64/" not in platlib: + return False + unpatched = platlib.replace("/lib64/", "/lib/") + return unpatched.replace("$platbase/", "$base/") == scheme["purelib"] + + +@functools.lru_cache(maxsize=None) +def _looks_like_red_hat_lib() -> bool: + """Red Hat patches platlib in unix_prefix and unix_home, but not purelib. + + This is the only way I can see to tell a Red Hat-patched Python. + """ + from distutils.command.install import INSTALL_SCHEMES + + return all( + k in INSTALL_SCHEMES + and _looks_like_red_hat_patched_platlib_purelib(INSTALL_SCHEMES[k]) + for k in ("unix_prefix", "unix_home") + ) + + +@functools.lru_cache(maxsize=None) +def _looks_like_debian_scheme() -> bool: + """Debian adds two additional schemes.""" + from distutils.command.install import INSTALL_SCHEMES + + return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES + + +@functools.lru_cache(maxsize=None) +def _looks_like_red_hat_scheme() -> bool: + """Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``. + + Red Hat's ``00251-change-user-install-location.patch`` changes the install + command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is + (fortunately?) done quite unconditionally, so we create a default command + object without any configuration to detect this. + """ + from distutils.command.install import install + from distutils.dist import Distribution + + cmd: Any = install(Distribution()) + cmd.finalize_options() + return ( + cmd.exec_prefix == f"{os.path.normpath(sys.exec_prefix)}/local" + and cmd.prefix == f"{os.path.normpath(sys.prefix)}/local" + ) + + +@functools.lru_cache(maxsize=None) +def _looks_like_slackware_scheme() -> bool: + """Slackware patches sysconfig but fails to patch distutils and site. + + Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib + path, but does not do the same to the site module. + """ + if user_site is None: # User-site not available. + return False + try: + paths = sysconfig.get_paths(scheme="posix_user", expand=False) + except KeyError: # User-site not available. + return False + return "/lib64/" in paths["purelib"] and "/lib64/" not in user_site + + +@functools.lru_cache(maxsize=None) +def _looks_like_msys2_mingw_scheme() -> bool: + """MSYS2 patches distutils and sysconfig to use a UNIX-like scheme. + + However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is + likely going to be included in their 3.10 release, so we ignore the warning. + See msys2/MINGW-packages#9319. + + MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase, + and is missing the final ``"site-packages"``. + """ + paths = sysconfig.get_paths("nt", expand=False) + return all( + "Lib" not in p and "lib" in p and not p.endswith("site-packages") + for p in (paths[key] for key in ("platlib", "purelib")) + ) + + +def _fix_abiflags(parts: Tuple[str]) -> Generator[str, None, None]: + ldversion = sysconfig.get_config_var("LDVERSION") + abiflags = getattr(sys, "abiflags", None) + + # LDVERSION does not end with sys.abiflags. Just return the path unchanged. + if not ldversion or not abiflags or not ldversion.endswith(abiflags): + yield from parts + return + + # Strip sys.abiflags from LDVERSION-based path components. + for part in parts: + if part.endswith(ldversion): + part = part[: (0 - len(abiflags))] + yield part + + +@functools.lru_cache(maxsize=None) +def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) -> None: + issue_url = "https://github.com/pypa/pip/issues/10151" + message = ( + "Value for %s does not match. Please report this to <%s>" + "\ndistutils: %s" + "\nsysconfig: %s" + ) + logger.log(_MISMATCH_LEVEL, message, key, issue_url, old, new) + + +def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool: + if old == new: + return False + _warn_mismatched(old, new, key=key) + return True + + +@functools.lru_cache(maxsize=None) +def _log_context( + *, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + prefix: Optional[str] = None, +) -> None: + parts = [ + "Additional context:", + "user = %r", + "home = %r", + "root = %r", + "prefix = %r", + ] + + logger.log(_MISMATCH_LEVEL, "\n".join(parts), user, home, root, prefix) + + +def get_scheme( + dist_name: str, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> Scheme: + new = _sysconfig.get_scheme( + dist_name, + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + if _USE_SYSCONFIG: + return new + + old = _distutils.get_scheme( + dist_name, + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + + warning_contexts = [] + for k in SCHEME_KEYS: + old_v = pathlib.Path(getattr(old, k)) + new_v = pathlib.Path(getattr(new, k)) + + if old_v == new_v: + continue + + # distutils incorrectly put PyPy packages under ``site-packages/python`` + # in the ``posix_home`` scheme, but PyPy devs said they expect the + # directory name to be ``pypy`` instead. So we treat this as a bug fix + # and not warn about it. See bpo-43307 and python/cpython#24628. + skip_pypy_special_case = ( + sys.implementation.name == "pypy" + and home is not None + and k in ("platlib", "purelib") + and old_v.parent == new_v.parent + and old_v.name.startswith("python") + and new_v.name.startswith("pypy") + ) + if skip_pypy_special_case: + continue + + # sysconfig's ``osx_framework_user`` does not include ``pythonX.Y`` in + # the ``include`` value, but distutils's ``headers`` does. We'll let + # CPython decide whether this is a bug or feature. See bpo-43948. + skip_osx_framework_user_special_case = ( + user + and is_osx_framework() + and k == "headers" + and old_v.parent.parent == new_v.parent + and old_v.parent.name.startswith("python") + ) + if skip_osx_framework_user_special_case: + continue + + # On Red Hat and derived Linux distributions, distutils is patched to + # use "lib64" instead of "lib" for platlib. + if k == "platlib" and _looks_like_red_hat_lib(): + continue + + # On Python 3.9+, sysconfig's posix_user scheme sets platlib against + # sys.platlibdir, but distutils's unix_user incorrectly coninutes + # using the same $usersite for both platlib and purelib. This creates a + # mismatch when sys.platlibdir is not "lib". + skip_bpo_44860 = ( + user + and k == "platlib" + and not WINDOWS + and sys.version_info >= (3, 9) + and _PLATLIBDIR != "lib" + and _looks_like_bpo_44860() + ) + if skip_bpo_44860: + continue + + # Slackware incorrectly patches posix_user to use lib64 instead of lib, + # but not usersite to match the location. + skip_slackware_user_scheme = ( + user + and k in ("platlib", "purelib") + and not WINDOWS + and _looks_like_slackware_scheme() + ) + if skip_slackware_user_scheme: + continue + + # Both Debian and Red Hat patch Python to place the system site under + # /usr/local instead of /usr. Debian also places lib in dist-packages + # instead of site-packages, but the /usr/local check should cover it. + skip_linux_system_special_case = ( + not (user or home or prefix or running_under_virtualenv()) + and old_v.parts[1:3] == ("usr", "local") + and len(new_v.parts) > 1 + and new_v.parts[1] == "usr" + and (len(new_v.parts) < 3 or new_v.parts[2] != "local") + and (_looks_like_red_hat_scheme() or _looks_like_debian_scheme()) + ) + if skip_linux_system_special_case: + continue + + # On Python 3.7 and earlier, sysconfig does not include sys.abiflags in + # the "pythonX.Y" part of the path, but distutils does. + skip_sysconfig_abiflag_bug = ( + sys.version_info < (3, 8) + and not WINDOWS + and k in ("headers", "platlib", "purelib") + and tuple(_fix_abiflags(old_v.parts)) == new_v.parts + ) + if skip_sysconfig_abiflag_bug: + continue + + # MSYS2 MINGW's sysconfig patch does not include the "site-packages" + # part of the path. This is incorrect and will be fixed in MSYS. + skip_msys2_mingw_bug = ( + WINDOWS and k in ("platlib", "purelib") and _looks_like_msys2_mingw_scheme() + ) + if skip_msys2_mingw_bug: + continue + + # CPython's POSIX install script invokes pip (via ensurepip) against the + # interpreter located in the source tree, not the install site. This + # triggers special logic in sysconfig that's not present in distutils. + # https://github.com/python/cpython/blob/8c21941ddaf/Lib/sysconfig.py#L178-L194 + skip_cpython_build = ( + sysconfig.is_python_build(check_home=True) + and not WINDOWS + and k in ("headers", "include", "platinclude") + ) + if skip_cpython_build: + continue + + warning_contexts.append((old_v, new_v, f"scheme.{k}")) + + if not warning_contexts: + return old + + # Check if this path mismatch is caused by distutils config files. Those + # files will no longer work once we switch to sysconfig, so this raises a + # deprecation message for them. + default_old = _distutils.distutils_scheme( + dist_name, + user, + home, + root, + isolated, + prefix, + ignore_config_files=True, + ) + if any(default_old[k] != getattr(old, k) for k in SCHEME_KEYS): + deprecated( + reason=( + "Configuring installation scheme with distutils config files " + "is deprecated and will no longer work in the near future. If you " + "are using a Homebrew or Linuxbrew Python, please see discussion " + "at https://github.com/Homebrew/homebrew-core/issues/76621" + ), + replacement=None, + gone_in=None, + ) + return old + + # Post warnings about this mismatch so user can report them back. + for old_v, new_v, key in warning_contexts: + _warn_mismatched(old_v, new_v, key=key) + _log_context(user=user, home=home, root=root, prefix=prefix) + + return old + + +def get_bin_prefix() -> str: + new = _sysconfig.get_bin_prefix() + if _USE_SYSCONFIG: + return new + + old = _distutils.get_bin_prefix() + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"): + _log_context() + return old + + +def get_bin_user() -> str: + return _sysconfig.get_scheme("", user=True).scripts + + +def _looks_like_deb_system_dist_packages(value: str) -> bool: + """Check if the value is Debian's APT-controlled dist-packages. + + Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the + default package path controlled by APT, but does not patch ``sysconfig`` to + do the same. This is similar to the bug worked around in ``get_scheme()``, + but here the default is ``deb_system`` instead of ``unix_local``. Ultimately + we can't do anything about this Debian bug, and this detection allows us to + skip the warning when needed. + """ + if not _looks_like_debian_scheme(): + return False + if value == "/usr/lib/python3/dist-packages": + return True + return False + + +def get_purelib() -> str: + """Return the default pure-Python lib location.""" + new = _sysconfig.get_purelib() + if _USE_SYSCONFIG: + return new + + old = _distutils.get_purelib() + if _looks_like_deb_system_dist_packages(old): + return old + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"): + _log_context() + return old + + +def get_platlib() -> str: + """Return the default platform-shared lib location.""" + new = _sysconfig.get_platlib() + if _USE_SYSCONFIG: + return new + + from . import _distutils + + old = _distutils.get_platlib() + if _looks_like_deb_system_dist_packages(old): + return old + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"): + _log_context() + return old diff --git a/project/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ddfef893ff26ce0c0df302f7bdb2d738579db0d GIT binary patch literal 18175 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 T3< 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 b#O$sZ>3U(IlgoMM;4u0XKk9tQj5_}Z_%=iK literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72466830124560d1b16770566e7474d3bede62ac GIT binary patch literal 8879 zcmcgRTWl0rcDJ9^FLxWe{RX>i9<~`j!WtMb9we~M!VDO8Jj3i-o^6-A%66IVuGXz; z8S=q`;kcdo4;yQD6Nt#Aw_)5Uq@u6)qLfgTh&i& z$SP5)t8U%8k8{pF_uTX9e`;t55V&T3KD+P6x zuy5y_lf7MYF7|fMx#8_hc#_^ZZ<3qi95~*U@Fo3o{$yY-z`osyU@|lpg1SfaCK{6A zxo|Qv7fCkGH9ClsNM!X;i3q9b31EK)k9Ey8Lw^(=*J?|t?Fm$#l|D$__*NL(Cb>jT zbUbmvIC!jUu3hv=9ZOEp|G+)h3H2_h2cUk~t_Puh#IA>+-n~r3hJSF(^)T#w362=9 z#dyC(>e=lr^;W;@M>>eV{1ZFHMyX3YBz1^Ql6$qUG*9a4C{>Brd|*!$=CvHy>yrXY zVX^grXYQ!Io;Fy|F}vOl_2YKE1L`M4$1EA_`X2Gl3_8vBYpFFMA&ax|6)7oAD#=AT zC1|peGTXjXC3-ETYCY&4Hr9>1aD`c0I_yx@Gf0zL^-ULMTC%A z(FzfzLGzTx*7pL_oWcv3Jh>vp@9;|sPcbBoN@? zy0xLLC@Ef)RgKDv8BG%T#f>r$;Cxa@iTrgrCGlSsflF~EwInZ( zpj3*|l8{MgwoD?uHaB>6UDkkWi;}i3NvZe9BM2A+SI^WDnDY)PKrS9Hl#l}@oI$g= zF9Vksr4?aKhNA)N1|F#(>bO=AP~ZXuVPIQY#Su9PM+o`B6byp~vy}`y>!~3g4+KmS zB@ljC<4WyuhzlSeGOial!a8eg(^1SM!IpTlW#7{Y+NddZ>Gq{-*DqbZJ{_|Z+AQVZ z{L>&5-;%ee3V!(6)cE`tk`P~+zxvhul%NTh0qZ=-!`b;XRaT|AHh*1SoL6N{8cqxG zJHoQ0&cneN1%7H0O$mw7gc4`VQ%7SJ*-3Ahe9V&b7|408!m}lqMuCDO@TjMt*doON z;^$u-J)`^16p7Q{v)4F~Z#-!9TQrR#Zcs?1__Zl8{ z=6L>H^Mkq=lnH7;+pObR6L{OI^I+Cxs-*DnmQ2gFn$ygG#NV79vP={hx?3B!Hh8dq zU%}#)b(J3gCA5*=h^4fJg~0fh+hI_%`bwE zKpA*P1+(d<*CL#vdu}>nCTFVxGgNH`2RXAPcI)%$E7PBUK0ReCuh^wq*O&$_e~gm6YQ(d+@JI1d~aIY zA1&+6$E-W&dq+45T=T20VV%Q!FMK>7?l;2yy05~WYPk+Z z(P{5+l?0S`*ads$zBg36XDdq5@O*sW*f9s7mj8|Oab;2gg@?tbK8r)krh>H&N( zCYzjwUa@_xmU)@=X1VA7+O==`v{H5n#@EtK@4>2jv)pbKbtS0ab_O)`S?z1Jto7>P z`&0aZ5Q6_R2x3TUE8(f9@izp{WI$`L^skmR>u$KxTB&9IVuKjY2A+U+dxjd0U0I*l zFafocJ4;lj7}+FRkKF|?=xwZIf8gs-?jT4K!gh(HF#(&BxPA8^q4J&&-RRYbbGOX1wu-|Q?i$7L0e%% zY>cRq#$l`oLAeI$5&#cPY-S(!^;M^D>^Z1q51NC0`^`bsHqK+ovoxEXGEsm;3d^Pt zkt!G_uq+RihEYvgQNN9}q!j`2GNj!kk)>4lJ5t)p>!3o-XfhF;`Uz@sUxu+F=Zc`SeB^*hqW{GEI=wQW(y`YSvjk??H^PUHKB< zF(&|#_nIsslUFJP;X=y{*eJ(SDr`MNcF#LJjHKQ3m2y?sf^42)?l#4f5w8k@37%y1 zecz%5`Wwe%B7-mXwFkq*Z=8SaeCVAe6m!|EfP{i`Fr#hL@OsUF7y zmsUe8y#OsAq7s#Qg~~BKiudj*pwesAp=4A-oZ+?8weB^6s&ovIjzR&U4oird9OT^+ z84-K|lo^xza^|y{n_tbC96A7yHiJrrO01&BshrkS(=9?GX3#??5!e(0Bn8cBds#8)pWr(#cf~=qG*XIx=yAW2bu0w zMNUz)f)v#!^W)mWG#$s=$H{5!vU|OtvUajP>T`j+5OAkcj%$Xd}z`LO>Ry9F-&}Xp6fNZ z-XigNx(mSw(C0r>Xg>V-lV5+b+xgw>^SONUIivYpZYnqR+HP+BuK9UqzWKD#d^$H( zh@N|OwoAJ$erAoPV$D$lrbZ_Y;3R@zniP{(b8oI`Ung8C{>{JUKbnjRejVERa`(J(WccYuzVW=#c)rwMXlU9# z`|#^x&>QytCxPO>u-Lj%gaw6==gr-i_ZwhEZgMZ$v+Mrd^3$ak@%)K#43Gb&~I*2F0MkHwS$s0lpBCW|L9p=O=vYtTkN#e!*YbUUrH6UMUxlS?_+ zdFc5!c+?+5fk9Bv`bC*o(_A#-2y?3pZX4+|UPZ z6e2x(q-QS}HGq zTPHnmX+d0?txRbQ5b1~!HPIINe?VkhIde&R?Sz4bi!Ti3Gc3sWDqaA>^6uoT@@6%&N0ZLhtl$p+ySwG3yJdSd@9s6+y}G*>jAv6@q4zl6EuDp<{l$h)9ge0V!Lkr(D!Q=p zIuI^;Si6@54?P^+Icfyp4$~7lW)CA`Q(CZ|;E6Wi?$F@%hPSAF3-xT`#z9q<1J_ddJv literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ac37e3d159c894df19901950fef01b58b03cef2 GIT binary patch literal 4000 zcmb6bYi}FJagWFML!=~A58H_@k|Bz=MAxztIgb3611oK$)ROC%Aj%$jN9ic)j@>(o zl47Am;R1{yG(zCQY?GiWV5cga5B}ay@h>2Q14N<-*(Hx6WxGK3 z?q+8n^VqqW+4-x_=SI+GemR!0+~8e~0$uim0Q zShuD-%&}nKx9%4MVyEDkgbjjI45TcA>$Wx8CAh_a;DL|K*#$4mbvM?1fFE!Xxt4U$ zvNexZ*_$ZOfDDvA zXc7y|H~x0*L8C*Uap1OfpZvoDGl#;R-xJcAFk^I1%c{m_GQ1`!@)e8~43iE%n-wIi z0@{ajvMk99@tiD(IKCobEyrg>dBtF}Qr2)}b6Cts3B#vKni$XW$t8Y4R1G^8wH%g{ zriP?v8{gBTfZPK!2~3*I)23NW454%r|2+a_E$gD2gLaLwGR zRzY`8NztWb4r5W)xR2JfMVRGPj^|Vj!x2U~F|rV$tOid;CI&em2IRy~2J4gSwof)9 zpKOF#!=6&`GOrn|x~3Z5hJd&vr zmc>e1Olq;8Nr@OS%9v@C7#Qq0aM468^O@rrB}t909!~&mB)ewxE{Iy39xYCf7H>$# zoglIsKD7rx0oB~dd$2gMdG4!|`k`ZG&uG~?iv6%;IAt*($BLpE&MdDj%KWmJY#I|b zkhmki;pqz+cN(B(OE)7!V3sHiUT9ly^4TUFUTU|Pb`Mm!*HBwuB87=t2)&pZP5lcJV)lEscN*nXVGz@{+d5g-j<3aak;8 zMF@N$;-+yko#I+{ODYG!4^F%yjza9g5MJ@uIcbGt2#wPePEjL-dnBz$@`%ZIlrtrU z>ybALF^%(*3Tz||cmfM7su1N%5VoxnO>rDA3nbcQjxZ*hU_dq0^2#WeUzC!IL>Y+t zbWbRd0P~{2rLeNx$RHsV(g#rRSl}Sh zVIHr+lpv{EPLndAq$1=pV*MP3Evu-~>i5L_GloUhFmdM>Ol-aDy1XPSd6~zyVzRb&4Y7MlS|xht_R&Sc4#T3ThLyy&VI_t%Y?8_+V2aqn zaI4vjqzM>)3MPRXw&E`6Fv%Z=tv-JUaFzHONvk+ORy=hbX!5`u%+Njm1f+nTbs?ww zc77}Louj|(=->5sZstGRxU*6ExZ)qy{lhiHx=!zQ2k%bYoBVuo+qpAR={~7E8P=%_e9w{@xTHy~Y>v#VL0U&z2Y2r-6Ih&0bh9=2h!GFAmv}Q0N)P9-bW3Rro zUY#H{XHx=7HN_eI9!-bpPm%SP7oegQtq_qPu3dx?s8g(3ib`KK!S{4-)sKzbxHfdh~Xs z|6RTR-Qowu51#M(duqr6+gjlhuYdDuIXGYOUe~?X%jR3Nk&VxvKY!*$-j2SrdwqFvGj&pq3MMVHI%Z_SRnMz(tO z&d`pn(izb^BZUr_>lxX)sRu(lu1auR4~`dnMYW8^;jN(Yn%%~XZFkoYbo)V|pK+Il zY6!X=*a6+6dPngVaN5U&N^A{5w;ymeW&l(Oo!=Jp;d7PY3;OVd!gO(E^EV|`_Yak= z7vQZ>_`K=}!o39ho1hvvaJQo{O&(&^0f_CI6Ip_Vew{f`nlCeh6=qOp2H|>R&X$f4 j!n1qe2Nqd|%+ Dict[str, str]: + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + dist_args: Dict[str, Union[str, List[str]]] = {"name": dist_name} + if isolated: + dist_args["script_args"] = ["--no-user-cfg"] + + d = Distribution(dist_args) + if not ignore_config_files: + try: + d.parse_config_files() + except UnicodeDecodeError: + paths = d.find_config_files() + logger.warning( + "Ignore distutils configs in %s due to encoding errors.", + ", ".join(os.path.basename(p) for p in paths), + ) + obj: Optional[DistutilsCommand] = None + obj = d.get_command_obj("install", create=True) + assert obj is not None + i = cast(distutils_install_command, obj) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), f"user={user} prefix={prefix}" + assert not (home and prefix), f"home={home} prefix={prefix}" + i.user = user or i.user + if user or home: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + + scheme = {} + for key in SCHEME_KEYS: + scheme[key] = getattr(i, "install_" + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if "install_lib" in d.get_option_dict("install"): + scheme.update({"purelib": i.install_lib, "platlib": i.install_lib}) + + if running_under_virtualenv(): + if home: + prefix = home + elif user: + prefix = i.install_userbase + else: + prefix = i.prefix + scheme["headers"] = os.path.join( + prefix, + "include", + "site", + f"python{get_major_minor_version()}", + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive(os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join(root, path_no_drive[1:]) + + return scheme + + +def get_scheme( + dist_name: str, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> Scheme: + """ + Get the "scheme" corresponding to the input parameters. The distutils + documentation provides the context for the available schemes: + https://docs.python.org/3/install/index.html#alternate-installation + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme and provides the base + directory for the same + :param root: root under which other directories are re-based + :param isolated: equivalent to --no-user-cfg, i.e. do not consider + ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for + scheme paths + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + scheme = distutils_scheme(dist_name, user, home, root, isolated, prefix) + return Scheme( + platlib=scheme["platlib"], + purelib=scheme["purelib"], + headers=scheme["headers"], + scripts=scheme["scripts"], + data=scheme["data"], + ) + + +def get_bin_prefix() -> str: + # XXX: In old virtualenv versions, sys.prefix can contain '..' components, + # so we need to call normpath to eliminate them. + prefix = os.path.normpath(sys.prefix) + if WINDOWS: + bin_py = os.path.join(prefix, "Scripts") + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(prefix, "bin") + return bin_py + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == "darwin" and prefix[:16] == "/System/Library/": + return "/usr/local/bin" + return os.path.join(prefix, "bin") + + +def get_purelib() -> str: + return get_python_lib(plat_specific=False) + + +def get_platlib() -> str: + return get_python_lib(plat_specific=True) diff --git a/project/Lib/site-packages/pip/_internal/locations/_sysconfig.py b/project/Lib/site-packages/pip/_internal/locations/_sysconfig.py new file mode 100644 index 0000000..97aef1f --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/locations/_sysconfig.py @@ -0,0 +1,213 @@ +import logging +import os +import sys +import sysconfig +import typing + +from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.virtualenv import running_under_virtualenv + +from .base import change_root, get_major_minor_version, is_osx_framework + +logger = logging.getLogger(__name__) + + +# Notes on _infer_* functions. +# Unfortunately ``get_default_scheme()`` didn't exist before 3.10, so there's no +# way to ask things like "what is the '_prefix' scheme on this platform". These +# functions try to answer that with some heuristics while accounting for ad-hoc +# platforms not covered by CPython's default sysconfig implementation. If the +# ad-hoc implementation does not fully implement sysconfig, we'll fall back to +# a POSIX scheme. + +_AVAILABLE_SCHEMES = set(sysconfig.get_scheme_names()) + +_PREFERRED_SCHEME_API = getattr(sysconfig, "get_preferred_scheme", None) + + +def _should_use_osx_framework_prefix() -> bool: + """Check for Apple's ``osx_framework_library`` scheme. + + Python distributed by Apple's Command Line Tools has this special scheme + that's used when: + + * This is a framework build. + * We are installing into the system prefix. + + This does not account for ``pip install --prefix`` (also means we're not + installing to the system prefix), which should use ``posix_prefix``, but + logic here means ``_infer_prefix()`` outputs ``osx_framework_library``. But + since ``prefix`` is not available for ``sysconfig.get_default_scheme()``, + which is the stdlib replacement for ``_infer_prefix()``, presumably Apple + wouldn't be able to magically switch between ``osx_framework_library`` and + ``posix_prefix``. ``_infer_prefix()`` returning ``osx_framework_library`` + means its behavior is consistent whether we use the stdlib implementation + or our own, and we deal with this special case in ``get_scheme()`` instead. + """ + return ( + "osx_framework_library" in _AVAILABLE_SCHEMES + and not running_under_virtualenv() + and is_osx_framework() + ) + + +def _infer_prefix() -> str: + """Try to find a prefix scheme for the current platform. + + This tries: + + * A special ``osx_framework_library`` for Python distributed by Apple's + Command Line Tools, when not running in a virtual environment. + * Implementation + OS, used by PyPy on Windows (``pypy_nt``). + * Implementation without OS, used by PyPy on POSIX (``pypy``). + * OS + "prefix", used by CPython on POSIX (``posix_prefix``). + * Just the OS name, used by CPython on Windows (``nt``). + + If none of the above works, fall back to ``posix_prefix``. + """ + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("prefix") + if _should_use_osx_framework_prefix(): + return "osx_framework_library" + implementation_suffixed = f"{sys.implementation.name}_{os.name}" + if implementation_suffixed in _AVAILABLE_SCHEMES: + return implementation_suffixed + if sys.implementation.name in _AVAILABLE_SCHEMES: + return sys.implementation.name + suffixed = f"{os.name}_prefix" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + if os.name in _AVAILABLE_SCHEMES: # On Windows, prefx is just called "nt". + return os.name + return "posix_prefix" + + +def _infer_user() -> str: + """Try to find a user scheme for the current platform.""" + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("user") + if is_osx_framework() and not running_under_virtualenv(): + suffixed = "osx_framework_user" + else: + suffixed = f"{os.name}_user" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + if "posix_user" not in _AVAILABLE_SCHEMES: # User scheme unavailable. + raise UserInstallationInvalid() + return "posix_user" + + +def _infer_home() -> str: + """Try to find a home for the current platform.""" + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("home") + suffixed = f"{os.name}_home" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + return "posix_home" + + +# Update these keys if the user sets a custom home. +_HOME_KEYS = [ + "installed_base", + "base", + "installed_platbase", + "platbase", + "prefix", + "exec_prefix", +] +if sysconfig.get_config_var("userbase") is not None: + _HOME_KEYS.append("userbase") + + +def get_scheme( + dist_name: str, + user: bool = False, + home: typing.Optional[str] = None, + root: typing.Optional[str] = None, + isolated: bool = False, + prefix: typing.Optional[str] = None, +) -> Scheme: + """ + Get the "scheme" corresponding to the input parameters. + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme + :param root: root under which other directories are re-based + :param isolated: ignored, but kept for distutils compatibility (where + this controls whether the user-site pydistutils.cfg is honored) + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + if user and prefix: + raise InvalidSchemeCombination("--user", "--prefix") + if home and prefix: + raise InvalidSchemeCombination("--home", "--prefix") + + if home is not None: + scheme_name = _infer_home() + elif user: + scheme_name = _infer_user() + else: + scheme_name = _infer_prefix() + + # Special case: When installing into a custom prefix, use posix_prefix + # instead of osx_framework_library. See _should_use_osx_framework_prefix() + # docstring for details. + if prefix is not None and scheme_name == "osx_framework_library": + scheme_name = "posix_prefix" + + if home is not None: + variables = {k: home for k in _HOME_KEYS} + elif prefix is not None: + variables = {k: prefix for k in _HOME_KEYS} + else: + variables = {} + + paths = sysconfig.get_paths(scheme=scheme_name, vars=variables) + + # Logic here is very arbitrary, we're doing it for compatibility, don't ask. + # 1. Pip historically uses a special header path in virtual environments. + # 2. If the distribution name is not known, distutils uses 'UNKNOWN'. We + # only do the same when not running in a virtual environment because + # pip's historical header path logic (see point 1) did not do this. + if running_under_virtualenv(): + if user: + base = variables.get("userbase", sys.prefix) + else: + base = variables.get("base", sys.prefix) + python_xy = f"python{get_major_minor_version()}" + paths["include"] = os.path.join(base, "include", "site", python_xy) + elif not dist_name: + dist_name = "UNKNOWN" + + scheme = Scheme( + platlib=paths["platlib"], + purelib=paths["purelib"], + headers=os.path.join(paths["include"], dist_name), + scripts=paths["scripts"], + data=paths["data"], + ) + if root is not None: + for key in SCHEME_KEYS: + value = change_root(root, getattr(scheme, key)) + setattr(scheme, key, value) + return scheme + + +def get_bin_prefix() -> str: + # Forcing to use /usr/local/bin for standard macOS framework installs. + if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/": + return "/usr/local/bin" + return sysconfig.get_paths()["scripts"] + + +def get_purelib() -> str: + return sysconfig.get_paths()["purelib"] + + +def get_platlib() -> str: + return sysconfig.get_paths()["platlib"] diff --git a/project/Lib/site-packages/pip/_internal/locations/base.py b/project/Lib/site-packages/pip/_internal/locations/base.py new file mode 100644 index 0000000..3f9f896 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/locations/base.py @@ -0,0 +1,81 @@ +import functools +import os +import site +import sys +import sysconfig +import typing + +from pip._internal.exceptions import InstallationError +from pip._internal.utils import appdirs +from pip._internal.utils.virtualenv import running_under_virtualenv + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + +# FIXME doesn't account for venv linked to global site-packages +site_packages: str = sysconfig.get_path("purelib") + + +def get_major_minor_version() -> str: + """ + Return the major-minor version of the current Python as a string, e.g. + "3.7" or "3.10". + """ + return "{}.{}".format(*sys.version_info) + + +def change_root(new_root: str, pathname: str) -> str: + """Return 'pathname' with 'new_root' prepended. + + If 'pathname' is relative, this is equivalent to os.path.join(new_root, pathname). + Otherwise, it requires making 'pathname' relative and then joining the + two, which is tricky on DOS/Windows and Mac OS. + + This is borrowed from Python's standard library's distutils module. + """ + if os.name == "posix": + if not os.path.isabs(pathname): + return os.path.join(new_root, pathname) + else: + return os.path.join(new_root, pathname[1:]) + + elif os.name == "nt": + (drive, path) = os.path.splitdrive(pathname) + if path[0] == "\\": + path = path[1:] + return os.path.join(new_root, path) + + else: + raise InstallationError( + f"Unknown platform: {os.name}\n" + "Can not change root path prefix on unknown platform." + ) + + +def get_src_prefix() -> str: + if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, "src") + else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), "src") + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit("The folder you are executing pip from can no longer be found.") + + # under macOS + virtualenv sys.prefix is not properly resolved + # it is something like /path/to/python/bin/.. + return os.path.abspath(src_prefix) + + +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site: typing.Optional[str] = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE + + +@functools.lru_cache(maxsize=None) +def is_osx_framework() -> bool: + return bool(sysconfig.get_config_var("PYTHONFRAMEWORK")) diff --git a/project/Lib/site-packages/pip/_internal/main.py b/project/Lib/site-packages/pip/_internal/main.py new file mode 100644 index 0000000..33c6d24 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/main.py @@ -0,0 +1,12 @@ +from typing import List, Optional + + +def main(args: Optional[List[str]] = None) -> int: + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/project/Lib/site-packages/pip/_internal/metadata/__init__.py b/project/Lib/site-packages/pip/_internal/metadata/__init__.py new file mode 100644 index 0000000..aa232b6 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/metadata/__init__.py @@ -0,0 +1,128 @@ +import contextlib +import functools +import os +import sys +from typing import TYPE_CHECKING, List, Optional, Type, cast + +from pip._internal.utils.misc import strtobool + +from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel + +if TYPE_CHECKING: + from typing import Literal, Protocol +else: + Protocol = object + +__all__ = [ + "BaseDistribution", + "BaseEnvironment", + "FilesystemWheel", + "MemoryWheel", + "Wheel", + "get_default_environment", + "get_environment", + "get_wheel_distribution", + "select_backend", +] + + +def _should_use_importlib_metadata() -> bool: + """Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend. + + By default, pip uses ``importlib.metadata`` on Python 3.11+, and + ``pkg_resourcess`` otherwise. This can be overridden by a couple of ways: + + * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it + dictates whether ``importlib.metadata`` is used, regardless of Python + version. + * On Python 3.11+, Python distributors can patch ``importlib.metadata`` + to add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This + makes pip use ``pkg_resources`` (unless the user set the aforementioned + environment variable to *True*). + """ + with contextlib.suppress(KeyError, ValueError): + return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"])) + if sys.version_info < (3, 11): + return False + import importlib.metadata + + return bool(getattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA", True)) + + +class Backend(Protocol): + NAME: 'Literal["importlib", "pkg_resources"]' + Distribution: Type[BaseDistribution] + Environment: Type[BaseEnvironment] + + +@functools.lru_cache(maxsize=None) +def select_backend() -> Backend: + if _should_use_importlib_metadata(): + from . import importlib + + return cast(Backend, importlib) + from . import pkg_resources + + return cast(Backend, pkg_resources) + + +def get_default_environment() -> BaseEnvironment: + """Get the default representation for the current environment. + + This returns an Environment instance from the chosen backend. The default + Environment instance should be built from ``sys.path`` and may use caching + to share instance state accorss calls. + """ + return select_backend().Environment.default() + + +def get_environment(paths: Optional[List[str]]) -> BaseEnvironment: + """Get a representation of the environment specified by ``paths``. + + This returns an Environment instance from the chosen backend based on the + given import paths. The backend must build a fresh instance representing + the state of installed distributions when this function is called. + """ + return select_backend().Environment.from_paths(paths) + + +def get_directory_distribution(directory: str) -> BaseDistribution: + """Get the distribution metadata representation in the specified directory. + + This returns a Distribution instance from the chosen backend based on + the given on-disk ``.dist-info`` directory. + """ + return select_backend().Distribution.from_directory(directory) + + +def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution: + """Get the representation of the specified wheel's distribution metadata. + + This returns a Distribution instance from the chosen backend based on + the given wheel's ``.dist-info`` directory. + + :param canonical_name: Normalized project name of the given wheel. + """ + return select_backend().Distribution.from_wheel(wheel, canonical_name) + + +def get_metadata_distribution( + metadata_contents: bytes, + filename: str, + canonical_name: str, +) -> BaseDistribution: + """Get the dist representation of the specified METADATA file contents. + + This returns a Distribution instance from the chosen backend sourced from the data + in `metadata_contents`. + + :param metadata_contents: Contents of a METADATA file within a dist, or one served + via PEP 658. + :param filename: Filename for the dist this metadata represents. + :param canonical_name: Normalized project name of the given dist. + """ + return select_backend().Distribution.from_metadata_file_contents( + metadata_contents, + filename, + canonical_name, + ) diff --git a/project/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1967b963750204d0077a68f8df6fdd5faec2f637 GIT binary patch literal 6499 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 MNMeobLAc)h2g+fsng9R* literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78f7e100cb61c0d704f4d3ca96fb71f6b3f7e4aa GIT binary patch literal 3562 zcmahL{ZAXob!OM=57r+L2#}HwU&u9QzyTUHiW)8o7duHyAZg%=f=JQg9bm(LxU*{# zI8*UMq&gAO`6`{lMR$#Ry5`cJs-9X^y`L&w{{lO*T5BaFr2f?3T%|vt{M0vV;|~&a zquIA_-n{o_=6%h483?o>XcIq=E?fre-)ykg+*Rb|3LuY>jAX1L4bNbWo8dHmhR2M? zsV+^J5geRX-I`~{qj_h%ns3IZwam0&w1{Na=Xgex1>%?8#J}K@Jr7(n0oh9g7<-AI zcow)Ld#fUt_rZKnZka?8@jr|n;cfRdBFTi>0huHWnanL!hN31d?+qf@_KXwLlomOF(XCP=RNt{EDMCgC7#GsW)Fl(l3~XRd-q zi6$v3n`;@D6y1W4IPo4^%1pJ^R-?u5TZHP8$~eWF)VNC$7TYEp2VuOT$e;_jsN|@xk@nOFZ_Jy9O02yV zZ2`8T%C?&lD@FALuEhmHF2H&CUfu%m7^P7T{;#)ZK>Dgi&NXVNQDrQ1&p6Dd^B(R-3fW>sna z+-$O9g4yfJ{H&>1%!!F*@S{1KRFZ>p;2OtVgIYBJ2j}jZhJGfwYWo;62f;?@aaiST zwp%u90)2PvBAPI? zq+}`cDhbO_51|}Eg*s#7CE5k5n!<*;q8+}Mm%v?*kyUdVEQuO}ra5`&2a7B$8XTEM z`^|M{ycQ0V@az0-q`U5+`|!Vq z)A*pEO7jb^>D`>L0`=vsP#sU><~=lzCQ+l@{u6_PToY^ll)kJ({f?fWSFAN5Wi3R{ z+iti>6n!}2wObTZ(M?Oz6NEA=P?n3fyK>3dhv3R$w_VJ+^Wu~m)OJhBB++G?H!Vt; z!6Pnu(h*85!CIy*%&$T#n4MKN4Pe&0apa98HacJI*FZH3;m#on`JWt z;Gg9xZe3!vj0r$DaD1_;b^R?r5<)n(vO5di%D#Ti)I6o@g0y zhX?9lr?;QYYo-DSWEb~pX^aKdm-sS2`;uRifIvI-tC%4Z5 zQaxAaI?ELpzuuY)5S+AYvU*Nz3lMxtGQv@|O*#y~WTmtkWAq1rf9EmBm{b_R2Ff2D zt@P)^TR(j|{bc%++n?U95i7?M;UTg2nu_=+d$v|GCIXlp8jnwn#zv<`=dS!Xemyqn z+@ZE-kyvw*s@gmtu<4|#ShmQBNoke6s3Km=@+JvJHc<9dvnG`$%w)ni*1HI($*ba7W35DSCV(@r|hbfkZePymG8l0#p z4GjKi>YqCn|ldG^550V zuAX+TjP}4rs62vke|8egg8R2BKL>9B-hO;2J6%Tb%XQ=u&(G$TzBuj-4+PE`{|`5x BWMTjS literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ab5acc4db79343da70f19e67a312a54fe2f1ab4 GIT binary patch literal 38676 zcmdUYdvILWdEea^unR1(iwE%_LGls+NdP34B*2%zheQ&jNQnd~f|6xO@?wd50WP@@ z=-ve%FlfV$T*DqVMqDO>9eIqnj0{Cg%%o07X_JiYX`9D%I=h^8x!n#^c2YOZG=D&$ zoKcld+TVB1eePY5qHND37mKrZ&pG!zzVn^$e6MrvcWY{@1YAR(=^gKv1>rC0hkjLP zHxF;P1>sFW5+qkb7~$Wp5jXqo8S$`h?}(Ru`$l~1yJDn*eOHcDvTy&0AK&goAXzn1 zm8>4AP6kJU$(oUxWbH_8GBgrOhDXB5x{)7v##QLN-A|^MCY+%1D6Ya^4kq&n6 zPjn_Xj%-YB8rj5t2NIi;T_at|?vd_f&qxo8t4eH1ZXMam?yD2M$;e2A-3JrflG{hN zCwGkOV83e;eaZfje%#kep~TMQu900XL9SM)&tdd+_sDLSkaEj=Ms~|hvM6sDcem=$ z6-M?V?kTzA;(#7yOWo%dWZ%X8dYXLTZI>Xti+_HN9CQoM3R2x0f>bZ>e%pgI{A+1X zOAYcW`6;Q^TYG_{iYxbBQ8l8amyabC40x+lKTzs+emrW zcxJ?Bq9#!mGzW z_39vonA-7bB6fcFtCLFlB8KbLlkxMf(%AOubmL*Ahk~sLc)yegZi_xl zjVXD$v7{v|_5eMwoq`<*ei4;VDCwz5N98Q`kgf8eZhz4qWm7R4EmlRN$+R?;kZ~W3 zMqi(bB?xr*<;RFj%1Y*1(W7P*Wg8XJPr)t(@9>VWjw_oemV&+bSHFy4*7z&uM|B0u*L7#Nb<$;YGJzIeG}=BP%(%XTa=+s`EBvxxUpO(0d&ZL4_Y0xF{vR+v`H$0xN*rxh zuO(?|Qn#Y@%&Uq z%qVd@ieb8vRxa_f=}``x0Y2C}BI2jmfQ^nakf2lmi-5=4GCCTGP;uZ5(lq24Z?Fon zgcwVvr&1im4A!h6Kpt93(Mkf?=;%H%K5qOF(HA*6nE{Hh8pPP-q@0rCsR?AES{S~{ zF^NO5FCspNRf|=bxuRoO;u=p?Xli`qjzs?Y|KaL(DNp0~kkXFu9gji`Xt9#|iZ#FJ zCFpd!6=FRVBGD>6EQ*|-uZ?OWgvCcglPH@mY=u__k@Xlo^K}HX!g7yL9bOiEzSZ+b z7dG5HzUaN%*qLqYEQA`C1y5k@d}iVB&8v$$?>2AFHg7Hj!}HI6<@DU(+~9+T<^|6} z{etJ_Q*(ob@T&RP{Q3FwHv@CN$*qz(B^U$5-1s(AfYcx(!JxYYMSgn|hA&BeM zj1ntWBxA}YSsCi~DZBBYvWEg%6FAsI(P%6MbY<+98jULZD2diXzKjqs6$&K$tJFwy z8JQIdb&XjseRAH$LUrxzbFI z39{X|S8{Su#9?`55Nm*@0{@iHFI74@D&+G^0jWyMQz2D5^7th;csuV5)5ib{3b1* z7x_Bydo%KN$=x<6bRxb7@mnquE6c8nz4{$`yAkOT$mZKF66eY;Y18e^b|&Ky&v!Xm zzk~H`rTV%Z`TJP@e%UMUw95BrTaP2}E|#}+Hf?d_+s*P3wrq8z?O|zqk=E--drCSW zZIcJAux2pbXMw3#+Wv-bWIv0y&*~k3W+oyha_WAf}m zo@XADXE*X3LY|HCVO#lo5Pt;mUDiIK?|TtHSSJ1{#2=Lg%HsjNF4LVtHT6$@T`WW(Nw`=;#C(|*Bu>g{#0?uT_L|sU9FoeX# zYFwSs6pgh5H&pIHjo$<#LKQK75BEA#BQjACiUH49LRC(o`8F1!mgx_Snx@y6LL_3( zaEbaKMldU2kq@;SGAmo#igkLwh%?E6D^rVp;z&qhD+V9rFZ9TRo6i%3n;xLAVoIpR_A0e6a#N{ew_Hz1xldPdy6Yp;0znm8dtSp|*& zyk1OfS1&*+NndHlxPb#spC^p~1{s0|)JO)*&&#|_hz?*s!P+w9Vr*#|%&nBZl1czO zs7zv}r{W2APc4s)Wr#;*#b1*%mey)m;efEgt220)?J;$hF0BZCL(`SZ z>E|Dfq%m;1CXPD<&eNd11-7u$({ykV}__=%)oCNoPo(}1M=0efzj#sB%4=e$p} z7060;JR}i=G&L9T&97gF#s$ z?oQ|TwK)3iKg?w{quqFrddPa&iJQmu@>?GC$vvdJhP;qwqxe!rDJa!YRz{;(jM4O# zGEHYGzlO)u)d-B1Z_kFd^Ons z1jT?t^qeVEDIcjlQu3Irsxc*=xF*Kf>H|%EMouzy6m$vk)EK9@dIhS1)L2ev;#g`E z)1c3asHUeBl&Y=zG39(5lC5%$CWshQ#x8)Ys1c|o$WAdjYLu6hV<{+9GzzcRM-2si ziDCXhh0&XYssuVnu3n)jG?-@nu$o9XUFY3o>jcwwjgD$6iwJ2ftoodYcw*dW1zQu? ztcIrOd^!;y6G>kL%^N6OEQO^sEwZ&j(KI%O#*T^yKr&ZkIb{?VhsH34u>j4%Le3Q~ z*6}h4PFaPx5(6HUnI-zv`UausD-<|%;s*NPLb4tGp+t2l-7~I5>vTabe%U2Mr7;7U zU%zHt7pYu!*=3kvA+j{t!qG3E|&w1TF<5nt>PGpE(!yq~|{igry97bPXo%KGl zgv$pkSpDr_~Auzc|80x~6Q ziZMbd!b{Svl|x0EGlnXQ2GnR6>0-^%9O|wtR&k~^3Y%83PB(f*^#_y<=zGzFM1`zF zoaE4OV?7`VQkkIi8k;T6zB07xMMZU1M+ez-kApa^nD@J=MwJji{}vXSR^N=yRTZjN zEelnFjfGI_z0j7sp)I*kZ$8uuYeG%`{pR+?fm;W2&3*aizHGQ}*@MWRRtanOzUTeJ znq1qleA}_PQ-x3)RCYBRVU}oVyLmkuCMDin#)+m+M)pobsz0LFL@Hd)PB2u} z>;n?Gl|*_H(vGJ11WD!A*R4i@96cSy5mplNaY70XOCmDMyS0_k6P-%20*vD583A{_gM>;n4`xgY4jd{e!XSW*j~GK>$S69KHgGgU?4&ji$O(thbj**bl-5-?V@&dPtlO(h0+h;O3XUKsR$@7)X1wF( zYc(a?v{p?9)S~CFMG2&=x6_-;;EHY-vt}$(f#fB?R^`^U`Ier!8n&pq0D(KG4+~mX0#06 zw3ik{$aKV875y-Zs)UF7$Wg3qDPpv0g~pbf2j={R zP&4=?ZLsj;UP!zf5*M3tp{{(WE9>ui#2}G5^k*F;jaV2=I6NKJS39{2`45#jWtV+!&7EQ$C%A|kyS3iZP5%ABGS z*Lst&6rAHE+j=&XhGvUtPZ@2Lp$*ccZe4+=Q5+z240KNuJR*z)asp>nyT%eKl(?KA zvU#DgYaBRSeMA$6(YUQlvbB{;z%u9bsA7z3&)d*Rw89-{hGnbva? zt*vy1I!iJSUB{*ajCZ8QyyN2}?=rB$LiZ{__s~g&=_!f((zR432OcFjM@=$LQwY;? zJU!k2hbx83TpV8N$b};LP$cV*ILEwF2YMHte^UrRL%4`2=anJs&@MaQ3762i z4k2Sk>ZA^oLi3tDa8_S6l%hLv?A_MI(19(=#lftSUX9AY_8({Y9gMOxTPa z_n^MM>+Vdw8MkOD!HkvM)?Pr@S*@qdxZg&L-ZfgqTYugCIVRglF1owo()$8F`}XPc zv>gG+F{pdsa}zydNQj*1>QDdo z@W|cWl{FL}U{)_`Qn4NzDM$r2C{xIaFM3%@=(*w3LzZZTu(DW@NKZ^)TSeuSm;#Az zLYYOZrc^CfYIgUcOSUOfnYOizea-CkMne04jiQLh_XJuBO{?EbeLeN#jR$f~2lGt_ z=boK=_QU%jk%)AQ85A0t=XcKUgqAeW^5KUcE_-VNE%zJR@(r67ujCrGn_u+Cg%D}hUfu?_P^;+RuRa-p2<=W!;Uc(`e@Iz1A;X2O`*Ka-? z^!zC3!@bQ=NWudnly`CSs5vW@Xdf_B*I{;9X0mnGW(>{0Ah0>b=dgQN(D5FUs4+uO zwQ<=+l0o6MHnJuxT7(=Ut6Irj#lbd`t$)RqUbh(af8KZh*A)#af*uP#AU>y_BgK z97{l@Crh*)MlSIh2pCUHuXfN~BkgHIyRV`Kpqud(-TV{fi;TfT7{In`o2 z0Rnifo~3cWB*(G=S~(vYfwf_XQ8Rpd%f1>73yfKUKu9yyxp z*X=H4jCgv|X=-c(p2i-VP{aISz7d+7$BQZCSZrrrX0gx7t{+6}dD9V=wjOKC415`^ zD~Mg)$60)FY)Vn!86#efE6njnPT?+{q8&<>73WamO6-~{o>Qin?d*!Y8FDf)>}=`M zp2eeefBanVB4@UV7SIS%Xdc9`3L4GZtMhe)@`U_f4l zATMlp0Lc`JhzJKzs^h6B)S*~gGxBts12mS@*9bs6Q3hr}b%=xKx8vE!(+oy1#^pns z?uAGs{{6_mZ_V{RpYOvAIhhZg%=%9{xwn5L5L1Y#>mX|(2z{3Vk%CeLf+COYaKu&v zZg(rI$g^jm)z1O7WHxf79Msn4`cCKjPUk{r@}V`Np$r|2a=0NchW!Wc#oAHNF_ zUYUE2T#(1Gp+r;3lkSvu3(!0wZ5nA(G$EJ_+)V96n&=2K!s%K~^6a*1H5n}}BP(fY z>^Qppvx{nI{Ev@8p}l=>g>Ai8 z!D%oq-LH4mN*s$}vx8%p|6nbhCZEzQZvYC~2CHR1q^^4no9;Gj$~AQ58@gcp@dxku zJMQ{B7LVury?K9c*53;o&|K&dgUET$mH1^ljKD3sV)bakDQzn^DUEEL90}kcp(IB0 z-JXVvIpp~>&p+FHV(8du3pHSBTFoth`-d>I9c?KD&4!EM1mo*y3DRMxdzZj)8oL~W zX9WDSEG2S+z;zIMGnpvGC_>qSjAFPYglLbA9uP4g0iN_BO!Hv0#iR`o9R4jZp_Cm^ z{tY6_FyVS6tf1c9sZHfd*4H#dc>2b+Ko!!v?2uA`h9$+N>@W+M`#3x#**yYfoyQh0hcn#4Gft6u|qX#Gl zba@Onet;5{Sqe&6f96YBX0GdQOy8xRlhBEtS6O<#*tFD`@7|va9mt0cWc>%67*c_U zSnoHXh);qcYjvqDCG1dNThv)r!LoGuvx}40-KpbHx%tsT?Sis;-*u1Vx$d>9 zxfiJqj%&t?Q8JX?GamaPJ1$$B>@6O1L;dc)?)e-%==ry)zMdf^n|Jzm%@IDUEy%rR zV7N=C9yQpeQyKVCS}rch*Gkz@W(HyF0kfvZ`O!Mu#hpAQ`JQ-V4Y3}yBbq*Nx<913 zh)jn{8ag!HdxndV;zmUz?Kuk9t1HRNRNa0Hj*_{6?cY}F=X;Si8W#8 zg5aPRI3y{*g5O}M_^PWCHV`wc?FR|zJWX_xfpA)MaFiuEeuvQg+b9L-UMtkCx><8C zyy0$mL$5>!?l-Lem4i1AW`i4+-4%iMpERuhP0!-d->AA(m223N zZ`eXR?V;gbPa4B^Gbl72oqP6vu%6V@3wss^Z=JfcBNyD25AMnacbR3PSnCJc$Pbq* zQ4oFmF$w3Y)wO8j?Y2V!;fH~$!?m6tHf%o}@chW*!u^i|K7?$$d$EFTl~;cT8T)qz zWjY-}PK}XB%Jv~a?zHkx7CwgDE1k}j*39~05-5Z46lW7@he@Gm1NYhuEE$9#1;i(o zpQ>MJMKH0Ei8~q#tNbZ|WaD1BkRe%mw33iv&GSPbg+=DXFXMUwu>#x-9n*A_&Mv?a zCQABpoVK38Q|nRIsh<}_&+z)xURM9d0;w?^=P*zjp9@YBN=qFJ#-~#3ATUy`5Wi_U zLc{MDy0`Hu>>$7}leeU0LnZJ5hSqE1&U0jR_c&AKwTafg)WH2(ryAaj3sA=FcL(}Zs~GcY-D1t{unPs zo!;o6OXaft8R21yN+sQgavZ_WFtPJaJ{-xtq zZu*zz`Ohm)e?!&#d#LIOjecaFH+Vfk00+WNdoa1_rac_RX5%KTUWtpuT{zb@V<8?5Ew^S0|N&)5je1CCYV%@)$N9z=o(T82msz zt^kefXVwt)V8kfre_&))a%}lu_?s27p<#TM#(vfFtIys%x!ADy!mXxUV^_YhD;Mt0 zhr4;YHDnVJT*(~DP`-iy8}rr6biN&YwG`z|)*G%)@sc6m+MiDag+7Eq4~{&Uq86mWn)bqXMBg4bIygn{{HayM}FY_lhBVsxo2L;Kl4Iv*V+88 zvq;E=hVuZJe^?EoE@tDb+T{67*CxA-lhBlj0i$TvmwmsONdg_fC zodmFnTbzAi`4&tsnCq~Cf5AQDorT?e7+yFT!!rdA!iH!tQ&PjCAsXndpl^r?=>NO; z=hs(#sd^9qi^mKI0Q}r$+$1EJB;YH)i^fhtm9=BeH;$v;-tf=3OZ$R(R53K&V5s!X z)7EUWn;^wzH`!Q>+3hEB>wDfAmo_g05?aCawfm3{Gn5<~impj34l8-YJ>hKRn?q51V|)pilK*k{L&*+PX;t#JV|&n_qPq9o_!% z$e4Y&Ov?Kew|Q@u&^5sAFaQVR+aT(;_yqfiLsB7>6D*bgiU3D^(gqpqjMaQ>X8Gw< zKTp8^9RYR-m3_z|3weaRW)M6G*ZtHZ)b#xJ=G$BEy#CI%+uQOzPye9h->u69&*Xz= zmOXk#^AYoo6Td2x_%V9N_6~4|=)=^>Bh*P8-^I`B!{MaLuTk`0Ab<}E6X)(x7Jw#m zK`nae&^>lIn)2Tets8We0{L-pc;Tu((L9sS7 zf2T^}N0q_DO`adEav`)$GNL7nx}U|($F*8aHmqc|u(L0qXRg@aVqi|d?1Nn|kRrH; zGuzdq%Y>4)=5u=+xKXRP`LoETR0~cBfCS2!O$agupE)|p*``s`3y^7uBO(cG+P*K- zA=K6;O$0W|f^#bBVb%xB)&rAxlQoyI&U%k60uD({W~+2JSGdly2S~yu@djJCAiOYH z(`>i}Gy`0^!x1G=)G%116U4@Ao!2U6ZsaTN_%^yjlT|Z3kYoU!AM&4BEwS|YS!R*4 z?ytadQvgOOe@Q`!%CfksEU!1c$-xws&G+{-)2T>I^cJC}?q0C}Zm^$gVaSu~Da_4# zq1|^wyK|wv`OscWlRy=tbvDc=!qkEPhkuOn_~Np%pKhu0Tl3Df@GJ)V4^G2i|2pMVgO}%bu6=DXWl|xHHEkm2fnQ>qcb7ygvIviGyst<$VmL zijthYE45XswC60ZhL!yGT(6?vfR^vN=f;;ZA+u9Z*Scpsw*z)Ht+rTylleAQ#b}8< zLuNoR2ISP0f^<+VW;nD?q#kt~ziOF5x+IKzCx%Y+#?=e@#ADmeZO?0m*jhDA*nMQo z9~I{@VE;Ei$VrmPRRRaJYVt7GrdZs{uq%WP!30g=$K5ig44SXzJ`s>aG|N0&L_6E0 zi!?Sd(iHb{tAEtrJhtgd0}*+)>D#$cpxzqn5i$C6j-4w( zjUcjs%BRS>M(!#wq2sV1oQxXL?JWQ{9NBPCFj9v(9B7jnsgF!O0dup^bPYt|RH%Ts z5!6EOP@m?E2aN>P3uPMwL#Q_5m$8(X3d8B3b+m_+o4}lpTpb^|UirxN+O+$X*FJI$ zfMI(U(M;o_oWNbTzm)4)p!Dxja2Y`{z*J%EM4w}nU*mMFx~#CYz&a zu2*w0Pj6Zjh^Wi7(_0*LZsp9?ATeqX$gOdHO`br5=8e7hnOxJ(eA7;=Gd9kSbp?1( z2-eRXn>$7dySj!Hg4jg@v=}E7;^CtuCb6c2fjY=EBkNm zXFrIbwl3`a_S4^ddZ|CRW?Oy@JZTYC2)BUDe(m#L{rrNO3w7i}9m|5drgh2ty_(;u zxigmQ8pwAIu&6@E=I;)CXJARnb@b;u`tNldxZ82yy|G-!;e5y8Tv(j<&A+~|3FY0d zU%xc?p6>_a+4@tt`cwJ(Q`w;TSq_=aWCH6Ot5yr&tm^W7*VScbX^13t;Q!%w5OBgS zxh}ZqH0?#iI4?VC1sUFnZ4VwZ-;CR0)5B1_i+_HRqxFpIvH$|R21MTSjGn_OI6_49 zXvAw5cg&vN{H&bOw3PaG2b_-VBv%Z#hai>w4T@LD*2{3Q=z$*yVwu-R@KOqAdue(} zeo`@0qY+eSW#?S@Dvojbc12x{>0E)!=IbP+Bt0fa$_Fj0=QDG`!m8GLt9IU9wKKPB zcYf7wIO&sDKZ3cV_Zv4Z%C|1%8vEeyJ9o4YYFr3rL!I~#9tB(O1>5ch+ZJBT1v~P= zj%=`_P~SZFJpWs+*2{Us8vY>~qYH?OxOZNTK|T*L(lTH;?Z;Tn?duXd!>7r58jupg z!C{uuf!M)eZiJq1Vf9L_rZayetXeF_gP1yNZpCl?g;ckMr{J+4LcFn_I9F#-vK{*#6j8&~(BfE9Y!delol;?v%)D8MLyH`ZVn<$00&|M~ilV2BA`)Q&7Pdfup=vRLKYn3_-Xe}*f16VE}7Z^f1EKu|8cIn636Z!0}3c%96m^>g=J-x z)6nx%T{M9Ky)~L=9Ph(dQV2v?_2XuNSh6jvt>Kx$$8*OXeKRSTlvo0$Y}%ws0JUyA zH5cTMTwT-QZf5S`5IJx_Z2!pBK3!%0WRz^$BkmLF^lv*k<4Y^8*BVVTsTfNt*;=xu zghUy*3A8Wcn)-;`IJ;O-e~fyywRSa5h_X|(nn2gGfS?>j!wOo{wy^3goCSrOLhF%* z7vFj{+j<0__jd7bg!2_xfa|bp#YcG}i*mL#!arKdO?H+P($>AzMp0O|@k9t`RC#K; z5Swr9$u{l5XX!Hk&W86Gp9f8A@=cqwVe_-RMsG8tp3G1`WHUMu#UVQQ@IN7d2Eet5 zZ|7Ai0jX^tPX~bIw2~+&>pi_YQ^Q+o0StHGej)<+z)Jir%X$xZu2Zuli~ z&%i(2F?Ju4aI&?&l>7m)!B}&${!$OnUhhKOY54qVRcQEn?nwWu z{00RX3a(NxL&4`LXrN#gL9u~`O80=*ywH?UO8#dQkoyvXtJ zF_2KEqRiWtyK6F!EwWwBpLO+jD zz=$ZJAxB8UGd47Q-bd)?NjK zD=ZUSYbxrN-63D+gEiu^58v>rYiL@oq&vURym~o6cU3}F+j2GC33_0ZLJ{q(lxkn+ z!WC@)^mQ)br9b$}?mo`G&A@mHsmrTfz9X&$$Q$%sCaiGzb}Wz#@2yOz9E7$&D47}+R-ml*JMFQOoPnSqgwVw+fL zA>YnBgESaB&A`Y;u^17&SgFRhbBQ$z*>KMSBO68Vw&DFui`a|%F<#S@ZQc6#d_Lc{ z#bLrXNSJzH)JhRRIyA1?*RpVY@zeP>WW&7~7K8z^@MQ)@Hj3q7arwFz z&`W%ofsu`3_4iHfTmV>H1Q9*3WZS7_tMu)d&wvRa^wR?)8%5N!wt0M~Tnp#0tmE4n z8d+IFm6rDf7mcsS_X5kShnBpEs&WIbFm>>?)X2U{1AhgQUcNJS`?X~Ox1~Y25(QkK zR(CD|Z1^e->S@gPE)C^7_7MyiG^_#UUgx6kR!v@{#iUHSP|-U3>AbIHu`cWD$oV?* zz7C=&EsGm(_2%2Lr5E>RK>h2~vuNY*_ibL-_*QRzHO3$JW?%q=VjCIU{Jx%r%;J%y zhQ;G=!JdMjW?;$Qqh)vdb}e=-_1^+vz^xe=St-`fO7{8=5(&bW85r3pHpsGteT|D? z=Q4Xd5F3#nwEXFo{GpdhM~97A7_@2e!jgI`Y0@pr-D(s^6r9Ex zIH(tHxeHhL&bjU!fA8fVjQ!zj`JK;G(m5cNBMdkAs%-i2n+Tva=&AKpEndCjf3M;D zHTlf|1%8(XVzY0^wRHT>Yx%85XtI*7$r1MXfdW_Wcy56t;FZybx_v#rZIBSQ|4#vJe61MpC6QLcG5i}>t#o0u+O#tr*qPP51NR?)8ybZ&Tw_#KvzSsYGVFxumHPE#XtBN!d;%Fdw`Bjys#U^T`_G=Ev4k zX;$}%Vih~OgIT`$W;_e<_`5n-+AH=(ZKLKf^rP13*Aui1yHDSJmc6kc27SNr##Lr= zpjWKXk+)1MU|8ww!(~x*oP*+msVtIk=p>;Y8xRe>fkcV}Xkqj>ad2TNIYqCVi=~YB zv>J*D=r@?vF`d4IBd3jMn^PZk-Uh=k2~t*U;$GfXNS5Y^5kT+@Q>{96o(VzRw!z=%z^x+&Wcc1vye2_>5o$M5B27-6r*qh$ zdD3^>>Jkk*42c>C-!x5CWRzpn3?-d}H1)^x@VTy!CTO&Nx9n(ebtByE&0m6zb;3?;Vk#?>GI2a9@drv&&u{93x*aT(Mr_@5GxvT#9O>cUuA7 zm;(U4o(9Lhk!J$10aQ0K-Tj%aR}S@#Z0~*QwHf_J`;J6=U+dB1x;x=mc%;swTFvZ$ zji`-V?>27DHAeD{k!7JSfKx~j%njlQq4v&OErsxYetOXTrk0yYoHf*5`@VqS0}8Ui zbr4V+H-Yu3X}uqAdb9THwS~rgg~pbA<7R|6PrYC1t*b}gI!F%`R0(yhct6M7bNp|) zL$8ogp>xNIRm?#(nocF~nql=)d=f|Dr^XUfl5CuWuNG_dqfk_yk-wgro*ARrpkD?Z zdk-;Rc7I&goa=a}tP+%5ZwNCLrS64D^Qd4WR!H;WInN4dKBRfer_H%FcSc8jU@0nM z+py}N2kcUx4<}70&e8zk+2xOYQ{|2w( z7%~ny)k-wlVn<4&Ts8-li7B#_n>%#Tv>vRMJ=#l5L1Q1)K>g(+bO1Tud|}!Kz*3FJ zC#LlM3OHP!5C$d~evk*b@N2A%1w7hYhD>~8`;6IvG+kP5Iy4eUrE>#XH~Fpz11zin zUHe&b_>G*p%r9X=*Q{IpinKZ%(~9+@`<#PB7kCVR_k=R)&2Z8UQrFM!pS? zcpMH{3Y)DqrWef!PQzU|1??O=U7fE(%?MOZ)1 zzLA{DFp`w!7RU3DebRl!ecAQBYGdMstrKq+PwHOct7#+~2uG=4QJl3ni2tk;kQ~@m zl6E!E@NDQHKJ&4~y8MP6?=@yO9KdJZ#lN+XWnsO>P}HGa-Id&po6gu^4OJTHj-6@S zgu9{}C%h7$D~h9_(;73^_9$Ax4X+NCZUxHnCF%tkWj=&U=XRmC{$5Sj-I}gkO;5h2 zXU@&u(BlehEpYO37W5=nwLU5N2qi&5SoF!35!58onLKucu?g zVRqRA-SH!yBh}(C(Vh_XPV<8juos@#Spfnf%5>rRrm*Qm$|CH81(II}YW$ z4wFI=OuIdZ2yJ3veNUl%Q(=8)VfFgunhn0Emjwh58e5iq^rJ!uwJdmUq?Rk`mmd!- z2k5Q}hf6P4(;b}-${(y1s_L`#?fF2*a)?r>pmG5RGQoEYAU7_Wv~)eBX=Z8#t*=3c zR?TPbC&C+XJD)j$>`7;(xZYs;lr`2JNkn(_y@*0&lQ1V{QXW z%ma)_#M@2n*+aoz3I-^64neU}E2LOC!e1Pz&@r&3_{X|K!8?S1`*CC9A6^1jTQ_@Z z_S6?nEqe*Wo_*_d2}+gx8LjNJd(tA`j+%rUV0KcE|2Gug=Mnt_`jnPK^5rRgz5DOV6!d5t38??~?erI#d@ zR2b1yewQFcbO7*a5$C)&YUc3Ax^6=U>NP_L8W_8d)I68ddccU}f*J#bTaW5~$1`*e zl7AHhrSugHmY4c4a`aX4l6wf%M3vXii{6glf>sVY$ ziQ@{$wT0?6TTl+Ex+x0m&c zD~r{q*sB{¥3~GeM3e+2S!YMx(4>=rJGlcHEHvjTQgkHzP#RVt$#}$lvgy>_C#H zgW)4f5jLHRLeQUXw6w=S%ReAk6Ve-KS!iklc2>{f?-zufN-uA*i4N4_(hVXUA)Bm? zHj(j3lF{4U=C9YYTga+VD^hEj#_ry)l)yb_VzOW)z|+|PtCU15v`^F3jnEQ||b>`9PP z8Mi`qFoiZ?6x;DCiU^KbN=a!Y!Zi}4gtV9(R3%Iq>75m2GLkhYJ|4&R27Ve0xwaJ7 zl+Vk~y5!zGgp|d#<+EvLJ}Ik^M`@yrEi5B@&jpm;5#wdYDnG`$*`7=q4^oe-N(+@h zh*Vr}&q4>FBviZ@gCui0E}k9V&i#klDF14Ee%A5`-@CB!7F^2FVo-C z&j1W5C)tVdd~z^t?k37j#7{X!!AS}jmr2VqqsnX!lrRDx`S$}(IM3mratw%vkD%TI z!ePIG%T*AnX4zjsXw2%Lf)LK?pMp?5%l-;N?JWDV+yrLXpAoa{u64O#R{lp8h=OZh zRv55;3c~Z*a-V{5B3tfL5T41F`#cbKXYHSYus>Vwv+VW~Se_)P5?uXRq0jm$2!mPs zryv~2mirWh?OFThfv_%X|2*)7;i}?lDtOmt9iIoGRkO$8r@C-zX-~GTFW-c=G(4yd z&o|6Zo(=9H_!SX1Xj;A=L4%3_T~be`9SAv#d1Zp3$7;4VE*OzDfR<1scnsG zD^7Vrkz?~MH=bVh;P->7(7b1Uc;0_w+p-V8Ne&7uSJIte5B7Upto^0I{BziA>k4D9 zt)3p7sC4x&3+2Q4tM9Xv53K3uLT6nra3|%%_gVZ0*3^p_U-a4;%pHd*gL-Ww)%vJp hXD~0nPqBD&f}S3(aAEy%2J;)=r`Qk5B(bIG{{xQAP>BEl literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01abc42b7094984c08e084a3b049b65250022a6f GIT binary patch literal 17533 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 str: + return field.lower().replace("-", "_") + + +def msg_to_json(msg: Message) -> Dict[str, Any]: + """Convert a Message object into a JSON-compatible dictionary.""" + + def sanitise_header(h: Union[Header, str]) -> str: + if isinstance(h, Header): + chunks = [] + for bytes, encoding in decode_header(h): + if encoding == "unknown-8bit": + try: + # See if UTF-8 works + bytes.decode("utf-8") + encoding = "utf-8" + except UnicodeDecodeError: + # If not, latin1 at least won't fail + encoding = "latin1" + chunks.append((bytes, encoding)) + return str(make_header(chunks)) + return str(h) + + result = {} + for field, multi in METADATA_FIELDS: + if field not in msg: + continue + key = json_name(field) + if multi: + value: Union[str, List[str]] = [ + sanitise_header(v) for v in msg.get_all(field) # type: ignore + ] + else: + value = sanitise_header(msg.get(field)) # type: ignore + if key == "keywords": + # Accept both comma-separated and space-separated + # forms, for better compatibility with old data. + if "," in value: + value = [v.strip() for v in value.split(",")] + else: + value = value.split() + result[key] = value + + payload = msg.get_payload() + if payload: + result["description"] = payload + + return result diff --git a/project/Lib/site-packages/pip/_internal/metadata/base.py b/project/Lib/site-packages/pip/_internal/metadata/base.py new file mode 100644 index 0000000..9249124 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/metadata/base.py @@ -0,0 +1,702 @@ +import csv +import email.message +import functools +import json +import logging +import pathlib +import re +import zipfile +from typing import ( + IO, + TYPE_CHECKING, + Any, + Collection, + Container, + Dict, + Iterable, + Iterator, + List, + NamedTuple, + Optional, + Tuple, + Union, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import LegacyVersion, Version + +from pip._internal.exceptions import NoneMetadataError +from pip._internal.locations import site_packages, user_site +from pip._internal.models.direct_url import ( + DIRECT_URL_METADATA_NAME, + DirectUrl, + DirectUrlValidationError, +) +from pip._internal.utils.compat import stdlib_pkgs # TODO: Move definition here. +from pip._internal.utils.egg_link import egg_link_path_from_sys_path +from pip._internal.utils.misc import is_local, normalize_path +from pip._internal.utils.urls import url_to_path + +from ._json import msg_to_json + +if TYPE_CHECKING: + from typing import Protocol +else: + Protocol = object + +DistributionVersion = Union[LegacyVersion, Version] + +InfoPath = Union[str, pathlib.PurePath] + +logger = logging.getLogger(__name__) + + +class BaseEntryPoint(Protocol): + @property + def name(self) -> str: + raise NotImplementedError() + + @property + def value(self) -> str: + raise NotImplementedError() + + @property + def group(self) -> str: + raise NotImplementedError() + + +def _convert_installed_files_path( + entry: Tuple[str, ...], + info: Tuple[str, ...], +) -> str: + """Convert a legacy installed-files.txt path into modern RECORD path. + + The legacy format stores paths relative to the info directory, while the + modern format stores paths relative to the package root, e.g. the + site-packages directory. + + :param entry: Path parts of the installed-files.txt entry. + :param info: Path parts of the egg-info directory relative to package root. + :returns: The converted entry. + + For best compatibility with symlinks, this does not use ``abspath()`` or + ``Path.resolve()``, but tries to work with path parts: + + 1. While ``entry`` starts with ``..``, remove the equal amounts of parts + from ``info``; if ``info`` is empty, start appending ``..`` instead. + 2. Join the two directly. + """ + while entry and entry[0] == "..": + if not info or info[-1] == "..": + info += ("..",) + else: + info = info[:-1] + entry = entry[1:] + return str(pathlib.Path(*info, *entry)) + + +class RequiresEntry(NamedTuple): + requirement: str + extra: str + marker: str + + +class BaseDistribution(Protocol): + @classmethod + def from_directory(cls, directory: str) -> "BaseDistribution": + """Load the distribution from a metadata directory. + + :param directory: Path to a metadata directory, e.g. ``.dist-info``. + """ + raise NotImplementedError() + + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> "BaseDistribution": + """Load the distribution from the contents of a METADATA file. + + This is used to implement PEP 658 by generating a "shallow" dist object that can + be used for resolution without downloading or building the actual dist yet. + + :param metadata_contents: The contents of a METADATA file. + :param filename: File name for the dist with this metadata. + :param project_name: Name of the project this dist represents. + """ + raise NotImplementedError() + + @classmethod + def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution": + """Load the distribution from a given wheel. + + :param wheel: A concrete wheel definition. + :param name: File name of the wheel. + + :raises InvalidWheel: Whenever loading of the wheel causes a + :py:exc:`zipfile.BadZipFile` exception to be thrown. + :raises UnsupportedWheel: If the wheel is a valid zip, but malformed + internally. + """ + raise NotImplementedError() + + def __repr__(self) -> str: + return f"{self.raw_name} {self.version} ({self.location})" + + def __str__(self) -> str: + return f"{self.raw_name} {self.version}" + + @property + def location(self) -> Optional[str]: + """Where the distribution is loaded from. + + A string value is not necessarily a filesystem path, since distributions + can be loaded from other sources, e.g. arbitrary zip archives. ``None`` + means the distribution is created in-memory. + + Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If + this is a symbolic link, we want to preserve the relative path between + it and files in the distribution. + """ + raise NotImplementedError() + + @property + def editable_project_location(self) -> Optional[str]: + """The project location for editable distributions. + + This is the directory where pyproject.toml or setup.py is located. + None if the distribution is not installed in editable mode. + """ + # TODO: this property is relatively costly to compute, memoize it ? + direct_url = self.direct_url + if direct_url: + if direct_url.is_local_editable(): + return url_to_path(direct_url.url) + else: + # Search for an .egg-link file by walking sys.path, as it was + # done before by dist_is_editable(). + egg_link_path = egg_link_path_from_sys_path(self.raw_name) + if egg_link_path: + # TODO: get project location from second line of egg_link file + # (https://github.com/pypa/pip/issues/10243) + return self.location + return None + + @property + def installed_location(self) -> Optional[str]: + """The distribution's "installed" location. + + This should generally be a ``site-packages`` directory. This is + usually ``dist.location``, except for legacy develop-installed packages, + where ``dist.location`` is the source code location, and this is where + the ``.egg-link`` file is. + + The returned location is normalized (in particular, with symlinks removed). + """ + raise NotImplementedError() + + @property + def info_location(self) -> Optional[str]: + """Location of the .[egg|dist]-info directory or file. + + Similarly to ``location``, a string value is not necessarily a + filesystem path. ``None`` means the distribution is created in-memory. + + For a modern .dist-info installation on disk, this should be something + like ``{location}/{raw_name}-{version}.dist-info``. + + Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If + this is a symbolic link, we want to preserve the relative path between + it and other files in the distribution. + """ + raise NotImplementedError() + + @property + def installed_by_distutils(self) -> bool: + """Whether this distribution is installed with legacy distutils format. + + A distribution installed with "raw" distutils not patched by setuptools + uses one single file at ``info_location`` to store metadata. We need to + treat this specially on uninstallation. + """ + info_location = self.info_location + if not info_location: + return False + return pathlib.Path(info_location).is_file() + + @property + def installed_as_egg(self) -> bool: + """Whether this distribution is installed as an egg. + + This usually indicates the distribution was installed by (older versions + of) easy_install. + """ + location = self.location + if not location: + return False + return location.endswith(".egg") + + @property + def installed_with_setuptools_egg_info(self) -> bool: + """Whether this distribution is installed with the ``.egg-info`` format. + + This usually indicates the distribution was installed with setuptools + with an old pip version or with ``single-version-externally-managed``. + + Note that this ensure the metadata store is a directory. distutils can + also installs an ``.egg-info``, but as a file, not a directory. This + property is *False* for that case. Also see ``installed_by_distutils``. + """ + info_location = self.info_location + if not info_location: + return False + if not info_location.endswith(".egg-info"): + return False + return pathlib.Path(info_location).is_dir() + + @property + def installed_with_dist_info(self) -> bool: + """Whether this distribution is installed with the "modern format". + + This indicates a "modern" installation, e.g. storing metadata in the + ``.dist-info`` directory. This applies to installations made by + setuptools (but through pip, not directly), or anything using the + standardized build backend interface (PEP 517). + """ + info_location = self.info_location + if not info_location: + return False + if not info_location.endswith(".dist-info"): + return False + return pathlib.Path(info_location).is_dir() + + @property + def canonical_name(self) -> NormalizedName: + raise NotImplementedError() + + @property + def version(self) -> DistributionVersion: + raise NotImplementedError() + + @property + def setuptools_filename(self) -> str: + """Convert a project name to its setuptools-compatible filename. + + This is a copy of ``pkg_resources.to_filename()`` for compatibility. + """ + return self.raw_name.replace("-", "_") + + @property + def direct_url(self) -> Optional[DirectUrl]: + """Obtain a DirectUrl from this distribution. + + Returns None if the distribution has no `direct_url.json` metadata, + or if `direct_url.json` is invalid. + """ + try: + content = self.read_text(DIRECT_URL_METADATA_NAME) + except FileNotFoundError: + return None + try: + return DirectUrl.from_json(content) + except ( + UnicodeDecodeError, + json.JSONDecodeError, + DirectUrlValidationError, + ) as e: + logger.warning( + "Error parsing %s for %s: %s", + DIRECT_URL_METADATA_NAME, + self.canonical_name, + e, + ) + return None + + @property + def installer(self) -> str: + try: + installer_text = self.read_text("INSTALLER") + except (OSError, ValueError, NoneMetadataError): + return "" # Fail silently if the installer file cannot be read. + for line in installer_text.splitlines(): + cleaned_line = line.strip() + if cleaned_line: + return cleaned_line + return "" + + @property + def requested(self) -> bool: + return self.is_file("REQUESTED") + + @property + def editable(self) -> bool: + return bool(self.editable_project_location) + + @property + def local(self) -> bool: + """If distribution is installed in the current virtual environment. + + Always True if we're not in a virtualenv. + """ + if self.installed_location is None: + return False + return is_local(self.installed_location) + + @property + def in_usersite(self) -> bool: + if self.installed_location is None or user_site is None: + return False + return self.installed_location.startswith(normalize_path(user_site)) + + @property + def in_site_packages(self) -> bool: + if self.installed_location is None or site_packages is None: + return False + return self.installed_location.startswith(normalize_path(site_packages)) + + def is_file(self, path: InfoPath) -> bool: + """Check whether an entry in the info directory is a file.""" + raise NotImplementedError() + + def iter_distutils_script_names(self) -> Iterator[str]: + """Find distutils 'scripts' entries metadata. + + If 'scripts' is supplied in ``setup.py``, distutils records those in the + installed distribution's ``scripts`` directory, a file for each script. + """ + raise NotImplementedError() + + def read_text(self, path: InfoPath) -> str: + """Read a file in the info directory. + + :raise FileNotFoundError: If ``path`` does not exist in the directory. + :raise NoneMetadataError: If ``path`` exists in the info directory, but + cannot be read. + """ + raise NotImplementedError() + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + raise NotImplementedError() + + def _metadata_impl(self) -> email.message.Message: + raise NotImplementedError() + + @functools.lru_cache(maxsize=1) + def _metadata_cached(self) -> email.message.Message: + # When we drop python 3.7 support, move this to the metadata property and use + # functools.cached_property instead of lru_cache. + metadata = self._metadata_impl() + self._add_egg_info_requires(metadata) + return metadata + + @property + def metadata(self) -> email.message.Message: + """Metadata of distribution parsed from e.g. METADATA or PKG-INFO. + + This should return an empty message if the metadata file is unavailable. + + :raises NoneMetadataError: If the metadata file is available, but does + not contain valid metadata. + """ + return self._metadata_cached() + + @property + def metadata_dict(self) -> Dict[str, Any]: + """PEP 566 compliant JSON-serializable representation of METADATA or PKG-INFO. + + This should return an empty dict if the metadata file is unavailable. + + :raises NoneMetadataError: If the metadata file is available, but does + not contain valid metadata. + """ + return msg_to_json(self.metadata) + + @property + def metadata_version(self) -> Optional[str]: + """Value of "Metadata-Version:" in distribution metadata, if available.""" + return self.metadata.get("Metadata-Version") + + @property + def raw_name(self) -> str: + """Value of "Name:" in distribution metadata.""" + # The metadata should NEVER be missing the Name: key, but if it somehow + # does, fall back to the known canonical name. + return self.metadata.get("Name", self.canonical_name) + + @property + def requires_python(self) -> SpecifierSet: + """Value of "Requires-Python:" in distribution metadata. + + If the key does not exist or contains an invalid value, an empty + SpecifierSet should be returned. + """ + value = self.metadata.get("Requires-Python") + if value is None: + return SpecifierSet() + try: + # Convert to str to satisfy the type checker; this can be a Header object. + spec = SpecifierSet(str(value)) + except InvalidSpecifier as e: + message = "Package %r has an invalid Requires-Python: %s" + logger.warning(message, self.raw_name, e) + return SpecifierSet() + return spec + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + """Dependencies of this distribution. + + For modern .dist-info distributions, this is the collection of + "Requires-Dist:" entries in distribution metadata. + """ + raise NotImplementedError() + + def iter_provided_extras(self) -> Iterable[str]: + """Extras provided by this distribution. + + For modern .dist-info distributions, this is the collection of + "Provides-Extra:" entries in distribution metadata. + + The return value of this function is not particularly useful other than + display purposes due to backward compatibility issues and the extra + names being poorly normalized prior to PEP 685. If you want to perform + logic operations on extras, use :func:`is_extra_provided` instead. + """ + raise NotImplementedError() + + def is_extra_provided(self, extra: str) -> bool: + """Check whether an extra is provided by this distribution. + + This is needed mostly for compatibility issues with pkg_resources not + following the extra normalization rules defined in PEP 685. + """ + raise NotImplementedError() + + def _iter_declared_entries_from_record(self) -> Optional[Iterator[str]]: + try: + text = self.read_text("RECORD") + except FileNotFoundError: + return None + # This extra Path-str cast normalizes entries. + return (str(pathlib.Path(row[0])) for row in csv.reader(text.splitlines())) + + def _iter_declared_entries_from_legacy(self) -> Optional[Iterator[str]]: + try: + text = self.read_text("installed-files.txt") + except FileNotFoundError: + return None + paths = (p for p in text.splitlines(keepends=False) if p) + root = self.location + info = self.info_location + if root is None or info is None: + return paths + try: + info_rel = pathlib.Path(info).relative_to(root) + except ValueError: # info is not relative to root. + return paths + if not info_rel.parts: # info *is* root. + return paths + return ( + _convert_installed_files_path(pathlib.Path(p).parts, info_rel.parts) + for p in paths + ) + + def iter_declared_entries(self) -> Optional[Iterator[str]]: + """Iterate through file entries declared in this distribution. + + For modern .dist-info distributions, this is the files listed in the + ``RECORD`` metadata file. For legacy setuptools distributions, this + comes from ``installed-files.txt``, with entries normalized to be + compatible with the format used by ``RECORD``. + + :return: An iterator for listed entries, or None if the distribution + contains neither ``RECORD`` nor ``installed-files.txt``. + """ + return ( + self._iter_declared_entries_from_record() + or self._iter_declared_entries_from_legacy() + ) + + def _iter_requires_txt_entries(self) -> Iterator[RequiresEntry]: + """Parse a ``requires.txt`` in an egg-info directory. + + This is an INI-ish format where an egg-info stores dependencies. A + section name describes extra other environment markers, while each entry + is an arbitrary string (not a key-value pair) representing a dependency + as a requirement string (no markers). + + There is a construct in ``importlib.metadata`` called ``Sectioned`` that + does mostly the same, but the format is currently considered private. + """ + try: + content = self.read_text("requires.txt") + except FileNotFoundError: + return + extra = marker = "" # Section-less entries don't have markers. + for line in content.splitlines(): + line = line.strip() + if not line or line.startswith("#"): # Comment; ignored. + continue + if line.startswith("[") and line.endswith("]"): # A section header. + extra, _, marker = line.strip("[]").partition(":") + continue + yield RequiresEntry(requirement=line, extra=extra, marker=marker) + + def _iter_egg_info_extras(self) -> Iterable[str]: + """Get extras from the egg-info directory.""" + known_extras = {""} + for entry in self._iter_requires_txt_entries(): + extra = canonicalize_name(entry.extra) + if extra in known_extras: + continue + known_extras.add(extra) + yield extra + + def _iter_egg_info_dependencies(self) -> Iterable[str]: + """Get distribution dependencies from the egg-info directory. + + To ease parsing, this converts a legacy dependency entry into a PEP 508 + requirement string. Like ``_iter_requires_txt_entries()``, there is code + in ``importlib.metadata`` that does mostly the same, but not do exactly + what we need. + + Namely, ``importlib.metadata`` does not normalize the extra name before + putting it into the requirement string, which causes marker comparison + to fail because the dist-info format do normalize. This is consistent in + all currently available PEP 517 backends, although not standardized. + """ + for entry in self._iter_requires_txt_entries(): + extra = canonicalize_name(entry.extra) + if extra and entry.marker: + marker = f'({entry.marker}) and extra == "{extra}"' + elif extra: + marker = f'extra == "{extra}"' + elif entry.marker: + marker = entry.marker + else: + marker = "" + if marker: + yield f"{entry.requirement} ; {marker}" + else: + yield entry.requirement + + def _add_egg_info_requires(self, metadata: email.message.Message) -> None: + """Add egg-info requires.txt information to the metadata.""" + if not metadata.get_all("Requires-Dist"): + for dep in self._iter_egg_info_dependencies(): + metadata["Requires-Dist"] = dep + if not metadata.get_all("Provides-Extra"): + for extra in self._iter_egg_info_extras(): + metadata["Provides-Extra"] = extra + + +class BaseEnvironment: + """An environment containing distributions to introspect.""" + + @classmethod + def default(cls) -> "BaseEnvironment": + raise NotImplementedError() + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> "BaseEnvironment": + raise NotImplementedError() + + def get_distribution(self, name: str) -> Optional["BaseDistribution"]: + """Given a requirement name, return the installed distributions. + + The name may not be normalized. The implementation must canonicalize + it for lookup. + """ + raise NotImplementedError() + + def _iter_distributions(self) -> Iterator["BaseDistribution"]: + """Iterate through installed distributions. + + This function should be implemented by subclass, but never called + directly. Use the public ``iter_distribution()`` instead, which + implements additional logic to make sure the distributions are valid. + """ + raise NotImplementedError() + + def iter_all_distributions(self) -> Iterator[BaseDistribution]: + """Iterate through all installed distributions without any filtering.""" + for dist in self._iter_distributions(): + # Make sure the distribution actually comes from a valid Python + # packaging distribution. Pip's AdjacentTempDirectory leaves folders + # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The + # valid project name pattern is taken from PEP 508. + project_name_valid = re.match( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", + dist.canonical_name, + flags=re.IGNORECASE, + ) + if not project_name_valid: + logger.warning( + "Ignoring invalid distribution %s (%s)", + dist.canonical_name, + dist.location, + ) + continue + yield dist + + def iter_installed_distributions( + self, + local_only: bool = True, + skip: Container[str] = stdlib_pkgs, + include_editables: bool = True, + editables_only: bool = False, + user_only: bool = False, + ) -> Iterator[BaseDistribution]: + """Return a list of installed distributions. + + This is based on ``iter_all_distributions()`` with additional filtering + options. Note that ``iter_installed_distributions()`` without arguments + is *not* equal to ``iter_all_distributions()``, since some of the + configurations exclude packages by default. + + :param local_only: If True (default), only return installations + local to the current virtualenv, if in a virtualenv. + :param skip: An iterable of canonicalized project names to ignore; + defaults to ``stdlib_pkgs``. + :param include_editables: If False, don't report editables. + :param editables_only: If True, only report editables. + :param user_only: If True, only report installations in the user + site directory. + """ + it = self.iter_all_distributions() + if local_only: + it = (d for d in it if d.local) + if not include_editables: + it = (d for d in it if not d.editable) + if editables_only: + it = (d for d in it if d.editable) + if user_only: + it = (d for d in it if d.in_usersite) + return (d for d in it if d.canonical_name not in skip) + + +class Wheel(Protocol): + location: str + + def as_zipfile(self) -> zipfile.ZipFile: + raise NotImplementedError() + + +class FilesystemWheel(Wheel): + def __init__(self, location: str) -> None: + self.location = location + + def as_zipfile(self) -> zipfile.ZipFile: + return zipfile.ZipFile(self.location, allowZip64=True) + + +class MemoryWheel(Wheel): + def __init__(self, location: str, stream: IO[bytes]) -> None: + self.location = location + self.stream = stream + + def as_zipfile(self) -> zipfile.ZipFile: + return zipfile.ZipFile(self.stream, allowZip64=True) diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py b/project/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py new file mode 100644 index 0000000..a779138 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py @@ -0,0 +1,6 @@ +from ._dists import Distribution +from ._envs import Environment + +__all__ = ["NAME", "Distribution", "Environment"] + +NAME = "importlib" diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..336fa13be6abdfa702acc4891c721e137a7673fd GIT binary patch literal 388 zcmY*Uze@u#6i#|~J#FpcA0VzL)WgL=R8U%Q&@KwX5sbMe)@UwwBx%8|n}344i}>Gk zEH@RL+=OnOd{=)!-~0ITJ>L8BlDAf?fgpM}?Yn01L6g7#IZsdPB5-? zP1Q0l@h}=7?!Dr~=YA6K;1WgkPYi|#mm3{vossF#$y`I-?COy;xz2=kkyrY?lZ&qL zVAl9R<+{v@+&CrEUQ{pZl!MzY`(;3d9@(FrK5DW ycv`F-W;q`!aco+!u==4r0{ZeW##6LCS;Z7>O;#~$>`j&!hqG{V>{n@;aKksk`fQN^ literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51db17f34b283cf3019754835deb53133a21de11 GIT binary patch literal 3561 zcmbtWO>7&-6`m!RD^ipw`6sE=M$NQVAX9ay7)5^X^A%S9T+MVuxjgi@p3k-746 zmz^C-rm6x$V6-lfgD$NF6ajiD+zQU2=qbk@dz1klgavXc3bZ#FN-sY3d$S}ZS~Ys; zhvej(E zuG)=UHP>*ej>R%;o_X1O%(Lat!z^Qu@SnD7-tcnZIWqSQuiyjm(yPVpN6gDh zTNWmJQ?_Dzg?n~bFD{3v9KkSTfAd#pV2FZy<&Y$w^vVLQpc+thv(iXh3~RFRI{ zC`fEq#Mi zFe53`JoX;jwH9_Ws(`s7Czi8`9m`)GRkSKyz4$|ac`^32e6=auJL0yC7n^=_uI7hYDtKMQkDa;FTP4@VXF;~u{@IE9_Q!?&7hghGypO*_tTVTNGEB(F#t-K) zK={EAs~Dy2ckn#seR<5YpXA_gdtqZ7oAaKf+zoP)n<`=8ovwzqsK1&e)P5&&(Te&xPAcF3>B;A{K96$=)4YkAT zAjgqX%}N`%$N>l0d-g+cACa7CRR=uBvrnuKd31Y2NuGl8rqFfqD_qfKj>t4n?E6|GqEzP~FycXKR*A3@F1 z5@|yyS7_U%B`!kGXj)p@@S7`sAiInU#Nq3bhf;c6VBba~3i&b&<}iTkc2n{?uoCn0 z?}xZW?nT%njI>d=9;rL{ItX~|hpxoFgX%f#)=>oQ>qcGFQamuo<1x}ivwZx3Jj7dXO*M`6$==V;-FPz}p&QwKLTm5gPWngx6qH@Ja_$tSZ$qI=5O ziZNYLQXT+jKS_NRoCi$zfymh4g@0tJQHbnX$(e;n|De$fWCL4E@B2zcO1%KyaV**d zk&V$_5L9SNCE$>-yT$%d`r6~txlZZaUjCd3%m2$LMH%*l2~JZeShz9PHzHk_BH>qv z5Y!jS8RHejF)8QOmxwVzgv_O!;zcfypGN>UrP6I>zMm$E86xDkW2ojdB|-;{CCG79 z=X3c3M&vAWN(UJ$H@)o=UZ;=9lPp;GJ~Ye&rziFte*e?d0@^pRypz}5&%tE(;5Ba| zBYT;_Vh#jn#cvS{*L@&G*JTP+geQ%u^z{=Ii;*M|K%?_j#%XcpDIQlQz35_lS6qXUZ zdLWi}n-Snn$LVjy1uSVT2fkb3SAaW|OxWf|o=kHCG(`at23!I)B<%)3?FC~UHV4)` z@{qwl7i*F4@w!+8Txn+|*A*(VNevAVwn-2`uJ9X(tCdy&j6;DdLZc4;YWN}f#ORBo z29yhUmQrJqGj3WaTglLERC4&LY^hmX?Qsa60togweXW!t~}gru=YC1PF|N0Yi#XZ9YSm&EOWz+s{!BT%*Y0iV&L&`=~Xs z7N|FA{vq!nbD8HNNyOx6-hBv-(#;c8%o9dk1dDDy{vHT!eT0pS|0cVA>(_66{8p#< z^47J_i!W?@pIm)hRaGarHcOva*(wwYoAT-^?v*8wY~rKJ8&EeFQt=Yd-e&fesRP)eab?5K1uH1eL|~W z9I?(9tXFm>JCon&On&!(Ve;9Bf30^ey=%tLl8J&fzEkK-%yuTeL%i|NuA1(-#CZNc Dupo5F literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bdd86e340811616945177d4585d019b4609f986 GIT binary patch literal 14871 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

y8gl2egM*lrgkXa_Vq z#(~W7EN!C?tH6F--aRCMOEid_mv;?`7cP+G7xW<66OnM)g+M4uq-x8`nw7+n%?}7W zX@TxNh+`*03j29r1*r~sZgMhpN#D)WRQu+*W#c+$l$CU8cHE)3_Os;#HOYI{i58i~ma0?~>Zhom} z>8&!_>Rm+uy(O-~7UiAjGE^CbR zEx?dABS;`Xdn8&7J8y@yCG6}s&QcJcq0Wo37XAn;?*;(!#|PK=-K+fWGXIpqKULyi z{EN)}@lT&GKmDTe^os@N0Us%b%6y-~_m#N5FQF6e?pWOs5GquE00#${2Vb-``x00n9e^h7l>piSdxXhu_>xRhEZ(V3FTetF&4s=0rL z=sf_gP{7I8^J{$1D&O)b``=h$TIFb*dc%X8$TerOx`pdSLnCUNP@Qs8O2H|Qs8e;P zWD-|_b4S|hORUjJ=!nWq!yzEzlO2awqP?o}qq51VR9dhQe-rM`kkAdBB}&V2?Gr?r zxGZ)sOr2G&}JS6hZx zqUDzTO3VJWmhsh=@p8*CrR5l6ZXp1o>Vfdh?IrJK<3_7cE7T_2P&V*!!yvc_FaNh3 zja$E0_%BmnZ^Hoxo#&Z)o=5Anx_W4MQ0zJiXW2<4EZ!P#6B?CnqKmMo# zfR$J^4W{=<>+jeaemlW&WVTA1rYP8)wX*0&cok zXKZ7IEzlS0;sQjEeBpmd%3e$fqC9vM%$o#g2ON~@MAHQ#Ne!b5k%@!g999zIXcHym zd{^V#)}fSfq?^b{QFSk_@x7~Hd2HLeB9-}lN=;=0$+1n#@?^wRFz)mYoWwBCIyv(L zXND}A*sKbmj&=#QdK%Q960$B`K%u%5Kd4pE`g`;m0Mm(|UNC4(>tww_V=lW^7yNyb zbhWD9x7DKPv}WztwNoR0D>cm%l)5Qdd*L$h#V z$ex(Ftc4Zd$Be4|Mn-^RkDSxYqi*9UD7-F=pDhct z++{9%f=L42S*p%zlWMITG9MNxFmR-f1@W@gkIpJA67;Fsi*v+Caaa$_p~ecr|08sr zZ&4S(qjR9L4#T%K{LW8+Pe6Kdq18-s-BFpvOBR} zL^y~lz!~h6D4W>bsPm7|sEi)P6{y<>6cw1{K01l6464IM+`i2uBSUCshSHW;VvZ$KP z0EZ^*lK9qttq8t^GWuz~e}-md986UaltRzLy>j8k>6@{&mVwolf#q{(hj` zF|KrsS16~egMh;G4+2}3rZuyvaAZB$dUIceVtpO!t?f5l+TVK1CeRkXj-vgJdo8kO zHL_>r)qCexPL(5vmB?XIWWs*X95NH^ejB`%L(eM!o1a&jp9d4y)cWHJuXjZwEv?DK zP6>@3>8l7{L2v;9p*rsRX=gETktI8(((9Nyf}j}zGNgnHmy|<*KB9C9fXc!80LP6r}^B70if`Ryg(yy)=g%IzulX z(VnFd;6}_aL!&M!fFAqdbQ8O4X`s00Hk?6$WDOv$|LSW50eeeO2bL}^+ix!-)<6xI zPzMau=ZYtmPv1F(SkKjf3H7;(+s$rUo?4ObW-1gU>p>g&sEzF}`YRMXYQSg(b2)-W zv%{tKogf74a19uEnCqa~Q9PalkL3_~)B}f;-Lm}JO7iX-Aj2&9g;o$?*znR69^(lw z?;($R;Kj~9yF8)vjMh49N^uVM5QIDL_>>6DD86g}o1lZmsb%>NPz93pz`?L?WHERw z=g6ZTcwH_i?Hlwr6KLN2~d3q z^t%4bCz;5%x@luX5^T`a4ElfSmW|Q$P#A77O79?I8$r~6|1cz8!r#5X4_ai&*q*C? z)4PTs$yJB-- zr~kLWPthYKYLEF|r=BiZ?{(^h(nj|~YG-MqyW)731{Ku^mRw5PcBSo^&#>(C8p1_- W+(v`YZwyPpp3g|p=TAT&g8!c?=~-I< literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..468e84715ddbec55b51f6bb2b703675057ffff2b GIT binary patch literal 12504 zcmbVSdu$u`eZS-TB~cGrq-04x>tS1tM5ngmD2eSPs^!P*x>;;ADeHuzbSH^2AIcqN z*$UODo6#wSi>jG3Yg>yFeIzoPq3%|o{xb=N{Y?rtm^eUyhoQjw&%nUxU=-M}&-Zua z@s5(xcE{uQ?tYK&@AZBEejhe9`8Zsc-W-`0dN}Ss=%aQyt1pkg$#dLYPUJ*B#l`d| zAG5J4|ypw57ahU(A>G$NcF)ERb%BHKm(l&FNq) z$P-?BswLeTYfZPs+Ss=v)t(N;Lg_uRJ?z_=>PUxUVfOAyMbe$IPWJ9jb*1;l_Tt?m zdQ;u$o>))1H`bfp7u%N>VggI|rS_-$VtqVk<0SiBe{GP`zy}!J&+*r<*r4c_4u}Ei z;Iu<*y5)!+vTvTsL%_t%9j<+g{6{TTT)-5N4s_NEaAH8@fwlFP z;{&Aq+(?f-#oA~?8|~7b5A4XpU%z6*B7d113jLNoFAcdg&-t7rCvsU?b6iX+InDFc z`CKxaNu)H-W$CR2DKjN$_RCUEb6#1PPf0^It@%<`PA5{yB}u%LNK0DlR3ekjB&S$X zJcA?@Y8g)`(rF-+lamXCPzzGZMCN)@&Suh5CO5=u&evuoDRqz6e4;cjOH+xQBqBNZ z+PR5|i}8uquS{IJeEzGKeoM1CUHLf`7fAK>-qVeF)&`zOU=1zr3>!boB6p*YaVl%+IwSbJNCZ4R+{7HjD9rM z1SQ!nof-0L9w{R#i^<%q+=6lo$VPK7CFdzq^Cgvd_5B_%hf!Cd6%u~`#_8v;UXc=0vscf(cJ(yqfT-YVDlvKd z>b#ttlcsW4FD56iD#@HQGM|{bmY9*0tMkeEBcKS-Imr4*x=KMulIi)ZoJ%DqkHn?S zbtO7~Q)>myWUndlRPve>XPuP?(Qbq~un4fimHq7x{oR}X?jOcW{t?wbQsH>#o^mj> zy0GPMy8Z0;PJQRp`k|7)U-kE!vszSt??eB#}3oR)3HAAW0mMO@7fS1w@C#OkT5RfH5++BOP(8fExY7-kk`6Po)>v- zyX5(h*S<@hA9*3s4$5oN+T&)nK9kId5M=}4OZ`>IWd+9Rl0f32CW(}&&nMuzGAjw` zL^31HFUa#*MG~^pLT)yx2vezqq6m0F{j`+MLedG-*@cW~MRQOfqE&_kCCl(-GpUa&|H?iT*4mGC4NmiEC_>SP~^UnUW|?k)&QFtMMRv;vkiq2Qlt~M5#OwX|KmJ?v?gGa{GMLAZ=dF@n z*7cML!<_M6FfH*w%R&8_jTBq%g%2)Z@;QP7x_i*hW+c@BA?q+$DMar zN3`t9yYk$e(c|l!%->ebDFstsO?X^ZJUnJ1Z=be(jl0Y9-0eHe@^UQgC+TEiI|!SM zkkDln?3L)HAztnV-laX4uO;W_iIoQxL0n+GFsKYQF|DL|4GpGwYFbTevWPmFhA9&n z$!!3dE0vv@kz~!in21LXkXs(11k${kgD`4M7L!Wz$caVW z-r^-Km@zCuo$iScNyOsPiQWgLpAqBeaB8V{N3u8aM^RV#AAtYFZ-x7vj|=pyzh3em zQ2hs>BfahAK-=n>-?_Lwy=v&d!_eqvX!OC@gTuwpXel(Ih9)YU-;0s}tEacRM>fP# z_c68m*y>j*Hb+zE*4{%Kq0-){x;MJ!S@S&EYVWOZwx-TH*lOvx+x%X0ao_O=O&`DY zFE>gpuc$4r6kA>?w?wE4tM=r{lZq47@I+VkJ$>I(>U~b_eQx!uA#5=o#}ToSsMiaSa;wmSbo{I3`Sb9gGn42ciui{2)AWN zu4ZZgJCQS(1)`zuP*jO~kP)|SDftJ9TUWkB8l-@kav{|;DG3tnN0QLs4QL;@BsYfz zXv~BVJO7H1kf&yo*CkzcQ|(JbcKHN4rMc#zUNSkk10O@qI^oLCB0(ObB5hSYA&G`l zpwPGoPnAL)M1V_?ooJJC{tTs+IRKq1D?V=E(1$Pn_{IBUrT!CY|A`9c^q%8&SPJZ0 zJ-s$k4t5uV1LfyV7F+soKN>u$4nBvMt+w9vT;Yx4=$TU6S+(tKF;KrN{yG{aILhR%R3v(h)$~qz3dWs`dL$XF5~a# zzQiexMVl`BNiXpD{R*27GR7Nz7S%Aaksls9sHYc-+b+pW&n}z0xqJB~_kWFV(FdP+OHoIst zPGN`E3|O*#r?P4AdvY?FO6G170@&3_S;@gj%#29s`P@wdAI1bLFvE;VV~os}#st95 zOX!m0kSr+5 z;DF|M1uqoGK#U276Cw*Ty||Qx>FMMR&5@m#GMWQ(oPz_9lQqvAd@riZw3Dutd?u|# zhMnewGE0dXKdm|0l4-tNLZ-kK=urz+-)m8-x*}72s7$=8U%GAOXQq?BhD-bYz#@N* zCPc*YRIRHvt|fdszkaS198`mYtB!K8{d;eJ=k0fwZ!g!4t@57EyI0@4`u#WWyjkIV z-ct;$P9W-ms&8)w4;O=n$U4xUvHo~7~_F+i!Mf6cL$ z-scTC!I?A^o_I2PWVQIpItl04aElE z2O6=*Muwhq&hWUl>99_CNcLScUW2Bra(CD5b6$$b<9I22R1F^mvA6b=L*3=>Xt6uGvGCDSsrz}g`*})7 zHGs9#;_GHEP^XOd8O^!kVcl5eHZu+5sN zfwa-cA4A$yjIiAU(6v(8bE;^)x080oVfVIgg#|S{yzzP|d|VA5Up=>a?#Wg#q6QCw zO1Gc2JA$+n~cgj-KTnU^gh(+{71SC$~iR`V-%UR60XZEh5E+V3yh8fB~PF zs>Xg1o~76}!tU@r4qHU@VPO(`H;~;?;WY$)u^Cg34;wbPv1JG(6cNuN_KQd}T%vk> zSw{5!I{7bBV+&?9Xb6Gsn*xQ#VSm9h8JFO$P`yNMxQbr)k#u)ON+SvnU#YrjiIAOv zt{PWkp?)QsmIMUN6%;^ZdREFHCQTj)^=BG^Xd0z}6a?9I#zLlnsc}kZjBv3S=G-jp zS1itE;b3JB!he$B0VQ)L4+IfB(qc?wY0jhqH6u%uu%AF5ffT@yt{wW~|u26jL3xPPel!Ugr{MfTAMB0lG^UT)Z24gwY# zCJ+fY#|prQ$Ht-Ju`jEKPqU9*fj+-9wJ;mq>BJ2MTX+^noWvci*kg(|TX#uBKF|FF z&X)YpF4{$h=={j_0gQ;BX~U}~72r@W4Pftz zHtlF%j{+dIeLwTIRdmU5bToP_c^DKoJVbpTRFCdK+b6@4CHh5L=8xg31H5Ge+q*Y9%Z`EpA~xw*aK zbvj)z&zvrpXHFN4GBaQkIt3KQRdYWc{}YnT8_*Iqpz9mNqD{181DQ6LostV%%kF8L z=-hT-#e+Ov@=88)T{9NcW82UlptXAV5F6Gu9EoYFmjrg&kZu+|k^^~OOP)idP3Iun zJoagR(^(YFNe;VG-4Y~!qju3dBNW<0!C?>(2U%45MTAg`!?@xMMNObCql8(YGD)!% zGPP;!^cAQm1v_!Npkwc<BlWf(+NnlrFL@{tBF5BgUr}o;T{FsR+aaU-5H|@LDAE#chfv$MmNu} zZsz%wJ%4;xsbr(oQ5}H%E#SlS{uLf_o0F1)lvU;-I z-m!MW4a+s!5)V)HdNZ8%?q*f$x8Ja#4b0zXN^ zZC4|HYp-r6>%{NYwb(mAq3b=S=t%Ui4Me5}A=zk0QFD>u0RMq@7Ii0r1S>fadN8X! zP60M{oXa?`v9!;;pgR=!N1#xC3832`Tdf17)&pwmfmK&I()|N}g>#X^39x#u9PYXM z_Iqy^#!BH~xDLg@4tF`y`!I57GjeDnQi>c^BXEdqO>mk4)*M?c@C<&MF13uREu+Pj z(Q-%Enos{d3imt=4{e5rHV&1-$JFq#VqoXH(p2jZqcS;xu3P*EniE>|$0ERA^LM#b zei|Daw>+@ak+S`=5?|v+3AX1=B$UTdORF!+j&WJ^Bhd|u*J4(?BH9D~woG1n- zDo(Dc^AUT+7bUoBmDs}J%tr?!SJ?7al9m4)Enz%F^K1lUhTyQ9r07HWiz>OdH1>R{ z`-{f)YZ?SukWW@P>}FR7U>b@r@KAVRQ+S~yoK%IA6(@>(Mg#qvz^WUY=`EqPv+Gw% z!9F$ESM>Dh<7koRsiSWZkO`1P(Cu2Xa5X4&iY+U}xtL_6I`@0sHDp$N9_MJ?5XMJ^vx1Pz*E_0p5+FjP{dYkjQb z9Z=m;jHfrKV#{in{%h_oNdoar^<)cuN3*d65prt xeHELFcNNZUT>j}-z<|8#zQ`VR0Oq#!*9unJdU-JFcCdEjGfMq@hb+dv{|COh@09=m literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py b/project/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py new file mode 100644 index 0000000..593bff2 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py @@ -0,0 +1,55 @@ +import importlib.metadata +from typing import Any, Optional, Protocol, cast + + +class BadMetadata(ValueError): + def __init__(self, dist: importlib.metadata.Distribution, *, reason: str) -> None: + self.dist = dist + self.reason = reason + + def __str__(self) -> str: + return f"Bad metadata in {self.dist} ({self.reason})" + + +class BasePath(Protocol): + """A protocol that various path objects conform. + + This exists because importlib.metadata uses both ``pathlib.Path`` and + ``zipfile.Path``, and we need a common base for type hints (Union does not + work well since ``zipfile.Path`` is too new for our linter setup). + + This does not mean to be exhaustive, but only contains things that present + in both classes *that we need*. + """ + + @property + def name(self) -> str: + raise NotImplementedError() + + @property + def parent(self) -> "BasePath": + raise NotImplementedError() + + +def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]: + """Find the path to the distribution's metadata directory. + + HACK: This relies on importlib.metadata's private ``_path`` attribute. Not + all distributions exist on disk, so importlib.metadata is correct to not + expose the attribute as public. But pip's code base is old and not as clean, + so we do this to avoid having to rewrite too many things. Hopefully we can + eliminate this some day. + """ + return getattr(d, "_path", None) + + +def get_dist_name(dist: importlib.metadata.Distribution) -> str: + """Get the distribution's project name. + + The ``name`` attribute is only available in Python 3.10 or later. We are + targeting exactly that, but Mypy does not know this. + """ + name = cast(Any, dist).name + if not isinstance(name, str): + raise BadMetadata(dist, reason="invalid metadata entry 'name'") + return name diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py b/project/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py new file mode 100644 index 0000000..26370fa --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py @@ -0,0 +1,227 @@ +import email.message +import importlib.metadata +import os +import pathlib +import zipfile +from typing import ( + Collection, + Dict, + Iterable, + Iterator, + Mapping, + Optional, + Sequence, + cast, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import InvalidWheel, UnsupportedWheel +from pip._internal.metadata.base import ( + BaseDistribution, + BaseEntryPoint, + DistributionVersion, + InfoPath, + Wheel, +) +from pip._internal.utils.misc import normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file + +from ._compat import BasePath, get_dist_name + + +class WheelDistribution(importlib.metadata.Distribution): + """An ``importlib.metadata.Distribution`` read from a wheel. + + Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``, + its implementation is too "lazy" for pip's needs (we can't keep the ZipFile + handle open for the entire lifetime of the distribution object). + + This implementation eagerly reads the entire metadata directory into the + memory instead, and operates from that. + """ + + def __init__( + self, + files: Mapping[pathlib.PurePosixPath, bytes], + info_location: pathlib.PurePosixPath, + ) -> None: + self._files = files + self.info_location = info_location + + @classmethod + def from_zipfile( + cls, + zf: zipfile.ZipFile, + name: str, + location: str, + ) -> "WheelDistribution": + info_dir, _ = parse_wheel(zf, name) + paths = ( + (name, pathlib.PurePosixPath(name.split("/", 1)[-1])) + for name in zf.namelist() + if name.startswith(f"{info_dir}/") + ) + files = { + relpath: read_wheel_metadata_file(zf, fullpath) + for fullpath, relpath in paths + } + info_location = pathlib.PurePosixPath(location, info_dir) + return cls(files, info_location) + + def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: + # Only allow iterating through the metadata directory. + if pathlib.PurePosixPath(str(path)) in self._files: + return iter(self._files) + raise FileNotFoundError(path) + + def read_text(self, filename: str) -> Optional[str]: + try: + data = self._files[pathlib.PurePosixPath(filename)] + except KeyError: + return None + try: + text = data.decode("utf-8") + except UnicodeDecodeError as e: + wheel = self.info_location.parent + error = f"Error decoding metadata for {wheel}: {e} in {filename} file" + raise UnsupportedWheel(error) + return text + + +class Distribution(BaseDistribution): + def __init__( + self, + dist: importlib.metadata.Distribution, + info_location: Optional[BasePath], + installed_location: Optional[BasePath], + ) -> None: + self._dist = dist + self._info_location = info_location + self._installed_location = installed_location + + @classmethod + def from_directory(cls, directory: str) -> BaseDistribution: + info_location = pathlib.Path(directory) + dist = importlib.metadata.Distribution.at(info_location) + return cls(dist, info_location, info_location.parent) + + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> BaseDistribution: + # Generate temp dir to contain the metadata file, and write the file contents. + temp_dir = pathlib.Path( + TempDirectory(kind="metadata", globally_managed=True).path + ) + metadata_path = temp_dir / "METADATA" + metadata_path.write_bytes(metadata_contents) + # Construct dist pointing to the newly created directory. + dist = importlib.metadata.Distribution.at(metadata_path.parent) + return cls(dist, metadata_path.parent, None) + + @classmethod + def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: + try: + with wheel.as_zipfile() as zf: + dist = WheelDistribution.from_zipfile(zf, name, wheel.location) + except zipfile.BadZipFile as e: + raise InvalidWheel(wheel.location, name) from e + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") + return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location)) + + @property + def location(self) -> Optional[str]: + if self._info_location is None: + return None + return str(self._info_location.parent) + + @property + def info_location(self) -> Optional[str]: + if self._info_location is None: + return None + return str(self._info_location) + + @property + def installed_location(self) -> Optional[str]: + if self._installed_location is None: + return None + return normalize_path(str(self._installed_location)) + + def _get_dist_name_from_location(self) -> Optional[str]: + """Try to get the name from the metadata directory name. + + This is much faster than reading metadata. + """ + if self._info_location is None: + return None + stem, suffix = os.path.splitext(self._info_location.name) + if suffix not in (".dist-info", ".egg-info"): + return None + return stem.split("-", 1)[0] + + @property + def canonical_name(self) -> NormalizedName: + name = self._get_dist_name_from_location() or get_dist_name(self._dist) + return canonicalize_name(name) + + @property + def version(self) -> DistributionVersion: + return parse_version(self._dist.version) + + def is_file(self, path: InfoPath) -> bool: + return self._dist.read_text(str(path)) is not None + + def iter_distutils_script_names(self) -> Iterator[str]: + # A distutils installation is always "flat" (not in e.g. egg form), so + # if this distribution's info location is NOT a pathlib.Path (but e.g. + # zipfile.Path), it can never contain any distutils scripts. + if not isinstance(self._info_location, pathlib.Path): + return + for child in self._info_location.joinpath("scripts").iterdir(): + yield child.name + + def read_text(self, path: InfoPath) -> str: + content = self._dist.read_text(str(path)) + if content is None: + raise FileNotFoundError(path) + return content + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + # importlib.metadata's EntryPoint structure sasitfies BaseEntryPoint. + return self._dist.entry_points + + def _metadata_impl(self) -> email.message.Message: + # From Python 3.10+, importlib.metadata declares PackageMetadata as the + # return type. This protocol is unfortunately a disaster now and misses + # a ton of fields that we need, including get() and get_payload(). We + # rely on the implementation that the object is actually a Message now, + # until upstream can improve the protocol. (python/cpython#94952) + return cast(email.message.Message, self._dist.metadata) + + def iter_provided_extras(self) -> Iterable[str]: + return self.metadata.get_all("Provides-Extra", []) + + def is_extra_provided(self, extra: str) -> bool: + return any( + canonicalize_name(provided_extra) == canonicalize_name(extra) + for provided_extra in self.metadata.get_all("Provides-Extra", []) + ) + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras] + for req_string in self.metadata.get_all("Requires-Dist", []): + req = Requirement(req_string) + if not req.marker: + yield req + elif not extras and req.marker.evaluate({"extra": ""}): + yield req + elif any(req.marker.evaluate(context) for context in contexts): + yield req diff --git a/project/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py b/project/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py new file mode 100644 index 0000000..048dc55 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py @@ -0,0 +1,189 @@ +import functools +import importlib.metadata +import logging +import os +import pathlib +import sys +import zipfile +import zipimport +from typing import Iterator, List, Optional, Sequence, Set, Tuple + +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name + +from pip._internal.metadata.base import BaseDistribution, BaseEnvironment +from pip._internal.models.wheel import Wheel +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filetypes import WHEEL_EXTENSION + +from ._compat import BadMetadata, BasePath, get_dist_name, get_info_location +from ._dists import Distribution + +logger = logging.getLogger(__name__) + + +def _looks_like_wheel(location: str) -> bool: + if not location.endswith(WHEEL_EXTENSION): + return False + if not os.path.isfile(location): + return False + if not Wheel.wheel_file_re.match(os.path.basename(location)): + return False + return zipfile.is_zipfile(location) + + +class _DistributionFinder: + """Finder to locate distributions. + + The main purpose of this class is to memoize found distributions' names, so + only one distribution is returned for each package name. At lot of pip code + assumes this (because it is setuptools's behavior), and not doing the same + can potentially cause a distribution in lower precedence path to override a + higher precedence one if the caller is not careful. + + Eventually we probably want to make it possible to see lower precedence + installations as well. It's useful feature, after all. + """ + + FoundResult = Tuple[importlib.metadata.Distribution, Optional[BasePath]] + + def __init__(self) -> None: + self._found_names: Set[NormalizedName] = set() + + def _find_impl(self, location: str) -> Iterator[FoundResult]: + """Find distributions in a location.""" + # Skip looking inside a wheel. Since a package inside a wheel is not + # always valid (due to .data directories etc.), its .dist-info entry + # should not be considered an installed distribution. + if _looks_like_wheel(location): + return + # To know exactly where we find a distribution, we have to feed in the + # paths one by one, instead of dumping the list to importlib.metadata. + for dist in importlib.metadata.distributions(path=[location]): + info_location = get_info_location(dist) + try: + raw_name = get_dist_name(dist) + except BadMetadata as e: + logger.warning("Skipping %s due to %s", info_location, e.reason) + continue + normalized_name = canonicalize_name(raw_name) + if normalized_name in self._found_names: + continue + self._found_names.add(normalized_name) + yield dist, info_location + + def find(self, location: str) -> Iterator[BaseDistribution]: + """Find distributions in a location. + + The path can be either a directory, or a ZIP archive. + """ + for dist, info_location in self._find_impl(location): + if info_location is None: + installed_location: Optional[BasePath] = None + else: + installed_location = info_location.parent + yield Distribution(dist, info_location, installed_location) + + def find_linked(self, location: str) -> Iterator[BaseDistribution]: + """Read location in egg-link files and return distributions in there. + + The path should be a directory; otherwise this returns nothing. This + follows how setuptools does this for compatibility. The first non-empty + line in the egg-link is read as a path (resolved against the egg-link's + containing directory if relative). Distributions found at that linked + location are returned. + """ + path = pathlib.Path(location) + if not path.is_dir(): + return + for child in path.iterdir(): + if child.suffix != ".egg-link": + continue + with child.open() as f: + lines = (line.strip() for line in f) + target_rel = next((line for line in lines if line), "") + if not target_rel: + continue + target_location = str(path.joinpath(target_rel)) + for dist, info_location in self._find_impl(target_location): + yield Distribution(dist, info_location, path) + + def _find_eggs_in_dir(self, location: str) -> Iterator[BaseDistribution]: + from pip._vendor.pkg_resources import find_distributions + + from pip._internal.metadata import pkg_resources as legacy + + with os.scandir(location) as it: + for entry in it: + if not entry.name.endswith(".egg"): + continue + for dist in find_distributions(entry.path): + yield legacy.Distribution(dist) + + def _find_eggs_in_zip(self, location: str) -> Iterator[BaseDistribution]: + from pip._vendor.pkg_resources import find_eggs_in_zip + + from pip._internal.metadata import pkg_resources as legacy + + try: + importer = zipimport.zipimporter(location) + except zipimport.ZipImportError: + return + for dist in find_eggs_in_zip(importer, location): + yield legacy.Distribution(dist) + + def find_eggs(self, location: str) -> Iterator[BaseDistribution]: + """Find eggs in a location. + + This actually uses the old *pkg_resources* backend. We likely want to + deprecate this so we can eventually remove the *pkg_resources* + dependency entirely. Before that, this should first emit a deprecation + warning for some versions when using the fallback since importing + *pkg_resources* is slow for those who don't need it. + """ + if os.path.isdir(location): + yield from self._find_eggs_in_dir(location) + if zipfile.is_zipfile(location): + yield from self._find_eggs_in_zip(location) + + +@functools.lru_cache(maxsize=None) # Warn a distribution exactly once. +def _emit_egg_deprecation(location: Optional[str]) -> None: + deprecated( + reason=f"Loading egg at {location} is deprecated.", + replacement="to use pip for package installation.", + gone_in="24.3", + issue=12330, + ) + + +class Environment(BaseEnvironment): + def __init__(self, paths: Sequence[str]) -> None: + self._paths = paths + + @classmethod + def default(cls) -> BaseEnvironment: + return cls(sys.path) + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: + if paths is None: + return cls(sys.path) + return cls(paths) + + def _iter_distributions(self) -> Iterator[BaseDistribution]: + finder = _DistributionFinder() + for location in self._paths: + yield from finder.find(location) + for dist in finder.find_eggs(location): + _emit_egg_deprecation(dist.location) + yield dist + # This must go last because that's how pkg_resources tie-breaks. + yield from finder.find_linked(location) + + def get_distribution(self, name: str) -> Optional[BaseDistribution]: + matches = ( + distribution + for distribution in self.iter_all_distributions() + if distribution.canonical_name == canonicalize_name(name) + ) + return next(matches, None) diff --git a/project/Lib/site-packages/pip/_internal/metadata/pkg_resources.py b/project/Lib/site-packages/pip/_internal/metadata/pkg_resources.py new file mode 100644 index 0000000..bb11e5b --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/metadata/pkg_resources.py @@ -0,0 +1,278 @@ +import email.message +import email.parser +import logging +import os +import zipfile +from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional + +from pip._vendor import pkg_resources +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel +from pip._internal.utils.egg_link import egg_link_path_from_location +from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file + +from .base import ( + BaseDistribution, + BaseEntryPoint, + BaseEnvironment, + DistributionVersion, + InfoPath, + Wheel, +) + +__all__ = ["NAME", "Distribution", "Environment"] + +logger = logging.getLogger(__name__) + +NAME = "pkg_resources" + + +class EntryPoint(NamedTuple): + name: str + value: str + group: str + + +class InMemoryMetadata: + """IMetadataProvider that reads metadata files from a dictionary. + + This also maps metadata decoding exceptions to our internal exception type. + """ + + def __init__(self, metadata: Mapping[str, bytes], wheel_name: str) -> None: + self._metadata = metadata + self._wheel_name = wheel_name + + def has_metadata(self, name: str) -> bool: + return name in self._metadata + + def get_metadata(self, name: str) -> str: + try: + return self._metadata[name].decode() + except UnicodeDecodeError as e: + # Augment the default error with the origin of the file. + raise UnsupportedWheel( + f"Error decoding metadata for {self._wheel_name}: {e} in {name} file" + ) + + def get_metadata_lines(self, name: str) -> Iterable[str]: + return pkg_resources.yield_lines(self.get_metadata(name)) + + def metadata_isdir(self, name: str) -> bool: + return False + + def metadata_listdir(self, name: str) -> List[str]: + return [] + + def run_script(self, script_name: str, namespace: str) -> None: + pass + + +class Distribution(BaseDistribution): + def __init__(self, dist: pkg_resources.Distribution) -> None: + self._dist = dist + + @classmethod + def from_directory(cls, directory: str) -> BaseDistribution: + dist_dir = directory.rstrip(os.sep) + + # Build a PathMetadata object, from path to metadata. :wink: + base_dir, dist_dir_name = os.path.split(dist_dir) + metadata = pkg_resources.PathMetadata(base_dir, dist_dir) + + # Determine the correct Distribution object type. + if dist_dir.endswith(".egg-info"): + dist_cls = pkg_resources.Distribution + dist_name = os.path.splitext(dist_dir_name)[0] + else: + assert dist_dir.endswith(".dist-info") + dist_cls = pkg_resources.DistInfoDistribution + dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0] + + dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata) + return cls(dist) + + @classmethod + def from_metadata_file_contents( + cls, + metadata_contents: bytes, + filename: str, + project_name: str, + ) -> BaseDistribution: + metadata_dict = { + "METADATA": metadata_contents, + } + dist = pkg_resources.DistInfoDistribution( + location=filename, + metadata=InMemoryMetadata(metadata_dict, filename), + project_name=project_name, + ) + return cls(dist) + + @classmethod + def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution: + try: + with wheel.as_zipfile() as zf: + info_dir, _ = parse_wheel(zf, name) + metadata_dict = { + path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path) + for path in zf.namelist() + if path.startswith(f"{info_dir}/") + } + except zipfile.BadZipFile as e: + raise InvalidWheel(wheel.location, name) from e + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") + dist = pkg_resources.DistInfoDistribution( + location=wheel.location, + metadata=InMemoryMetadata(metadata_dict, wheel.location), + project_name=name, + ) + return cls(dist) + + @property + def location(self) -> Optional[str]: + return self._dist.location + + @property + def installed_location(self) -> Optional[str]: + egg_link = egg_link_path_from_location(self.raw_name) + if egg_link: + location = egg_link + elif self.location: + location = self.location + else: + return None + return normalize_path(location) + + @property + def info_location(self) -> Optional[str]: + return self._dist.egg_info + + @property + def installed_by_distutils(self) -> bool: + # A distutils-installed distribution is provided by FileMetadata. This + # provider has a "path" attribute not present anywhere else. Not the + # best introspection logic, but pip has been doing this for a long time. + try: + return bool(self._dist._provider.path) + except AttributeError: + return False + + @property + def canonical_name(self) -> NormalizedName: + return canonicalize_name(self._dist.project_name) + + @property + def version(self) -> DistributionVersion: + return parse_version(self._dist.version) + + def is_file(self, path: InfoPath) -> bool: + return self._dist.has_metadata(str(path)) + + def iter_distutils_script_names(self) -> Iterator[str]: + yield from self._dist.metadata_listdir("scripts") + + def read_text(self, path: InfoPath) -> str: + name = str(path) + if not self._dist.has_metadata(name): + raise FileNotFoundError(name) + content = self._dist.get_metadata(name) + if content is None: + raise NoneMetadataError(self, name) + return content + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + for group, entries in self._dist.get_entry_map().items(): + for name, entry_point in entries.items(): + name, _, value = str(entry_point).partition("=") + yield EntryPoint(name=name.strip(), value=value.strip(), group=group) + + def _metadata_impl(self) -> email.message.Message: + """ + :raises NoneMetadataError: if the distribution reports `has_metadata()` + True but `get_metadata()` returns None. + """ + if isinstance(self._dist, pkg_resources.DistInfoDistribution): + metadata_name = "METADATA" + else: + metadata_name = "PKG-INFO" + try: + metadata = self.read_text(metadata_name) + except FileNotFoundError: + if self.location: + displaying_path = display_path(self.location) + else: + displaying_path = repr(self.location) + logger.warning("No metadata found in %s", displaying_path) + metadata = "" + feed_parser = email.parser.FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + if extras: # pkg_resources raises on invalid extras, so we sanitize. + extras = frozenset(pkg_resources.safe_extra(e) for e in extras) + extras = extras.intersection(self._dist.extras) + return self._dist.requires(extras) + + def iter_provided_extras(self) -> Iterable[str]: + return self._dist.extras + + def is_extra_provided(self, extra: str) -> bool: + return pkg_resources.safe_extra(extra) in self._dist.extras + + +class Environment(BaseEnvironment): + def __init__(self, ws: pkg_resources.WorkingSet) -> None: + self._ws = ws + + @classmethod + def default(cls) -> BaseEnvironment: + return cls(pkg_resources.working_set) + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: + return cls(pkg_resources.WorkingSet(paths)) + + def _iter_distributions(self) -> Iterator[BaseDistribution]: + for dist in self._ws: + yield Distribution(dist) + + def _search_distribution(self, name: str) -> Optional[BaseDistribution]: + """Find a distribution matching the ``name`` in the environment. + + This searches from *all* distributions available in the environment, to + match the behavior of ``pkg_resources.get_distribution()``. + """ + canonical_name = canonicalize_name(name) + for dist in self.iter_all_distributions(): + if dist.canonical_name == canonical_name: + return dist + return None + + def get_distribution(self, name: str) -> Optional[BaseDistribution]: + # Search the distribution by looking through the working set. + dist = self._search_distribution(name) + if dist: + return dist + + # If distribution could not be found, call working_set.require to + # update the working set, and try to find the distribution again. + # This might happen for e.g. when you install a package twice, once + # using setup.py develop and again using setup.py install. Now when + # running pip uninstall twice, the package gets removed from the + # working set in the first uninstall, so we have to populate the + # working set again so that pip knows about it and the packages gets + # picked up and is successfully uninstalled the second time too. + try: + # We didn't pass in any version specifiers, so this can never + # raise pkg_resources.VersionConflict. + self._ws.require(name) + except pkg_resources.DistributionNotFound: + return None + return self._search_distribution(name) diff --git a/project/Lib/site-packages/pip/_internal/models/__init__.py b/project/Lib/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/project/Lib/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/project/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f790bcaa5cfc51ce6893adff3300801d7602117e GIT binary patch literal 271 zcmZ3^%ge<81b%V4Y4$++F^B^Lj8MjBkdo;PDGX5zDU87knoLy|jtT{d$=QkNsR|_- zi6sij`FSOYnR&$ux%nxnImHmcqSS(-)Z)~<5(Oa6EXhnQ*5mTiWW2>5AD@z+93Q`u z;WNmBUm-45F(Ijm$r&*o;V~|WC5cXn#i=nliAiQL1x5K;smUcVKAA}|#hE3kx=>q- zV+t}0^y4%0N>YpR5_9w+*6POtMKVj`R-NcUVv@Y8;&}>`FftnmrW0J3 zW?f>{1s@D`!N-&s(t>Hhjd2b+-^{Kyl50aptKYmg zpKpHeBQy24P)!_YHJfn?f;!`P3()s}LYF?UIVD%B6_}%+ zI=3CK6z!Is9w~dXAbblJQB=SL6%qs&lsT~ICtOg8LN%hoA1okAk}B(KsEmoe+9NEW zS~)?|t7<`yK%-{ZSz880IX_N5rbutiqzIzUUo o7&p*m&*yuAF*t!~$vCzktd0Gynhq literal 0 HcmV?d00001 diff --git a/project/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc b/project/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..444e3cfc688d80e6949ba623debea5322d0ba1b9 GIT binary patch literal 12764 zcmb_iZEO=~o}aNjeve-g6Y>Iyd1=7B1XyU7mjVrh0$t*^kg{DjtudYnad7PHj6;jp z>A4j;Sryt%?~q7$>27p_Uf9wtI_*k)xRv^0Kb%fF$wrp2=7fZ_TAlVjoXo*VRX^SD z|BOBM*reCh-gx|<=Y5`+|MUC5JoAqo9Zn8c_?_*Of9~VBKT@QAxod$ZRujiv=R_{T ziM(h^@)4drO%W4&nj;oG%}HU#8nMpUBDNWO#6IJQIA)v?=Zq`jnsGT;E&sqr zI!v785{1urj{6*c?TUCrYs8Bj)3mRiCfZuc_)Xk#PPAX)M2FP*nHlx*uhs8zaN>aI zlx$K!vQClvKrlAMyKDejg6Vu$1~qjM^_ptGIWBjW>!-{;4e{J-=ET;!Ky)8L?ET<1S z{Vh5Dl3VJN`la4UbE7wrHLUy^lwaFYeywOa!-WR3j^Jy@UJJgkYiID!^!9MbrkY1m zmsQJXBA!w0Co_^9JD-$P`>V5=L^>5qs+RG~vyy5fdNwAj!W${1hXmCznvkV<<_$Ti z_UOU0v1CGwQO#qroR(D^a!#fu)2eGkj!z{nNi1SJ8&_C>AJ2M4)=YFxP7Y5i=~Q<3 zor#STKY43pdnC3!yL0=#?a{ZlPRwuK|E$!|;f?XyEV4(PBcFH>z0OG-c%36Y$JkA> ziw)SU+N04_Y(|PkRcAChlNRTa6n00WKc0&vwVd1B6Ke3Av!nYb#-&(%YU0EXCq`qL z*pZkbO(bLIUznJc)6*FL#Hqyj2_=z{w$H}m7h@MBWnwllyCa%NVJb0yJMaQ2sqAPP z=ImwG6-HL!Es7T;um36*dwx`=3|2zrMYThEZx-*8#At>V!+cS?tlC6rGB%gYs8(6Z z%*m;^1vToI9Rb>2Ph^nmT+Wo^F7dJ{XFkK_5Noi^yd_hgG?dI)a=ejol%9;fO)38u zn9Q8%7o2Fy@u22Ut;TKsA)m8gvMt%&$E8g0QY<+q1t;b7Oi%=W5ktwBgRzttyd=qq z$;-j|xPmmU;cRbkDy9VIQikNNk8SWKx|8C6Q7xu~b}Q6LnjVS7Quv z4-p!n3`pcufptO=5DwBMcT=h*dO^y_>ky=p%6X7HSG99?*TTAdE}yG-y9=I*yQ2`l z`f~o*L)WSWY4PonYirrHwaS?V=R?m>#TzKPU&np7OM8B`R(pazHk-W8ryNL?GdY}9 zE9ds-Pq9TctdkY*W$Sbrf$N-MEw~(JI%ob2>-xFAw)2*pCEsaS6Iu=aQ`0lo!4%GR z2507!3?}xH6pU#rg1tZ^*SK&Hq1M^ypxKGa(vRn`IYoH`ifp1{dqMKt|5&*W|AK#E zY-#tht>oTWcJIs|tJvK6dCbc4hT^6X?Jjwals!j^_9GRSuQqs9NB|8K01X}lDe)%m zV>7{K<0jq%k;PvDw~lh3A@(``+BJ_f#oIhnV%yja^TQcuMl@e!vnd68>rPY%DBOvhtMY*D!ux)fJf=+Cq| z*Tz1j}+wv0_4M&3>;q=4kP3LDI#gb|h8 zd&};<;4zm^-+buXq4jl zSJ@P)){F1Pa5KB2HFu(KsyeVh;jg3&^?@d=-XE=E?ifGJbmO}`u{6&?& zq)_+kzz6msB-Yp~7@bTcA*P}!yuFFH^b#+jra}M#-f|t(?vKY8USH&wf4n?j7%70# zk4;^O$L`KZGYS@a2UToZYoCH^4ufV^y1lHP5gY~lXq^sgZGqN2g^vc z9Mm8a#q`Tj3qAQI0?jf$Vur@&63voDwBRpDf@EoIV9_d?ChejP8l6?LiFV}LC5z-} z);60b$J?!4F zG;&K>{z0jGZ@GK#!$B4;ZhNUTI8q)QsoE?)=VK1!DUm8?aX7V|q%#U$LX*N4VHAN@ zSnB+Oz%ZwaFO!)&yUjJ2GtMa4R2-|m69d=