From cb4a07f1486527fd270ea88ca9a6c3cf3df6f3a2 Mon Sep 17 00:00:00 2001 From: python Date: Sun, 14 Dec 2025 20:12:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BA=86=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E5=85=B3?= =?UTF-8?q?=E8=81=94=E5=85=B3=E7=B3=BB=E5=B7=A5=E5=85=B7=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=AD=A3=E5=B8=B8=E6=98=BE=E7=A4=BA=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=92=8C=E4=BF=AE=E6=94=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 166 +- check_database_tenant_data.py | 140 + check_relations_query.py | 88 + check_specific_template_relations.py | 198 + check_template_all_relations.py | 98 + check_template_with_output_fields.py | 76 + .../document_service.cpython-312.pyc | Bin 25534 -> 42534 bytes .../__pycache__/field_service.cpython-312.pyc | Bin 15895 -> 15665 bytes static/template_field_manager.html | 362 +- test_api_direct.py | 82 + test_api_response.py | 93 + test_field_relations.py | 306 + test_relations_detailed.py | 167 + test_tenant_ids_api.py | 60 + update_template_field_relations_from_docx.py | 456 + .../pip-24.2.dist-info/AUTHORS.txt | 796 - .../pip-24.2.dist-info/INSTALLER | 1 - .../pip-24.2.dist-info/LICENSE.txt | 20 - .../site-packages/pip-24.2.dist-info/METADATA | 89 - .../site-packages/pip-24.2.dist-info/RECORD | 853 - .../pip-24.2.dist-info/REQUESTED | 0 .../site-packages/pip-24.2.dist-info/WHEEL | 5 - .../pip-24.2.dist-info/entry_points.txt | 3 - .../pip-24.2.dist-info/top_level.txt | 1 - venv/Lib/site-packages/pip/__init__.py | 6 +- venv/Lib/site-packages/pip/__pip-runner__.py | 2 +- .../pip/__pycache__/__init__.cpython-312.pyc | Bin 707 -> 671 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 863 -> 863 bytes .../__pip-runner__.cpython-312.pyc | Bin 2227 -> 2227 bytes .../site-packages/pip/_internal/__init__.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 809 -> 773 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14494 -> 18195 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12689 -> 12390 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17654 -> 18260 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 35573 -> 40593 bytes .../__pycache__/main.cpython-312.pyc | Bin 692 -> 656 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 5140 -> 4108 bytes .../self_outdated_check.cpython-312.pyc | Bin 10230 -> 10275 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13637 -> 10709 bytes .../site-packages/pip/_internal/build_env.py | 272 +- venv/Lib/site-packages/pip/_internal/cache.py | 35 +- .../pip/_internal/cli/__init__.py | 3 +- .../cli/__pycache__/__init__.cpython-312.pyc | Bin 300 -> 297 bytes .../autocompletion.cpython-312.pyc | Bin 8628 -> 9119 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10216 -> 10603 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30417 -> 30345 bytes .../command_context.cpython-312.pyc | Bin 1796 -> 1835 bytes .../__pycache__/index_command.cpython-312.pyc | Bin 7146 -> 7219 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2322 -> 2281 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4928 -> 4856 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 15035 -> 14828 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 3856 -> 6089 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 12263 -> 13839 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7855 -> 11270 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 397 -> 397 bytes .../pip/_internal/cli/autocompletion.py | 20 +- .../pip/_internal/cli/base_command.py | 27 +- .../pip/_internal/cli/cmdoptions.py | 205 +- .../pip/_internal/cli/command_context.py | 7 +- .../pip/_internal/cli/index_command.py | 23 +- .../site-packages/pip/_internal/cli/main.py | 8 +- .../pip/_internal/cli/main_parser.py | 10 +- .../site-packages/pip/_internal/cli/parser.py | 46 +- .../pip/_internal/cli/progress_bars.py | 91 +- .../pip/_internal/cli/req_command.py | 108 +- .../pip/_internal/cli/spinners.py | 86 +- .../pip/_internal/commands/__init__.py | 13 +- .../__pycache__/__init__.cpython-312.pyc | Bin 4024 -> 4139 bytes .../__pycache__/cache.cpython-312.pyc | Bin 9723 -> 10184 bytes .../__pycache__/check.cpython-312.pyc | Bin 2614 -> 2578 bytes .../__pycache__/completion.cpython-312.pyc | Bin 5215 -> 5448 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 13185 -> 13349 bytes .../__pycache__/debug.cpython-312.pyc | Bin 10090 -> 9983 bytes .../__pycache__/download.cpython-312.pyc | Bin 7525 -> 7278 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4407 -> 4307 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 2990 -> 2955 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 1695 -> 1660 bytes .../__pycache__/index.cpython-312.pyc | Bin 6693 -> 7277 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 4002 -> 3971 bytes .../__pycache__/install.cpython-312.pyc | Bin 29136 -> 29767 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 15779 -> 17038 bytes .../__pycache__/search.cpython-312.pyc | Bin 7540 -> 7628 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 10499 -> 11210 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4731 -> 4696 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 8887 -> 8369 bytes .../pip/_internal/commands/cache.py | 38 +- .../pip/_internal/commands/check.py | 3 +- .../pip/_internal/commands/completion.py | 19 +- .../pip/_internal/commands/configuration.py | 44 +- .../pip/_internal/commands/debug.py | 14 +- .../pip/_internal/commands/download.py | 16 +- .../pip/_internal/commands/freeze.py | 6 +- .../pip/_internal/commands/hash.py | 3 +- .../pip/_internal/commands/help.py | 3 +- .../pip/_internal/commands/index.py | 56 +- .../pip/_internal/commands/inspect.py | 8 +- .../pip/_internal/commands/install.py | 134 +- .../pip/_internal/commands/list.py | 87 +- .../pip/_internal/commands/search.py | 42 +- .../pip/_internal/commands/show.py | 48 +- .../pip/_internal/commands/uninstall.py | 3 +- .../pip/_internal/commands/wheel.py | 24 +- .../pip/_internal/configuration.py | 69 +- .../__pycache__/__init__.cpython-312.pyc | Bin 963 -> 963 bytes .../__pycache__/base.cpython-312.pyc | Bin 2915 -> 2941 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1722 -> 1791 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8449 -> 8344 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2303 -> 2340 bytes .../pip/_internal/distributions/base.py | 10 +- .../pip/_internal/distributions/installed.py | 12 +- .../pip/_internal/distributions/sdist.py | 60 +- .../pip/_internal/distributions/wheel.py | 10 +- .../site-packages/pip/_internal/exceptions.py | 185 +- .../pip/_internal/index/__init__.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 254 -> 251 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21639 -> 21240 bytes .../package_finder.cpython-312.pyc | Bin 40670 -> 42127 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12610 -> 12329 bytes .../pip/_internal/index/collector.py | 53 +- .../pip/_internal/index/package_finder.py | 223 +- .../pip/_internal/index/sources.py | 36 +- .../pip/_internal/locations/__init__.py | 51 +- .../__pycache__/__init__.cpython-312.pyc | Bin 16462 -> 15333 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 6874 -> 6792 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 8050 -> 7942 bytes .../__pycache__/base.cpython-312.pyc | Bin 3803 -> 3730 bytes .../pip/_internal/locations/_distutils.py | 25 +- .../pip/_internal/locations/_sysconfig.py | 9 +- .../pip/_internal/locations/base.py | 7 +- venv/Lib/site-packages/pip/_internal/main.py | 4 +- .../pip/_internal/metadata/__init__.py | 77 +- .../__pycache__/__init__.cpython-312.pyc | Bin 5891 -> 6783 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2948 -> 2895 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35220 -> 34457 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 16106 -> 15806 bytes .../pip/_internal/metadata/_json.py | 11 +- .../pip/_internal/metadata/base.py | 53 +- .../__pycache__/__init__.cpython-312.pyc | Bin 380 -> 380 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 4513 -> 4259 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 12587 -> 12831 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11101 -> 8029 bytes .../_internal/metadata/importlib/_compat.py | 10 +- .../_internal/metadata/importlib/_dists.py | 44 +- .../pip/_internal/metadata/importlib/_envs.py | 86 +- .../pip/_internal/metadata/pkg_resources.py | 25 +- .../pip/_internal/models/__init__.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 288 -> 285 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1626 -> 1626 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 10866 -> 10525 bytes .../format_control.cpython-312.pyc | Bin 4245 -> 4146 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1716 -> 1716 bytes .../installation_report.cpython-312.pyc | Bin 2299 -> 2312 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 26639 -> 26678 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1045 -> 1045 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5009 -> 4974 bytes .../selection_prefs.cpython-312.pyc | Bin 1873 -> 1900 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4975 -> 4876 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5782 -> 4691 bytes .../pip/_internal/models/direct_url.py | 47 +- .../pip/_internal/models/format_control.py | 10 +- .../_internal/models/installation_report.py | 7 +- .../pip/_internal/models/link.py | 109 +- .../pip/_internal/models/search_scope.py | 13 +- .../pip/_internal/models/selection_prefs.py | 6 +- .../pip/_internal/models/target_python.py | 19 +- .../pip/_internal/models/wheel.py | 47 +- .../pip/_internal/network/__init__.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 276 -> 273 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 22121 -> 21485 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6473 -> 7953 bytes .../__pycache__/download.cpython-312.pyc | Bin 8501 -> 16078 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11629 -> 11584 bytes .../__pycache__/session.cpython-312.pyc | Bin 18896 -> 19220 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2277 -> 2274 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 2971 -> 2952 bytes .../pip/_internal/network/auth.py | 42 +- .../pip/_internal/network/cache.py | 40 +- .../pip/_internal/network/download.py | 295 +- .../pip/_internal/network/lazy_wheel.py | 27 +- .../pip/_internal/network/session.py | 60 +- .../pip/_internal/network/utils.py | 4 +- .../pip/_internal/network/xmlrpc.py | 7 +- .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 219 bytes .../__pycache__/check.cpython-312.pyc | Bin 7126 -> 7179 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10150 -> 10217 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25794 -> 26585 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 225 -> 225 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 7689 -> 7600 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 1879 -> 1874 bytes .../metadata_editable.cpython-312.pyc | Bin 1913 -> 1928 bytes .../metadata_legacy.cpython-312.pyc | Bin 3033 -> 0 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 1699 -> 1740 bytes .../wheel_editable.cpython-312.pyc | Bin 2038 -> 2079 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 3868 -> 0 bytes .../operations/build/build_tracker.py | 18 +- .../_internal/operations/build/metadata.py | 3 +- .../operations/build/metadata_editable.py | 4 +- .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 13 +- .../operations/build/wheel_editable.py | 13 +- .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 50 +- .../pip/_internal/operations/freeze.py | 45 +- .../_internal/operations/install/__init__.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 288 -> 285 bytes .../editable_legacy.cpython-312.pyc | Bin 1820 -> 0 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 34125 -> 34094 bytes .../operations/install/editable_legacy.py | 47 - .../pip/_internal/operations/install/wheel.py | 105 +- .../pip/_internal/operations/prepare.py | 86 +- .../site-packages/pip/_internal/pyproject.py | 78 +- .../pip/_internal/req/__init__.py | 35 +- .../req/__pycache__/__init__.cpython-312.pyc | Bin 3467 -> 4010 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21240 -> 21685 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21454 -> 23769 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38497 -> 34623 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 5505 -> 5454 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32116 -> 31624 bytes .../pip/_internal/req/constructors.py | 132 +- .../pip/_internal/req/req_file.py | 228 +- .../pip/_internal/req/req_install.py | 236 +- .../pip/_internal/req/req_set.py | 9 +- .../pip/_internal/req/req_uninstall.py | 48 +- .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 219 bytes .../__pycache__/base.cpython-312.pyc | Bin 1207 -> 1190 bytes .../pip/_internal/resolution/base.py | 6 +- .../__pycache__/__init__.cpython-312.pyc | Bin 226 -> 226 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 22601 -> 22536 bytes .../_internal/resolution/legacy/resolver.py | 41 +- .../__pycache__/__init__.cpython-312.pyc | Bin 230 -> 230 bytes .../__pycache__/base.cpython-312.pyc | Bin 8171 -> 8005 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 29194 -> 29454 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32308 -> 33806 bytes .../found_candidates.cpython-312.pyc | Bin 6815 -> 6753 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10545 -> 11650 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 5062 -> 5822 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 15378 -> 14780 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12336 -> 12385 bytes .../_internal/resolution/resolvelib/base.py | 29 +- .../resolution/resolvelib/candidates.py | 102 +- .../resolution/resolvelib/factory.py | 142 +- .../resolution/resolvelib/found_candidates.py | 46 +- .../resolution/resolvelib/provider.py | 187 +- .../resolution/resolvelib/reporter.py | 43 +- .../resolution/resolvelib/requirements.py | 14 +- .../resolution/resolvelib/resolver.py | 77 +- .../pip/_internal/self_outdated_check.py | 38 +- .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 214 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4549 -> 4549 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1885 -> 1885 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2429 -> 2474 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2926 -> 3041 bytes .../compatibility_tags.cpython-312.pyc | Bin 5582 -> 6666 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 703 -> 698 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4210 -> 4228 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3555 -> 3558 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3225 -> 3163 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2167 -> 0 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 4012 -> 4074 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7348 -> 7985 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1183 -> 1148 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2438 -> 2369 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7622 -> 7441 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13577 -> 13883 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 33570 -> 32711 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2602 -> 1904 bytes .../utils/__pycache__/retry.cpython-312.pyc | Bin 2127 -> 1991 bytes .../setuptools_build.cpython-312.pyc | Bin 4569 -> 0 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8658 -> 8526 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12043 -> 11928 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 13517 -> 14330 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2096 -> 2100 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4485 -> 4399 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5922 -> 5885 bytes .../pip/_internal/utils/appdirs.py | 6 +- .../pip/_internal/utils/compat.py | 8 +- .../pip/_internal/utils/compatibility_tags.py | 72 +- .../pip/_internal/utils/datetime.py | 3 +- .../pip/_internal/utils/deprecation.py | 20 +- .../pip/_internal/utils/direct_url_helpers.py | 4 +- .../pip/_internal/utils/egg_link.py | 11 +- .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 10 +- .../pip/_internal/utils/filesystem.py | 25 +- .../pip/_internal/utils/filetypes.py | 13 +- .../pip/_internal/utils/glibc.py | 11 +- .../pip/_internal/utils/hashes.py | 15 +- .../pip/_internal/utils/logging.py | 53 +- .../site-packages/pip/_internal/utils/misc.py | 98 +- .../pip/_internal/utils/packaging.py | 23 +- .../pip/_internal/utils/retry.py | 11 +- .../pip/_internal/utils/setuptools_build.py | 146 - .../pip/_internal/utils/subprocess.py | 37 +- .../pip/_internal/utils/temp_dir.py | 22 +- .../pip/_internal/utils/unpacking.py | 41 +- .../site-packages/pip/_internal/utils/urls.py | 2 +- .../pip/_internal/utils/virtualenv.py | 5 +- .../pip/_internal/utils/wheel.py | 10 +- .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 553 -> 553 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5074 -> 5172 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 19039 -> 19930 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7627 -> 7779 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12546 -> 12359 bytes .../versioncontrol.cpython-312.pyc | Bin 29019 -> 28749 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 34 +- .../site-packages/pip/_internal/vcs/git.py | 90 +- .../pip/_internal/vcs/mercurial.py | 45 +- .../pip/_internal/vcs/subversion.py | 43 +- .../pip/_internal/vcs/versioncontrol.py | 107 +- .../pip/_internal/wheel_builder.py | 157 +- .../Lib/site-packages/pip/_vendor/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 4572 -> 4616 bytes .../typing_extensions.cpython-312.pyc | Bin 139474 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 925 -> 925 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 2669 -> 2669 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6487 -> 6734 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3810 -> 3810 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16247 -> 16476 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4370 -> 4370 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 6717 -> 6720 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 5284 -> 5284 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1697 -> 1697 bytes .../pip/_vendor/cachecontrol/adapter.py | 23 +- .../pip/_vendor/cachecontrol/cache.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 458 -> 458 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7786 -> 7057 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2756 -> 2756 bytes .../_vendor/cachecontrol/caches/file_cache.py | 59 +- .../pip/_vendor/cachecontrol/controller.py | 14 +- .../pip/_vendor/cachecontrol/filewrapper.py | 4 +- .../pip/_vendor/cachecontrol/heuristics.py | 5 +- .../pip/_vendor/certifi/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 341 -> 341 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 668 -> 668 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 3234 -> 2105 bytes .../pip/_vendor/certifi/cacert.pem | 752 +- .../site-packages/pip/_vendor/certifi/core.py | 33 +- .../pip/_vendor/distlib/__init__.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1292 -> 1292 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45554 -> 45549 bytes .../__pycache__/database.cpython-312.pyc | Bin 65704 -> 0 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 24339 -> 0 bytes .../__pycache__/locators.cpython-312.pyc | Bin 59953 -> 0 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 15099 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 7701 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 41689 -> 0 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17335 -> 17335 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19792 -> 19780 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88040 -> 88058 bytes .../__pycache__/version.cpython-312.pyc | Bin 30368 -> 0 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 51471 -> 0 bytes .../pip/_vendor/distlib/compat.py | 3 +- .../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/scripts.py | 93 +- .../site-packages/pip/_vendor/distlib/util.py | 123 +- .../pip/_vendor/distlib/version.py | 751 - .../pip/_vendor/distlib/wheel.py | 1099 -- .../__pycache__/__init__.cpython-312.pyc | Bin 983 -> 983 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 315 -> 315 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53815 -> 53815 bytes .../pip/_vendor/idna/__init__.py | 3 +- .../idna/__pycache__/__init__.cpython-312.pyc | Bin 904 -> 909 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4999 -> 4999 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 910 -> 913 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 15814 -> 16144 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 99499 -> 99499 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2656 -> 2656 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 239 -> 240 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158871 -> 158869 bytes .../site-packages/pip/_vendor/idna/codec.py | 58 +- .../site-packages/pip/_vendor/idna/compat.py | 10 +- .../site-packages/pip/_vendor/idna/core.py | 280 +- .../pip/_vendor/idna/idnadata.py | 7076 ++++--- .../pip/_vendor/idna/intranges.py | 11 +- .../pip/_vendor/idna/package_data.py | 3 +- .../pip/_vendor/idna/uts46data.py | 16439 ++++++++-------- .../pip/_vendor/msgpack/__init__.py | 16 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1764 -> 1762 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2048 -> 2048 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8193 -> 8316 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 42066 -> 41513 bytes .../site-packages/pip/_vendor/msgpack/ext.py | 8 +- .../pip/_vendor/msgpack/fallback.py | 82 +- .../pip/_vendor/packaging/__init__.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 581 -> 581 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 4990 -> 5039 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 9708 -> 9729 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 4577 -> 4577 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 14008 -> 14006 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3264 -> 3264 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 7938 -> 7975 bytes .../__pycache__/markers.cpython-312.pyc | Bin 11034 -> 12789 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 24976 -> 27231 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 4433 -> 4433 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 38762 -> 39062 bytes .../__pycache__/tags.cpython-312.pyc | Bin 21367 -> 24696 bytes .../__pycache__/utils.cpython-312.pyc | Bin 7364 -> 6658 bytes .../__pycache__/version.cpython-312.pyc | Bin 19530 -> 20509 bytes .../pip/_vendor/packaging/_elffile.py | 11 +- .../pip/_vendor/packaging/_manylinux.py | 4 +- .../pip/_vendor/packaging/_parser.py | 3 +- .../pip/_vendor/packaging/_tokenizer.py | 9 +- .../pip/_vendor/packaging/markers.py | 93 +- .../pip/_vendor/packaging/metadata.py | 106 +- .../pip/_vendor/packaging/specifiers.py | 30 +- .../pip/_vendor/packaging/tags.py | 146 +- .../pip/_vendor/packaging/utils.py | 85 +- .../pip/_vendor/packaging/version.py | 33 +- .../pip/_vendor/pkg_resources/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 161284 -> 161272 bytes .../pip/_vendor/platformdirs/__init__.py | 64 +- .../__pycache__/__init__.cpython-312.pyc | Bin 19852 -> 19870 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1971 -> 1971 bytes .../__pycache__/android.cpython-312.pyc | Bin 10720 -> 10708 bytes .../__pycache__/api.cpython-312.pyc | Bin 12934 -> 13363 bytes .../__pycache__/macos.cpython-312.pyc | Bin 8030 -> 9026 bytes .../__pycache__/unix.cpython-312.pyc | Bin 15060 -> 14774 bytes .../__pycache__/version.cpython-312.pyc | Bin 620 -> 826 bytes .../__pycache__/windows.cpython-312.pyc | Bin 13697 -> 13697 bytes .../pip/_vendor/platformdirs/android.py | 8 +- .../pip/_vendor/platformdirs/api.py | 11 +- .../pip/_vendor/platformdirs/macos.py | 32 +- .../pip/_vendor/platformdirs/unix.py | 11 +- .../pip/_vendor/platformdirs/version.py | 26 +- .../pip/_vendor/pygments/__init__.py | 4 +- .../pip/_vendor/pygments/__main__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 3512 -> 3512 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 758 -> 758 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26608 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 2652 -> 2652 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3245 -> 3245 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4744 -> 4744 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38385 -> 38385 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1583 -> 1583 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 2632 -> 2632 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4101 -> 4101 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4780 -> 4780 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 12122 -> 12122 bytes .../__pycache__/style.cpython-312.pyc | Bin 6717 -> 6717 bytes .../__pycache__/token.cpython-312.pyc | Bin 8213 -> 8213 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 32996 -> 32996 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 14093 -> 14093 bytes .../pip/_vendor/pygments/cmdline.py | 668 - .../pip/_vendor/pygments/console.py | 2 +- .../pip/_vendor/pygments/filter.py | 2 +- .../pip/_vendor/pygments/filters/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 37935 -> 37935 bytes .../pip/_vendor/pygments/formatter.py | 2 +- .../_vendor/pygments/formatters/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 6926 -> 6926 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4239 -> 4239 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4246 -> 0 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7317 -> 0 bytes .../__pycache__/html.cpython-312.pyc | Bin 41050 -> 0 bytes .../__pycache__/img.cpython-312.pyc | Bin 28572 -> 0 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6079 -> 0 bytes .../__pycache__/latex.cpython-312.pyc | Bin 20149 -> 0 bytes .../__pycache__/other.cpython-312.pyc | Bin 6901 -> 0 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2982 -> 0 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 13797 -> 0 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9163 -> 0 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5843 -> 0 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15142 -> 0 bytes .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 987 - .../pip/_vendor/pygments/formatters/img.py | 685 - .../pip/_vendor/pygments/formatters/irc.py | 154 - .../pip/_vendor/pygments/formatters/latex.py | 518 - .../pip/_vendor/pygments/formatters/other.py | 160 - .../pygments/formatters/pangomarkup.py | 83 - .../pip/_vendor/pygments/formatters/rtf.py | 349 - .../pip/_vendor/pygments/formatters/svg.py | 185 - .../_vendor/pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../pip/_vendor/pygments/lexer.py | 2 +- .../pip/_vendor/pygments/lexers/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 14645 -> 14645 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 68287 -> 69868 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42991 -> 42996 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 19 +- .../pip/_vendor/pygments/lexers/python.py | 51 +- .../pip/_vendor/pygments/modeline.py | 2 +- .../pip/_vendor/pygments/plugin.py | 2 +- .../pip/_vendor/pygments/regexopt.py | 2 +- .../pip/_vendor/pygments/scanner.py | 2 +- .../pip/_vendor/pygments/sphinxext.py | 2 +- .../pip/_vendor/pygments/style.py | 2 +- .../pip/_vendor/pygments/styles/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 2688 -> 2688 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 3672 -> 3672 bytes .../pip/_vendor/pygments/token.py | 2 +- .../pip/_vendor/pygments/unistring.py | 2 +- .../pip/_vendor/pygments/util.py | 2 +- .../pip/_vendor/pyproject_hooks/__init__.py | 26 +- .../__pycache__/__init__.cpython-312.pyc | Bin 637 -> 771 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 398 -> 0 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14717 -> 18070 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 - .../pip/_vendor/pyproject_hooks/_impl.py | 276 +- .../pyproject_hooks/_in_process/__init__.py | 7 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1104 -> 1100 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 14377 -> 15338 bytes .../_in_process/_in_process.py | 194 +- .../__pycache__/__init__.cpython-312.pyc | Bin 5277 -> 5277 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 608 -> 608 bytes .../_internal_utils.cpython-312.pyc | Bin 2048 -> 2048 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 28455 -> 27890 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7215 -> 7215 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13945 -> 13945 bytes .../__pycache__/certs.cpython-312.pyc | Bin 946 -> 702 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1701 -> 2009 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25222 -> 25222 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7622 -> 7622 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4252 -> 4252 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1075 -> 1075 bytes .../__pycache__/models.cpython-312.pyc | Bin 35452 -> 35547 bytes .../__pycache__/packages.cpython-312.pyc | Bin 1290 -> 1290 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27870 -> 27878 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 6047 -> 6047 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5647 -> 5647 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36390 -> 36138 bytes .../pip/_vendor/requests/__version__.py | 4 +- .../pip/_vendor/requests/adapters.py | 57 +- .../pip/_vendor/requests/certs.py | 9 +- .../pip/_vendor/requests/compat.py | 12 + .../pip/_vendor/requests/models.py | 4 +- .../pip/_vendor/requests/sessions.py | 2 +- .../pip/_vendor/requests/utils.py | 22 +- .../pip/_vendor/resolvelib/__init__.py | 9 +- .../__pycache__/__init__.cpython-312.pyc | Bin 658 -> 658 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6875 -> 10149 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2678 -> 3313 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25904 -> 0 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10524 -> 12468 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 0 bytes .../collections_abc.cpython-312.pyc | Bin 444 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 147 +- .../pip/_vendor/resolvelib/reporters.py | 32 +- .../pip/_vendor/resolvelib/resolvers.py | 547 - .../pip/_vendor/resolvelib/structs.py | 141 +- .../pip/_vendor/rich/__main__.py | 52 +- .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7039 -> 7039 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10316 -> 9562 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7896 -> 7896 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 206000 -> 206000 bytes .../_emoji_replace.cpython-312.pyc | Bin 1753 -> 1753 bytes .../_export_format.cpython-312.pyc | Bin 2373 -> 2373 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 561 -> 561 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 879 -> 879 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12097 -> 12047 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4171 -> 4171 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1894 -> 1894 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3644 -> 3653 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5184 -> 5184 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 745 -> 745 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6594 -> 6447 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13203 -> 13203 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 989 -> 989 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 889 -> 889 bytes .../_win32_console.cpython-312.pyc | Bin 29000 -> 28835 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2514 -> 2514 bytes .../_windows_renderer.cpython-312.pyc | Bin 3587 -> 3587 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 3350 -> 3350 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1632 -> 1632 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12311 -> 12268 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9090 -> 9105 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4296 -> 4296 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11862 -> 11715 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5834 -> 5584 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26593 -> 26576 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1725 -> 1725 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8608 -> 8608 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113460 -> 115066 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2282 -> 2282 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9234 -> 9234 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10965 -> 10820 bytes .../default_styles.cpython-312.pyc | Bin 10390 -> 10545 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1512 -> 1545 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4236 -> 4105 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1869 -> 1869 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3595 -> 3595 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3096 -> 3071 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9911 -> 9912 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6059 -> 6059 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5232 -> 5232 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20182 -> 20182 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19033 -> 20017 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4913 -> 4769 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13578 -> 14098 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9591 -> 9591 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6402 -> 6402 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7148 -> 6957 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1835 -> 1835 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5321 -> 5321 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12207 -> 12748 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40171 -> 40635 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 74959 -> 74963 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10401 -> 10401 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 14811 -> 16029 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1816 -> 1816 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 591 -> 591 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6637 -> 6637 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6592 -> 6592 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3849 -> 3849 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2503 -> 2503 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28139 -> 28561 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6088 -> 5947 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6085 -> 6085 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33524 -> 33441 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2163 -> 2163 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39972 -> 40987 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43563 -> 43861 bytes .../terminal_theme.cpython-312.pyc | Bin 3372 -> 3372 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 60873 -> 61234 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6359 -> 6351 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 338 -> 338 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31535 -> 36197 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11460 -> 11817 bytes .../pip/_vendor/rich/_inspect.py | 4 +- .../pip/_vendor/rich/_null_file.py | 2 +- .../site-packages/pip/_vendor/rich/_ratio.py | 8 +- .../pip/_vendor/rich/_win32_console.py | 7 +- .../site-packages/pip/_vendor/rich/align.py | 9 +- .../site-packages/pip/_vendor/rich/ansi.py | 1 + .../Lib/site-packages/pip/_vendor/rich/box.py | 8 +- .../site-packages/pip/_vendor/rich/cells.py | 53 +- .../site-packages/pip/_vendor/rich/color.py | 4 +- .../site-packages/pip/_vendor/rich/console.py | 155 +- .../site-packages/pip/_vendor/rich/control.py | 8 +- .../pip/_vendor/rich/default_styles.py | 5 +- .../pip/_vendor/rich/diagnose.py | 14 +- .../site-packages/pip/_vendor/rich/emoji.py | 7 +- .../pip/_vendor/rich/filesize.py | 3 +- .../pip/_vendor/rich/highlighter.py | 2 +- .../site-packages/pip/_vendor/rich/live.py | 41 +- .../pip/_vendor/rich/live_render.py | 8 +- .../site-packages/pip/_vendor/rich/logging.py | 8 + .../site-packages/pip/_vendor/rich/padding.py | 10 +- .../site-packages/pip/_vendor/rich/panel.py | 13 +- .../site-packages/pip/_vendor/rich/pretty.py | 71 +- .../pip/_vendor/rich/progress.py | 54 +- .../pip/_vendor/rich/progress_bar.py | 2 +- .../site-packages/pip/_vendor/rich/prompt.py | 31 +- .../site-packages/pip/_vendor/rich/segment.py | 52 +- .../site-packages/pip/_vendor/rich/spinner.py | 21 +- .../site-packages/pip/_vendor/rich/style.py | 22 +- .../site-packages/pip/_vendor/rich/syntax.py | 53 +- .../site-packages/pip/_vendor/rich/table.py | 24 +- .../site-packages/pip/_vendor/rich/text.py | 16 +- .../site-packages/pip/_vendor/rich/theme.py | 4 +- .../pip/_vendor/rich/traceback.py | 302 +- .../site-packages/pip/_vendor/rich/tree.py | 24 +- .../pip/_vendor/tomli/__init__.py | 5 +- .../__pycache__/__init__.cpython-312.pyc | Bin 408 -> 362 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26923 -> 29437 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3932 -> 4100 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 390 -> 390 bytes .../pip/_vendor/tomli/_parser.py | 274 +- .../site-packages/pip/_vendor/tomli/_re.py | 26 +- .../pip/_vendor/truststore/__init__.py | 25 +- .../__pycache__/__init__.cpython-312.pyc | Bin 642 -> 1476 bytes .../__pycache__/_api.cpython-312.pyc | Bin 16564 -> 17556 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 16596 -> 19011 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 2229 -> 2280 bytes .../_ssl_constants.cpython-312.pyc | Bin 1123 -> 1123 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 15764 -> 15789 bytes .../pip/_vendor/truststore/_api.py | 44 +- .../pip/_vendor/truststore/_macos.py | 200 +- .../pip/_vendor/truststore/_openssl.py | 4 +- .../pip/_vendor/truststore/_windows.py | 7 +- .../pip/_vendor/typing_extensions.py | 3641 ---- .../__pycache__/__init__.cpython-312.pyc | Bin 3429 -> 3429 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 16388 -> 16388 bytes .../__pycache__/_version.cpython-312.pyc | Bin 242 -> 242 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20427 -> 20427 bytes .../connectionpool.cpython-312.pyc | Bin 36461 -> 36562 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13517 -> 13517 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10426 -> 10426 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4036 -> 4036 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20453 -> 20453 bytes .../__pycache__/request.cpython-312.pyc | Bin 7318 -> 7318 bytes .../__pycache__/response.cpython-312.pyc | Bin 33967 -> 33967 bytes .../pip/_vendor/urllib3/_version.py | 2 +- .../pip/_vendor/urllib3/connection.py | 4 +- .../pip/_vendor/urllib3/connectionpool.py | 7 +- .../__pycache__/__init__.cpython-312.pyc | Bin 222 -> 222 bytes .../_appengine_environ.cpython-312.pyc | Bin 1872 -> 1872 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 11588 -> 11588 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 5738 -> 5738 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 24472 -> 24472 bytes .../securetransport.cpython-312.pyc | Bin 35525 -> 35525 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7535 -> 7535 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 239 -> 239 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 17451 -> 17451 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 14787 -> 14787 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 223 -> 223 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41279 -> 41279 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 233 -> 233 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 1849 -> 1849 bytes .../weakref_finalize.cpython-312.pyc | Bin 7360 -> 7360 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 1170 -> 1170 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4771 -> 4771 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1576 -> 1576 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1376 -> 1376 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4207 -> 4207 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 3016 -> 3016 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21725 -> 21746 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15108 -> 15388 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5075 -> 5075 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10777 -> 10777 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11163 -> 11163 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15809 -> 15809 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4427 -> 4427 bytes .../pip/_vendor/urllib3/util/retry.py | 4 +- .../pip/_vendor/urllib3/util/ssl_.py | 17 +- venv/Lib/site-packages/pip/_vendor/vendor.txt | 33 +- venv/Scripts/pip.exe | Bin 108442 -> 108442 bytes venv/Scripts/pip3.12.exe | Bin 108442 -> 108442 bytes venv/Scripts/pip3.exe | Bin 108442 -> 108442 bytes verify_template_relations.py | 86 + verify_updated_relations.py | 120 + 730 files changed, 20762 insertions(+), 33991 deletions(-) create mode 100644 check_database_tenant_data.py create mode 100644 check_relations_query.py create mode 100644 check_specific_template_relations.py create mode 100644 check_template_all_relations.py create mode 100644 check_template_with_output_fields.py create mode 100644 test_api_direct.py create mode 100644 test_api_response.py create mode 100644 test_field_relations.py create mode 100644 test_relations_detailed.py create mode 100644 test_tenant_ids_api.py create mode 100644 update_template_field_relations_from_docx.py delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/AUTHORS.txt delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/INSTALLER delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/LICENSE.txt delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/METADATA delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/RECORD delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/WHEEL delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/entry_points.txt delete mode 100644 venv/Lib/site-packages/pip-24.2.dist-info/top_level.txt delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/encoding.py delete mode 100644 venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/database.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/index.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/version.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 venv/Lib/site-packages/pip/_vendor/typing_extensions.py create mode 100644 verify_template_relations.py create mode 100644 verify_updated_relations.py diff --git a/app.py b/app.py index 575add9..95dec91 100644 --- a/app.py +++ b/app.py @@ -21,6 +21,54 @@ from utils.response import success_response, error_response # 加载环境变量 load_dotenv() + +def clean_query_result(data): + """ + 清理查询结果,将 bytes 类型转换为字符串 + 用于处理数据库查询结果中的 BLOB 等字段 + 支持处理:bytes, datetime, Decimal, 以及其他不可序列化的类型 + """ + if isinstance(data, bytes): + # 如果是单个字节(如 TINYINT(1) 的 state 字段),转换为整数 + if len(data) == 1: + return int.from_bytes(data, byteorder='big') + # 如果是多个字节(如字符串),解码为 UTF-8 + try: + return data.decode('utf-8') + except UnicodeDecodeError: + return data.decode('utf-8', errors='ignore') + elif isinstance(data, dict): + return {key: clean_query_result(value) for key, value in data.items()} + elif isinstance(data, list): + return [clean_query_result(item) for item in data] + elif isinstance(data, datetime): + return data.isoformat() + elif isinstance(data, (int, float, str, bool, type(None))): + # 保持原始类型,但确保数字类型不会被意外转换 + return data + elif hasattr(data, '__int__'): + # 处理 Decimal 等数值类型,转换为 int 或 float + try: + if isinstance(data, float) or (hasattr(data, 'as_tuple') and data.as_tuple()[2] < 0): + return float(data) + else: + return int(data) + except: + return str(data) + else: + # 对于其他类型(如 Decimal, date, time 等),尝试转换为字符串或 JSON 兼容类型 + try: + # 尝试使用 JSON 默认处理 + import json + json.dumps(data, default=str) # 测试是否可以序列化 + return data + except (TypeError, ValueError): + # 如果无法序列化,转换为字符串 + try: + return str(data) + except: + return None + app = Flask(__name__) CORS(app) # 允许跨域请求 @@ -857,20 +905,27 @@ def get_tenant_ids(): """ 获取数据库中所有已存在的 tenant_id 用于模板字段关联管理页面选择租户 + 从三个表中查询所有不同的 tenant_id(字段表、模板表、关联表) """ try: conn = document_service.get_connection() cursor = conn.cursor(pymysql.cursors.DictCursor) try: - # 从 f_polic_file_config 表中获取所有不同的 tenant_id + # 从三个表中获取所有不同的 tenant_id(合并去重) cursor.execute(""" SELECT DISTINCT tenant_id - FROM f_polic_file_config - WHERE tenant_id IS NOT NULL + FROM ( + SELECT tenant_id FROM f_polic_field WHERE tenant_id IS NOT NULL + UNION + SELECT tenant_id FROM f_polic_file_config WHERE tenant_id IS NOT NULL + UNION + SELECT tenant_id FROM f_polic_file_field WHERE tenant_id IS NOT NULL + ) AS all_tenants ORDER BY tenant_id """) - tenant_ids = [row['tenant_id'] for row in cursor.fetchall()] + # 将 tenant_id 转换为字符串,避免 JavaScript 大整数精度问题 + tenant_ids = [str(row['tenant_id']) for row in cursor.fetchall()] return success_response({'tenant_ids': tenant_ids}) @@ -911,43 +966,81 @@ def get_template_field_relations(): WHERE tenant_id = %s AND state = 1 ORDER BY name """, (tenant_id,)) - templates = cursor.fetchall() + templates = cursor.fetchall() or [] + templates = [clean_query_result(t) for t in templates] # 获取指定 tenant_id 下所有启用的输入字段 + # 注意:这里查询的是 state=1 的字段,但为了字段管理页面能显示所有字段的状态,应该查询所有字段 cursor.execute(""" - SELECT id, name, filed_code, field_type + SELECT id, name, filed_code, field_type, state FROM f_polic_field - WHERE tenant_id = %s AND field_type = 1 AND state = 1 + WHERE tenant_id = %s AND field_type = 1 ORDER BY name """, (tenant_id,)) - input_fields = cursor.fetchall() + input_fields = cursor.fetchall() or [] + input_fields = [clean_query_result(f) for f in input_fields] + # 确保 state 字段是整数类型(虽然这里查询的是 state=1,但为了统一处理) + for field in input_fields: + if 'state' in field: + try: + field['state'] = int(field['state']) + except (ValueError, TypeError): + field['state'] = 1 # 获取指定 tenant_id 下所有启用的输出字段 + # 注意:这里查询的是 state=1 的字段,但为了字段管理页面能显示所有字段的状态,应该查询所有字段 cursor.execute(""" - SELECT id, name, filed_code, field_type + SELECT id, name, filed_code, field_type, state FROM f_polic_field - WHERE tenant_id = %s AND field_type = 2 AND state = 1 + WHERE tenant_id = %s AND field_type = 2 ORDER BY name """, (tenant_id,)) - output_fields = cursor.fetchall() + output_fields = cursor.fetchall() or [] + output_fields = [clean_query_result(f) for f in output_fields] + # 确保 state 字段是整数类型 + for field in output_fields: + if 'state' in field: + try: + field['state'] = int(field['state']) + except (ValueError, TypeError): + field['state'] = 1 # 获取指定 tenant_id 下现有的关联关系 + # 关联关系:f_polic_file_field.file_id -> f_polic_file_config.id + # f_polic_file_field.filed_id -> f_polic_field.id + # 注意:只查询关联关系表中 state=1 的记录,不检查模板的 state + # 因为模板可能被禁用,但关联关系仍然有效 cursor.execute(""" SELECT fff.file_id, fff.filed_id FROM f_polic_file_field fff - INNER JOIN f_polic_file_config fc ON fff.file_id = fc.id WHERE fff.tenant_id = %s AND fff.state = 1 """, (tenant_id,)) - relations = cursor.fetchall() + relations = cursor.fetchall() or [] + relations = [clean_query_result(r) for r in relations] # 构建关联关系映射 (file_id -> list of filed_id) + # 注意:JSON 序列化时,字典的整数 key 会变成字符串 + # 所以这里使用字符串 key,前端需要处理类型转换 relation_map = {} for rel in relations: file_id = rel['file_id'] filed_id = rel['filed_id'] - if file_id not in relation_map: - relation_map[file_id] = [] - relation_map[file_id].append(filed_id) + # 确保 ID 是整数类型 + try: + file_id = int(file_id) + filed_id = int(filed_id) + except (ValueError, TypeError): + continue # 跳过无效的关联关系 + + # 使用字符串 key,因为 JSON 序列化会将数字 key 转为字符串 + file_id_str = str(file_id) + if file_id_str not in relation_map: + relation_map[file_id_str] = [] + relation_map[file_id_str].append(filed_id) + + # 确保 relation_map 的 key 是整数类型(JSON 序列化时 key 会变成字符串) + # 但为了前端能正确匹配,我们保持 key 为整数类型 + # JSON 会自动将数字 key 转换为字符串,所以前端需要处理这种情况 return success_response({ 'tenant_id': tenant_id, @@ -1072,10 +1165,10 @@ def save_template_field_relations(): # 字段管理 API -@app.route('/api/fields', methods=['GET']) -def get_fields(): +@app.route('/api/field-management/fields', methods=['GET']) +def get_field_management_fields(): """ - 获取字段列表 + 获取字段列表(用于字段管理页面) 查询参数: tenant_id (必填), field_type (可选: 1=输入字段, 2=输出字段) """ try: @@ -1114,6 +1207,16 @@ def get_fields(): """, (tenant_id,)) fields = cursor.fetchall() + # 清理查询结果,将 bytes 类型转换为字符串 + fields = [clean_query_result(field) for field in fields] if fields else [] + # 确保 state 字段是整数类型(数据库可能返回 Decimal 或其他类型) + for field in fields: + if 'state' in field: + try: + field['state'] = int(field['state']) + except (ValueError, TypeError): + field['state'] = 1 # 默认启用 + # 即使没有数据也返回空数组,而不是错误 return success_response({'fields': fields}) finally: @@ -1124,7 +1227,7 @@ def get_fields(): return error_response(500, f"获取字段列表失败: {str(e)}") -@app.route('/api/fields', methods=['POST']) +@app.route('/api/field-management/fields', methods=['POST']) def create_field(): """ 创建新字段 @@ -1196,7 +1299,7 @@ def create_field(): return error_response(500, f"创建字段失败: {str(e)}") -@app.route('/api/fields/', methods=['PUT']) +@app.route('/api/field-management/fields/', methods=['PUT']) def update_field(field_id): """ 更新字段 @@ -1301,7 +1404,7 @@ def update_field(field_id): return error_response(500, f"更新字段失败: {str(e)}") -@app.route('/api/fields/', methods=['DELETE']) +@app.route('/api/field-management/fields/', methods=['DELETE']) def delete_field(field_id): """ 删除字段(软删除,将 state 设置为 0) @@ -1395,15 +1498,22 @@ def backup_database(): else: cursor.execute(f"SELECT * FROM {table}") - backup_data[table] = cursor.fetchall() + rows = cursor.fetchall() + # 清理查询结果,将 bytes 类型转换为字符串 + backup_data[table] = [clean_query_result(row) for row in rows] if rows else [] # 创建临时文件保存备份数据 + # 确保所有数据都已清理,可以 JSON 序列化 temp_file = tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False, encoding='utf-8') - json.dump({ - 'backup_time': datetime.now().isoformat(), - 'tenant_id': tenant_id, - 'tables': backup_data - }, temp_file, ensure_ascii=False, indent=2, default=str) + try: + json.dump({ + 'backup_time': datetime.now().isoformat(), + 'tenant_id': tenant_id, + 'tables': backup_data + }, temp_file, ensure_ascii=False, indent=2, default=str) + except (TypeError, ValueError) as e: + temp_file.close() + return error_response(500, f"备份数据序列化失败: {str(e)}") temp_file.close() return send_file( diff --git a/check_database_tenant_data.py b/check_database_tenant_data.py new file mode 100644 index 0000000..81742ae --- /dev/null +++ b/check_database_tenant_data.py @@ -0,0 +1,140 @@ +""" +检查数据库中的实际数据,查看有哪些 tenant_id 以及对应的数据量 +""" +import pymysql +import os +from dotenv import load_dotenv + +load_dotenv() + +# 数据库连接配置 +DB_CONFIG = { + 'host': os.getenv('DB_HOST', '152.136.177.240'), + 'port': int(os.getenv('DB_PORT', 5012)), + 'user': os.getenv('DB_USER', 'finyx'), + 'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'), + 'database': os.getenv('DB_NAME', 'finyx'), + 'charset': 'utf8mb4' +} + +def check_tenant_data(): + """检查各个表中的 tenant_id 数据""" + conn = pymysql.connect(**DB_CONFIG) + cursor = conn.cursor(pymysql.cursors.DictCursor) + + try: + print("=" * 80) + print("检查数据库中的 tenant_id 数据") + print("=" * 80) + + # 1. 检查 f_polic_field 表中的 tenant_id + print("\n1. f_polic_field 表中的 tenant_id 分布:") + cursor.execute(""" + SELECT tenant_id, + COUNT(*) as total_count, + SUM(CASE WHEN field_type = 1 THEN 1 ELSE 0 END) as input_count, + SUM(CASE WHEN field_type = 2 THEN 1 ELSE 0 END) as output_count, + SUM(CASE WHEN state = 1 THEN 1 ELSE 0 END) as enabled_count + FROM f_polic_field + GROUP BY tenant_id + ORDER BY tenant_id + """) + field_tenants = cursor.fetchall() + for row in field_tenants: + print(f" tenant_id: {row['tenant_id']}") + print(f" 总字段数: {row['total_count']}, 输入字段: {row['input_count']}, 输出字段: {row['output_count']}, 启用: {row['enabled_count']}") + + # 2. 检查 f_polic_file_config 表中的 tenant_id + print("\n2. f_polic_file_config 表中的 tenant_id 分布:") + cursor.execute(""" + SELECT tenant_id, + COUNT(*) as total_count, + SUM(CASE WHEN state = 1 THEN 1 ELSE 0 END) as enabled_count + FROM f_polic_file_config + GROUP BY tenant_id + ORDER BY tenant_id + """) + config_tenants = cursor.fetchall() + for row in config_tenants: + print(f" tenant_id: {row['tenant_id']}") + print(f" 总模板数: {row['total_count']}, 启用: {row['enabled_count']}") + + # 3. 检查 f_polic_file_field 表中的 tenant_id + print("\n3. f_polic_file_field 表中的 tenant_id 分布:") + cursor.execute(""" + SELECT tenant_id, + COUNT(*) as total_count, + SUM(CASE WHEN state = 1 THEN 1 ELSE 0 END) as enabled_count + FROM f_polic_file_field + GROUP BY tenant_id + ORDER BY tenant_id + """) + relation_tenants = cursor.fetchall() + for row in relation_tenants: + print(f" tenant_id: {row['tenant_id']}") + print(f" 总关联数: {row['total_count']}, 启用: {row['enabled_count']}") + + # 4. 检查特定 tenant_id 的详细数据 + test_tenant_id = 615873064429507600 + print(f"\n4. 检查 tenant_id = {test_tenant_id} 的详细数据:") + + # 字段数据 + cursor.execute(""" + SELECT COUNT(*) as count + FROM f_polic_field + WHERE tenant_id = %s + """, (test_tenant_id,)) + field_count = cursor.fetchone()['count'] + print(f" f_polic_field 表中的字段数: {field_count}") + + if field_count > 0: + cursor.execute(""" + SELECT id, name, filed_code, field_type, state + FROM f_polic_field + WHERE tenant_id = %s + LIMIT 10 + """, (test_tenant_id,)) + sample_fields = cursor.fetchall() + print(f" 示例字段(前10条):") + for field in sample_fields: + print(f" ID: {field['id']}, 名称: {field['name']}, 编码: {field['filed_code']}, 类型: {field['field_type']}, 状态: {field['state']}") + + # 模板数据 + cursor.execute(""" + SELECT COUNT(*) as count + FROM f_polic_file_config + WHERE tenant_id = %s + """, (test_tenant_id,)) + template_count = cursor.fetchone()['count'] + print(f" f_polic_file_config 表中的模板数: {template_count}") + + # 关联数据 + cursor.execute(""" + SELECT COUNT(*) as count + FROM f_polic_file_field + WHERE tenant_id = %s + """, (test_tenant_id,)) + relation_count = cursor.fetchone()['count'] + print(f" f_polic_file_field 表中的关联数: {relation_count}") + + # 5. 检查所有不同的 tenant_id + print("\n5. 所有表中出现的 tenant_id 汇总:") + cursor.execute(""" + SELECT DISTINCT tenant_id FROM f_polic_field + UNION + SELECT DISTINCT tenant_id FROM f_polic_file_config + UNION + SELECT DISTINCT tenant_id FROM f_polic_file_field + ORDER BY tenant_id + """) + all_tenants = cursor.fetchall() + print(" 所有 tenant_id 列表:") + for row in all_tenants: + print(f" {row['tenant_id']}") + + finally: + cursor.close() + conn.close() + +if __name__ == '__main__': + check_tenant_data() diff --git a/check_relations_query.py b/check_relations_query.py new file mode 100644 index 0000000..93b6800 --- /dev/null +++ b/check_relations_query.py @@ -0,0 +1,88 @@ +""" +检查关联关系查询逻辑 +""" +import pymysql +import os +from dotenv import load_dotenv + +load_dotenv() + +DB_CONFIG = { + 'host': os.getenv('DB_HOST', '152.136.177.240'), + 'port': int(os.getenv('DB_PORT', 5012)), + 'user': os.getenv('DB_USER', 'finyx'), + 'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'), + 'database': os.getenv('DB_NAME', 'finyx'), + 'charset': 'utf8mb4' +} + +TENANT_ID = 615873064429507639 + +def check_relations(): + """检查关联关系查询""" + conn = pymysql.connect(**DB_CONFIG) + cursor = conn.cursor(pymysql.cursors.DictCursor) + + try: + # 检查一个具体模板的关联关系 + template_id = 1765273962716807 # 走读式谈话流程 + + print(f"检查模板 ID: {template_id}") + + # 方法1: 当前 API 使用的查询 + print("\n方法1: 当前 API 使用的查询(带 INNER JOIN 和 state=1):") + cursor.execute(""" + SELECT fff.file_id, fff.filed_id, fff.state as relation_state, fc.state as template_state + FROM f_polic_file_field fff + INNER JOIN f_polic_file_config fc ON fff.file_id = fc.id AND fff.tenant_id = fc.tenant_id + WHERE fff.tenant_id = %s AND fff.state = 1 AND fff.file_id = %s + """, (TENANT_ID, template_id)) + results1 = cursor.fetchall() + print(f" 结果数: {len(results1)}") + for r in results1[:5]: + print(f" file_id: {r['file_id']}, filed_id: {r['filed_id']}, relation_state: {r['relation_state']}, template_state: {r['template_state']}") + + # 方法2: 只查询关联表,不检查模板状态 + print("\n方法2: 只查询关联表(不检查模板状态):") + cursor.execute(""" + SELECT fff.file_id, fff.filed_id, fff.state as relation_state + FROM f_polic_file_field fff + WHERE fff.tenant_id = %s AND fff.state = 1 AND fff.file_id = %s + """, (TENANT_ID, template_id)) + results2 = cursor.fetchall() + print(f" 结果数: {len(results2)}") + for r in results2[:5]: + print(f" file_id: {r['file_id']}, filed_id: {r['filed_id']}, relation_state: {r['relation_state']}") + + # 方法3: 检查模板是否存在且启用 + print("\n方法3: 检查模板状态:") + cursor.execute(""" + SELECT id, name, state + FROM f_polic_file_config + WHERE tenant_id = %s AND id = %s + """, (TENANT_ID, template_id)) + template = cursor.fetchone() + if template: + print(f" 模板存在: {template['name']}, state: {template['state']}") + else: + print(f" 模板不存在") + + # 检查所有关联关系(包括 state=0 的) + print("\n方法4: 检查所有关联关系(包括未启用的):") + cursor.execute(""" + SELECT fff.file_id, fff.filed_id, fff.state as relation_state + FROM f_polic_file_field fff + WHERE fff.tenant_id = %s AND fff.file_id = %s + """, (TENANT_ID, template_id)) + results4 = cursor.fetchall() + print(f" 结果数: {len(results4)}") + enabled = [r for r in results4 if r['relation_state'] == 1] + disabled = [r for r in results4 if r['relation_state'] == 0] + print(f" 启用: {len(enabled)}, 未启用: {len(disabled)}") + + finally: + cursor.close() + conn.close() + +if __name__ == '__main__': + check_relations() diff --git a/check_specific_template_relations.py b/check_specific_template_relations.py new file mode 100644 index 0000000..6839af1 --- /dev/null +++ b/check_specific_template_relations.py @@ -0,0 +1,198 @@ +""" +检查特定模板的关联关系 +""" +import pymysql +import os +import re +from pathlib import Path +from docx import Document +from dotenv import load_dotenv + +load_dotenv() + +DB_CONFIG = { + 'host': os.getenv('DB_HOST', '152.136.177.240'), + 'port': int(os.getenv('DB_PORT', 5012)), + 'user': os.getenv('DB_USER', 'finyx'), + 'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'), + 'database': os.getenv('DB_NAME', 'finyx'), + 'charset': 'utf8mb4' +} + +TENANT_ID = 615873064429507639 +TEMPLATE_NAME = "1.请示报告卡(初核谈话)" +TEMPLATE_FILE = "template_finish/2-初核模版/2.谈话审批/走读式谈话审批/1.请示报告卡(初核谈话).docx" + +def extract_placeholders_from_docx(file_path: str): + """从docx文件中提取所有占位符""" + placeholders = set() + pattern = r'\{\{([^}]+)\}\}' + + try: + doc = Document(file_path) + + # 从段落中提取占位符 + for paragraph in doc.paragraphs: + text = paragraph.text + matches = re.findall(pattern, text) + for match in matches: + cleaned = match.strip() + if cleaned and '{' not in cleaned and '}' not in cleaned: + placeholders.add(cleaned) + + # 从表格中提取占位符 + for table in doc.tables: + for row in table.rows: + for cell in row.cells: + for paragraph in cell.paragraphs: + text = paragraph.text + matches = re.findall(pattern, text) + for match in matches: + cleaned = match.strip() + if cleaned and '{' not in cleaned and '}' not in cleaned: + placeholders.add(cleaned) + + except Exception as e: + print(f"错误: 读取文件失败 - {str(e)}") + return [] + + return sorted(list(placeholders)) + +def check_template(): + """检查模板的关联关系""" + conn = pymysql.connect(**DB_CONFIG) + cursor = conn.cursor(pymysql.cursors.DictCursor) + + try: + print(f"检查模板: {TEMPLATE_NAME}") + print("=" * 80) + + # 1. 从文档提取占位符 + print("\n1. 从文档提取占位符:") + if not Path(TEMPLATE_FILE).exists(): + print(f" 文件不存在: {TEMPLATE_FILE}") + return + + placeholders = extract_placeholders_from_docx(TEMPLATE_FILE) + print(f" 占位符数量: {len(placeholders)}") + print(f" 占位符列表: {placeholders}") + + # 2. 查询模板ID + print(f"\n2. 查询模板ID:") + cursor.execute(""" + SELECT id, name + FROM f_polic_file_config + WHERE tenant_id = %s AND name = %s + """, (TENANT_ID, TEMPLATE_NAME)) + template = cursor.fetchone() + if not template: + print(f" 模板不存在") + return + + template_id = template['id'] + print(f" 模板ID: {template_id}") + + # 3. 查询字段映射 + print(f"\n3. 查询字段映射:") + cursor.execute(""" + SELECT id, name, filed_code, field_type, state + FROM f_polic_field + WHERE tenant_id = %s + """, (TENANT_ID,)) + fields = cursor.fetchall() + + field_map = {} + for field in fields: + state = field['state'] + if isinstance(state, bytes): + state = int.from_bytes(state, byteorder='big') if len(state) == 1 else 1 + field_map[field['filed_code']] = { + 'id': field['id'], + 'name': field['name'], + 'field_type': field['field_type'], + 'state': state + } + + print(f" 字段总数: {len(field_map)}") + + # 4. 匹配占位符到字段 + print(f"\n4. 匹配占位符到字段:") + input_field_ids = [] + output_field_ids = [] + not_found = [] + + for placeholder in placeholders: + if placeholder in field_map: + field_info = field_map[placeholder] + if field_info['state'] == 1: + if field_info['field_type'] == 1: + input_field_ids.append(field_info['id']) + elif field_info['field_type'] == 2: + output_field_ids.append(field_info['id']) + else: + not_found.append(placeholder) + + # 添加必需的输入字段 + required_input_fields = ['clue_info', 'target_basic_info_clue'] + for req_field in required_input_fields: + if req_field in field_map: + field_info = field_map[req_field] + if field_info['state'] == 1 and field_info['id'] not in input_field_ids: + input_field_ids.append(field_info['id']) + + print(f" 输入字段ID: {input_field_ids}") + print(f" 输出字段ID: {output_field_ids}") + if not_found: + print(f" 未找到的占位符: {not_found}") + + # 5. 查询数据库中的关联关系 + print(f"\n5. 查询数据库中的关联关系:") + cursor.execute(""" + SELECT fff.filed_id, fff.state, f.name, f.field_type + FROM f_polic_file_field fff + INNER JOIN f_polic_field f ON fff.filed_id = f.id AND fff.tenant_id = f.tenant_id + WHERE fff.tenant_id = %s AND fff.file_id = %s + """, (TENANT_ID, template_id)) + db_relations = cursor.fetchall() + + db_input_ids = [] + db_output_ids = [] + for rel in db_relations: + state = rel['state'] + if isinstance(state, bytes): + state = int.from_bytes(state, byteorder='big') if len(state) == 1 else 1 + + if state == 1: + if rel['field_type'] == 1: + db_input_ids.append(rel['filed_id']) + elif rel['field_type'] == 2: + db_output_ids.append(rel['filed_id']) + + print(f" 数据库中的输入字段ID: {sorted(db_input_ids)}") + print(f" 数据库中的输出字段ID: {sorted(db_output_ids)}") + + # 6. 对比 + print(f"\n6. 对比结果:") + expected_input = set(input_field_ids) + expected_output = set(output_field_ids) + actual_input = set(db_input_ids) + actual_output = set(db_output_ids) + + print(f" 输入字段 - 期望: {sorted(expected_input)}, 实际: {sorted(actual_input)}") + print(f" 输入字段匹配: {expected_input == actual_input}") + + print(f" 输出字段 - 期望: {sorted(expected_output)}, 实际: {sorted(actual_output)}") + print(f" 输出字段匹配: {expected_output == actual_output}") + + if expected_output != actual_output: + missing = expected_output - actual_output + extra = actual_output - expected_output + print(f" 缺少的输出字段: {sorted(missing)}") + print(f" 多余的输出字段: {sorted(extra)}") + + finally: + cursor.close() + conn.close() + +if __name__ == '__main__': + check_template() diff --git a/check_template_all_relations.py b/check_template_all_relations.py new file mode 100644 index 0000000..30b66f7 --- /dev/null +++ b/check_template_all_relations.py @@ -0,0 +1,98 @@ +""" +检查模板的所有关联关系(包括未启用的) +""" +import pymysql +import os +from dotenv import load_dotenv + +load_dotenv() + +DB_CONFIG = { + 'host': os.getenv('DB_HOST', '152.136.177.240'), + 'port': int(os.getenv('DB_PORT', 5012)), + 'user': os.getenv('DB_USER', 'finyx'), + 'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'), + 'database': os.getenv('DB_NAME', 'finyx'), + 'charset': 'utf8mb4' +} + +TENANT_ID = 615873064429507639 +TEMPLATE_ID = 1765432134276990 # 1.请示报告卡(初核谈话) + +def check_all_relations(): + """检查模板的所有关联关系""" + conn = pymysql.connect(**DB_CONFIG) + cursor = conn.cursor(pymysql.cursors.DictCursor) + + try: + print(f"检查模板 ID: {TEMPLATE_ID}") + print("=" * 80) + + # 查询模板信息 + cursor.execute(""" + SELECT id, name, state + FROM f_polic_file_config + WHERE tenant_id = %s AND id = %s + """, (TENANT_ID, TEMPLATE_ID)) + template = cursor.fetchone() + if template: + print(f"模板名称: {template['name']}") + print(f"模板状态: {template['state']}") + else: + print("模板不存在") + return + + # 查询所有关联关系(包括 state=0 的) + cursor.execute(""" + SELECT + fff.file_id, + fff.filed_id, + fff.state as relation_state, + f.name as field_name, + f.field_type, + f.state as field_state + FROM f_polic_file_field fff + INNER JOIN f_polic_field f ON fff.filed_id = f.id AND fff.tenant_id = f.tenant_id + WHERE fff.tenant_id = %s AND fff.file_id = %s + ORDER BY f.field_type, f.name + """, (TENANT_ID, TEMPLATE_ID)) + all_relations = cursor.fetchall() + + print(f"\n所有关联关系数: {len(all_relations)}") + + # 按状态分组 + enabled_relations = [r for r in all_relations if r['relation_state'] == 1 or (isinstance(r['relation_state'], bytes) and r['relation_state'] == b'\x01')] + disabled_relations = [r for r in all_relations if r not in enabled_relations] + + print(f"启用的关联关系: {len(enabled_relations)}") + print(f"未启用的关联关系: {len(disabled_relations)}") + + # 按字段类型分组 + input_fields = [r for r in enabled_relations if r['field_type'] == 1] + output_fields = [r for r in enabled_relations if r['field_type'] == 2] + + print(f"\n启用的输入字段关联: {len(input_fields)}") + for r in input_fields: + state_str = str(r['relation_state']) if not isinstance(r['relation_state'], bytes) else 'bytes' + print(f" - {r['field_name']} (ID: {r['filed_id']}, relation_state: {state_str}, field_state: {r['field_state']})") + + print(f"\n启用的输出字段关联: {len(output_fields)}") + for r in output_fields[:10]: + state_str = str(r['relation_state']) if not isinstance(r['relation_state'], bytes) else 'bytes' + print(f" - {r['field_name']} (ID: {r['filed_id']}, relation_state: {state_str}, field_state: {r['field_state']})") + if len(output_fields) > 10: + print(f" ... 还有 {len(output_fields) - 10} 个输出字段") + + # 检查未启用的关联关系 + if disabled_relations: + print(f"\n未启用的关联关系: {len(disabled_relations)}") + disabled_input = [r for r in disabled_relations if r['field_type'] == 1] + disabled_output = [r for r in disabled_relations if r['field_type'] == 2] + print(f" 输入字段: {len(disabled_input)}, 输出字段: {len(disabled_output)}") + + finally: + cursor.close() + conn.close() + +if __name__ == '__main__': + check_all_relations() diff --git a/check_template_with_output_fields.py b/check_template_with_output_fields.py new file mode 100644 index 0000000..6029ce2 --- /dev/null +++ b/check_template_with_output_fields.py @@ -0,0 +1,76 @@ +""" +检查哪些模板有输出字段关联 +""" +import pymysql +import os +from dotenv import load_dotenv + +load_dotenv() + +DB_CONFIG = { + 'host': os.getenv('DB_HOST', '152.136.177.240'), + 'port': int(os.getenv('DB_PORT', 5012)), + 'user': os.getenv('DB_USER', 'finyx'), + 'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'), + 'database': os.getenv('DB_NAME', 'finyx'), + 'charset': 'utf8mb4' +} + +TENANT_ID = 615873064429507639 + +def check_templates_with_output_fields(): + """检查哪些模板有输出字段关联""" + conn = pymysql.connect(**DB_CONFIG) + cursor = conn.cursor(pymysql.cursors.DictCursor) + + try: + # 查询所有模板及其关联的输出字段 + cursor.execute(""" + SELECT + fc.id as template_id, + fc.name as template_name, + COUNT(CASE WHEN f.field_type = 2 THEN 1 END) as output_field_count, + COUNT(CASE WHEN f.field_type = 1 THEN 1 END) as input_field_count, + COUNT(*) as total_field_count + FROM f_polic_file_config fc + INNER JOIN f_polic_file_field fff ON fc.id = fff.file_id AND fc.tenant_id = fff.tenant_id + INNER JOIN f_polic_field f ON fff.filed_id = f.id AND fff.tenant_id = f.tenant_id + WHERE fc.tenant_id = %s + AND fff.state = 1 + AND fc.state = 1 + GROUP BY fc.id, fc.name + HAVING output_field_count > 0 + ORDER BY output_field_count DESC + LIMIT 10 + """, (TENANT_ID,)) + + templates = cursor.fetchall() + + print(f"有输出字段关联的模板(前10个):") + print("=" * 80) + for t in templates: + print(f"\n模板: {t['template_name']} (ID: {t['template_id']})") + print(f" 输入字段: {t['input_field_count']}, 输出字段: {t['output_field_count']}, 总计: {t['total_field_count']}") + + # 查询该模板的具体输出字段 + cursor.execute(""" + SELECT f.id, f.name, f.filed_code + FROM f_polic_file_field fff + INNER JOIN f_polic_field f ON fff.filed_id = f.id AND fff.tenant_id = f.tenant_id + WHERE fff.tenant_id = %s + AND fff.file_id = %s + AND fff.state = 1 + AND f.field_type = 2 + LIMIT 5 + """, (TENANT_ID, t['template_id'])) + output_fields = cursor.fetchall() + print(f" 输出字段示例(前5个):") + for f in output_fields: + print(f" - {f['name']} (ID: {f['id']}, code: {f['filed_code']})") + + finally: + cursor.close() + conn.close() + +if __name__ == '__main__': + check_templates_with_output_fields() diff --git a/services/__pycache__/document_service.cpython-312.pyc b/services/__pycache__/document_service.cpython-312.pyc index b77a15acd77547702dfed80068877dd5f04766ef..222fd0342e3f0500abb458bc9a93fdaaebdcb16c 100644 GIT binary patch literal 42534 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 GLj4!Rj|t5H diff --git a/services/__pycache__/field_service.cpython-312.pyc b/services/__pycache__/field_service.cpython-312.pyc index adf73b9259d779bec80d1f045c463eae31090094..58a92f1d68b0637b9d9dee44bd7817608707f42d 100644 GIT binary patch delta 3006 zcmaJ@dr(x@8NcV=eLrAXmW6%6vcSr^u&f3FDeCZ!L;(eLv>kBEF1Wbt;<d&i|1cvnC3k2$nE{Re)SJ*hI@3<3=erB2G40Oq zJKyVk=bZ2S&UYD4y??^^XQNTa(BI!m>!LT_H_jr`nrS0Da;&-w2VR%nTY=qhTapdsHOI>5Xf-Q_Nr%dCO%Vq0`n9A7^~pc2V8b(ED^p zSGO#5cI-|Id%Bu;i+bwntncdD*Ri`vcDL8>Y)&4hE8KnkH+RomTKb6Gf91@*YnK+M z&n#U!efRY%53Zj6;_~m8&c7Ro#E;&68*D zsj&xFf2vzqzRV4a(dA_UmQPz&mM?RYx4HTXpH5^Gyr>$82y_9F3&mohZf_`-j5K4M zz#KupLr>2W3 zg0NN7x%`r;j=Tbdent|u)5L8bs)l`ux^&Tm zpTM|>d}1#v7d8D6q3;kdS```|j>N;FvM-k4BR*~V&>@(kpu~>jDDgPzkeBp2y49zs zng1t4K5|qc2l>*G@8xn!B^Be_H2FMbQI%0rtFld_jZy|<%pPn1Vf(~WllnPB8L4-^ z;H}@-Xl8DhJ&l!I-%2THI);JP!qLCwXIZH&gK7yJ+UMguF-v97(q+A~-)7{B z-N;0Wi~W>;oyF@Y>z*yHaJ7WBgATgfH-2H=01{l}lj3Hh{t*_Z*X$@6MFsRGTpTwD zqthvKmmRczBMVi9JQDQg(CcgQ7Ctfw*nQDkj!+>PD;OhVrEj1ll}?e1zH#!)vI5fS zSCG@|YtW1I67$Gk*LRb#^;R1gYqN#@m8 zT03X(&bz(8%6u#Hj(fwb!6j)FZquy6Dd|>1W*vTb$NMYJtWy@3QgiyrvsGD=UhTG= zHAp5VD|bBOT*gFdwtVZHX&bQxe}VRpYr%Zl2N!}Ro%O+1E%R}(UeQv--l(iMQSGL} z-m*<`GhYRAvAtEHy17+BZ8)klbeIdPD15O+q{AKH-$}Bn?Goq zuM`ettyF7O1}3|g89GQoa;L7c&9AggH(k&EaJ$4%@pkcT;g9Q=L6i=lBI@HLh7Q*? zw=I9jSO!sQLt#W6*%AZeb<46mN;}A|E$f`}K41&<<97*m(gOhP2v?FHZwc5R->s;r b8%l(evB*~ZTe7gFEVDs{tY0yJ@{#@v2T}q{ delta 3097 zcmb7FYiv`=6~1$Q{fwPB@gt5C+c%CAa1!SoJCFc*5)vRJB)}5Uh7jAqc{tgz!y}}y zRH`;qXdj$vVG$CcFJQM?SY>~7Rn$_kWvNO+-^StP2qQq?)v>kwF4 zwe#bf^O~76XU;kE{_NQ~!!Ha59mmGwMt@}U`-TL`(lAbel6{2Z&T`PqyDTKgzssW; z$HkSYnL~}36BN>lcbPd3T#%s*s?u_qR|hq#d7t*FKBx<3Tu{w%LwKk>f_laYX>N{# zOSxv4c4{)2ShY&L;4C=7MChs zc;B3RfxoDITf5-BGO%Q;Su)q&Pg`8cT{2hSx7lU2FHzmLWNS~e-Ya{SZ1wkY#YYCU zT{kbB&P*CPd$~-gIH&tFNBvz#{gNXvFDz^9NfqZ>+^X8GAa3}!w$i?qxgwEJOwDF7 zHE0o|sRRC^EhetTY~9Ps99qakvj1XATMut#6_Wtm$l4Ij%-$@y6IBN<= zLKDHEU?@C1GZBwfjK!v+)Qj7eB9t-cp&|_DM0ILwiqBYQ zNk1I3I`pe=3g5L>k;Cw*wU89U->fCPjt5ungEDT+$o6<{jFLGr%Vg;qAl#f{%mgQM zP4G#r8oV|WvA_mf7s*Y_&bX9M8Tf0lTA>*G4@%LMv1rV55pol%?59^H*m=Cjby4l@xwfPhLm!oaJi``9F@MrLSiiqb*YpI@$|1xyB~^9!=&AbkZb z1eVKD8iEh=n@ABn$sbT3W8xS`ps&DB3Shp#StI0@BsJWc+J&zsIYpfzsa2bd^KC5q z45rt6PW7CtT`*sEUUDYHs_Tt+#f{7QP4LTtlkQfoP2_Hg?si@=f^U%?*mUHk^edQh zyaj!ARy_%?^dtfgoGz$x`rvbQK8qYq8p8E+S{7$`q%QbE2KSxXRVE<1ey1GPvC?}% z;LeCIop?c%Xpni*9G|y-hjpWtS zNW~b$FwIw0ndE?AVVCMEsy>3n!pfptZC;XpaU8GP6Jpb{egpig@KBbXE%{N4(8hDO zcz2rzzV0sJn+15seZe!wjb$?Jb0bVvC8mG@gJ_ZSe>eW%|1thYQ6b5JX^#b}Jyw?X zTRdx6rcZk+9Roq_nBzIu7#q}$lDG?Qcsjf<^qv)0#&gA$xj&D3x4uD=aH1 z?RMLj4~yH=vM}%As6e>A+#BSy<1lwbv6nkcMtH)F@L$V5%rH$AadX1h%FfRpgyngv z#7Bh9FG{pVxGoA1SsNqg7k|6fNuDWRFK9}8$oE)w+F+`5;2E7A3QMi<>r#W|2=h2q z&_hV=XE3}K{#p9awDQ-88^q$64wDNO#3Ht94*WpWLQZ*y@!2LogD_fNbRs*|U$Gzj z_Z+9=%tTU7ObrKPayO+DxCWcBq#acJ@8qj zla#`f%HrNub7v!W%iJP#TKJD_El$S$%x~|k7H%6=jJ|EPcluSgs{}@WY_W7!C_gS$ zAnhYaR~V3PbZ>DeXeyeE<5h>0#$FaE+J~?ep$i_>yU1?H_M27PP|yu!etYFgf_VA# zClVc=49OqI47M7USAV+p!5_}O_VC7e+5>TanSTot|CyybH_KOuv<)}gD04a;ZAWes zLI*-K!e)dP_|)&t=|r-XfmcnPNbdq|z?p|>A}ND2lhZM;EtNj0t3Y$Wz6Sl5baK`V z#Y0Epk`Rf9CR2agY1~A<&uefpU{hhQrLV)qKo!{ni9kEc8cRbHS+}^e;g3A~%hxy7 z^?A@nK)`-P>k(WGBt